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

_ZN8facebook6hermes8debugger12ProgramStateC2EPNS1_8DebuggerE:
  148|    160|  ProgramState(Debugger *dbg) : dbg_(dbg) {}
_ZN8facebook6hermes8debugger10EvalResultC2Ev:
   61|    160|  EvalResult() = default;

_ZN8facebook6hermes13HermesRuntime16isHermesBytecodeEPKhm:
 1097|    320|bool HermesRuntime::isHermesBytecode(const uint8_t *data, size_t len) {
 1098|    320|  return hbc::BCProviderFromBuffer::isBytecodeStream(
 1099|    320|      llvh::ArrayRef<uint8_t>(data, len));
 1100|    320|}
_ZN8facebook6hermes13HermesRuntime14watchTimeLimitEj:
 1392|    160|void HermesRuntime::watchTimeLimit(uint32_t timeoutInMs) {
 1393|    160|  HermesRuntimeImpl &concrete = *impl(this);
 1394|    160|  vm::Runtime &runtime = concrete.runtime_;
 1395|    160|  auto &runtimeTimeLimitMonitor = runtime.timeLimitMonitor;
 1396|    160|  if (!runtimeTimeLimitMonitor) {
  ------------------
  |  Branch (1396:7): [True: 160, False: 0]
  ------------------
 1397|    160|    runtimeTimeLimitMonitor = ::hermes::vm::TimeLimitMonitor::getOrCreate();
 1398|    160|  }
 1399|    160|  runtimeTimeLimitMonitor->watchRuntime(
 1400|    160|      runtime, std::chrono::milliseconds(timeoutInMs));
 1401|    160|}
_ZN8facebook6hermes13HermesRuntime31evaluateJavaScriptWithSourceMapERKNSt3__110shared_ptrIKNS_3jsi6BufferEEES9_RKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1413|    160|    const std::string &sourceURL) {
 1414|    160|  return impl(this)->evaluatePreparedJavaScript(
 1415|    160|      impl(this)->prepareJavaScriptWithSourceMap(
 1416|    160|          buffer, sourceMapBuf, sourceURL));
 1417|    160|}
_ZN8facebook6hermes17HermesRuntimeImpl30prepareJavaScriptWithSourceMapERKNSt3__110shared_ptrIKNS_3jsi6BufferEEES9_NS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1485|    160|    std::string sourceURL) {
 1486|    160|  std::pair<std::unique_ptr<hbc::BCProvider>, std::string> bcErr{};
 1487|    160|  vm::RuntimeModuleFlags runtimeFlags{};
 1488|    160|  runtimeFlags.persistent = true;
 1489|       |
 1490|    160|  bool isBytecode = isHermesBytecode(jsiBuffer->data(), jsiBuffer->size());
 1491|       |#ifdef HERMESVM_PLATFORM_LOGGING
 1492|       |  hermesLog(
 1493|       |      "HermesVM", "Prepare JS on %s.", isBytecode ? "bytecode" : "source");
 1494|       |#endif
 1495|       |
 1496|       |  // Construct the BC provider either from buffer or source.
 1497|    160|  if (isBytecode) {
  ------------------
  |  Branch (1497:7): [True: 0, False: 160]
  ------------------
 1498|      0|    if (sourceMapBuf) {
  ------------------
  |  Branch (1498:9): [True: 0, False: 0]
  ------------------
 1499|      0|      throw std::logic_error("Source map cannot be specified with bytecode");
 1500|      0|    }
 1501|      0|    bcErr = hbc::BCProviderFromBuffer::createBCProviderFromBuffer(
 1502|      0|        std::make_unique<BufferAdapter>(jsiBuffer));
 1503|    160|  } else {
 1504|       |#if defined(HERMESVM_LEAN)
 1505|       |    bcErr.second = "prepareJavaScript source compilation not supported";
 1506|       |#else
 1507|    160|    std::unique_ptr<::hermes::SourceMap> sourceMap{};
 1508|    160|    if (sourceMapBuf) {
  ------------------
  |  Branch (1508:9): [True: 0, False: 160]
  ------------------
 1509|      0|      auto buf0 = ensureZeroTerminated(sourceMapBuf);
 1510|       |      // Convert the buffer into a form the parser needs.
 1511|      0|      llvh::MemoryBufferRef mbref(
 1512|      0|          llvh::StringRef((const char *)buf0->data(), buf0->size()), "");
 1513|      0|      ::hermes::SimpleDiagHandler diag;
 1514|      0|      ::hermes::SourceErrorManager sm;
 1515|      0|      diag.installInto(sm);
 1516|      0|      sourceMap = ::hermes::SourceMapParser::parse(mbref, sm);
 1517|      0|      if (!sourceMap) {
  ------------------
  |  Branch (1517:11): [True: 0, False: 0]
  ------------------
 1518|      0|        auto errorStr = diag.getErrorString();
 1519|      0|        LOG_EXCEPTION_CAUSE("Error parsing source map: %s", errorStr.c_str());
  ------------------
  |  |   73|      0|  do {                           \
  |  |   74|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (74:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1520|      0|        throw std::runtime_error("Error parsing source map:" + errorStr);
 1521|      0|      }
 1522|      0|    }
 1523|    160|    bcErr = hbc::BCProviderFromSrc::createBCProviderFromSrc(
 1524|    160|        ensureZeroTerminated(jsiBuffer),
 1525|    160|        sourceURL,
 1526|    160|        std::move(sourceMap),
 1527|    160|        compileFlags_);
 1528|    160|#endif
 1529|    160|  }
 1530|    160|  if (!bcErr.first) {
  ------------------
  |  Branch (1530:7): [True: 46, False: 114]
  ------------------
 1531|     46|    LOG_EXCEPTION_CAUSE("Compiling JS failed: %s", bcErr.second.c_str());
  ------------------
  |  |   73|     46|  do {                           \
  |  |   74|     46|  } while (0)
  |  |  ------------------
  |  |  |  Branch (74:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1532|     46|    throw jsi::JSINativeException(
 1533|     46|        "Compiling JS failed: " + std::move(bcErr.second));
 1534|     46|  }
 1535|    114|  return std::make_shared<const HermesPreparedJavaScript>(
 1536|    114|      std::move(bcErr.first), runtimeFlags, std::move(sourceURL));
 1537|    160|}
_ZN8facebook6hermes17HermesRuntimeImpl26evaluatePreparedJavaScriptERKNSt3__110shared_ptrIKNS_3jsi18PreparedJavaScriptEEE:
 1547|    114|    const std::shared_ptr<const jsi::PreparedJavaScript> &js) {
 1548|    114|  assert(
 1549|    114|      dynamic_cast<const HermesPreparedJavaScript *>(js.get()) &&
 1550|    114|      "js must be an instance of HermesPreparedJavaScript");
 1551|    114|  const auto *hermesPrep =
 1552|    114|      static_cast<const HermesPreparedJavaScript *>(js.get());
 1553|    114|  vm::GCScope gcScope(runtime_);
 1554|    114|  auto res = runtime_.runBytecode(
 1555|    114|      hermesPrep->bytecodeProvider(),
 1556|    114|      hermesPrep->runtimeFlags(),
 1557|    114|      hermesPrep->sourceURL(),
 1558|    114|      vm::Runtime::makeNullHandle<vm::Environment>());
 1559|    114|  checkStatus(res.getStatus());
 1560|    114|  return valueFromHermesValue(*res);
 1561|    114|}
_ZN8facebook6hermes17HermesRuntimeImpl18evaluateJavaScriptERKNSt3__110shared_ptrIKNS_3jsi6BufferEEERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1565|    160|    const std::string &sourceURL) {
 1566|    160|  return evaluateJavaScriptWithSourceMap(buffer, nullptr, sourceURL);
 1567|    160|}
_ZN8facebook6hermes17HermesRuntimeImpl6globalEv:
 1590|    160|jsi::Object HermesRuntimeImpl::global() {
 1591|    160|  return add<jsi::Object>(runtime_.getGlobal().getHermesValue());
 1592|    160|}
_ZN8facebook6hermes17HermesRuntimeImpl11cloneObjectEPKNS_3jsi7Runtime12PointerValueE:
 1631|    160|    const Runtime::PointerValue *pv) {
 1632|    160|  return clone(pv);
 1633|    160|}
_ZN8facebook6hermes17HermesRuntimeImpl18utf8FromStringViewEN6hermes2vm10StringViewE:
 1709|    104|std::string HermesRuntimeImpl::utf8FromStringView(vm::StringView view) {
 1710|    104|  if (view.isASCII())
  ------------------
  |  Branch (1710:7): [True: 75, False: 29]
  ------------------
 1711|     75|    return std::string{view.castToCharPtr(), view.length()};
 1712|       |
 1713|     29|  std::string ret;
 1714|     29|  ::hermes::convertUTF16ToUTF8WithReplacements(
 1715|     29|      ret, llvh::ArrayRef{view.castToChar16Ptr(), view.length()});
 1716|     29|  return ret;
 1717|    104|}
_ZN8facebook6hermes17HermesRuntimeImpl21createStringFromAsciiEPKcm:
 1795|   390k|    size_t length) {
 1796|   390k|#ifndef NDEBUG
 1797|  3.12M|  for (size_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (1797:22): [True: 2.73M, False: 390k]
  ------------------
 1798|  2.73M|    assert(
 1799|  2.73M|        static_cast<unsigned char>(str[i]) < 128 &&
 1800|  2.73M|        "non-ASCII character in string");
 1801|  2.73M|  }
 1802|   390k|#endif
 1803|   390k|  vm::GCScope gcScope(runtime_);
 1804|   390k|  return add<jsi::String>(stringHVFromAscii(str, length));
 1805|   390k|}
_ZN8facebook6hermes17HermesRuntimeImpl12createObjectENSt3__110shared_ptrINS_3jsi10HostObjectEEE:
 1893|    160|    std::shared_ptr<jsi::HostObject> ho) {
 1894|    160|  vm::GCScope gcScope(runtime_);
 1895|       |
 1896|    160|  auto objRes = vm::HostObject::createWithoutPrototype(
 1897|    160|      runtime_, std::make_unique<JsiProxy>(*this, ho));
 1898|    160|  checkStatus(objRes.getStatus());
 1899|    160|  return add<jsi::Object>(*objRes);
 1900|    160|}
_ZN8facebook6hermes17HermesRuntimeImpl16setPropertyValueERKNS_3jsi6ObjectERKNS2_6StringERKNS2_5ValueE:
 2134|    160|    const jsi::Value &value) {
 2135|    160|  vm::GCScope gcScope(runtime_);
 2136|    160|  auto h = handle(obj);
 2137|    160|  checkStatus(h->putComputed_RJS(
 2138|    160|                   h,
 2139|    160|                   runtime_,
 2140|    160|                   stringHandle(name),
 2141|    160|                   vmHandleFromValue(value),
 2142|    160|                   vm::PropOpFlags().plusThrowOnError())
 2143|    160|                  .getStatus());
 2144|    160|}
_ZN8facebook6hermes17HermesRuntimeImpl11checkStatusEN6hermes2vm15ExecutionStatusE:
 2478|   391k|void HermesRuntimeImpl::checkStatus(vm::ExecutionStatus status) {
 2479|   391k|  if (LLVM_LIKELY(status != vm::ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  188|   391k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 391k, False: 52]
  |  |  ------------------
  ------------------
 2480|   391k|    return;
 2481|   391k|  }
 2482|       |
 2483|     52|  throwPendingError();
 2484|     52|}
_ZN8facebook6hermes17HermesRuntimeImpl17stringHVFromAsciiEPKcm:
 2488|   390k|    size_t length) {
 2489|   390k|  auto strRes = vm::StringPrimitive::createEfficient(
 2490|   390k|      runtime_, llvh::makeArrayRef(str, length));
 2491|   390k|  checkStatus(strRes.getStatus());
 2492|   390k|  return *strRes;
 2493|   390k|}
_ZN8facebook6hermes17HermesRuntimeImpl17throwPendingErrorEv:
 2514|     52|void HermesRuntimeImpl::throwPendingError() {
 2515|     52|  vm::GCScope scope{runtime_};
 2516|       |
 2517|       |  // Retrieve the exception value and clear as we will rethrow it as a C++
 2518|       |  // exception.
 2519|     52|  auto hv = runtime_.getThrownValue();
 2520|     52|  runtime_.clearThrownValue();
 2521|     52|  auto jsiVal = valueFromHermesValue(hv);
 2522|     52|  auto hnd = vmHandleFromValue(jsiVal);
 2523|       |
 2524|     52|  std::string msg = "No message";
 2525|     52|  std::string stack = "No stack";
 2526|     52|  if (auto str = vm::Handle<vm::StringPrimitive>::dyn_vmcast(hnd)) {
  ------------------
  |  Branch (2526:12): [True: 0, False: 52]
  ------------------
 2527|       |    // If the exception is a string, use it as the message.
 2528|      0|    msg = utf8FromStringView(
 2529|      0|        vm::StringPrimitive::createStringView(runtime_, str));
 2530|     52|  } else if (auto obj = vm::Handle<vm::JSObject>::dyn_vmcast(hnd)) {
  ------------------
  |  Branch (2530:19): [True: 52, False: 0]
  ------------------
 2531|       |    // If the exception is an object try to retrieve its message and stack
 2532|       |    // properties.
 2533|       |
 2534|       |    /// Attempt to retrieve a string property \p sym from \c obj and store it
 2535|       |    /// in \p out. Ignore any catchable errors and non-string properties.
 2536|     52|    auto getStrProp = [this, obj](vm::SymbolID sym, std::string &out) {
 2537|     52|      auto propRes = vm::JSObject::getNamed_RJS(obj, runtime_, sym);
 2538|     52|      if (LLVM_UNLIKELY(propRes == vm::ExecutionStatus::EXCEPTION)) {
 2539|       |        // An exception was thrown while retrieving the property, if it is
 2540|       |        // catchable, suppress it. Otherwise, rethrow this exception without
 2541|       |        // trying to invoke any more JavaScript.
 2542|     52|        auto propExHv = runtime_.getThrownValue();
 2543|     52|        runtime_.clearThrownValue();
 2544|       |
 2545|     52|        if (!vm::isUncatchableError(propExHv))
 2546|     52|          return;
 2547|       |
 2548|       |        // An uncatchable error occurred, it is unsafe to do anything that might
 2549|       |        // execute more JavaScript.
 2550|     52|        throw jsi::JSError(
 2551|     52|            valueFromHermesValue(propExHv),
 2552|     52|            "Uncatchable exception thrown while creating error",
 2553|     52|            "No stack");
 2554|     52|      }
 2555|       |
 2556|       |      // If the property is a string, update out. Otherwise ignore it.
 2557|     52|      auto prop = propRes->get();
 2558|     52|      if (prop.isString()) {
 2559|     52|        auto view = vm::StringPrimitive::createStringView(
 2560|     52|            runtime_, runtime_.makeHandle(prop.getString()));
 2561|     52|        out = utf8FromStringView(view);
 2562|     52|      }
 2563|     52|    };
 2564|       |
 2565|     52|    getStrProp(vm::Predefined::getSymbolID(vm::Predefined::message), msg);
 2566|     52|    getStrProp(vm::Predefined::getSymbolID(vm::Predefined::stack), stack);
 2567|     52|  }
 2568|       |
 2569|       |  // Use the constructor of jsi::JSError that cannot run additional
 2570|       |  // JS, since that may then result in additional exceptions and infinite
 2571|       |  // recursion.
 2572|     52|  throw jsi::JSError(std::move(jsiVal), msg, stack);
 2573|     52|}
_ZN8facebook6hermes17makeHermesRuntimeERKN6hermes2vm13RuntimeConfigE:
 2616|    160|    const vm::RuntimeConfig &runtimeConfig) {
 2617|       |  // This is insurance against someone adding data members to
 2618|       |  // HermesRuntime.  If on some weird platform it fails, it can be
 2619|       |  // updated or removed.
 2620|    160|  static_assert(
 2621|    160|      sizeof(HermesRuntime) == sizeof(void *),
 2622|    160|      "HermesRuntime should only include a vtable ptr");
 2623|       |
 2624|       |#if defined(HERMESVM_PLATFORM_LOGGING)
 2625|       |  auto ret = std::make_unique<HermesRuntimeImpl>(
 2626|       |      runtimeConfig.rebuild()
 2627|       |          .withGCConfig(runtimeConfig.getGCConfig()
 2628|       |                            .rebuild()
 2629|       |                            .withShouldRecordStats(true)
 2630|       |                            .build())
 2631|       |          .build());
 2632|       |#else
 2633|    160|  auto ret = std::make_unique<HermesRuntimeImpl>(runtimeConfig);
 2634|    160|#endif
 2635|       |
 2636|    160|#ifdef HERMES_ENABLE_DEBUGGER
 2637|       |  // Only HermesRuntime can create a debugger instance.  This requires
 2638|       |  // the setter and not using make_unique, so the call to new is here
 2639|       |  // in this function, which is a friend of debugger::Debugger.
 2640|    160|  ret->setDebugger(std::unique_ptr<debugger::Debugger>(
 2641|    160|      new debugger::Debugger(ret.get(), ret->runtime_)));
 2642|       |#else
 2643|       |  ret->setDebugger(std::make_unique<debugger::Debugger>());
 2644|       |#endif
 2645|       |
 2646|    160|  return ret;
 2647|    160|}
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_14implEPNS0_13HermesRuntimeE:
 1080|    480|inline HermesRuntimeImpl *impl(HermesRuntime *rt) {
 1081|       |  // This is guaranteed safe because HermesRuntime is abstract so
 1082|       |  // cannot be constructed, and the only instances created are
 1083|       |  // HermesRuntimeImpl's created by the factory function.  It's kind
 1084|       |  // of like pimpl, but different.
 1085|       |
 1086|    480|  return static_cast<HermesRuntimeImpl *>(rt);
 1087|    480|}
_ZN8facebook6hermes17HermesRuntimeImpl17vmHandleFromValueERKNS_3jsi5ValueE:
  523|    212|  vm::Handle<> vmHandleFromValue(const jsi::Value &value) {
  524|    212|    if (value.isUndefined()) {
  ------------------
  |  Branch (524:9): [True: 0, False: 212]
  ------------------
  525|      0|      return vm::Runtime::getUndefinedValue();
  526|    212|    } else if (value.isNull()) {
  ------------------
  |  Branch (526:16): [True: 0, False: 212]
  ------------------
  527|      0|      return vm::Runtime::getNullValue();
  528|    212|    } else if (value.isBool()) {
  ------------------
  |  Branch (528:16): [True: 0, False: 212]
  ------------------
  529|      0|      return vm::Runtime::getBoolValue(value.getBool());
  530|    212|    } else if (value.isNumber()) {
  ------------------
  |  Branch (530:16): [True: 0, False: 212]
  ------------------
  531|      0|      return runtime_.makeHandle(
  532|      0|          vm::HermesValue::encodeUntrustedNumberValue(value.getNumber()));
  533|    212|    } else if (
  534|    212|        value.isSymbol() || value.isBigInt() || value.isString() ||
  ------------------
  |  Branch (534:9): [True: 0, False: 212]
  |  Branch (534:29): [True: 0, False: 212]
  |  Branch (534:49): [True: 0, False: 212]
  ------------------
  535|    212|        value.isObject()) {
  ------------------
  |  Branch (535:9): [True: 212, False: 0]
  ------------------
  536|    212|      return vm::Handle<vm::HermesValue>(&phv(value));
  537|    212|    } else {
  538|      0|      llvm_unreachable("unknown value kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  539|      0|    }
  540|    212|  }
_ZN8facebook6hermes17HermesRuntimeImpl3phvERKNS_3jsi5ValueE:
  465|   390k|  static const ::hermes::vm::PinnedHermesValue &phv(const jsi::Value &value) {
  466|   390k|    assert(
  467|   390k|        dynamic_cast<const HermesPointerValue *>(getPointerValue(value)) &&
  468|   390k|        "Pointer does not contain a HermesPointerValue");
  469|   390k|    return static_cast<const HermesPointerValue *>(getPointerValue(value))
  470|   390k|        ->value();
  471|   390k|  }
_ZNK8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE5valueEv:
  935|   391k|    const T &value() const {
  936|   391k|      assert(!isFree() && "Value not present");
  937|   391k|      return value_;
  938|   391k|    }
_ZNK8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE6isFreeEv:
  891|  19.0M|    bool isFree() const {
  892|       |      // In general, it is safe to use relaxed operations here because there
  893|       |      // will be a control dependency between this load and any store that needs
  894|       |      // to be ordered. However, TSAN does not analyse control dependencies,
  895|       |      // since they are technically not part of C++, so use acquire under TSAN
  896|       |      // to enforce the ordering of subsequent writes resulting from deleting a
  897|       |      // freed element. (see the comment on dec() for more information)
  898|       |
  899|       |#if LLVM_THREAD_SANITIZER_BUILD
  900|       |      return refCount_.load(std::memory_order_acquire) == 0;
  901|       |#else
  902|  19.0M|      return refCount_.load(std::memory_order_relaxed) == 0;
  903|  19.0M|#endif
  904|  19.0M|    }
_ZN8facebook6hermes17HermesRuntimeImpl3phvERKNS_3jsi7PointerE:
  457|    320|      const jsi::Pointer &pointer) {
  458|    320|    assert(
  459|    320|        dynamic_cast<const HermesPointerValue *>(getPointerValue(pointer)) &&
  460|    320|        "Pointer does not contain a HermesPointerValue");
  461|    320|    return static_cast<const HermesPointerValue *>(getPointerValue(pointer))
  462|    320|        ->value();
  463|    320|  }
_ZN8facebook6hermes17HermesRuntimeImpl11hvFromValueERKNS_3jsi5ValueE:
  505|   390k|  static vm::HermesValue hvFromValue(const jsi::Value &value) {
  506|   390k|    if (value.isUndefined()) {
  ------------------
  |  Branch (506:9): [True: 0, False: 390k]
  ------------------
  507|      0|      return vm::HermesValue::encodeUndefinedValue();
  508|   390k|    } else if (value.isNull()) {
  ------------------
  |  Branch (508:16): [True: 0, False: 390k]
  ------------------
  509|      0|      return vm::HermesValue::encodeNullValue();
  510|   390k|    } else if (value.isBool()) {
  ------------------
  |  Branch (510:16): [True: 0, False: 390k]
  ------------------
  511|      0|      return vm::HermesValue::encodeBoolValue(value.getBool());
  512|   390k|    } else if (value.isNumber()) {
  ------------------
  |  Branch (512:16): [True: 0, False: 390k]
  ------------------
  513|      0|      return vm::HermesValue::encodeUntrustedNumberValue(value.getNumber());
  514|   390k|    } else if (
  515|   390k|        value.isSymbol() || value.isBigInt() || value.isString() ||
  ------------------
  |  Branch (515:9): [True: 0, False: 390k]
  |  Branch (515:29): [True: 0, False: 390k]
  |  Branch (515:49): [True: 390k, False: 0]
  ------------------
  516|   390k|        value.isObject()) {
  ------------------
  |  Branch (516:9): [True: 0, False: 0]
  ------------------
  517|   390k|      return phv(value);
  518|   390k|    } else {
  519|      0|      llvm_unreachable("unknown value kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  520|      0|    }
  521|   390k|  }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_120ensureZeroTerminatedERKNSt3__110shared_ptrIKNS_3jsi6BufferEEE:
 1463|    160|    const std::shared_ptr<const jsi::Buffer> &buf) {
 1464|    160|  size_t size = buf->size();
 1465|    160|  const uint8_t *data = buf->data();
 1466|       |
 1467|       |  // Check for zero termination
 1468|    160|  if (size != 0 && data[size - 1] == 0) {
  ------------------
  |  Branch (1468:7): [True: 160, False: 0]
  |  Branch (1468:20): [True: 5, False: 155]
  ------------------
 1469|      5|    return std::make_unique<BufferAdapter>(buf, data, size - 1);
 1470|    155|  } else {
 1471|       |    // Copy into a zero-terminated instance.
 1472|    155|    return std::make_unique<BufferAdapter>(std::make_shared<jsi::StringBuffer>(
 1473|    155|        std::string((const char *)data, size)));
 1474|    155|  }
 1475|    160|}
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_113BufferAdapterC2ERKNSt3__110shared_ptrIKNS_3jsi6BufferEEEPKhm:
 1233|    160|      : buf_(buf) {
 1234|    160|    data_ = data;
 1235|    160|    size_ = size;
 1236|    160|  }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_113BufferAdapterC2ERKNSt3__110shared_ptrIKNS_3jsi6BufferEEE:
 1239|    155|      : BufferAdapter(buf, buf->data(), buf->size()) {}
hermes.cpp:_ZNK8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScript16bytecodeProviderEv:
 1444|    114|  std::shared_ptr<hbc::BCProvider> bytecodeProvider() const {
 1445|    114|    return bcProvider_;
 1446|    114|  }
hermes.cpp:_ZNK8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScript12runtimeFlagsEv:
 1448|    114|  vm::RuntimeModuleFlags runtimeFlags() const {
 1449|    114|    return runtimeFlags_;
 1450|    114|  }
hermes.cpp:_ZNK8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScript9sourceURLEv:
 1452|    114|  const std::string &sourceURL() const {
 1453|    114|    return sourceURL_;
 1454|    114|  }
_ZN8facebook6hermes17HermesRuntimeImpl20valueFromHermesValueEN6hermes2vm11HermesValueE:
  542|    114|  jsi::Value valueFromHermesValue(vm::HermesValue hv) {
  543|    114|    if (hv.isUndefined() || hv.isEmpty()) {
  ------------------
  |  Branch (543:9): [True: 17, False: 97]
  |  Branch (543:29): [True: 0, False: 97]
  ------------------
  544|     17|      return jsi::Value::undefined();
  545|     97|    } else if (hv.isNull()) {
  ------------------
  |  Branch (545:16): [True: 0, False: 97]
  ------------------
  546|      0|      return nullptr;
  547|     97|    } else if (hv.isBool()) {
  ------------------
  |  Branch (547:16): [True: 0, False: 97]
  ------------------
  548|      0|      return hv.getBool();
  549|     97|    } else if (hv.isDouble()) {
  ------------------
  |  Branch (549:16): [True: 7, False: 90]
  ------------------
  550|      7|      return hv.getDouble();
  551|     90|    } else if (hv.isSymbol()) {
  ------------------
  |  Branch (551:16): [True: 0, False: 90]
  ------------------
  552|      0|      return add<jsi::Symbol>(hv);
  553|     90|    } else if (hv.isBigInt()) {
  ------------------
  |  Branch (553:16): [True: 0, False: 90]
  ------------------
  554|      0|      return add<jsi::BigInt>(hv);
  555|     90|    } else if (hv.isString()) {
  ------------------
  |  Branch (555:16): [True: 17, False: 73]
  ------------------
  556|     17|      return add<jsi::String>(hv);
  557|     73|    } else if (hv.isObject()) {
  ------------------
  |  Branch (557:16): [True: 73, False: 0]
  ------------------
  558|     73|      return add<jsi::Object>(hv);
  559|     73|    } else {
  560|      0|      llvm_unreachable("unknown HermesValue type");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  561|      0|    }
  562|    114|  }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEEC2Ev:
  888|   715k|    ManagedValue() : refCount_(0) {}
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE10invalidateEv:
  940|   782k|    void invalidate() noexcept override {
  941|   782k|#ifdef ASSERT_ON_DANGLING_VM_REFS
  942|   782k|      assert(
  943|   782k|          ((1u << 31) & refCount_) == 0 &&
  944|   782k|          "This PointerValue was left dangling after the Runtime was destroyed.");
  945|   782k|#endif
  946|   782k|      dec();
  947|   782k|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE3decEv:
  960|   782k|    void dec() noexcept {
  961|       |      // It is safe to use relaxed operations here because decrementing the
  962|       |      // reference count is the only access that may be performed without proper
  963|       |      // synchronisation. As a result, the only ordering we need to enforce when
  964|       |      // decrementing is that the vtable pointer used to call \c invalidate is
  965|       |      // loaded from before the decrement, in case the decrement ends up causing
  966|       |      // this value to be freed. We get this ordering from the fact that the
  967|       |      // vtable read and the reference count update form a load-store control
  968|       |      // dependency, which preserves their ordering on any reasonable hardware.
  969|       |      // TSAN does not analyse control dependencies, so we use release under
  970|       |      // TSAN to enforce the ordering of the preceding vtable load.
  971|       |
  972|       |#if LLVM_THREAD_SANITIZER_BUILD
  973|       |      auto oldCount = refCount_.fetch_sub(1, std::memory_order_release);
  974|       |#else
  975|   782k|      auto oldCount = refCount_.fetch_sub(1, std::memory_order_relaxed);
  976|   782k|#endif
  977|   782k|      assert(oldCount > 0 && "Ref count underflow");
  978|   782k|      (void)oldCount;
  979|   782k|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE11setNextFreeEPS6_:
  925|  1.49M|    void setNextFree(ManagedValue<T> *nextFree) {
  926|  1.49M|      assert(isFree() && "Free pointer unusuable while occupied");
  927|  1.49M|      nextFree_ = nextFree;
  928|  1.49M|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE11getNextFreeEv:
  918|  7.43M|    ManagedValue<T> *getNextFree() {
  919|  7.43M|      assert(isFree() && "Free pointer unusuable while occupied");
  920|  7.43M|      return nextFree_;
  921|  7.43M|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE7emplaceIJRNS4_11HermesValueEEEEvDpOT_:
  910|   782k|    void emplace(Args &&...args) {
  911|   782k|      assert(isFree() && "Emplacing already occupied value");
  912|   782k|      refCount_.store(1, std::memory_order_relaxed);
  913|   782k|      new (&value_) T(std::forward<Args>(args)...);
  914|   782k|    }
_ZN8facebook6hermes17HermesRuntimeImpl5cloneEPKNS_3jsi7Runtime12PointerValueE:
 1037|    160|  HermesPointerValue *clone(const Runtime::PointerValue *pv) {
 1038|    160|    if (!pv) {
  ------------------
  |  Branch (1038:9): [True: 0, False: 160]
  ------------------
 1039|      0|      return nullptr;
 1040|      0|    }
 1041|       |    // These are only ever allocated by us, so we can remove their constness
 1042|    160|    auto result = static_cast<HermesPointerValue *>(
 1043|    160|        const_cast<Runtime::PointerValue *>(pv));
 1044|    160|    result->inc();
 1045|    160|    return result;
 1046|    160|  }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE3incEv:
  949|    160|    void inc() noexcept {
  950|       |      // It is always safe to use relaxed operations for incrementing the
  951|       |      // reference count, because the only operation that may occur concurrently
  952|       |      // with it is decrementing the reference count, and we do not need to
  953|       |      // enforce any ordering between the two.
  954|    160|      auto oldCount = refCount_.fetch_add(1, std::memory_order_relaxed);
  955|    160|      assert(oldCount && "Cannot resurrect a pointer");
  956|    160|      assert(oldCount + 1 != 0 && "Ref count overflow");
  957|    160|      (void)oldCount;
  958|    160|    }
_ZN8facebook6hermes17HermesRuntimeImpl12stringHandleERKNS_3jsi6StringE:
  474|    160|      const jsi::String &str) {
  475|    160|    return ::hermes::vm::Handle<vm::StringPrimitive>::vmcast(&phv(str));
  476|    160|  }
_ZN8facebook6hermes17HermesRuntimeImpl6handleERKNS_3jsi6ObjectE:
  479|    160|      const jsi::Object &obj) {
  480|    160|    return ::hermes::vm::Handle<::hermes::vm::JSObject>::vmcast(&phv(obj));
  481|    160|  }
hermes.cpp:_ZZN8facebook6hermes17HermesRuntimeImpl17throwPendingErrorEvENK3$_0clEN6hermes2vm8SymbolIDERNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
 2536|    104|    auto getStrProp = [this, obj](vm::SymbolID sym, std::string &out) {
 2537|    104|      auto propRes = vm::JSObject::getNamed_RJS(obj, runtime_, sym);
 2538|    104|      if (LLVM_UNLIKELY(propRes == vm::ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    104|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 104]
  |  |  ------------------
  ------------------
 2539|       |        // An exception was thrown while retrieving the property, if it is
 2540|       |        // catchable, suppress it. Otherwise, rethrow this exception without
 2541|       |        // trying to invoke any more JavaScript.
 2542|      0|        auto propExHv = runtime_.getThrownValue();
 2543|      0|        runtime_.clearThrownValue();
 2544|       |
 2545|      0|        if (!vm::isUncatchableError(propExHv))
  ------------------
  |  Branch (2545:13): [True: 0, False: 0]
  ------------------
 2546|      0|          return;
 2547|       |
 2548|       |        // An uncatchable error occurred, it is unsafe to do anything that might
 2549|       |        // execute more JavaScript.
 2550|      0|        throw jsi::JSError(
 2551|      0|            valueFromHermesValue(propExHv),
 2552|      0|            "Uncatchable exception thrown while creating error",
 2553|      0|            "No stack");
 2554|      0|      }
 2555|       |
 2556|       |      // If the property is a string, update out. Otherwise ignore it.
 2557|    104|      auto prop = propRes->get();
 2558|    104|      if (prop.isString()) {
  ------------------
  |  Branch (2558:11): [True: 104, False: 0]
  ------------------
 2559|    104|        auto view = vm::StringPrimitive::createStringView(
 2560|    104|            runtime_, runtime_.makeHandle(prop.getString()));
 2561|    104|        out = utf8FromStringView(view);
 2562|    104|      }
 2563|    104|    };
_ZN8facebook6hermes17HermesRuntimeImpl11setDebuggerENSt3__110unique_ptrINS0_8debugger8DebuggerENS2_14default_deleteIS5_EEEE:
  241|    160|  void setDebugger(std::unique_ptr<debugger::Debugger> d) {
  242|    160|    debugger_ = std::move(d);
  243|    160|  }
_ZN8facebook6hermes17HermesRuntimeImplD2Ev:
  232|    160|  ~HermesRuntimeImpl() override {
  233|    160|#ifdef HERMES_ENABLE_DEBUGGER
  234|       |    // Deallocate the debugger so it frees any HermesPointerValues it may hold.
  235|       |    // This must be done before we check hermesValues_ below.
  236|    160|    debugger_.reset();
  237|    160|#endif
  238|    160|  }
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm8WeakRootINS4_8JSObjectEEEED2Ev:
 1018|    160|    ~ManagedValues() {
 1019|    160|      ::hermes::ManagedChunkedList<ManagedValue<T>>::collect();
 1020|    160|      bool empty = true;
 1021|    160|      ::hermes::ManagedChunkedList<ManagedValue<T>>::forEach(
 1022|    160|          [&empty](ManagedValue<T> &element) {
 1023|    160|            element.markDangling();
 1024|    160|            empty = false;
 1025|    160|          });
 1026|    160|      if (!empty) {
  ------------------
  |  Branch (1026:11): [True: 0, False: 160]
  ------------------
 1027|       |        // This is the deliberate memory leak described above.
 1028|      0|        new ::hermes::ManagedChunkedList(std::move(*this));
 1029|      0|      }
 1030|    160|    }
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm17PinnedHermesValueEED2Ev:
 1018|    160|    ~ManagedValues() {
 1019|    160|      ::hermes::ManagedChunkedList<ManagedValue<T>>::collect();
 1020|    160|      bool empty = true;
 1021|    160|      ::hermes::ManagedChunkedList<ManagedValue<T>>::forEach(
 1022|    160|          [&empty](ManagedValue<T> &element) {
 1023|    160|            element.markDangling();
 1024|    160|            empty = false;
 1025|    160|          });
 1026|    160|      if (!empty) {
  ------------------
  |  Branch (1026:11): [True: 0, False: 160]
  ------------------
 1027|       |        // This is the deliberate memory leak described above.
 1028|      0|        new ::hermes::ManagedChunkedList(std::move(*this));
 1029|      0|      }
 1030|    160|    }
_ZN8facebook6hermes17HermesRuntimeImpl3addINS_3jsi6StringEEET_N6hermes2vm11HermesValueE:
  246|   390k|  T add(::hermes::vm::HermesValue hv) {
  247|   390k|    static_assert(
  248|   390k|        std::is_base_of<jsi::Pointer, T>::value, "this type cannot be added");
  249|   390k|    return make<T>(&hermesValues_.add(hv));
  250|   390k|  }
_ZN8facebook6hermes17HermesRuntimeImpl3addINS_3jsi6ObjectEEET_N6hermes2vm11HermesValueE:
  246|    393|  T add(::hermes::vm::HermesValue hv) {
  247|    393|    static_assert(
  248|    393|        std::is_base_of<jsi::Pointer, T>::value, "this type cannot be added");
  249|    393|    return make<T>(&hermesValues_.add(hv));
  250|    393|  }
_ZN8facebook6hermes17HermesRuntimeImpl3addINS_3jsi10PropNameIDEEET_N6hermes2vm11HermesValueE:
  246|   390k|  T add(::hermes::vm::HermesValue hv) {
  247|   390k|    static_assert(
  248|   390k|        std::is_base_of<jsi::Pointer, T>::value, "this type cannot be added");
  249|   390k|    return make<T>(&hermesValues_.add(hv));
  250|   390k|  }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScriptC2ENSt3__110unique_ptrIN6hermes3hbc14BCProviderBaseENS3_14default_deleteIS7_EEEENS5_2vm18RuntimeModuleFlagsENS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
 1440|    114|      : bcProvider_(std::move(bcProvider)),
 1441|    114|        runtimeFlags_(runtimeFlags),
 1442|    114|        sourceURL_(std::move(sourceURL)) {}
_ZN8facebook6hermes17HermesRuntimeImpl8JsiProxyC2ERS1_NSt3__110shared_ptrINS_3jsi10HostObjectEEE:
  728|    160|        : rt_(rt), ho_(ho) {}
_ZN8facebook6hermes17HermesRuntimeImpl8JsiProxy3getEN6hermes2vm8SymbolIDE:
  730|   390k|    vm::CallResult<vm::HermesValue> get(vm::SymbolID id) override {
  731|   390k|      jsi::PropNameID sym =
  732|   390k|          rt_.add<jsi::PropNameID>(vm::HermesValue::encodeSymbolValue(id));
  733|   390k|      jsi::Value ret;
  734|   390k|      try {
  735|   390k|        ret = ho_->get(rt_, sym);
  736|   390k|      }
  737|       |#ifdef HERMESVM_EXCEPTION_ON_OOM
  738|       |      catch (const vm::JSOutOfMemoryError &) {
  739|       |        throw;
  740|       |      }
  741|       |#endif
  742|   390k|      catch (const jsi::JSError &error) {
  743|      0|        return rt_.runtime_.setThrownValue(hvFromValue(error.value()));
  744|      0|      } catch (const std::exception &ex) {
  745|      0|        llvh::SmallVector<llvh::UTF16, 16> buf;
  746|      0|        return rt_.runtime_.raiseError(
  747|      0|            vm::TwineChar16{"Exception in HostObject::get for prop '"} +
  748|      0|            rt_.runtime_.getIdentifierTable().getStringViewForDev(
  749|      0|                rt_.runtime_, id) +
  750|      0|            "': " + rt_.utf16FromErrorWhat(ex, buf));
  751|      0|      } catch (...) {
  752|      0|        return rt_.runtime_.raiseError(
  753|      0|            vm::TwineChar16{"Exception in HostObject::get: for prop '"} +
  754|      0|            rt_.runtime_.getIdentifierTable().getStringViewForDev(
  755|      0|                rt_.runtime_, id) +
  756|      0|            "': <unknown exception>");
  757|      0|      }
  758|       |
  759|   390k|      return hvFromValue(ret);
  760|   390k|    }
_ZN8facebook6hermes17HermesRuntimeImplC2ERKN6hermes2vm13RuntimeConfigE:
  153|    160|      : hermesValues_(runtimeConfig.getGCConfig().getOccupancyTarget()),
  154|    160|        weakHermesValues_(runtimeConfig.getGCConfig().getOccupancyTarget()),
  155|    160|        rt_(::hermes::vm::Runtime::create(runtimeConfig)),
  156|    160|        runtime_(*rt_),
  157|    160|        vmExperimentFlags_(runtimeConfig.getVMExperimentFlags()) {
  158|    160|#ifdef HERMES_ENABLE_DEBUGGER
  159|    160|    compileFlags_.debug = true;
  160|    160|#endif
  161|       |
  162|    160|    switch (runtimeConfig.getCompilationMode()) {
  ------------------
  |  Branch (162:13): [True: 0, False: 160]
  ------------------
  163|    160|      case vm::SmartCompilation:
  ------------------
  |  Branch (163:7): [True: 160, False: 0]
  ------------------
  164|    160|        compileFlags_.lazy = true;
  165|       |        // (Leaves thresholds at default values)
  166|    160|        break;
  167|      0|      case vm::ForceEagerCompilation:
  ------------------
  |  Branch (167:7): [True: 0, False: 160]
  ------------------
  168|      0|        compileFlags_.lazy = false;
  169|      0|        break;
  170|      0|      case vm::ForceLazyCompilation:
  ------------------
  |  Branch (170:7): [True: 0, False: 160]
  ------------------
  171|      0|        compileFlags_.lazy = true;
  172|      0|        compileFlags_.preemptiveFileCompilationThreshold = 0;
  173|      0|        compileFlags_.preemptiveFunctionCompilationThreshold = 0;
  174|      0|        break;
  175|    160|    }
  176|       |
  177|    160|    compileFlags_.enableBlockScoping = runtimeConfig.getEnableBlockScoping();
  178|    160|    compileFlags_.enableGenerator = runtimeConfig.getEnableGenerator();
  179|    160|    compileFlags_.enableES6Classes = runtimeConfig.getES6Class();
  180|    160|    compileFlags_.emitAsyncBreakCheck =
  181|    160|        runtimeConfig.getAsyncBreakCheckInEval();
  182|    160|    runtime_.addCustomRootsFunction(
  183|    160|        [this](vm::GC *, vm::RootAcceptor &acceptor) {
  184|    160|          hermesValues_.forEach([&acceptor](HermesPointerValue &element) {
  185|    160|            acceptor.accept(element.value());
  186|    160|          });
  187|    160|        });
  188|    160|    runtime_.addCustomWeakRootsFunction(
  189|    160|        [this](vm::GC *, vm::WeakRootAcceptor &acceptor) {
  190|    160|          weakHermesValues_.forEach([&acceptor](WeakRefPointerValue &element) {
  191|    160|            acceptor.acceptWeak(element.value());
  192|    160|          });
  193|    160|        });
  194|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
  195|    160|    runtime_.addCustomSnapshotFunction(
  196|    160|        [this](vm::HeapSnapshot &snap) {
  197|    160|          snap.beginNode();
  198|    160|          snap.endNode(
  199|    160|              vm::HeapSnapshot::NodeType::Native,
  200|    160|              "ManagedValues",
  201|    160|              vm::GCBase::IDTracker::reserved(
  202|    160|                  vm::GCBase::IDTracker::ReservedObjectID::JSIHermesValueList),
  203|    160|              hermesValues_.capacity() * sizeof(HermesPointerValue),
  204|    160|              0);
  205|    160|          snap.beginNode();
  206|    160|          snap.endNode(
  207|    160|              vm::HeapSnapshot::NodeType::Native,
  208|    160|              "ManagedValues",
  209|    160|              vm::GCBase::IDTracker::reserved(
  210|    160|                  vm::GCBase::IDTracker::ReservedObjectID::
  211|    160|                      JSIWeakHermesValueList),
  212|    160|              weakHermesValues_.capacity() * sizeof(WeakRefPointerValue),
  213|    160|              0);
  214|    160|        },
  215|    160|        [](vm::HeapSnapshot &snap) {
  216|    160|          snap.addNamedEdge(
  217|    160|              vm::HeapSnapshot::EdgeType::Internal,
  218|    160|              "hermesValues",
  219|    160|              vm::GCBase::IDTracker::reserved(
  220|    160|                  vm::GCBase::IDTracker::ReservedObjectID::JSIHermesValueList));
  221|    160|          snap.addNamedEdge(
  222|    160|              vm::HeapSnapshot::EdgeType::Internal,
  223|    160|              "weakHermesValues",
  224|    160|              vm::GCBase::IDTracker::reserved(
  225|    160|                  vm::GCBase::IDTracker::ReservedObjectID::
  226|    160|                      JSIWeakHermesValueList));
  227|    160|        });
  228|    160|#endif // HERMES_MEMORY_INSTRUMENTATION
  229|    160|  }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_130InstallHermesFatalErrorHandlerC2Ev:
  126|    160|  InstallHermesFatalErrorHandler() {
  127|       |    // The LLVM fatal error handler can only be installed once. Use a Meyer's
  128|       |    // singleton to guarantee it - the static "dummy" is guaranteed by the
  129|       |    // compiler to be initialized no more than once.
  130|    160|    static int dummy = ([]() {
  131|    160|      llvh::install_fatal_error_handler(detail::hermesFatalErrorHandler);
  132|    160|      return 0;
  133|    160|    })();
  134|    160|    (void)dummy;
  135|    160|  }
hermes.cpp:_ZZN8facebook6hermes12_GLOBAL__N_130InstallHermesFatalErrorHandlerC1EvENKUlvE_clEv:
  130|      1|    static int dummy = ([]() {
  131|      1|      llvh::install_fatal_error_handler(detail::hermesFatalErrorHandler);
  132|      1|      return 0;
  133|      1|    })();
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm17PinnedHermesValueEEC2Ed:
 1006|    160|        : ::hermes::ManagedChunkedList<ManagedValue<T>>(
 1007|    160|              occupancyRatio,
 1008|    160|              kSizingWeight_) {}
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm8WeakRootINS4_8JSObjectEEEEC2Ed:
 1006|    160|        : ::hermes::ManagedChunkedList<ManagedValue<T>>(
 1007|    160|              occupancyRatio,
 1008|    160|              kSizingWeight_) {}
_ZZN8facebook6hermes17HermesRuntimeImplC1ERKN6hermes2vm13RuntimeConfigEENKUlPNS3_7HadesGCERNS3_12RootAcceptorEE_clES8_SA_:
  183|    339|        [this](vm::GC *, vm::RootAcceptor &acceptor) {
  184|    339|          hermesValues_.forEach([&acceptor](HermesPointerValue &element) {
  185|    339|            acceptor.accept(element.value());
  186|    339|          });
  187|    339|        });
_ZZZN8facebook6hermes17HermesRuntimeImplC1ERKN6hermes2vm13RuntimeConfigEENKUlPNS3_7HadesGCERNS3_12RootAcceptorEE_clES8_SA_ENKUlRNS1_12ManagedValueINS3_17PinnedHermesValueEEEE_clESF_:
  184|     15|          hermesValues_.forEach([&acceptor](HermesPointerValue &element) {
  185|     15|            acceptor.accept(element.value());
  186|     15|          });
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE5valueEv:
  930|     15|    T &value() {
  931|     15|      assert(!isFree() && "Value not present");
  932|     15|      return value_;
  933|     15|    }
_ZZN8facebook6hermes17HermesRuntimeImplC1ERKN6hermes2vm13RuntimeConfigEENKUlPNS3_7HadesGCERNS3_16WeakRootAcceptorEE_clES8_SA_:
  189|    339|        [this](vm::GC *, vm::WeakRootAcceptor &acceptor) {
  190|    339|          weakHermesValues_.forEach([&acceptor](WeakRefPointerValue &element) {
  191|    339|            acceptor.acceptWeak(element.value());
  192|    339|          });
  193|    339|        });

_ZN8facebook6hermes13HermesRuntimeC2Ev:
  226|    160|  HermesRuntime() = default;

_ZN8facebook3jsi15InstrumentationD2Ev:
   34|    160|  virtual ~Instrumentation() = default;

_ZNK8facebook3jsi6Object11setPropertyIS1_EEvRNS0_7RuntimeEPKcOT_:
  118|    160|void Object::setProperty(Runtime& runtime, const char* name, T&& value) const {
  119|    160|  setProperty(
  120|    160|      runtime, String::createFromAscii(runtime, name), std::forward<T>(value));
  121|    160|}
_ZNK8facebook3jsi6Object11setPropertyIS1_EEvRNS0_7RuntimeERKNS0_6StringEOT_:
  125|    160|    const {
  126|    160|  setPropertyValue(
  127|    160|      runtime, name, detail::toValue(runtime, std::forward<T>(value)));
  128|    160|}
_ZN8facebook3jsi6detail7toValueINS0_6ObjectEEENS0_5ValueERNS0_7RuntimeERKT_:
   36|    160|inline Value toValue(Runtime& runtime, const T& other) {
   37|    160|  static_assert(
   38|    160|      std::is_base_of<Pointer, T>::value,
   39|    160|      "This type cannot be converted to Value");
   40|    160|  return Value(runtime, other);
   41|    160|}
_ZN8facebook3jsi7Runtime15getPointerValueERKNS0_7PointerE:
   78|    640|    const jsi::Pointer& pointer) {
   79|    640|  return pointer.ptr_;
   80|    640|}
_ZN8facebook3jsi7Runtime15getPointerValueERKNS0_5ValueE:
   83|   781k|    const jsi::Value& value) {
   84|   781k|  return value.data_.pointer.ptr_;
   85|   781k|}
_ZN8facebook3jsi7Runtime4makeINS0_6StringEEET_PNS1_12PointerValueE:
   69|   390k|inline T Runtime::make(Runtime::PointerValue* pv) {
   70|   390k|  return T(pv);
   71|   390k|}
_ZN8facebook3jsi7Runtime4makeINS0_6ObjectEEET_PNS1_12PointerValueE:
   69|    393|inline T Runtime::make(Runtime::PointerValue* pv) {
   70|    393|  return T(pv);
   71|    393|}
_ZN8facebook3jsi7Runtime4makeINS0_10PropNameIDEEET_PNS1_12PointerValueE:
   69|   390k|inline T Runtime::make(Runtime::PointerValue* pv) {
   70|   390k|  return T(pv);
   71|   390k|}

_ZN8facebook3jsi6BufferD2Ev:
  207|    315|Buffer::~Buffer() = default;
_ZN8facebook3jsi18PreparedJavaScriptD2Ev:
  211|    114|PreparedJavaScript::~PreparedJavaScript() = default;
_ZN8facebook3jsi10HostObjectD2Ev:
  224|    160|HostObject::~HostObject() {}
_ZN8facebook3jsi7RuntimeD2Ev:
  228|    160|Runtime::~Runtime() {}
_ZN8facebook3jsi5ValueC2EOS1_:
  431|   390k|Value::Value(Value&& other) noexcept : Value(other.kind_) {
  432|   390k|  if (kind_ == BooleanKind) {
  ------------------
  |  Branch (432:7): [True: 0, False: 390k]
  ------------------
  433|      0|    data_.boolean = other.data_.boolean;
  434|   390k|  } else if (kind_ == NumberKind) {
  ------------------
  |  Branch (434:14): [True: 0, False: 390k]
  ------------------
  435|      0|    data_.number = other.data_.number;
  436|   390k|  } else if (kind_ >= PointerKind) {
  ------------------
  |  Branch (436:14): [True: 390k, False: 0]
  ------------------
  437|   390k|    new (&data_.pointer) Pointer(std::move(other.data_.pointer));
  438|   390k|  }
  439|       |  // when the other's dtor runs, nothing will happen.
  440|   390k|  other.kind_ = UndefinedKind;
  441|   390k|}
_ZN8facebook3jsi5ValueD2Ev:
  462|  1.17M|Value::~Value() {
  463|  1.17M|  if (kind_ >= PointerKind) {
  ------------------
  |  Branch (463:7): [True: 391k, False: 781k]
  ------------------
  464|   391k|    data_.pointer.~Pointer();
  465|   391k|  }
  466|  1.17M|}
_ZN8facebook3jsi7JSErrorC2EONS0_5ValueENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEESA_:
  664|     52|    : JSIException(message + "\n\n" + stack),
  665|     52|      value_(std::make_shared<Value>(std::move(value))),
  666|     52|      message_(std::move(message)),
  667|     52|      stack_(std::move(stack)) {}
_ZN8facebook3jsi12JSIExceptionD2Ev:
  737|     98|JSIException::~JSIException() {}
_ZN8facebook3jsi7JSErrorD2Ev:
  741|     52|JSError::~JSError() {}

_ZN8facebook3jsi6Object20createFromHostObjectERNS0_7RuntimeENSt3__110shared_ptrINS0_10HostObjectEEE:
  787|    160|      std::shared_ptr<HostObject> ho) {
  788|    160|    return runtime.createObject(ho);
  789|    160|  }
_ZN8facebook3jsi7PointerD2Ev:
  463|  1.17M|  ~Pointer() {
  464|  1.17M|    if (ptr_) {
  ------------------
  |  Branch (464:9): [True: 782k, False: 390k]
  ------------------
  465|   782k|      ptr_->invalidate();
  466|   782k|    }
  467|  1.17M|  }
_ZN8facebook3jsi6String15createFromAsciiERNS0_7RuntimeEPKc:
  695|   390k|  static String createFromAscii(Runtime& runtime, const char* str) {
  696|   390k|    return createFromAscii(runtime, str, strlen(str));
  697|   390k|  }
_ZN8facebook3jsi6String15createFromAsciiERNS0_7RuntimeEPKcm:
  689|   390k|  createFromAscii(Runtime& runtime, const char* str, size_t length) {
  690|   390k|    return runtime.createStringFromAscii(str, length);
  691|   390k|  }
_ZN8facebook3jsi5ValueC2INS0_6StringEvEEOT_:
 1267|   390k|  /* implicit */ Value(T&& other) : Value(kindOf(other)) {
 1268|   390k|    new (&data_.pointer) T(std::move(other));
 1269|   390k|  }
_ZN8facebook3jsi5Value6kindOfERKNS0_6StringE:
 1515|   390k|  constexpr static ValueKind kindOf(const String&) {
 1516|   390k|    return StringKind;
 1517|   390k|  }
_ZN8facebook3jsi5ValueC2ENS1_9ValueKindE:
 1507|  1.17M|  Value(ValueKind kind) : kind_(kind) {}
_ZN8facebook3jsi5Value4DataC2Ev:
 1493|  1.17M|    Data() {
 1494|  1.17M|      static_assert(
 1495|  1.17M|          sizeof(Data) == sizeof(uint64_t),
 1496|  1.17M|          "Value data should fit in a 64-bit register");
 1497|  1.17M|    }
_ZN8facebook3jsi6StringC2EOS1_:
  683|   390k|  String(String&& other) = default;
_ZN8facebook3jsi7PointerC2EOS1_:
  459|   781k|  explicit Pointer(Pointer&& other) noexcept : ptr_(other.ptr_) {
  460|   781k|    other.ptr_ = nullptr;
  461|   781k|  }
_ZNK8facebook3jsi6Object16setPropertyValueERNS0_7RuntimeERKNS0_6StringERKNS0_5ValueE:
  991|    160|      const Value& value) const {
  992|    160|    return runtime.setPropertyValue(*this, name, value);
  993|    160|  }
_ZN8facebook3jsi5ValueC2ERNS0_7RuntimeERKNS0_6ObjectE:
 1298|    160|  Value(Runtime& runtime, const Object& obj) : Value(ObjectKind) {
 1299|    160|    new (&data_.pointer) Object(runtime.cloneObject(obj.ptr_));
 1300|    160|  }
_ZN8facebook3jsi7PointerC2EPNS0_7Runtime12PointerValueE:
  474|   782k|  explicit Pointer(Runtime::PointerValue* ptr) : ptr_(ptr) {}
_ZN8facebook3jsi12StringBufferC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
   47|    315|  StringBuffer(std::string s) : s_(std::move(s)) {}
_ZNK8facebook3jsi12StringBuffer4sizeEv:
   48|    475|  size_t size() const override {
   49|    475|    return s_.size();
   50|    475|  }
_ZNK8facebook3jsi12StringBuffer4dataEv:
   51|    475|  const uint8_t* data() const override {
   52|    475|    return reinterpret_cast<const uint8_t*>(s_.data());
   53|    475|  }
_ZN8facebook3jsi5ValueC2Ev:
 1239|   390k|  Value() noexcept : Value(UndefinedKind) {}
_ZN8facebook3jsi5ValueC2Ed:
 1250|      7|  /* implicit */ Value(double d) : Value(NumberKind) {
 1251|      7|    data_.number = d;
 1252|      7|  }
_ZN8facebook3jsi5Value9undefinedEv:
 1316|     17|  static Value undefined() {
 1317|     17|    return Value();
 1318|     17|  }
_ZN8facebook3jsi5ValueaSEOS1_:
 1335|   390k|  Value& operator=(Value&& other) noexcept {
 1336|   390k|    this->~Value();
 1337|   390k|    new (this) Value(std::move(other));
 1338|   390k|    return *this;
 1339|   390k|  }
_ZNK8facebook3jsi5Value11isUndefinedEv:
 1341|   390k|  bool isUndefined() const {
 1342|   390k|    return kind_ == UndefinedKind;
 1343|   390k|  }
_ZNK8facebook3jsi5Value6isNullEv:
 1345|   390k|  bool isNull() const {
 1346|   390k|    return kind_ == NullKind;
 1347|   390k|  }
_ZNK8facebook3jsi5Value6isBoolEv:
 1349|   390k|  bool isBool() const {
 1350|   390k|    return kind_ == BooleanKind;
 1351|   390k|  }
_ZNK8facebook3jsi5Value8isNumberEv:
 1353|   390k|  bool isNumber() const {
 1354|   390k|    return kind_ == NumberKind;
 1355|   390k|  }
_ZNK8facebook3jsi5Value8isStringEv:
 1357|   390k|  bool isString() const {
 1358|   390k|    return kind_ == StringKind;
 1359|   390k|  }
_ZNK8facebook3jsi5Value8isBigIntEv:
 1361|   390k|  bool isBigInt() const {
 1362|   390k|    return kind_ == BigIntKind;
 1363|   390k|  }
_ZNK8facebook3jsi5Value8isSymbolEv:
 1365|   390k|  bool isSymbol() const {
 1366|   390k|    return kind_ == SymbolKind;
 1367|   390k|  }
_ZNK8facebook3jsi5Value8isObjectEv:
 1369|    212|  bool isObject() const {
 1370|    212|    return kind_ == ObjectKind;
 1371|    212|  }
_ZN8facebook3jsi5Value4DataD2Ev:
 1498|  1.17M|    ~Data() {}
_ZN8facebook3jsi5Value6kindOfERKNS0_6ObjectE:
 1518|     73|  constexpr static ValueKind kindOf(const Object&) {
 1519|     73|    return ObjectKind;
 1520|     73|  }
_ZN8facebook3jsi12JSIExceptionC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1574|     98|  JSIException(std::string what) : what_(std::move(what)) {}
_ZN8facebook3jsi18JSINativeExceptionC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1593|     46|  JSINativeException(std::string what) : JSIException(std::move(what)) {}
_ZN8facebook3jsi7Runtime12PointerValueD2Ev:
  294|   715k|    virtual ~PointerValue() = default;
_ZN8facebook3jsi5ValueC2INS0_6ObjectEvEEOT_:
 1267|     73|  /* implicit */ Value(T&& other) : Value(kindOf(other)) {
 1268|     73|    new (&data_.pointer) T(std::move(other));
 1269|     73|  }
_ZN8facebook3jsi6ObjectC2EOS1_:
  779|     73|  Object(Object&& other) = default;
_ZN8facebook3jsi18PreparedJavaScriptC2Ev:
   77|    114|  PreparedJavaScript() = default;

dtoa_alloc_init:
  590|  21.3k|dtoa_alloc *dtoa_alloc_init(void *mem, int bytelen) {
  591|  21.3k|	dtoa_alloc *dalloc = (dtoa_alloc *)mem;
  592|  21.3k|	int pmem_len = (bytelen - sizeof(dtoa_alloc)) / sizeof(double) + 1;
  593|  21.3k|	assert(pmem_len > 0 && "dtoa_alloc_init bytelen is too small");
  594|  21.3k|	dalloc_init(dalloc, pmem_len);
  595|  21.3k|	return dalloc;
  596|  21.3k|}
dtoa_alloc_done:
  598|  21.3k|void dtoa_alloc_done(dtoa_alloc *dalloc) {
  599|  21.3k|	dalloc_done(dalloc);
  600|  21.3k|}
hermes_g_strtod:
 3622|  43.4k|{
 3623|  43.4k|	DECL_DALLOC(dalloc, PRIVATE_mem);
  ------------------
  |  |  554|  43.4k|	struct { \
  |  |  555|  43.4k|		dtoa_alloc h; \
  |  |  556|  43.4k|		double mem[(len)-1]; \
  |  |  557|  43.4k|	} name
  ------------------
 3624|  43.4k|	dalloc_init(&dalloc.h, PRIVATE_mem);
  ------------------
  |  |  230|  43.4k|#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
  |  |  ------------------
  |  |  |  |  228|  43.4k|#define PRIVATE_MEM 2304
  |  |  ------------------
  ------------------
 3625|  43.4k|	double res = _hermes_g_strtod(&dalloc.h, s00, se);
 3626|  43.4k|	dalloc_done(&dalloc.h);
 3627|  43.4k|	return res;
 3628|  43.4k|}
g_freedtoa:
 3685|  21.3k|{
 3686|  21.3k|	Bigint *b = (Bigint *)((int *)s - 1);
 3687|  21.3k|	b->maxwds = 1 << (b->k = *(int*)b);
 3688|  21.3k|	Bfree(dalloc, b);
 3689|       |#ifndef MULTIPLE_THREADS
 3690|       |	if (s == dtoa_result)
 3691|       |		dtoa_result = 0;
 3692|       |#endif
 3693|  21.3k|	}
dtoa.c:dalloc_init:
  559|  64.8k|static void dalloc_init(dtoa_alloc *dalloc, int pmem_len) {
  560|  64.8k|	memset(dalloc, 0, sizeof(dtoa_alloc));
  561|  64.8k|	dalloc->pmem_len = pmem_len;
  562|  64.8k|	dalloc->pmem_next = dalloc->private_mem;
  563|  64.8k|}
dtoa.c:dalloc_done:
  565|  64.8k|static void dalloc_done(dtoa_alloc *dalloc) {
  566|  64.8k|	char *pmem, *pmem_end;
  567|       |
  568|  64.8k|	if (!dalloc->used_heap)
  ------------------
  |  Branch (568:6): [True: 64.8k, False: 0]
  ------------------
  569|  64.8k|		return;
  570|       |
  571|      0|	pmem = (char *)dalloc->private_mem;
  572|      0|	pmem_end = (char *)(dalloc->private_mem + dalloc->pmem_len);
  573|       |
  574|      0|	for(int i = 0; i < Kmax+1; ++i) {
  ------------------
  |  |  527|      0|#define Kmax 7
  ------------------
  |  Branch (574:17): [True: 0, False: 0]
  ------------------
  575|      0|		Bigint *p = dalloc->freelist[i];
  576|      0|		while (p) {
  ------------------
  |  Branch (576:10): [True: 0, False: 0]
  ------------------
  577|      0|			char *tf = (char *)p;
  578|      0|			p = p->next;
  579|      0|			if (tf >= pmem && tf < pmem_end)
  ------------------
  |  Branch (579:8): [True: 0, False: 0]
  |  Branch (579:22): [True: 0, False: 0]
  ------------------
  580|      0|				continue;
  581|       |#ifdef FREE
  582|       |			FREE((void*)tf);
  583|       |#else
  584|      0|			free((void*)tf);
  585|      0|#endif
  586|      0|		}
  587|      0|	}
  588|      0|}
dtoa.c:_hermes_g_strtod:
 2548|  43.4k|{
 2549|  43.4k|	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;
 2550|  43.4k|	int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign;
 2551|  43.4k|	CONST char *s, *s0, *s1;
  ------------------
  |  |  298|  43.4k|#define CONST const
  ------------------
 2552|  43.4k|	double aadj, aadj1;
 2553|  43.4k|	Long L;
 2554|  43.4k|	ULong UL;
 2555|  43.4k|	U aadj2, adj, rv, rv0;
 2556|  43.4k|	ULong y, z;
 2557|  43.4k|	BCinfo bc;
 2558|  43.4k|	Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
 2559|  43.4k|#ifdef Avoid_Underflow
 2560|  43.4k|	ULong Lsb, Lsb1;
 2561|  43.4k|#endif
 2562|       |#ifdef SET_INEXACT
 2563|       |	int oldinexact;
 2564|       |#endif
 2565|  43.4k|#ifndef NO_STRTOD_BIGCOMP
 2566|  43.4k|	int req_bigcomp = 0;
 2567|  43.4k|#endif
 2568|       |#ifdef Honor_FLT_ROUNDS /*{*/
 2569|       |#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
 2570|       |	bc.rounding = Flt_Rounds;
 2571|       |#else /*}{*/
 2572|       |	bc.rounding = 1;
 2573|       |	switch(fegetround()) {
 2574|       |	  case FE_TOWARDZERO:	bc.rounding = 0; break;
 2575|       |	  case FE_UPWARD:	bc.rounding = 2; break;
 2576|       |	  case FE_DOWNWARD:	bc.rounding = 3;
 2577|       |	  }
 2578|       |#endif /*}}*/
 2579|       |#endif /*}*/
 2580|       |#ifdef USE_LOCALE
 2581|       |	CONST char *s2;
 2582|       |#endif
 2583|       |
 2584|  43.4k|	sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;
 2585|  43.4k|	dval(&rv) = 0.;
  ------------------
  |  |  315|  43.4k|#define dval(x) (x)->d
  ------------------
 2586|  43.4k|	for(s = s00;;s++) switch(*s) {
 2587|     18|		case '-':
  ------------------
  |  Branch (2587:3): [True: 18, False: 43.4k]
  ------------------
 2588|     18|			sign = 1;
 2589|     18|			FALLTHROUGH;
  ------------------
  |  |  182|     18|    #define FALLTHROUGH __attribute__ ((fallthrough))
  ------------------
 2590|     18|		case '+':
  ------------------
  |  Branch (2590:3): [True: 0, False: 43.4k]
  ------------------
 2591|     18|			if (*++s)
  ------------------
  |  Branch (2591:8): [True: 18, False: 0]
  ------------------
 2592|     18|				goto break2;
 2593|      0|			FALLTHROUGH;
  ------------------
  |  |  182|      0|    #define FALLTHROUGH __attribute__ ((fallthrough))
  ------------------
 2594|      0|		case 0:
  ------------------
  |  Branch (2594:3): [True: 0, False: 43.4k]
  ------------------
 2595|      0|			goto ret0;
 2596|      0|		case '\t':
  ------------------
  |  Branch (2596:3): [True: 0, False: 43.4k]
  ------------------
 2597|      0|		case '\n':
  ------------------
  |  Branch (2597:3): [True: 0, False: 43.4k]
  ------------------
 2598|      0|		case '\v':
  ------------------
  |  Branch (2598:3): [True: 0, False: 43.4k]
  ------------------
 2599|      0|		case '\f':
  ------------------
  |  Branch (2599:3): [True: 0, False: 43.4k]
  ------------------
 2600|      0|		case '\r':
  ------------------
  |  Branch (2600:3): [True: 0, False: 43.4k]
  ------------------
 2601|      0|		case ' ':
  ------------------
  |  Branch (2601:3): [True: 0, False: 43.4k]
  ------------------
 2602|      0|			continue;
 2603|  43.4k|		default:
  ------------------
  |  Branch (2603:3): [True: 43.4k, False: 18]
  ------------------
 2604|  43.4k|			goto break2;
 2605|  43.4k|		}
 2606|  43.4k| break2:
 2607|  43.4k|	if (*s == '0') {
  ------------------
  |  Branch (2607:6): [True: 197, False: 43.2k]
  ------------------
 2608|       |#ifndef NO_HEX_FP /*{*/
 2609|       |		switch(s[1]) {
 2610|       |		  case 'x':
 2611|       |		  case 'X':
 2612|       |#ifdef Honor_FLT_ROUNDS
 2613|       |			gethex(&s, &rv, bc.rounding, sign);
 2614|       |#else
 2615|       |			gethex(&s, &rv, 1, sign);
 2616|       |#endif
 2617|       |			goto ret;
 2618|       |		  }
 2619|       |#endif /*}*/
 2620|    197|		nz0 = 1;
 2621|    197|		while(*++s == '0') ;
  ------------------
  |  Branch (2621:9): [True: 0, False: 197]
  ------------------
 2622|    197|		if (!*s)
  ------------------
  |  Branch (2622:7): [True: 0, False: 197]
  ------------------
 2623|      0|			goto ret;
 2624|    197|		}
 2625|  43.4k|	s0 = s;
 2626|  43.4k|	y = z = 0;
 2627|   828k|	for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
  ------------------
  |  Branch (2627:19): [True: 785k, False: 43.4k]
  |  Branch (2627:38): [True: 785k, False: 0]
  ------------------
 2628|   785k|		if (nd < 9)
  ------------------
  |  Branch (2628:7): [True: 388k, False: 396k]
  ------------------
 2629|   388k|			y = 10*y + c - '0';
 2630|   396k|		else if (nd < DBL_DIG + 2)
  ------------------
  |  Branch (2630:12): [True: 342k, False: 53.4k]
  ------------------
 2631|   342k|			z = 10*z + c - '0';
 2632|  43.4k|	nd0 = nd;
 2633|  43.4k|	bc.dp0 = bc.dp1 = s - s0;
 2634|  44.6k|	for(s1 = s; s1 > s0 && *--s1 == '0'; )
  ------------------
  |  Branch (2634:14): [True: 44.4k, False: 215]
  |  Branch (2634:25): [True: 1.23k, False: 43.2k]
  ------------------
 2635|  1.23k|		++nz1;
 2636|       |#ifdef USE_LOCALE
 2637|       |	s1 = localeconv()->decimal_point;
 2638|       |	if (c == *s1) {
 2639|       |		c = '.';
 2640|       |		if (*++s1) {
 2641|       |			s2 = s;
 2642|       |			for(;;) {
 2643|       |				if (*++s2 != *s1) {
 2644|       |					c = 0;
 2645|       |					break;
 2646|       |					}
 2647|       |				if (!*++s1) {
 2648|       |					s = s2;
 2649|       |					break;
 2650|       |					}
 2651|       |				}
 2652|       |			}
 2653|       |		}
 2654|       |#endif
 2655|  43.4k|	if (c == '.') {
  ------------------
  |  Branch (2655:6): [True: 207, False: 43.2k]
  ------------------
 2656|    207|		c = *++s;
 2657|    207|		bc.dp1 = s - s0;
 2658|    207|		bc.dplen = bc.dp1 - bc.dp0;
 2659|    207|		if (!nd) {
  ------------------
  |  Branch (2659:7): [True: 197, False: 10]
  ------------------
 2660|  2.15M|			for(; c == '0'; c = *++s)
  ------------------
  |  Branch (2660:10): [True: 2.15M, False: 197]
  ------------------
 2661|  2.15M|				nz++;
 2662|    197|			if (c > '0' && c <= '9') {
  ------------------
  |  Branch (2662:8): [True: 10, False: 187]
  |  Branch (2662:19): [True: 10, False: 0]
  ------------------
 2663|     10|				bc.dp0 = s0 - s;
 2664|     10|				bc.dp1 = bc.dp0 + bc.dplen;
 2665|     10|				s0 = s;
 2666|     10|				nf += nz;
 2667|     10|				nz = 0;
 2668|     10|				goto have_dig;
 2669|     10|				}
 2670|    187|			goto dig_done;
 2671|    197|			}
 2672|  3.63M|		for(; c >= '0' && c <= '9'; c = *++s) {
  ------------------
  |  Branch (2672:9): [True: 3.63M, False: 12]
  |  Branch (2672:21): [True: 3.63M, False: 8]
  ------------------
 2673|  3.63M| have_dig:
 2674|  3.63M|			nz++;
 2675|  3.63M|			if (c -= '0') {
  ------------------
  |  Branch (2675:8): [True: 42.5k, False: 3.58M]
  ------------------
 2676|  42.5k|				nf += nz;
 2677|  2.29M|				for(i = 1; i < nz; i++)
  ------------------
  |  Branch (2677:16): [True: 2.25M, False: 42.5k]
  ------------------
 2678|  2.25M|					if (nd++ < 9)
  ------------------
  |  Branch (2678:10): [True: 3, False: 2.25M]
  ------------------
 2679|      3|						y *= 10;
 2680|  2.25M|					else if (nd <= DBL_DIG + 2)
  ------------------
  |  Branch (2680:15): [True: 0, False: 2.25M]
  ------------------
 2681|      0|						z *= 10;
 2682|  42.5k|				if (nd++ < 9)
  ------------------
  |  Branch (2682:9): [True: 77, False: 42.4k]
  ------------------
 2683|     77|					y = 10*y + c;
 2684|  42.4k|				else if (nd <= DBL_DIG + 2)
  ------------------
  |  Branch (2684:14): [True: 48, False: 42.4k]
  ------------------
 2685|     48|					z = 10*z + c;
 2686|  42.5k|				nz = nz1 = 0;
 2687|  42.5k|				}
 2688|  3.63M|			}
 2689|     10|		}
 2690|  43.4k| dig_done:
 2691|  43.4k|	e = 0;
 2692|  43.4k|	if (c == 'e' || c == 'E') {
  ------------------
  |  Branch (2692:6): [True: 8, False: 43.4k]
  |  Branch (2692:18): [True: 0, False: 43.4k]
  ------------------
 2693|      8|		if (!nd && !nz && !nz0) {
  ------------------
  |  Branch (2693:7): [True: 0, False: 8]
  |  Branch (2693:14): [True: 0, False: 0]
  |  Branch (2693:21): [True: 0, False: 0]
  ------------------
 2694|      0|			goto ret0;
 2695|      0|			}
 2696|      8|		s00 = s;
 2697|      8|		esign = 0;
 2698|      8|		switch(c = *++s) {
  ------------------
  |  Branch (2698:10): [True: 0, False: 8]
  ------------------
 2699|      4|			case '-':
  ------------------
  |  Branch (2699:4): [True: 4, False: 4]
  ------------------
 2700|      4|				esign = 1;
 2701|      4|				FALLTHROUGH;
  ------------------
  |  |  182|      4|    #define FALLTHROUGH __attribute__ ((fallthrough))
  ------------------
 2702|      8|			case '+':
  ------------------
  |  Branch (2702:4): [True: 4, False: 4]
  ------------------
 2703|      8|				c = *++s;
 2704|      8|			}
 2705|      8|		if (c >= '0' && c <= '9') {
  ------------------
  |  Branch (2705:7): [True: 8, False: 0]
  |  Branch (2705:19): [True: 8, False: 0]
  ------------------
 2706|      8|			while(c == '0')
  ------------------
  |  Branch (2706:10): [True: 0, False: 8]
  ------------------
 2707|      0|				c = *++s;
 2708|      8|			if (c > '0' && c <= '9') {
  ------------------
  |  Branch (2708:8): [True: 8, False: 0]
  |  Branch (2708:19): [True: 8, False: 0]
  ------------------
 2709|      8|				UL = c - '0';
 2710|      8|				s1 = s;
 2711|     69|				while((c = *++s) >= '0' && c <= '9')
  ------------------
  |  Branch (2711:11): [True: 61, False: 8]
  |  Branch (2711:32): [True: 61, False: 0]
  ------------------
 2712|     61|					UL = 10*UL + c - '0';
 2713|      8|				if (s - s1 > 8 || UL > 19999)
  ------------------
  |  Branch (2713:9): [True: 6, False: 2]
  |  Branch (2713:23): [True: 1, False: 1]
  ------------------
 2714|       |					/* Avoid confusion from exponents
 2715|       |					 * so large that e might overflow.
 2716|       |					 */
 2717|      7|					e = 19999; /* safe for 16 bit ints */
 2718|      1|				else
 2719|      1|					e = (int)UL;
 2720|      8|				if (esign)
  ------------------
  |  Branch (2720:9): [True: 4, False: 4]
  ------------------
 2721|      4|					e = -e;
 2722|      8|				}
 2723|      0|			else
 2724|      0|				e = 0;
 2725|      8|			}
 2726|      0|		else
 2727|      0|			s = s00;
 2728|      8|		}
 2729|  43.4k|	if (!nd) {
  ------------------
  |  Branch (2729:6): [True: 205, False: 43.2k]
  ------------------
 2730|    205|		if (!nz && !nz0) {
  ------------------
  |  Branch (2730:7): [True: 18, False: 187]
  |  Branch (2730:14): [True: 18, False: 0]
  ------------------
 2731|       |#ifdef INFNAN_CHECK
 2732|       |			/* Check for Nan and Infinity */
 2733|       |			if (!bc.dplen)
 2734|       |			 switch(c) {
 2735|       |			  case 'i':
 2736|       |			  case 'I':
 2737|       |				if (match(&s,"nf")) {
 2738|       |					--s;
 2739|       |					if (!match(&s,"inity"))
 2740|       |						++s;
 2741|       |					word0(&rv) = 0x7ff00000;
 2742|       |					word1(&rv) = 0;
 2743|       |					goto ret;
 2744|       |					}
 2745|       |				break;
 2746|       |			  case 'n':
 2747|       |			  case 'N':
 2748|       |				if (match(&s, "an")) {
 2749|       |					word0(&rv) = NAN_WORD0;
 2750|       |					word1(&rv) = NAN_WORD1;
 2751|       |#ifndef No_Hex_NaN
 2752|       |					if (*s == '(') /*)*/
 2753|       |						hexnan(&rv, &s);
 2754|       |#endif
 2755|       |					goto ret;
 2756|       |					}
 2757|       |			  }
 2758|       |#endif /* INFNAN_CHECK */
 2759|     18| ret0:
 2760|     18|			s = s00;
 2761|     18|			sign = 0;
 2762|     18|			}
 2763|    205|		goto ret;
 2764|    205|		}
 2765|  43.2k|	bc.e0 = e1 = e -= nf;
 2766|       |
 2767|       |	/* Now we have nd0 digits, starting at s0, followed by a
 2768|       |	 * decimal point, followed by nd-nd0 digits.  The number we're
 2769|       |	 * after is the integer represented by those digits times
 2770|       |	 * 10**e */
 2771|       |
 2772|  43.2k|	if (!nd0)
  ------------------
  |  Branch (2772:6): [True: 10, False: 43.2k]
  ------------------
 2773|     10|		nd0 = nd;
 2774|  43.2k|	k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2;
  ------------------
  |  Branch (2774:6): [True: 1.01k, False: 42.2k]
  ------------------
 2775|  43.2k|	dval(&rv) = y;
  ------------------
  |  |  315|  43.2k|#define dval(x) (x)->d
  ------------------
 2776|  43.2k|	if (k > 9) {
  ------------------
  |  Branch (2776:6): [True: 43.2k, False: 14]
  ------------------
 2777|       |#ifdef SET_INEXACT
 2778|       |		if (k > DBL_DIG)
 2779|       |			oldinexact = get_inexact();
 2780|       |#endif
 2781|  43.2k|		dval(&rv) = tens[k - 9] * dval(&rv) + z;
  ------------------
  |  |  315|  43.2k|#define dval(x) (x)->d
  ------------------
              		dval(&rv) = tens[k - 9] * dval(&rv) + z;
  ------------------
  |  |  315|  43.2k|#define dval(x) (x)->d
  ------------------
 2782|  43.2k|		}
 2783|  43.2k|	bd0 = 0;
 2784|  43.2k|	if (nd <= DBL_DIG
  ------------------
  |  Branch (2784:6): [True: 728, False: 42.4k]
  ------------------
 2785|  43.2k|#ifndef RND_PRODQUOT
 2786|  43.2k|#ifndef Honor_FLT_ROUNDS
 2787|  43.2k|		&& Flt_Rounds == 1
  ------------------
  |  |  381|    728|#define Flt_Rounds FLT_ROUNDS
  ------------------
  |  Branch (2787:6): [True: 728, False: 0]
  ------------------
 2788|  43.2k|#endif
 2789|  43.2k|#endif
 2790|  43.2k|			) {
 2791|    728|		if (!e)
  ------------------
  |  Branch (2791:7): [True: 715, False: 13]
  ------------------
 2792|    715|			goto ret;
 2793|     13|#ifndef ROUND_BIASED_without_Round_Up
 2794|     13|		if (e > 0) {
  ------------------
  |  Branch (2794:7): [True: 3, False: 10]
  ------------------
 2795|      3|			if (e <= Ten_pmax) {
  ------------------
  |  |  361|      3|#define Ten_pmax 22
  ------------------
  |  Branch (2795:8): [True: 0, False: 3]
  ------------------
 2796|       |#ifdef VAX
 2797|       |				goto vax_ovfl_check;
 2798|       |#else
 2799|       |#ifdef Honor_FLT_ROUNDS
 2800|       |				/* round correctly FLT_ROUNDS = 2 or 3 */
 2801|       |				if (sign) {
 2802|       |					rv.d = -rv.d;
 2803|       |					sign = 0;
 2804|       |					}
 2805|       |#endif
 2806|      0|				/* rv = */ rounded_product(dval(&rv), tens[e]);
  ------------------
  |  |  479|      0|#define rounded_product(a,b) a *= b
  ------------------
 2807|      0|				goto ret;
 2808|      0|#endif
 2809|      0|				}
 2810|      3|			i = DBL_DIG - nd;
 2811|      3|			if (e <= Ten_pmax + i) {
  ------------------
  |  |  361|      3|#define Ten_pmax 22
  ------------------
  |  Branch (2811:8): [True: 0, False: 3]
  ------------------
 2812|       |				/* A fancier test would sometimes let us do
 2813|       |				 * this for larger i values.
 2814|       |				 */
 2815|       |#ifdef Honor_FLT_ROUNDS
 2816|       |				/* round correctly FLT_ROUNDS = 2 or 3 */
 2817|       |				if (sign) {
 2818|       |					rv.d = -rv.d;
 2819|       |					sign = 0;
 2820|       |					}
 2821|       |#endif
 2822|      0|				e -= i;
 2823|      0|				dval(&rv) *= tens[i];
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 2824|       |#ifdef VAX
 2825|       |				/* VAX exponent range is so narrow we must
 2826|       |				 * worry about overflow here...
 2827|       |				 */
 2828|       | vax_ovfl_check:
 2829|       |				word0(&rv) -= P*Exp_msk1;
 2830|       |				/* rv = */ rounded_product(dval(&rv), tens[e]);
 2831|       |				if ((word0(&rv) & Exp_mask)
 2832|       |				 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
 2833|       |					goto ovfl;
 2834|       |				word0(&rv) += P*Exp_msk1;
 2835|       |#else
 2836|      0|				/* rv = */ rounded_product(dval(&rv), tens[e]);
  ------------------
  |  |  479|      0|#define rounded_product(a,b) a *= b
  ------------------
 2837|      0|#endif
 2838|      0|				goto ret;
 2839|      0|				}
 2840|      3|			}
 2841|     10|#ifndef Inaccurate_Divide
 2842|     10|		else if (e >= -Ten_pmax) {
  ------------------
  |  |  361|     10|#define Ten_pmax 22
  ------------------
  |  Branch (2842:12): [True: 6, False: 4]
  ------------------
 2843|       |#ifdef Honor_FLT_ROUNDS
 2844|       |			/* round correctly FLT_ROUNDS = 2 or 3 */
 2845|       |			if (sign) {
 2846|       |				rv.d = -rv.d;
 2847|       |				sign = 0;
 2848|       |				}
 2849|       |#endif
 2850|      6|			/* rv = */ rounded_quotient(dval(&rv), tens[-e]);
  ------------------
  |  |  480|      6|#define rounded_quotient(a,b) a /= b
  ------------------
 2851|      6|			goto ret;
 2852|      6|			}
 2853|     13|#endif
 2854|     13|#endif /* ROUND_BIASED_without_Round_Up */
 2855|     13|		}
 2856|  42.5k|	e1 += nd - k;
 2857|       |
 2858|  42.5k|#ifdef IEEE_Arith
 2859|       |#ifdef SET_INEXACT
 2860|       |	bc.inexact = 1;
 2861|       |	if (k <= DBL_DIG)
 2862|       |		oldinexact = get_inexact();
 2863|       |#endif
 2864|  42.5k|#ifdef Avoid_Underflow
 2865|  42.5k|	bc.scale = 0;
 2866|  42.5k|#endif
 2867|       |#ifdef Honor_FLT_ROUNDS
 2868|       |	if (bc.rounding >= 2) {
 2869|       |		if (sign)
 2870|       |			bc.rounding = bc.rounding == 2 ? 0 : 2;
 2871|       |		else
 2872|       |			if (bc.rounding != 2)
 2873|       |				bc.rounding = 0;
 2874|       |		}
 2875|       |#endif
 2876|  42.5k|#endif /*IEEE_Arith*/
 2877|       |
 2878|       |	/* Get starting approximation = rv * 10**e1 */
 2879|       |
 2880|  42.5k|	if (e1 > 0) {
  ------------------
  |  Branch (2880:6): [True: 41.2k, False: 1.25k]
  ------------------
 2881|  41.2k|		if ((i = e1 & 15))
  ------------------
  |  Branch (2881:7): [True: 41.2k, False: 20]
  ------------------
 2882|  41.2k|			dval(&rv) *= tens[i];
  ------------------
  |  |  315|  41.2k|#define dval(x) (x)->d
  ------------------
 2883|  41.2k|		if (e1 &= ~15) {
  ------------------
  |  Branch (2883:7): [True: 365, False: 40.8k]
  ------------------
 2884|    365|			if (e1 > DBL_MAX_10_EXP) {
  ------------------
  |  Branch (2884:8): [True: 3, False: 362]
  ------------------
 2885|      3| ovfl:
 2886|       |				/* Can't trust HUGE_VAL */
 2887|      3|#ifdef IEEE_Arith
 2888|       |#ifdef Honor_FLT_ROUNDS
 2889|       |				switch(bc.rounding) {
 2890|       |				  case 0: /* toward 0 */
 2891|       |				  case 3: /* toward -infinity */
 2892|       |					word0(&rv) = Big0;
 2893|       |					word1(&rv) = Big1;
 2894|       |					break;
 2895|       |				  default:
 2896|       |					word0(&rv) = Exp_mask;
 2897|       |					word1(&rv) = 0;
 2898|       |				  }
 2899|       |#else /*Honor_FLT_ROUNDS*/
 2900|      3|				word0(&rv) = Exp_mask;
  ------------------
  |  |  309|      3|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = Exp_mask;
  ------------------
  |  |  350|      3|#define Exp_mask  0x7ff00000
  ------------------
 2901|      3|				word1(&rv) = 0;
  ------------------
  |  |  310|      3|#define word1(x) (x)->L[0]
  ------------------
 2902|      3|#endif /*Honor_FLT_ROUNDS*/
 2903|       |#ifdef SET_INEXACT
 2904|       |				/* set overflow bit */
 2905|       |				dval(&rv0) = 1e300;
 2906|       |				dval(&rv0) *= dval(&rv0);
 2907|       |#endif
 2908|       |#else /*IEEE_Arith*/
 2909|       |				word0(&rv) = Big0;
 2910|       |				word1(&rv) = Big1;
 2911|       |#endif /*IEEE_Arith*/
 2912|      7| range_err:
 2913|      7|				if (bd0) {
  ------------------
  |  Branch (2913:9): [True: 0, False: 7]
  ------------------
 2914|      0|					Bfree(dalloc, bb);
 2915|      0|					Bfree(dalloc, bd);
 2916|      0|					Bfree(dalloc, bs);
 2917|      0|					Bfree(dalloc, bd0);
 2918|      0|					Bfree(dalloc, delta);
 2919|      0|					}
 2920|      7|#ifndef NO_ERRNO
 2921|      7|				errno = ERANGE;
 2922|      7|#endif
 2923|      7|				goto ret;
 2924|      3|				}
 2925|    362|			e1 >>= 4;
 2926|    402|			for(j = 0; e1 > 1; j++, e1 >>= 1)
  ------------------
  |  Branch (2926:15): [True: 40, False: 362]
  ------------------
 2927|     40|				if (e1 & 1)
  ------------------
  |  Branch (2927:9): [True: 20, False: 20]
  ------------------
 2928|     20|					dval(&rv) *= bigtens[j];
  ------------------
  |  |  315|     20|#define dval(x) (x)->d
  ------------------
 2929|       |		/* The last multiplication could overflow. */
 2930|    362|			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  309|    362|#define word0(x) (x)->L[1]
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  351|    362|#define P 53
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  348|    362|#define Exp_msk1    0x100000
  ------------------
 2931|    362|			dval(&rv) *= bigtens[j];
  ------------------
  |  |  315|    362|#define dval(x) (x)->d
  ------------------
 2932|    362|			if ((z = word0(&rv) & Exp_mask)
  ------------------
  |  |  309|    362|#define word0(x) (x)->L[1]
  ------------------
              			if ((z = word0(&rv) & Exp_mask)
  ------------------
  |  |  350|    362|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (2932:8): [True: 0, False: 362]
  ------------------
 2933|    362|			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
  ------------------
  |  |  348|    362|#define Exp_msk1    0x100000
  ------------------
              			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
  ------------------
  |  |  353|    362|#define Bias 1023
  ------------------
              			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
  ------------------
  |  |  351|    362|#define P 53
  ------------------
 2934|      0|				goto ovfl;
 2935|    362|			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
  ------------------
  |  |  348|    362|#define Exp_msk1    0x100000
  ------------------
              			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
  ------------------
  |  |  353|    362|#define Bias 1023
  ------------------
              			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
  ------------------
  |  |  351|    362|#define P 53
  ------------------
  |  Branch (2935:8): [True: 0, False: 362]
  ------------------
 2936|       |				/* set to largest number */
 2937|       |				/* (Can't trust DBL_MAX) */
 2938|      0|				word0(&rv) = Big0;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = Big0;
  ------------------
  |  |  483|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  360|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  348|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  353|      0|#define Bias 1023
  |  |  ------------------
  ------------------
 2939|      0|				word1(&rv) = Big1;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
              				word1(&rv) = Big1;
  ------------------
  |  |  484|      0|#define Big1 0xffffffff
  ------------------
 2940|      0|				}
 2941|    362|			else
 2942|    362|				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  309|    362|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  351|    362|#define P 53
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  348|    362|#define Exp_msk1    0x100000
  ------------------
 2943|    362|			}
 2944|  41.2k|		}
 2945|  1.25k|	else if (e1 < 0) {
  ------------------
  |  Branch (2945:11): [True: 10, False: 1.24k]
  ------------------
 2946|     10|		e1 = -e1;
 2947|     10|		if ((i = e1 & 15))
  ------------------
  |  Branch (2947:7): [True: 10, False: 0]
  ------------------
 2948|     10|			dval(&rv) /= tens[i];
  ------------------
  |  |  315|     10|#define dval(x) (x)->d
  ------------------
 2949|     10|		if (e1 >>= 4) {
  ------------------
  |  Branch (2949:7): [True: 10, False: 0]
  ------------------
 2950|     10|			if (e1 >= 1 << n_bigtens)
  ------------------
  |  | 1525|     10|#define n_bigtens 5
  ------------------
  |  Branch (2950:8): [True: 4, False: 6]
  ------------------
 2951|      4|				goto undfl;
 2952|      6|#ifdef Avoid_Underflow
 2953|      6|			if (e1 & Scale_Bit)
  ------------------
  |  | 1524|      6|#define Scale_Bit 0x10
  ------------------
  |  Branch (2953:8): [True: 0, False: 6]
  ------------------
 2954|      0|				bc.scale = 2*P;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
 2955|     12|			for(j = 0; e1 > 0; j++, e1 >>= 1)
  ------------------
  |  Branch (2955:15): [True: 6, False: 6]
  ------------------
 2956|      6|				if (e1 & 1)
  ------------------
  |  Branch (2956:9): [True: 6, False: 0]
  ------------------
 2957|      6|					dval(&rv) *= tinytens[j];
  ------------------
  |  |  315|      6|#define dval(x) (x)->d
  ------------------
 2958|      6|			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (2958:8): [True: 0, False: 6]
  |  Branch (2958:20): [True: 0, False: 0]
  ------------------
 2959|      0|						>> Exp_shift)) > 0) {
  ------------------
  |  |  346|      0|#define Exp_shift  20
  ------------------
 2960|       |				/* scaled rv is denormal; clear j low bits */
 2961|      0|				if (j >= 32) {
  ------------------
  |  Branch (2961:9): [True: 0, False: 0]
  ------------------
 2962|      0|					if (j > 54)
  ------------------
  |  Branch (2962:10): [True: 0, False: 0]
  ------------------
 2963|      0|						goto undfl;
 2964|      0|					word1(&rv) = 0;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
 2965|      0|					if (j >= 53)
  ------------------
  |  Branch (2965:10): [True: 0, False: 0]
  ------------------
 2966|      0|					 word0(&rv) = (P+2)*Exp_msk1;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              					 word0(&rv) = (P+2)*Exp_msk1;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              					 word0(&rv) = (P+2)*Exp_msk1;
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 2967|      0|					else
 2968|      0|					 word0(&rv) &= 0xffffffff << (j-32);
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
 2969|      0|					}
 2970|      0|				else
 2971|      0|					word1(&rv) &= 0xffffffff << j;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
 2972|      0|				}
 2973|       |#else
 2974|       |			for(j = 0; e1 > 1; j++, e1 >>= 1)
 2975|       |				if (e1 & 1)
 2976|       |					dval(&rv) *= tinytens[j];
 2977|       |			/* The last multiplication could underflow. */
 2978|       |			dval(&rv0) = dval(&rv);
 2979|       |			dval(&rv) *= tinytens[j];
 2980|       |			if (!dval(&rv)) {
 2981|       |				dval(&rv) = 2.*dval(&rv0);
 2982|       |				dval(&rv) *= tinytens[j];
 2983|       |#endif
 2984|      6|				if (!dval(&rv)) {
  ------------------
  |  |  315|      6|#define dval(x) (x)->d
  ------------------
  |  Branch (2984:9): [True: 0, False: 6]
  ------------------
 2985|      4| undfl:
 2986|      4|					dval(&rv) = 0.;
  ------------------
  |  |  315|      4|#define dval(x) (x)->d
  ------------------
 2987|      4|					goto range_err;
 2988|      0|					}
 2989|       |#ifndef Avoid_Underflow
 2990|       |				word0(&rv) = Tiny0;
 2991|       |				word1(&rv) = Tiny1;
 2992|       |				/* The refinement below will clean
 2993|       |				 * this approximation up.
 2994|       |				 */
 2995|       |				}
 2996|       |#endif
 2997|      6|			}
 2998|     10|		}
 2999|       |
 3000|       |	/* Now the hard part -- adjusting rv to the correct value.*/
 3001|       |
 3002|       |	/* Put digits into bd: true value = bd * 10^e */
 3003|       |
 3004|  42.4k|	bc.nd = nd - nz1;
 3005|  42.4k|#ifndef NO_STRTOD_BIGCOMP
 3006|  42.4k|	bc.nd0 = nd0;	/* Only needed if nd > strtod_diglim, but done here */
 3007|       |			/* to silence an erroneous warning about bc.nd0 */
 3008|       |			/* possibly not being initialized. */
 3009|  42.4k|	if (nd > strtod_diglim) {
  ------------------
  |  |  324|  42.4k|#define strtod_diglim STRTOD_DIGLIM
  |  |  ------------------
  |  |  |  |  318|  42.4k|#define STRTOD_DIGLIM 40
  |  |  ------------------
  ------------------
  |  Branch (3009:6): [True: 26, False: 42.4k]
  ------------------
 3010|       |		/* ASSERT(strtod_diglim >= 18); 18 == one more than the */
 3011|       |		/* minimum number of decimal digits to distinguish double values */
 3012|       |		/* in IEEE arithmetic. */
 3013|     26|		i = j = 18;
 3014|     26|		if (i > nd0)
  ------------------
  |  Branch (3014:7): [True: 0, False: 26]
  ------------------
 3015|      0|			j += bc.dplen;
 3016|     26|		for(;;) {
 3017|     26|			if (--j < bc.dp1 && j >= bc.dp0)
  ------------------
  |  Branch (3017:8): [True: 20, False: 6]
  |  Branch (3017:24): [True: 0, False: 20]
  ------------------
 3018|      0|				j = bc.dp0 - 1;
 3019|     26|			if (s0[j] != '0')
  ------------------
  |  Branch (3019:8): [True: 26, False: 0]
  ------------------
 3020|     26|				break;
 3021|      0|			--i;
 3022|      0|			}
 3023|     26|		e += nd - i;
 3024|     26|		nd = i;
 3025|     26|		if (nd0 > nd)
  ------------------
  |  Branch (3025:7): [True: 26, False: 0]
  ------------------
 3026|     26|			nd0 = nd;
 3027|     26|		if (nd < 9) { /* must recompute y */
  ------------------
  |  Branch (3027:7): [True: 0, False: 26]
  ------------------
 3028|      0|			y = 0;
 3029|      0|			for(i = 0; i < nd0; ++i)
  ------------------
  |  Branch (3029:15): [True: 0, False: 0]
  ------------------
 3030|      0|				y = 10*y + s0[i] - '0';
 3031|      0|			for(j = bc.dp1; i < nd; ++i)
  ------------------
  |  Branch (3031:20): [True: 0, False: 0]
  ------------------
 3032|      0|				y = 10*y + s0[j++] - '0';
 3033|      0|			}
 3034|     26|		}
 3035|  42.4k|#endif
 3036|  42.4k|	bd0 = s2b(dalloc, s0, nd0, nd, y, bc.dplen);
 3037|       |
 3038|  42.5k|	for(;;) {
 3039|  42.5k|		bd = Balloc(dalloc, bd0->k);
 3040|  42.5k|		Bcopy(bd, bd0);
  ------------------
  |  |  657|  42.5k|#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
  |  |  658|  42.5k|y->wds*sizeof(Long) + 2*sizeof(int))
  ------------------
 3041|  42.5k|		bb = d2b(dalloc, &rv, &bbe, &bbbits);	/* rv = bb * 2^bbe */
 3042|  42.5k|		bs = i2b(dalloc, 1);
 3043|       |
 3044|  42.5k|		if (e >= 0) {
  ------------------
  |  Branch (3044:7): [True: 42.4k, False: 6]
  ------------------
 3045|  42.4k|			bb2 = bb5 = 0;
 3046|  42.4k|			bd2 = bd5 = e;
 3047|  42.4k|			}
 3048|      6|		else {
 3049|      6|			bb2 = bb5 = -e;
 3050|      6|			bd2 = bd5 = 0;
 3051|      6|			}
 3052|  42.5k|		if (bbe >= 0)
  ------------------
  |  Branch (3052:7): [True: 42.4k, False: 6]
  ------------------
 3053|  42.4k|			bb2 += bbe;
 3054|      6|		else
 3055|      6|			bd2 -= bbe;
 3056|  42.5k|		bs2 = bb2;
 3057|       |#ifdef Honor_FLT_ROUNDS
 3058|       |		if (bc.rounding != 1)
 3059|       |			bs2++;
 3060|       |#endif
 3061|  42.5k|#ifdef Avoid_Underflow
 3062|  42.5k|		Lsb = LSB;
  ------------------
  |  |  365|  42.5k|#define LSB 1
  ------------------
 3063|  42.5k|		Lsb1 = 0;
 3064|  42.5k|		j = bbe - bc.scale;
 3065|  42.5k|		i = j + bbbits - 1;	/* logb(rv) */
 3066|  42.5k|		j = P + 1 - bbbits;
  ------------------
  |  |  351|  42.5k|#define P 53
  ------------------
 3067|  42.5k|		if (i < Emin) {	/* denormal */
  ------------------
  |  |  355|  42.5k|#define Emin (-1022)
  ------------------
  |  Branch (3067:7): [True: 0, False: 42.5k]
  ------------------
 3068|      0|			i = Emin - i;
  ------------------
  |  |  355|      0|#define Emin (-1022)
  ------------------
 3069|      0|			j -= i;
 3070|      0|			if (i < 32)
  ------------------
  |  Branch (3070:8): [True: 0, False: 0]
  ------------------
 3071|      0|				Lsb <<= i;
 3072|      0|			else if (i < 52)
  ------------------
  |  Branch (3072:13): [True: 0, False: 0]
  ------------------
 3073|      0|				Lsb1 = Lsb << (i-32);
 3074|      0|			else
 3075|      0|				Lsb1 = Exp_mask;
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
 3076|      0|			}
 3077|       |#else /*Avoid_Underflow*/
 3078|       |#ifdef Sudden_Underflow
 3079|       |#ifdef IBM
 3080|       |		j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
 3081|       |#else
 3082|       |		j = P + 1 - bbbits;
 3083|       |#endif
 3084|       |#else /*Sudden_Underflow*/
 3085|       |		j = bbe;
 3086|       |		i = j + bbbits - 1;	/* logb(rv) */
 3087|       |		if (i < Emin)	/* denormal */
 3088|       |			j += P - Emin;
 3089|       |		else
 3090|       |			j = P + 1 - bbbits;
 3091|       |#endif /*Sudden_Underflow*/
 3092|       |#endif /*Avoid_Underflow*/
 3093|  42.5k|		bb2 += j;
 3094|  42.5k|		bd2 += j;
 3095|  42.5k|#ifdef Avoid_Underflow
 3096|  42.5k|		bd2 += bc.scale;
 3097|  42.5k|#endif
 3098|  42.5k|		i = bb2 < bd2 ? bb2 : bd2;
  ------------------
  |  Branch (3098:7): [True: 6, False: 42.4k]
  ------------------
 3099|  42.5k|		if (i > bs2)
  ------------------
  |  Branch (3099:7): [True: 292, False: 42.2k]
  ------------------
 3100|    292|			i = bs2;
 3101|  42.5k|		if (i > 0) {
  ------------------
  |  Branch (3101:7): [True: 42.2k, False: 282]
  ------------------
 3102|  42.2k|			bb2 -= i;
 3103|  42.2k|			bd2 -= i;
 3104|  42.2k|			bs2 -= i;
 3105|  42.2k|			}
 3106|  42.5k|		if (bb5 > 0) {
  ------------------
  |  Branch (3106:7): [True: 6, False: 42.4k]
  ------------------
 3107|      6|			bs = pow5mult(dalloc, bs, bb5);
 3108|      6|			bb1 = mult(dalloc, bs, bb);
 3109|      6|			Bfree(dalloc, bb);
 3110|      6|			bb = bb1;
 3111|      6|			}
 3112|  42.5k|		if (bb2 > 0)
  ------------------
  |  Branch (3112:7): [True: 42.5k, False: 0]
  ------------------
 3113|  42.5k|			bb = lshift(dalloc, bb, bb2);
 3114|  42.5k|		if (bd5 > 0)
  ------------------
  |  Branch (3114:7): [True: 20, False: 42.4k]
  ------------------
 3115|     20|			bd = pow5mult(dalloc, bd, bd5);
 3116|  42.5k|		if (bd2 > 0)
  ------------------
  |  Branch (3116:7): [True: 292, False: 42.2k]
  ------------------
 3117|    292|			bd = lshift(dalloc, bd, bd2);
 3118|  42.5k|		if (bs2 > 0)
  ------------------
  |  Branch (3118:7): [True: 41.9k, False: 556]
  ------------------
 3119|  41.9k|			bs = lshift(dalloc, bs, bs2);
 3120|  42.5k|		delta = diff(dalloc, bb, bd);
 3121|  42.5k|		bc.dsign = delta->sign;
 3122|  42.5k|		delta->sign = 0;
 3123|  42.5k|		i = cmp(delta, bs);
 3124|  42.5k|#ifndef NO_STRTOD_BIGCOMP /*{*/
 3125|  42.5k|		if (bc.nd > nd && i <= 0) {
  ------------------
  |  Branch (3125:7): [True: 26, False: 42.4k]
  |  Branch (3125:21): [True: 26, False: 0]
  ------------------
 3126|     26|			if (bc.dsign) {
  ------------------
  |  Branch (3126:8): [True: 26, False: 0]
  ------------------
 3127|       |				/* Must use bigcomp(). */
 3128|     26|				req_bigcomp = 1;
 3129|     26|				break;
 3130|     26|				}
 3131|       |#ifdef Honor_FLT_ROUNDS
 3132|       |			if (bc.rounding != 1) {
 3133|       |				if (i < 0) {
 3134|       |					req_bigcomp = 1;
 3135|       |					break;
 3136|       |					}
 3137|       |				}
 3138|       |			else
 3139|       |#endif
 3140|      0|				i = -1;	/* Discarded digits make delta smaller. */
 3141|      0|			}
 3142|  42.4k|#endif /*}*/
 3143|       |#ifdef Honor_FLT_ROUNDS /*{*/
 3144|       |		if (bc.rounding != 1) {
 3145|       |			if (i < 0) {
 3146|       |				/* Error is less than an ulp */
 3147|       |				if (!delta->x[0] && delta->wds <= 1) {
 3148|       |					/* exact */
 3149|       |#ifdef SET_INEXACT
 3150|       |					bc.inexact = 0;
 3151|       |#endif
 3152|       |					break;
 3153|       |					}
 3154|       |				if (bc.rounding) {
 3155|       |					if (bc.dsign) {
 3156|       |						adj.d = 1.;
 3157|       |						goto apply_adj;
 3158|       |						}
 3159|       |					}
 3160|       |				else if (!bc.dsign) {
 3161|       |					adj.d = -1.;
 3162|       |					if (!word1(&rv)
 3163|       |					 && !(word0(&rv) & Frac_mask)) {
 3164|       |						y = word0(&rv) & Exp_mask;
 3165|       |#ifdef Avoid_Underflow
 3166|       |						if (!bc.scale || y > 2*P*Exp_msk1)
 3167|       |#else
 3168|       |						if (y)
 3169|       |#endif
 3170|       |						  {
 3171|       |						  delta = lshift(delta,Log2P);
 3172|       |						  if (cmp(delta, bs) <= 0)
 3173|       |							adj.d = -0.5;
 3174|       |						  }
 3175|       |						}
 3176|       | apply_adj:
 3177|       |#ifdef Avoid_Underflow /*{*/
 3178|       |					if (bc.scale && (y = word0(&rv) & Exp_mask)
 3179|       |						<= 2*P*Exp_msk1)
 3180|       |					  word0(&adj) += (2*P+1)*Exp_msk1 - y;
 3181|       |#else
 3182|       |#ifdef Sudden_Underflow
 3183|       |					if ((word0(&rv) & Exp_mask) <=
 3184|       |							P*Exp_msk1) {
 3185|       |						word0(&rv) += P*Exp_msk1;
 3186|       |						dval(&rv) += adj.d*ulp(dval(&rv));
 3187|       |						word0(&rv) -= P*Exp_msk1;
 3188|       |						}
 3189|       |					else
 3190|       |#endif /*Sudden_Underflow*/
 3191|       |#endif /*Avoid_Underflow}*/
 3192|       |					dval(&rv) += adj.d*ulp(&rv);
 3193|       |					}
 3194|       |				break;
 3195|       |				}
 3196|       |			adj.d = ratio(delta, bs);
 3197|       |			if (adj.d < 1.)
 3198|       |				adj.d = 1.;
 3199|       |			if (adj.d <= 0x7ffffffe) {
 3200|       |				/* adj = rounding ? ceil(adj) : floor(adj); */
 3201|       |				y = adj.d;
 3202|       |				if (y != adj.d) {
 3203|       |					if (!((bc.rounding>>1) ^ bc.dsign))
 3204|       |						y++;
 3205|       |					adj.d = y;
 3206|       |					}
 3207|       |				}
 3208|       |#ifdef Avoid_Underflow /*{*/
 3209|       |			if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
 3210|       |				word0(&adj) += (2*P+1)*Exp_msk1 - y;
 3211|       |#else
 3212|       |#ifdef Sudden_Underflow
 3213|       |			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
 3214|       |				word0(&rv) += P*Exp_msk1;
 3215|       |				adj.d *= ulp(dval(&rv));
 3216|       |				if (bc.dsign)
 3217|       |					dval(&rv) += adj.d;
 3218|       |				else
 3219|       |					dval(&rv) -= adj.d;
 3220|       |				word0(&rv) -= P*Exp_msk1;
 3221|       |				goto cont;
 3222|       |				}
 3223|       |#endif /*Sudden_Underflow*/
 3224|       |#endif /*Avoid_Underflow}*/
 3225|       |			adj.d *= ulp(&rv);
 3226|       |			if (bc.dsign) {
 3227|       |				if (word0(&rv) == Big0 && word1(&rv) == Big1)
 3228|       |					goto ovfl;
 3229|       |				dval(&rv) += adj.d;
 3230|       |				}
 3231|       |			else
 3232|       |				dval(&rv) -= adj.d;
 3233|       |			goto cont;
 3234|       |			}
 3235|       |#endif /*}Honor_FLT_ROUNDS*/
 3236|       |
 3237|  42.4k|		if (i < 0) {
  ------------------
  |  Branch (3237:7): [True: 2.35k, False: 40.1k]
  ------------------
 3238|       |			/* Error is less than half an ulp -- check for
 3239|       |			 * special case of mantissa a power of two.
 3240|       |			 */
 3241|  2.35k|			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
  ------------------
  |  |  310|  4.19k|#define word1(x) (x)->L[0]
  |  |  ------------------
  |  |  |  Branch (310:18): [True: 1.38k, False: 454]
  |  |  ------------------
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
  ------------------
  |  |  309|    454|#define word0(x) (x)->L[1]
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
  ------------------
  |  |  363|  2.81k|#define Bndry_mask  0xfffff
  ------------------
  |  Branch (3241:8): [True: 522, False: 1.83k]
  |  Branch (3241:34): [True: 120, False: 334]
  ------------------
 3242|  2.35k|#ifdef IEEE_Arith /*{*/
 3243|  2.35k|#ifdef Avoid_Underflow
 3244|  2.35k|			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  309|    334|#define word0(x) (x)->L[1]
  ------------------
              			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  350|    334|#define Exp_mask  0x7ff00000
  ------------------
              			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  351|    334|#define P 53
  ------------------
              			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  348|    334|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3244:8): [True: 0, False: 334]
  ------------------
 3245|       |#else
 3246|       |			 || (word0(&rv) & Exp_mask) <= Exp_msk1
 3247|       |#endif
 3248|  2.35k|#endif /*}*/
 3249|  2.35k|				) {
 3250|       |#ifdef SET_INEXACT
 3251|       |				if (!delta->x[0] && delta->wds <= 1)
 3252|       |					bc.inexact = 0;
 3253|       |#endif
 3254|  2.02k|				break;
 3255|  2.02k|				}
 3256|    334|			if (!delta->x[0] && delta->wds <= 1) {
  ------------------
  |  Branch (3256:8): [True: 40, False: 294]
  |  Branch (3256:24): [True: 40, False: 0]
  ------------------
 3257|       |				/* exact result */
 3258|       |#ifdef SET_INEXACT
 3259|       |				bc.inexact = 0;
 3260|       |#endif
 3261|     40|				break;
 3262|     40|				}
 3263|    294|			delta = lshift(dalloc,delta,Log2P);
  ------------------
  |  |  367|    294|#define Log2P 1
  ------------------
 3264|    294|			if (cmp(delta, bs) > 0)
  ------------------
  |  Branch (3264:8): [True: 0, False: 294]
  ------------------
 3265|      0|				goto drop_down;
 3266|    294|			break;
 3267|    294|			}
 3268|  40.1k|		if (i == 0) {
  ------------------
  |  Branch (3268:7): [True: 39.8k, False: 298]
  ------------------
 3269|       |			/* exactly half-way between */
 3270|  39.8k|			if (bc.dsign) {
  ------------------
  |  Branch (3270:8): [True: 0, False: 39.8k]
  ------------------
 3271|      0|				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
  ------------------
  |  |  364|      0|#define Bndry_mask1 0xfffff
  ------------------
              				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
  ------------------
  |  |  364|      0|#define Bndry_mask1 0xfffff
  ------------------
  |  Branch (3271:9): [True: 0, False: 0]
  ------------------
 3272|      0|				 &&  word1(&rv) == (
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (3272:10): [True: 0, False: 0]
  ------------------
 3273|      0|#ifdef Avoid_Underflow
 3274|      0|			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
              			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3274:5): [True: 0, False: 0]
  |  Branch (3274:17): [True: 0, False: 0]
  ------------------
 3275|      0|		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
  ------------------
  |  |  346|      0|#define Exp_shift  20
  ------------------
 3276|      0|#endif
 3277|      0|						   0xffffffff)) {
 3278|       |					/*boundary case -- increment exponent*/
 3279|      0|					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  483|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  360|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  348|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  353|      0|#define Bias 1023
  |  |  ------------------
  ------------------
              					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
              					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  484|      0|#define Big1 0xffffffff
  ------------------
  |  Branch (3279:10): [True: 0, False: 0]
  |  Branch (3279:32): [True: 0, False: 0]
  ------------------
 3280|      0|						goto ovfl;
 3281|      0|					word0(&rv) = (word0(&rv) & Exp_mask)
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              					word0(&rv) = (word0(&rv) & Exp_mask)
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              					word0(&rv) = (word0(&rv) & Exp_mask)
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
 3282|      0|						+ Exp_msk1
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 3283|       |#ifdef IBM
 3284|       |						| Exp_msk1 >> 4
 3285|       |#endif
 3286|      0|						;
 3287|      0|					word1(&rv) = 0;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
 3288|      0|#ifdef Avoid_Underflow
 3289|      0|					bc.dsign = 0;
 3290|      0|#endif
 3291|      0|					break;
 3292|      0|					}
 3293|      0|				}
 3294|  39.8k|			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
  ------------------
  |  |  309|  39.8k|#define word0(x) (x)->L[1]
  ------------------
              			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
  ------------------
  |  |  363|  39.8k|#define Bndry_mask  0xfffff
  ------------------
              			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (3294:13): [True: 0, False: 39.8k]
  |  Branch (3294:43): [True: 0, False: 0]
  ------------------
 3295|      0| drop_down:
 3296|       |				/* boundary case -- decrement exponent */
 3297|       |#ifdef Sudden_Underflow /*{{*/
 3298|       |				L = word0(&rv) & Exp_mask;
 3299|       |#ifdef IBM
 3300|       |				if (L <  Exp_msk1)
 3301|       |#else
 3302|       |#ifdef Avoid_Underflow
 3303|       |				if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
 3304|       |#else
 3305|       |				if (L <= Exp_msk1)
 3306|       |#endif /*Avoid_Underflow*/
 3307|       |#endif /*IBM*/
 3308|       |					{
 3309|       |					if (bc.nd >nd) {
 3310|       |						bc.uflchk = 1;
 3311|       |						break;
 3312|       |						}
 3313|       |					goto undfl;
 3314|       |					}
 3315|       |				L -= Exp_msk1;
 3316|       |#else /*Sudden_Underflow}{*/
 3317|      0|#ifdef Avoid_Underflow
 3318|      0|				if (bc.scale) {
  ------------------
  |  Branch (3318:9): [True: 0, False: 0]
  ------------------
 3319|      0|					L = word0(&rv) & Exp_mask;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              					L = word0(&rv) & Exp_mask;
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
 3320|      0|					if (L <= (2*P+1)*Exp_msk1) {
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              					if (L <= (2*P+1)*Exp_msk1) {
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3320:10): [True: 0, False: 0]
  ------------------
 3321|      0|						if (L > (P+2)*Exp_msk1)
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              						if (L > (P+2)*Exp_msk1)
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3321:11): [True: 0, False: 0]
  ------------------
 3322|       |							/* round even ==> */
 3323|       |							/* accept rv */
 3324|      0|							break;
 3325|       |						/* rv = smallest denormal */
 3326|      0|						if (bc.nd >nd) {
  ------------------
  |  Branch (3326:11): [True: 0, False: 0]
  ------------------
 3327|      0|							bc.uflchk = 1;
 3328|      0|							break;
 3329|      0|							}
 3330|      0|						goto undfl;
 3331|      0|						}
 3332|      0|					}
 3333|      0|#endif /*Avoid_Underflow*/
 3334|      0|				L = (word0(&rv) & Exp_mask) - Exp_msk1;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				L = (word0(&rv) & Exp_mask) - Exp_msk1;
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
              				L = (word0(&rv) & Exp_mask) - Exp_msk1;
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 3335|      0|#endif /*Sudden_Underflow}}*/
 3336|      0|				word0(&rv) = L | Bndry_mask1;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = L | Bndry_mask1;
  ------------------
  |  |  364|      0|#define Bndry_mask1 0xfffff
  ------------------
 3337|      0|				word1(&rv) = 0xffffffff;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
 3338|       |#ifdef IBM
 3339|       |				goto cont;
 3340|       |#else
 3341|      0|#ifndef NO_STRTOD_BIGCOMP
 3342|      0|				if (bc.nd > nd)
  ------------------
  |  Branch (3342:9): [True: 0, False: 0]
  ------------------
 3343|      0|					goto cont;
 3344|      0|#endif
 3345|      0|				break;
 3346|      0|#endif
 3347|      0|				}
 3348|  39.8k|#ifndef ROUND_BIASED
 3349|  39.8k|#ifdef Avoid_Underflow
 3350|  39.8k|			if (Lsb1) {
  ------------------
  |  Branch (3350:8): [True: 0, False: 39.8k]
  ------------------
 3351|      0|				if (!(word0(&rv) & Lsb1))
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
  |  Branch (3351:9): [True: 0, False: 0]
  ------------------
 3352|      0|					break;
 3353|      0|				}
 3354|  39.8k|			else if (!(word1(&rv) & Lsb))
  ------------------
  |  |  310|  39.8k|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (3354:13): [True: 0, False: 39.8k]
  ------------------
 3355|      0|				break;
 3356|       |#else
 3357|       |			if (!(word1(&rv) & LSB))
 3358|       |				break;
 3359|       |#endif
 3360|  39.8k|#endif
 3361|  39.8k|			if (bc.dsign)
  ------------------
  |  Branch (3361:8): [True: 0, False: 39.8k]
  ------------------
 3362|      0|#ifdef Avoid_Underflow
 3363|      0|				dval(&rv) += sulp(&rv, &bc);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 3364|       |#else
 3365|       |				dval(&rv) += ulp(&rv);
 3366|       |#endif
 3367|  39.8k|#ifndef ROUND_BIASED
 3368|  39.8k|			else {
 3369|  39.8k|#ifdef Avoid_Underflow
 3370|  39.8k|				dval(&rv) -= sulp(&rv, &bc);
  ------------------
  |  |  315|  39.8k|#define dval(x) (x)->d
  ------------------
 3371|       |#else
 3372|       |				dval(&rv) -= ulp(&rv);
 3373|       |#endif
 3374|  39.8k|#ifndef Sudden_Underflow
 3375|  39.8k|				if (!dval(&rv)) {
  ------------------
  |  |  315|  39.8k|#define dval(x) (x)->d
  ------------------
  |  Branch (3375:9): [True: 0, False: 39.8k]
  ------------------
 3376|      0|					if (bc.nd >nd) {
  ------------------
  |  Branch (3376:10): [True: 0, False: 0]
  ------------------
 3377|      0|						bc.uflchk = 1;
 3378|      0|						break;
 3379|      0|						}
 3380|      0|					goto undfl;
 3381|      0|					}
 3382|  39.8k|#endif
 3383|  39.8k|				}
 3384|  39.8k|#ifdef Avoid_Underflow
 3385|  39.8k|			bc.dsign = 1 - bc.dsign;
 3386|  39.8k|#endif
 3387|  39.8k|#endif
 3388|  39.8k|			break;
 3389|  39.8k|			}
 3390|    298|		if ((aadj = ratio(delta, bs)) <= 2.) {
  ------------------
  |  Branch (3390:7): [True: 298, False: 0]
  ------------------
 3391|    298|			if (bc.dsign)
  ------------------
  |  Branch (3391:8): [True: 296, False: 2]
  ------------------
 3392|    296|				aadj = aadj1 = 1.;
 3393|      2|			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  310|      4|#define word1(x) (x)->L[0]
  |  |  ------------------
  |  |  |  Branch (310:18): [True: 2, False: 0]
  |  |  ------------------
  ------------------
              			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  363|      0|#define Bndry_mask  0xfffff
  ------------------
  |  Branch (3393:27): [True: 0, False: 0]
  ------------------
 3394|      2|#ifndef Sudden_Underflow
 3395|      2|				if (word1(&rv) == Tiny1 && !word0(&rv)) {
  ------------------
  |  |  310|      2|#define word1(x) (x)->L[0]
  ------------------
              				if (word1(&rv) == Tiny1 && !word0(&rv)) {
  ------------------
  |  |  369|      4|#define Tiny1 1
  ------------------
              				if (word1(&rv) == Tiny1 && !word0(&rv)) {
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
  |  Branch (3395:9): [True: 0, False: 2]
  |  Branch (3395:32): [True: 0, False: 0]
  ------------------
 3396|      0|					if (bc.nd >nd) {
  ------------------
  |  Branch (3396:10): [True: 0, False: 0]
  ------------------
 3397|      0|						bc.uflchk = 1;
 3398|      0|						break;
 3399|      0|						}
 3400|      0|					goto undfl;
 3401|      0|					}
 3402|      2|#endif
 3403|      2|				aadj = 1.;
 3404|      2|				aadj1 = -1.;
 3405|      2|				}
 3406|      0|			else {
 3407|       |				/* special case -- power of FLT_RADIX to be */
 3408|       |				/* rounded down... */
 3409|       |
 3410|      0|				if (aadj < 2./FLT_RADIX)
  ------------------
  |  Branch (3410:9): [True: 0, False: 0]
  ------------------
 3411|      0|					aadj = 1./FLT_RADIX;
 3412|      0|				else
 3413|      0|					aadj *= 0.5;
 3414|      0|				aadj1 = -aadj;
 3415|      0|				}
 3416|    298|			}
 3417|      0|		else {
 3418|      0|			aadj *= 0.5;
 3419|      0|			aadj1 = bc.dsign ? aadj : -aadj;
  ------------------
  |  Branch (3419:12): [True: 0, False: 0]
  ------------------
 3420|       |#ifdef Check_FLT_ROUNDS
 3421|       |			switch(bc.rounding) {
 3422|       |				case 2: /* towards +infinity */
 3423|       |					aadj1 -= 0.5;
 3424|       |					break;
 3425|       |				case 0: /* towards 0 */
 3426|       |				case 3: /* towards -infinity */
 3427|       |					aadj1 += 0.5;
 3428|       |				}
 3429|       |#else
 3430|      0|			if (Flt_Rounds == 0)
  ------------------
  |  |  381|      0|#define Flt_Rounds FLT_ROUNDS
  ------------------
  |  Branch (3430:8): [True: 0, False: 0]
  ------------------
 3431|      0|				aadj1 += 0.5;
 3432|      0|#endif /*Check_FLT_ROUNDS*/
 3433|      0|			}
 3434|    298|		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  309|    298|#define word0(x) (x)->L[1]
  ------------------
              		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  350|    298|#define Exp_mask  0x7ff00000
  ------------------
 3435|       |
 3436|       |		/* Check for overflow */
 3437|       |
 3438|    298|		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
  ------------------
  |  |  348|    298|#define Exp_msk1    0x100000
  ------------------
              		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
  ------------------
  |  |  353|    298|#define Bias 1023
  ------------------
  |  Branch (3438:7): [True: 0, False: 298]
  ------------------
 3439|      0|			dval(&rv0) = dval(&rv);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
              			dval(&rv0) = dval(&rv);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 3440|      0|			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 3441|      0|			adj.d = aadj1 * ulp(&rv);
 3442|      0|			dval(&rv) += adj.d;
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 3443|      0|			if ((word0(&rv) & Exp_mask) >=
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              			if ((word0(&rv) & Exp_mask) >=
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (3443:8): [True: 0, False: 0]
  ------------------
 3444|      0|					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
              					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
  ------------------
  |  |  353|      0|#define Bias 1023
  ------------------
              					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
  ------------------
  |  |  351|      0|#define P 53
  ------------------
 3445|      0|				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  483|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  360|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  348|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  353|      0|#define Bias 1023
  |  |  ------------------
  ------------------
              				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
              				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  484|      0|#define Big1 0xffffffff
  ------------------
  |  Branch (3445:9): [True: 0, False: 0]
  |  Branch (3445:32): [True: 0, False: 0]
  ------------------
 3446|      0|					goto ovfl;
 3447|      0|				word0(&rv) = Big0;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = Big0;
  ------------------
  |  |  483|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  360|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  348|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  353|      0|#define Bias 1023
  |  |  ------------------
  ------------------
 3448|      0|				word1(&rv) = Big1;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
              				word1(&rv) = Big1;
  ------------------
  |  |  484|      0|#define Big1 0xffffffff
  ------------------
 3449|      0|				goto cont;
 3450|      0|				}
 3451|      0|			else
 3452|      0|				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 3453|      0|			}
 3454|    298|		else {
 3455|    298|#ifdef Avoid_Underflow
 3456|    298|			if (bc.scale && y <= 2*P*Exp_msk1) {
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              			if (bc.scale && y <= 2*P*Exp_msk1) {
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3456:8): [True: 0, False: 298]
  |  Branch (3456:20): [True: 0, False: 0]
  ------------------
 3457|      0|				if (aadj <= 0x7fffffff) {
  ------------------
  |  Branch (3457:9): [True: 0, False: 0]
  ------------------
 3458|      0|					if ((z = aadj) <= 0)
  ------------------
  |  Branch (3458:10): [True: 0, False: 0]
  ------------------
 3459|      0|						z = 1;
 3460|      0|					aadj = z;
 3461|      0|					aadj1 = bc.dsign ? aadj : -aadj;
  ------------------
  |  Branch (3461:14): [True: 0, False: 0]
  ------------------
 3462|      0|					}
 3463|      0|				dval(&aadj2) = aadj1;
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 3464|      0|				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 3465|      0|				aadj1 = dval(&aadj2);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 3466|      0|				adj.d = aadj1 * ulp(&rv);
 3467|      0|				dval(&rv) += adj.d;
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 3468|      0|				if (rv.d == 0.)
  ------------------
  |  Branch (3468:9): [True: 0, False: 0]
  ------------------
 3469|       |#ifdef NO_STRTOD_BIGCOMP
 3470|       |					goto undfl;
 3471|       |#else
 3472|      0|					{
 3473|      0|					req_bigcomp = 1;
 3474|      0|					break;
 3475|      0|					}
 3476|      0|#endif
 3477|      0|				}
 3478|    298|			else {
 3479|    298|				adj.d = aadj1 * ulp(&rv);
 3480|    298|				dval(&rv) += adj.d;
  ------------------
  |  |  315|    298|#define dval(x) (x)->d
  ------------------
 3481|    298|				}
 3482|       |#else
 3483|       |#ifdef Sudden_Underflow
 3484|       |			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
 3485|       |				dval(&rv0) = dval(&rv);
 3486|       |				word0(&rv) += P*Exp_msk1;
 3487|       |				adj.d = aadj1 * ulp(&rv);
 3488|       |				dval(&rv) += adj.d;
 3489|       |#ifdef IBM
 3490|       |				if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)
 3491|       |#else
 3492|       |				if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
 3493|       |#endif
 3494|       |					{
 3495|       |					if (word0(&rv0) == Tiny0
 3496|       |					 && word1(&rv0) == Tiny1) {
 3497|       |						if (bc.nd >nd) {
 3498|       |							bc.uflchk = 1;
 3499|       |							break;
 3500|       |							}
 3501|       |						goto undfl;
 3502|       |						}
 3503|       |					word0(&rv) = Tiny0;
 3504|       |					word1(&rv) = Tiny1;
 3505|       |					goto cont;
 3506|       |					}
 3507|       |				else
 3508|       |					word0(&rv) -= P*Exp_msk1;
 3509|       |				}
 3510|       |			else {
 3511|       |				adj.d = aadj1 * ulp(&rv);
 3512|       |				dval(&rv) += adj.d;
 3513|       |				}
 3514|       |#else /*Sudden_Underflow*/
 3515|       |			/* Compute adj so that the IEEE rounding rules will
 3516|       |			 * correctly round rv + adj in some half-way cases.
 3517|       |			 * If rv * ulp(rv) is denormalized (i.e.,
 3518|       |			 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
 3519|       |			 * trouble from bits lost to denormalization;
 3520|       |			 * example: 1.2e-307 .
 3521|       |			 */
 3522|       |			if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
 3523|       |				aadj1 = (double)(int)(aadj + 0.5);
 3524|       |				if (!bc.dsign)
 3525|       |					aadj1 = -aadj1;
 3526|       |				}
 3527|       |			adj.d = aadj1 * ulp(&rv);
 3528|       |			dval(&rv) += adj.d;
 3529|       |#endif /*Sudden_Underflow*/
 3530|       |#endif /*Avoid_Underflow*/
 3531|    298|			}
 3532|    298|		z = word0(&rv) & Exp_mask;
  ------------------
  |  |  309|    298|#define word0(x) (x)->L[1]
  ------------------
              		z = word0(&rv) & Exp_mask;
  ------------------
  |  |  350|    298|#define Exp_mask  0x7ff00000
  ------------------
 3533|    298|#ifndef SET_INEXACT
 3534|    298|		if (bc.nd == nd) {
  ------------------
  |  Branch (3534:7): [True: 296, False: 2]
  ------------------
 3535|    296|#ifdef Avoid_Underflow
 3536|    296|		if (!bc.scale)
  ------------------
  |  Branch (3536:7): [True: 296, False: 0]
  ------------------
 3537|    296|#endif
 3538|    296|		if (y == z) {
  ------------------
  |  Branch (3538:7): [True: 296, False: 0]
  ------------------
 3539|       |			/* Can we stop now? */
 3540|    296|			L = (Long)aadj;
 3541|    296|			aadj -= L;
 3542|       |			/* The tolerances below are conservative. */
 3543|    296|			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  310|    296|#define word1(x) (x)->L[0]
  |  |  ------------------
  |  |  |  Branch (310:18): [True: 0, False: 0]
  |  |  ------------------
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  363|      0|#define Bndry_mask  0xfffff
  ------------------
  |  Branch (3543:8): [True: 296, False: 0]
  |  Branch (3543:34): [True: 0, False: 0]
  ------------------
 3544|    296|				if (aadj < .4999999 || aadj > .5000001)
  ------------------
  |  Branch (3544:9): [True: 296, False: 0]
  |  Branch (3544:28): [True: 0, False: 0]
  ------------------
 3545|    296|					break;
 3546|    296|				}
 3547|      0|			else if (aadj < .4999999/FLT_RADIX)
  ------------------
  |  Branch (3547:13): [True: 0, False: 0]
  ------------------
 3548|      0|				break;
 3549|    296|			}
 3550|    296|		}
 3551|      2|#endif
 3552|      2| cont:
 3553|      2|		Bfree(dalloc, bb);
 3554|      2|		Bfree(dalloc, bd);
 3555|      2|		Bfree(dalloc, bs);
 3556|      2|		Bfree(dalloc, delta);
 3557|      2|		}
 3558|  42.4k|	Bfree(dalloc, bb);
 3559|  42.4k|	Bfree(dalloc, bd);
 3560|  42.4k|	Bfree(dalloc, bs);
 3561|  42.4k|	Bfree(dalloc, bd0);
 3562|  42.4k|	Bfree(dalloc, delta);
 3563|  42.4k|#ifndef NO_STRTOD_BIGCOMP
 3564|  42.4k|	if (req_bigcomp) {
  ------------------
  |  Branch (3564:6): [True: 26, False: 42.4k]
  ------------------
 3565|     26|		bd0 = 0;
 3566|     26|		bc.e0 += nz1;
 3567|     26|		bigcomp(dalloc, &rv, s0, &bc);
 3568|     26|		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  309|     26|#define word0(x) (x)->L[1]
  ------------------
              		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  350|     26|#define Exp_mask  0x7ff00000
  ------------------
 3569|     26|		if (y == Exp_mask)
  ------------------
  |  |  350|     26|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (3569:7): [True: 0, False: 26]
  ------------------
 3570|      0|			goto ovfl;
 3571|     26|		if (y == 0 && rv.d == 0.)
  ------------------
  |  Branch (3571:7): [True: 0, False: 26]
  |  Branch (3571:17): [True: 0, False: 0]
  ------------------
 3572|      0|			goto undfl;
 3573|     26|		}
 3574|  42.4k|#endif
 3575|       |#ifdef SET_INEXACT
 3576|       |	if (bc.inexact) {
 3577|       |		if (!oldinexact) {
 3578|       |			word0(&rv0) = Exp_1 + (70 << Exp_shift);
 3579|       |			word1(&rv0) = 0;
 3580|       |			dval(&rv0) += 1.;
 3581|       |			}
 3582|       |		}
 3583|       |	else if (!oldinexact)
 3584|       |		clear_inexact();
 3585|       |#endif
 3586|  42.4k|#ifdef Avoid_Underflow
 3587|  42.4k|	if (bc.scale) {
  ------------------
  |  Branch (3587:6): [True: 0, False: 42.4k]
  ------------------
 3588|      0|		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  356|      0|#define Exp_1  0x3ff00000
  ------------------
              		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 3589|      0|		word1(&rv0) = 0;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
 3590|      0|		dval(&rv) *= dval(&rv0);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
              		dval(&rv) *= dval(&rv0);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 3591|      0|#ifndef NO_ERRNO
 3592|       |		/* try to avoid the bug of testing an 8087 register value */
 3593|      0|#ifdef IEEE_Arith
 3594|      0|		if (!(word0(&rv) & Exp_mask))
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              		if (!(word0(&rv) & Exp_mask))
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (3594:7): [True: 0, False: 0]
  ------------------
 3595|       |#else
 3596|       |		if (word0(&rv) == 0 && word1(&rv) == 0)
 3597|       |#endif
 3598|      0|			errno = ERANGE;
 3599|      0|#endif
 3600|      0|		}
 3601|  42.4k|#endif /* Avoid_Underflow */
 3602|       |#ifdef SET_INEXACT
 3603|       |	if (bc.inexact && !(word0(&rv) & Exp_mask)) {
 3604|       |		/* set underflow bit */
 3605|       |		dval(&rv0) = 1e-300;
 3606|       |		dval(&rv0) *= dval(&rv0);
 3607|       |		}
 3608|       |#endif
 3609|  43.4k| ret:
 3610|  43.4k|	if (se)
  ------------------
  |  Branch (3610:6): [True: 43.4k, False: 0]
  ------------------
 3611|  43.4k|		*se = (char *)s;
 3612|  43.4k|	return sign ? -dval(&rv) : dval(&rv);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
              	return sign ? -dval(&rv) : dval(&rv);
  ------------------
  |  |  315|  43.4k|#define dval(x) (x)->d
  ------------------
  |  Branch (3612:9): [True: 0, False: 43.4k]
  ------------------
 3613|  42.4k|	}
dtoa.c:s2b:
  724|  42.4k|{
  725|  42.4k|	Bigint *b;
  726|  42.4k|	int i, k;
  727|  42.4k|	Long x, y;
  728|       |
  729|  42.4k|	x = (nd + 8) / 9;
  730|  86.3k|	for(k = 0, y = 1; x > y; y <<= 1, k++) ;
  ------------------
  |  Branch (730:20): [True: 43.8k, False: 42.4k]
  ------------------
  731|  42.4k|#ifdef Pack_32
  732|  42.4k|	b = Balloc(dalloc, k);
  733|  42.4k|	b->x[0] = y9;
  734|  42.4k|	b->wds = 1;
  735|       |#else
  736|       |	b = Balloc(k+1);
  737|       |	b->x[0] = y9 & 0xffff;
  738|       |	b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
  739|       |#endif
  740|       |
  741|  42.4k|	i = 9;
  742|  42.4k|	if (9 < nd0) {
  ------------------
  |  Branch (742:6): [True: 42.4k, False: 0]
  ------------------
  743|  42.4k|		s += 9;
  744|   391k|		do b = multadd(dalloc, b, 10, *s++ - '0');
  745|   391k|			while(++i < nd0);
  ------------------
  |  Branch (745:10): [True: 348k, False: 42.4k]
  ------------------
  746|  42.4k|		s += dplen;
  747|  42.4k|		}
  748|      0|	else
  749|      0|		s += dplen + 9;
  750|  42.4k|	for(; i < nd; i++)
  ------------------
  |  Branch (750:8): [True: 0, False: 42.4k]
  ------------------
  751|      0|		b = multadd(dalloc, b, 10, *s++ - '0');
  752|  42.4k|	return b;
  753|  42.4k|	}
dtoa.c:sulp:
 2317|  39.8k|{
 2318|  39.8k|	U u;
 2319|  39.8k|	double rv;
 2320|  39.8k|	int i;
 2321|       |
 2322|  39.8k|	rv = ulp(x);
 2323|  39.8k|	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
              	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  346|      0|#define Exp_shift  20
  ------------------
  |  Branch (2323:6): [True: 39.8k, False: 0]
  |  Branch (2323:20): [True: 0, False: 0]
  ------------------
 2324|  39.8k|		return rv; /* Is there an example where i <= 0 ? */
 2325|      0|	word0(&u) = Exp_1 + (i << Exp_shift);
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              	word0(&u) = Exp_1 + (i << Exp_shift);
  ------------------
  |  |  356|      0|#define Exp_1  0x3ff00000
  ------------------
              	word0(&u) = Exp_1 + (i << Exp_shift);
  ------------------
  |  |  346|      0|#define Exp_shift  20
  ------------------
 2326|      0|	word1(&u) = 0;
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
 2327|      0|	return rv * u.d;
 2328|  39.8k|	}
dtoa.c:ratio:
 1467|    298|{
 1468|    298|	U da, db;
 1469|    298|	int k, ka, kb;
 1470|       |
 1471|    298|	dval(&da) = b2d(a, &ka);
  ------------------
  |  |  315|    298|#define dval(x) (x)->d
  ------------------
 1472|    298|	dval(&db) = b2d(b, &kb);
  ------------------
  |  |  315|    298|#define dval(x) (x)->d
  ------------------
 1473|    298|#ifdef Pack_32
 1474|    298|	k = ka - kb + 32*(a->wds - b->wds);
 1475|       |#else
 1476|       |	k = ka - kb + 16*(a->wds - b->wds);
 1477|       |#endif
 1478|       |#ifdef IBM
 1479|       |	if (k > 0) {
 1480|       |		word0(&da) += (k >> 2)*Exp_msk1;
 1481|       |		if (k &= 3)
 1482|       |			dval(&da) *= 1 << k;
 1483|       |		}
 1484|       |	else {
 1485|       |		k = -k;
 1486|       |		word0(&db) += (k >> 2)*Exp_msk1;
 1487|       |		if (k &= 3)
 1488|       |			dval(&db) *= 1 << k;
 1489|       |		}
 1490|       |#else
 1491|    298|	if (k > 0)
  ------------------
  |  Branch (1491:6): [True: 0, False: 298]
  ------------------
 1492|      0|		word0(&da) += k*Exp_msk1;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              		word0(&da) += k*Exp_msk1;
  ------------------
  |  |  348|      0|#define Exp_msk1    0x100000
  ------------------
 1493|    298|	else {
 1494|    298|		k = -k;
 1495|    298|		word0(&db) += k*Exp_msk1;
  ------------------
  |  |  309|    298|#define word0(x) (x)->L[1]
  ------------------
              		word0(&db) += k*Exp_msk1;
  ------------------
  |  |  348|    298|#define Exp_msk1    0x100000
  ------------------
 1496|    298|		}
 1497|    298|#endif
 1498|    298|	return dval(&da) / dval(&db);
  ------------------
  |  |  315|    298|#define dval(x) (x)->d
  ------------------
              	return dval(&da) / dval(&db);
  ------------------
  |  |  315|    298|#define dval(x) (x)->d
  ------------------
 1499|    298|	}
dtoa.c:b2d:
 1263|    596|{
 1264|    596|	ULong *xa, *xa0, w, y, z;
 1265|    596|	int k;
 1266|    596|	U d;
 1267|       |#ifdef VAX
 1268|       |	ULong d0, d1;
 1269|       |#else
 1270|    596|#define d0 word0(&d)
 1271|    596|#define d1 word1(&d)
 1272|    596|#endif
 1273|       |
 1274|    596|	xa0 = a->x;
 1275|    596|	xa = xa0 + a->wds;
 1276|    596|	y = *--xa;
 1277|       |#ifdef DEBUG
 1278|       |	if (!y) Bug("zero y in b2d");
 1279|       |#endif
 1280|    596|	k = hi0bits(y);
 1281|    596|	*e = 32 - k;
 1282|    596|#ifdef Pack_32
 1283|    596|	if (k < Ebits) {
  ------------------
  |  |  358|    596|#define Ebits 11
  ------------------
  |  Branch (1283:6): [True: 8, False: 588]
  ------------------
 1284|      8|		d0 = Exp_1 | y >> (Ebits - k);
  ------------------
  |  | 1270|      8|#define d0 word0(&d)
  |  |  ------------------
  |  |  |  |  309|      8|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              		d0 = Exp_1 | y >> (Ebits - k);
  ------------------
  |  |  356|      8|#define Exp_1  0x3ff00000
  ------------------
              		d0 = Exp_1 | y >> (Ebits - k);
  ------------------
  |  |  358|      8|#define Ebits 11
  ------------------
 1285|      8|		w = xa > xa0 ? *--xa : 0;
  ------------------
  |  Branch (1285:7): [True: 0, False: 8]
  ------------------
 1286|      8|		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
  ------------------
  |  | 1271|      8|#define d1 word1(&d)
  |  |  ------------------
  |  |  |  |  310|      8|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
              		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
  ------------------
  |  |  358|      8|#define Ebits 11
  ------------------
              		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
  ------------------
  |  |  358|      8|#define Ebits 11
  ------------------
 1287|      8|		goto ret_d;
 1288|      8|		}
 1289|    588|	z = xa > xa0 ? *--xa : 0;
  ------------------
  |  Branch (1289:6): [True: 0, False: 588]
  ------------------
 1290|    588|	if (k -= Ebits) {
  ------------------
  |  |  358|    588|#define Ebits 11
  ------------------
  |  Branch (1290:6): [True: 588, False: 0]
  ------------------
 1291|    588|		d0 = Exp_1 | y << k | z >> (32 - k);
  ------------------
  |  | 1270|    588|#define d0 word0(&d)
  |  |  ------------------
  |  |  |  |  309|    588|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              		d0 = Exp_1 | y << k | z >> (32 - k);
  ------------------
  |  |  356|    588|#define Exp_1  0x3ff00000
  ------------------
 1292|    588|		y = xa > xa0 ? *--xa : 0;
  ------------------
  |  Branch (1292:7): [True: 0, False: 588]
  ------------------
 1293|    588|		d1 = z << k | y >> (32 - k);
  ------------------
  |  | 1271|    588|#define d1 word1(&d)
  |  |  ------------------
  |  |  |  |  310|    588|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
 1294|    588|		}
 1295|      0|	else {
 1296|      0|		d0 = Exp_1 | y;
  ------------------
  |  | 1270|      0|#define d0 word0(&d)
  |  |  ------------------
  |  |  |  |  309|      0|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              		d0 = Exp_1 | y;
  ------------------
  |  |  356|      0|#define Exp_1  0x3ff00000
  ------------------
 1297|      0|		d1 = z;
  ------------------
  |  | 1271|      0|#define d1 word1(&d)
  |  |  ------------------
  |  |  |  |  310|      0|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
 1298|      0|		}
 1299|       |#else
 1300|       |	if (k < Ebits + 16) {
 1301|       |		z = xa > xa0 ? *--xa : 0;
 1302|       |		d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
 1303|       |		w = xa > xa0 ? *--xa : 0;
 1304|       |		y = xa > xa0 ? *--xa : 0;
 1305|       |		d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
 1306|       |		goto ret_d;
 1307|       |		}
 1308|       |	z = xa > xa0 ? *--xa : 0;
 1309|       |	w = xa > xa0 ? *--xa : 0;
 1310|       |	k -= Ebits + 16;
 1311|       |	d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
 1312|       |	y = xa > xa0 ? *--xa : 0;
 1313|       |	d1 = w << k + 16 | y << k;
 1314|       |#endif
 1315|    596| ret_d:
 1316|       |#ifdef VAX
 1317|       |	word0(&d) = d0 >> 16 | d0 << 16;
 1318|       |	word1(&d) = d1 >> 16 | d1 << 16;
 1319|       |#else
 1320|    596|#undef d0
 1321|    596|#undef d1
 1322|    596|#endif
 1323|    596|	return dval(&d);
  ------------------
  |  |  315|    596|#define dval(x) (x)->d
  ------------------
 1324|    588|	}
dtoa.c:hi0bits:
  762|  20.9k|{
  763|  20.9k|	int k = 0;
  764|       |
  765|  20.9k|	if (!(x & 0xffff0000)) {
  ------------------
  |  Branch (765:6): [True: 20.6k, False: 307]
  ------------------
  766|  20.6k|		k = 16;
  767|  20.6k|		x <<= 16;
  768|  20.6k|		}
  769|  20.9k|	if (!(x & 0xff000000)) {
  ------------------
  |  Branch (769:6): [True: 20.8k, False: 167]
  ------------------
  770|  20.8k|		k += 8;
  771|  20.8k|		x <<= 8;
  772|  20.8k|		}
  773|  20.9k|	if (!(x & 0xf0000000)) {
  ------------------
  |  Branch (773:6): [True: 1.09k, False: 19.9k]
  ------------------
  774|  1.09k|		k += 4;
  775|  1.09k|		x <<= 4;
  776|  1.09k|		}
  777|  20.9k|	if (!(x & 0xc0000000)) {
  ------------------
  |  Branch (777:6): [True: 803, False: 20.1k]
  ------------------
  778|    803|		k += 2;
  779|    803|		x <<= 2;
  780|    803|		}
  781|  20.9k|	if (!(x & 0x80000000)) {
  ------------------
  |  Branch (781:6): [True: 557, False: 20.4k]
  ------------------
  782|    557|		k++;
  783|    557|		if (!(x & 0x40000000))
  ------------------
  |  Branch (783:7): [True: 0, False: 557]
  ------------------
  784|      0|			return 32;
  785|    557|		}
  786|  20.9k|	return k;
  787|  20.9k|	}
dtoa.c:ulp:
 1221|  40.1k|{
 1222|  40.1k|	Long L;
 1223|  40.1k|	U u;
 1224|       |
 1225|  40.1k|	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  309|  40.1k|#define word0(x) (x)->L[1]
  ------------------
              	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  350|  40.1k|#define Exp_mask  0x7ff00000
  ------------------
              	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  351|  40.1k|#define P 53
  ------------------
              	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  348|  40.1k|#define Exp_msk1    0x100000
  ------------------
 1226|       |#ifndef Avoid_Underflow
 1227|       |#ifndef Sudden_Underflow
 1228|       |	if (L > 0) {
 1229|       |#endif
 1230|       |#endif
 1231|       |#ifdef IBM
 1232|       |		L |= Exp_msk1 >> 4;
 1233|       |#endif
 1234|  40.1k|		word0(&u) = L;
  ------------------
  |  |  309|  40.1k|#define word0(x) (x)->L[1]
  ------------------
 1235|  40.1k|		word1(&u) = 0;
  ------------------
  |  |  310|  40.1k|#define word1(x) (x)->L[0]
  ------------------
 1236|       |#ifndef Avoid_Underflow
 1237|       |#ifndef Sudden_Underflow
 1238|       |		}
 1239|       |	else {
 1240|       |		L = -L >> Exp_shift;
 1241|       |		if (L < Exp_shift) {
 1242|       |			word0(&u) = 0x80000 >> L;
 1243|       |			word1(&u) = 0;
 1244|       |			}
 1245|       |		else {
 1246|       |			word0(&u) = 0;
 1247|       |			L -= Exp_shift;
 1248|       |			word1(&u) = L >= 31 ? 1 : 1 << 31 - L;
 1249|       |			}
 1250|       |		}
 1251|       |#endif
 1252|       |#endif
 1253|  40.1k|	return dval(&u);
  ------------------
  |  |  315|  40.1k|#define dval(x) (x)->d
  ------------------
 1254|  40.1k|	}
dtoa.c:bigcomp:
 2340|     26|{
 2341|     26|	Bigint *b, *d;
 2342|     26|	int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase;
 2343|       |
 2344|     26|	dsign = bc->dsign;
 2345|     26|	nd = bc->nd;
 2346|     26|	nd0 = bc->nd0;
 2347|     26|	p5 = nd + bc->e0 - 1;
 2348|     26|	speccase = 0;
 2349|     26|#ifndef Sudden_Underflow
 2350|     26|	if (rv->d == 0.) {	/* special case: value near underflow-to-zero */
  ------------------
  |  Branch (2350:6): [True: 0, False: 26]
  ------------------
 2351|       |				/* threshold was rounded to zero */
 2352|      0|		b = i2b(dalloc, 1);
 2353|      0|		p2 = Emin - P + 1;
  ------------------
  |  |  355|      0|#define Emin (-1022)
  ------------------
              		p2 = Emin - P + 1;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
 2354|      0|		bbits = 1;
 2355|      0|#ifdef Avoid_Underflow
 2356|      0|		word0(rv) = (P+2) << Exp_shift;
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              		word0(rv) = (P+2) << Exp_shift;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
              		word0(rv) = (P+2) << Exp_shift;
  ------------------
  |  |  346|      0|#define Exp_shift  20
  ------------------
 2357|       |#else
 2358|       |		word1(rv) = 1;
 2359|       |#endif
 2360|      0|		i = 0;
 2361|       |#ifdef Honor_FLT_ROUNDS
 2362|       |		if (bc->rounding == 1)
 2363|       |#endif
 2364|      0|			{
 2365|      0|			speccase = 1;
 2366|      0|			--p2;
 2367|      0|			dsign = 0;
 2368|      0|			goto have_i;
 2369|      0|			}
 2370|      0|		}
 2371|     26|	else
 2372|     26|#endif
 2373|     26|		b = d2b(dalloc, rv, &p2, &bbits);
 2374|     26|#ifdef Avoid_Underflow
 2375|     26|	p2 -= bc->scale;
 2376|     26|#endif
 2377|       |	/* floor(log2(rv)) == bbits - 1 + p2 */
 2378|       |	/* Check for denormal case. */
 2379|     26|	i = P - bbits;
  ------------------
  |  |  351|     26|#define P 53
  ------------------
 2380|     26|	if (i > (j = P - Emin - 1 + p2)) {
  ------------------
  |  |  351|     26|#define P 53
  ------------------
              	if (i > (j = P - Emin - 1 + p2)) {
  ------------------
  |  |  355|     26|#define Emin (-1022)
  ------------------
  |  Branch (2380:6): [True: 0, False: 26]
  ------------------
 2381|       |#ifdef Sudden_Underflow
 2382|       |		Bfree(b);
 2383|       |		b = i2b(1);
 2384|       |		p2 = Emin;
 2385|       |		i = P - 1;
 2386|       |#ifdef Avoid_Underflow
 2387|       |		word0(rv) = (1 + bc->scale) << Exp_shift;
 2388|       |#else
 2389|       |		word0(rv) = Exp_msk1;
 2390|       |#endif
 2391|       |		word1(rv) = 0;
 2392|       |#else
 2393|      0|		i = j;
 2394|      0|#endif
 2395|      0|		}
 2396|       |#ifdef Honor_FLT_ROUNDS
 2397|       |	if (bc->rounding != 1) {
 2398|       |		if (i > 0)
 2399|       |			b = lshift(b, i);
 2400|       |		if (dsign)
 2401|       |			b = increment(b);
 2402|       |		}
 2403|       |	else
 2404|       |#endif
 2405|     26|		{
 2406|     26|		b = lshift(dalloc, b, ++i);
 2407|     26|		b->x[0] |= 1;
 2408|     26|		}
 2409|     26|#ifndef Sudden_Underflow
 2410|     26| have_i:
 2411|     26|#endif
 2412|     26|	p2 -= p5 + i;
 2413|     26|	d = i2b(dalloc, 1);
 2414|       |	/* Arrange for convenient computation of quotients:
 2415|       |	 * shift left if necessary so divisor has 4 leading 0 bits.
 2416|       |	 */
 2417|     26|	if (p5 > 0)
  ------------------
  |  Branch (2417:6): [True: 20, False: 6]
  ------------------
 2418|     20|		d = pow5mult(dalloc, d, p5);
 2419|      6|	else if (p5 < 0)
  ------------------
  |  Branch (2419:11): [True: 6, False: 0]
  ------------------
 2420|      6|		b = pow5mult(dalloc, b, -p5);
 2421|     26|	if (p2 > 0) {
  ------------------
  |  Branch (2421:6): [True: 20, False: 6]
  ------------------
 2422|     20|		b2 = p2;
 2423|     20|		d2 = 0;
 2424|     20|		}
 2425|      6|	else {
 2426|      6|		b2 = 0;
 2427|      6|		d2 = -p2;
 2428|      6|		}
 2429|     26|	i = dshift(d, d2);
 2430|     26|	if ((b2 += i) > 0)
  ------------------
  |  Branch (2430:6): [True: 26, False: 0]
  ------------------
 2431|     26|		b = lshift(dalloc, b, b2);
 2432|     26|	if ((d2 += i) > 0)
  ------------------
  |  Branch (2432:6): [True: 26, False: 0]
  ------------------
 2433|     26|		d = lshift(dalloc, d, d2);
 2434|       |
 2435|       |	/* Now b/d = exactly half-way between the two floating-point values */
 2436|       |	/* on either side of the input string.  Compute first digit of b/d. */
 2437|       |
 2438|     26|	if (!(dig = quorem(b,d))) {
  ------------------
  |  Branch (2438:6): [True: 0, False: 26]
  ------------------
 2439|      0|		b = multadd(dalloc, b, 10, 0);	/* very unlikely */
 2440|      0|		dig = quorem(b,d);
 2441|      0|		}
 2442|       |
 2443|       |	/* Compare b/d with s0 */
 2444|       |
 2445|    346|	for(i = 0; i < nd0; ) {
  ------------------
  |  Branch (2445:13): [True: 346, False: 0]
  ------------------
 2446|    346|		if ((dd = s0[i++] - '0' - dig))
  ------------------
  |  Branch (2446:7): [True: 26, False: 320]
  ------------------
 2447|     26|			goto ret;
 2448|    320|		if (!b->x[0] && b->wds == 1) {
  ------------------
  |  Branch (2448:7): [True: 0, False: 320]
  |  Branch (2448:19): [True: 0, False: 0]
  ------------------
 2449|      0|			if (i < nd)
  ------------------
  |  Branch (2449:8): [True: 0, False: 0]
  ------------------
 2450|      0|				dd = 1;
 2451|      0|			goto ret;
 2452|      0|			}
 2453|    320|		b = multadd(dalloc, b, 10, 0);
 2454|    320|		dig = quorem(b,d);
 2455|    320|		}
 2456|      0|	for(j = bc->dp1; i++ < nd;) {
  ------------------
  |  Branch (2456:19): [True: 0, False: 0]
  ------------------
 2457|      0|		if ((dd = s0[j++] - '0' - dig))
  ------------------
  |  Branch (2457:7): [True: 0, False: 0]
  ------------------
 2458|      0|			goto ret;
 2459|      0|		if (!b->x[0] && b->wds == 1) {
  ------------------
  |  Branch (2459:7): [True: 0, False: 0]
  |  Branch (2459:19): [True: 0, False: 0]
  ------------------
 2460|      0|			if (i < nd)
  ------------------
  |  Branch (2460:8): [True: 0, False: 0]
  ------------------
 2461|      0|				dd = 1;
 2462|      0|			goto ret;
 2463|      0|			}
 2464|      0|		b = multadd(dalloc, b, 10, 0);
 2465|      0|		dig = quorem(b,d);
 2466|      0|		}
 2467|      0|	if (dig > 0 || b->x[0] || b->wds > 1)
  ------------------
  |  Branch (2467:6): [True: 0, False: 0]
  |  Branch (2467:17): [True: 0, False: 0]
  |  Branch (2467:28): [True: 0, False: 0]
  ------------------
 2468|      0|		dd = -1;
 2469|     26| ret:
 2470|     26|	Bfree(dalloc, b);
 2471|     26|	Bfree(dalloc, d);
 2472|       |#ifdef Honor_FLT_ROUNDS
 2473|       |	if (bc->rounding != 1) {
 2474|       |		if (dd < 0) {
 2475|       |			if (bc->rounding == 0) {
 2476|       |				if (!dsign)
 2477|       |					goto retlow1;
 2478|       |				}
 2479|       |			else if (dsign)
 2480|       |				goto rethi1;
 2481|       |			}
 2482|       |		else if (dd > 0) {
 2483|       |			if (bc->rounding == 0) {
 2484|       |				if (dsign)
 2485|       |					goto rethi1;
 2486|       |				goto ret1;
 2487|       |				}
 2488|       |			if (!dsign)
 2489|       |				goto rethi1;
 2490|       |			dval(rv) += 2.*sulp(rv,bc);
 2491|       |			}
 2492|       |		else {
 2493|       |			bc->inexact = 0;
 2494|       |			if (dsign)
 2495|       |				goto rethi1;
 2496|       |			}
 2497|       |		}
 2498|       |	else
 2499|       |#endif
 2500|     26|	if (speccase) {
  ------------------
  |  Branch (2500:6): [True: 0, False: 26]
  ------------------
 2501|      0|		if (dd <= 0)
  ------------------
  |  Branch (2501:7): [True: 0, False: 0]
  ------------------
 2502|      0|			rv->d = 0.;
 2503|      0|		}
 2504|     26|	else if (dd < 0) {
  ------------------
  |  Branch (2504:11): [True: 26, False: 0]
  ------------------
 2505|     26|		if (!dsign)	/* does not happen for round-near */
  ------------------
  |  Branch (2505:7): [True: 0, False: 26]
  ------------------
 2506|      0|retlow1:
 2507|      0|			dval(rv) -= sulp(rv,bc);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 2508|     26|		}
 2509|      0|	else if (dd > 0) {
  ------------------
  |  Branch (2509:11): [True: 0, False: 0]
  ------------------
 2510|      0|		if (dsign) {
  ------------------
  |  Branch (2510:7): [True: 0, False: 0]
  ------------------
 2511|      0| rethi1:
 2512|      0|			dval(rv) += sulp(rv,bc);
  ------------------
  |  |  315|      0|#define dval(x) (x)->d
  ------------------
 2513|      0|			}
 2514|      0|		}
 2515|      0|	else {
 2516|       |		/* Exact half-way case:  apply round-even rule. */
 2517|      0|		if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
              		if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {
  ------------------
  |  |  350|      0|#define Exp_mask  0x7ff00000
  ------------------
              		if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {
  ------------------
  |  |  346|      0|#define Exp_shift  20
  ------------------
  |  Branch (2517:7): [True: 0, False: 0]
  ------------------
 2518|      0|			i = 1 - j;
 2519|      0|			if (i <= 31) {
  ------------------
  |  Branch (2519:8): [True: 0, False: 0]
  ------------------
 2520|      0|				if (word1(rv) & (0x1 << i))
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (2520:9): [True: 0, False: 0]
  ------------------
 2521|      0|					goto odd;
 2522|      0|				}
 2523|      0|			else if (word0(rv) & (0x1 << (i-32)))
  ------------------
  |  |  309|      0|#define word0(x) (x)->L[1]
  ------------------
  |  Branch (2523:13): [True: 0, False: 0]
  ------------------
 2524|      0|				goto odd;
 2525|      0|			}
 2526|      0|		else if (word1(rv) & 1) {
  ------------------
  |  |  310|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (2526:12): [True: 0, False: 0]
  ------------------
 2527|      0| odd:
 2528|      0|			if (dsign)
  ------------------
  |  Branch (2528:8): [True: 0, False: 0]
  ------------------
 2529|      0|				goto rethi1;
 2530|      0|			goto retlow1;
 2531|      0|			}
 2532|      0|		}
 2533|       |
 2534|       |#ifdef Honor_FLT_ROUNDS
 2535|       | ret1:
 2536|       |#endif
 2537|     26|	return;
 2538|     26|	}
dtoa.c:Bfree:
  642|   790k|{
  643|   790k|	if (v) {
  ------------------
  |  Branch (643:6): [True: 790k, False: 0]
  ------------------
  644|   790k|		if (v->k > Kmax)
  ------------------
  |  |  527|   790k|#define Kmax 7
  ------------------
  |  Branch (644:7): [True: 0, False: 790k]
  ------------------
  645|       |#ifdef FREE
  646|       |			FREE((void*)v);
  647|       |#else
  648|      0|			free((void*)v);
  649|   790k|#endif
  650|   790k|		else {
  651|   790k|			v->next = dalloc->freelist[v->k];
  652|   790k|			dalloc->freelist[v->k] = v;
  653|   790k|			}
  654|   790k|		}
  655|   790k|	}
dtoa.c:d2b:
 1333|  63.9k|{
 1334|  63.9k|	Bigint *b;
 1335|  63.9k|	int de, k;
 1336|  63.9k|	ULong *x, y, z;
 1337|  63.9k|#ifndef Sudden_Underflow
 1338|  63.9k|	int i;
 1339|  63.9k|#endif
 1340|       |#ifdef VAX
 1341|       |	ULong d0, d1;
 1342|       |	d0 = word0(d) >> 16 | word0(d) << 16;
 1343|       |	d1 = word1(d) >> 16 | word1(d) << 16;
 1344|       |#else
 1345|  63.9k|#define d0 word0(d)
 1346|  63.9k|#define d1 word1(d)
 1347|  63.9k|#endif
 1348|       |
 1349|  63.9k|#ifdef Pack_32
 1350|  63.9k|	b = Balloc(dalloc, 1);
 1351|       |#else
 1352|       |	b = Balloc(dalloc, 2);
 1353|       |#endif
 1354|  63.9k|	x = b->x;
 1355|       |
 1356|  63.9k|	z = d0 & Frac_mask;
  ------------------
  |  | 1345|  63.9k|#define d0 word0(d)
  |  |  ------------------
  |  |  |  |  309|  63.9k|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              	z = d0 & Frac_mask;
  ------------------
  |  |  359|  63.9k|#define Frac_mask  0xfffff
  ------------------
 1357|  63.9k|	d0 &= 0x7fffffff;	/* clear sign bit, which we ignore */
  ------------------
  |  | 1345|  63.9k|#define d0 word0(d)
  |  |  ------------------
  |  |  |  |  309|  63.9k|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
 1358|       |#ifdef Sudden_Underflow
 1359|       |	de = (int)(d0 >> Exp_shift);
 1360|       |#ifndef IBM
 1361|       |	z |= Exp_msk11;
 1362|       |#endif
 1363|       |#else
 1364|  63.9k|	if ((de = (int)(d0 >> Exp_shift)))
  ------------------
  |  | 1345|  63.9k|#define d0 word0(d)
  |  |  ------------------
  |  |  |  |  309|  63.9k|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              	if ((de = (int)(d0 >> Exp_shift)))
  ------------------
  |  |  346|  63.9k|#define Exp_shift  20
  ------------------
  |  Branch (1364:6): [True: 63.9k, False: 0]
  ------------------
 1365|  63.9k|		z |= Exp_msk1;
  ------------------
  |  |  348|  63.9k|#define Exp_msk1    0x100000
  ------------------
 1366|  63.9k|#endif
 1367|  63.9k|#ifdef Pack_32
 1368|  63.9k|	if ((y = d1)) {
  ------------------
  |  | 1346|  63.9k|#define d1 word1(d)
  |  |  ------------------
  |  |  |  |  310|  63.9k|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
  |  Branch (1368:6): [True: 62.7k, False: 1.16k]
  ------------------
 1369|  62.7k|		if ((k = lo0bits(&y))) {
  ------------------
  |  Branch (1369:7): [True: 21.5k, False: 41.2k]
  ------------------
 1370|  21.5k|			x[0] = y | z << (32 - k);
 1371|  21.5k|			z >>= k;
 1372|  21.5k|			}
 1373|  41.2k|		else
 1374|  41.2k|			x[0] = y;
 1375|  62.7k|#ifndef Sudden_Underflow
 1376|  62.7k|		i =
 1377|  62.7k|#endif
 1378|  62.7k|		    b->wds = (x[1] = z) ? 2 : 1;
  ------------------
  |  Branch (1378:16): [True: 62.5k, False: 224]
  ------------------
 1379|  62.7k|		}
 1380|  1.16k|	else {
 1381|  1.16k|		k = lo0bits(&z);
 1382|  1.16k|		x[0] = z;
 1383|  1.16k|#ifndef Sudden_Underflow
 1384|  1.16k|		i =
 1385|  1.16k|#endif
 1386|  1.16k|			b->wds = 1;
 1387|  1.16k|		k += 32;
 1388|  1.16k|		}
 1389|       |#else
 1390|       |	if (y = d1) {
 1391|       |		if (k = lo0bits(&y))
 1392|       |			if (k >= 16) {
 1393|       |				x[0] = y | z << 32 - k & 0xffff;
 1394|       |				x[1] = z >> k - 16 & 0xffff;
 1395|       |				x[2] = z >> k;
 1396|       |				i = 2;
 1397|       |				}
 1398|       |			else {
 1399|       |				x[0] = y & 0xffff;
 1400|       |				x[1] = y >> 16 | z << 16 - k & 0xffff;
 1401|       |				x[2] = z >> k & 0xffff;
 1402|       |				x[3] = z >> k+16;
 1403|       |				i = 3;
 1404|       |				}
 1405|       |		else {
 1406|       |			x[0] = y & 0xffff;
 1407|       |			x[1] = y >> 16;
 1408|       |			x[2] = z & 0xffff;
 1409|       |			x[3] = z >> 16;
 1410|       |			i = 3;
 1411|       |			}
 1412|       |		}
 1413|       |	else {
 1414|       |#ifdef DEBUG
 1415|       |		if (!z)
 1416|       |			Bug("Zero passed to d2b");
 1417|       |#endif
 1418|       |		k = lo0bits(&z);
 1419|       |		if (k >= 16) {
 1420|       |			x[0] = z;
 1421|       |			i = 0;
 1422|       |			}
 1423|       |		else {
 1424|       |			x[0] = z & 0xffff;
 1425|       |			x[1] = z >> 16;
 1426|       |			i = 1;
 1427|       |			}
 1428|       |		k += 32;
 1429|       |		}
 1430|       |	while(!x[i])
 1431|       |		--i;
 1432|       |	b->wds = i + 1;
 1433|       |#endif
 1434|  63.9k|#ifndef Sudden_Underflow
 1435|  63.9k|	if (de) {
  ------------------
  |  Branch (1435:6): [True: 63.9k, False: 0]
  ------------------
 1436|  63.9k|#endif
 1437|       |#ifdef IBM
 1438|       |		*e = (de - Bias - (P-1) << 2) + k;
 1439|       |		*bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
 1440|       |#else
 1441|  63.9k|		*e = de - Bias - (P-1) + k;
  ------------------
  |  |  353|  63.9k|#define Bias 1023
  ------------------
              		*e = de - Bias - (P-1) + k;
  ------------------
  |  |  351|  63.9k|#define P 53
  ------------------
 1442|  63.9k|		*bits = P - k;
  ------------------
  |  |  351|  63.9k|#define P 53
  ------------------
 1443|  63.9k|#endif
 1444|  63.9k|#ifndef Sudden_Underflow
 1445|  63.9k|		}
 1446|      0|	else {
 1447|      0|		*e = de - Bias - (P-1) + 1 + k;
  ------------------
  |  |  353|      0|#define Bias 1023
  ------------------
              		*e = de - Bias - (P-1) + 1 + k;
  ------------------
  |  |  351|      0|#define P 53
  ------------------
 1448|      0|#ifdef Pack_32
 1449|      0|		*bits = 32*i - hi0bits(x[i-1]);
 1450|       |#else
 1451|       |		*bits = (i+2)*16 - hi0bits(x[i]);
 1452|       |#endif
 1453|      0|		}
 1454|  63.9k|#endif
 1455|  63.9k|	return b;
 1456|  63.9k|	}
dtoa.c:lo0bits:
  796|  63.9k|{
  797|  63.9k|	int k;
  798|  63.9k|	ULong x = *y;
  799|       |
  800|  63.9k|	if (x & 7) {
  ------------------
  |  Branch (800:6): [True: 61.8k, False: 2.04k]
  ------------------
  801|  61.8k|		if (x & 1)
  ------------------
  |  Branch (801:7): [True: 41.3k, False: 20.5k]
  ------------------
  802|  41.3k|			return 0;
  803|  20.5k|		if (x & 2) {
  ------------------
  |  Branch (803:7): [True: 1.33k, False: 19.2k]
  ------------------
  804|  1.33k|			*y = x >> 1;
  805|  1.33k|			return 1;
  806|  1.33k|			}
  807|  19.2k|		*y = x >> 2;
  808|  19.2k|		return 2;
  809|  20.5k|		}
  810|  2.04k|	k = 0;
  811|  2.04k|	if (!(x & 0xffff)) {
  ------------------
  |  Branch (811:6): [True: 1.19k, False: 848]
  ------------------
  812|  1.19k|		k = 16;
  813|  1.19k|		x >>= 16;
  814|  1.19k|		}
  815|  2.04k|	if (!(x & 0xff)) {
  ------------------
  |  Branch (815:6): [True: 601, False: 1.44k]
  ------------------
  816|    601|		k += 8;
  817|    601|		x >>= 8;
  818|    601|		}
  819|  2.04k|	if (!(x & 0xf)) {
  ------------------
  |  Branch (819:6): [True: 981, False: 1.06k]
  ------------------
  820|    981|		k += 4;
  821|    981|		x >>= 4;
  822|    981|		}
  823|  2.04k|	if (!(x & 0x3)) {
  ------------------
  |  Branch (823:6): [True: 527, False: 1.51k]
  ------------------
  824|    527|		k += 2;
  825|    527|		x >>= 2;
  826|    527|		}
  827|  2.04k|	if (!(x & 1)) {
  ------------------
  |  Branch (827:6): [True: 781, False: 1.26k]
  ------------------
  828|    781|		k++;
  829|    781|		x >>= 1;
  830|    781|		if (!x)
  ------------------
  |  Branch (830:7): [True: 0, False: 781]
  ------------------
  831|      0|			return 32;
  832|    781|		}
  833|  2.04k|	*y = x;
  834|  2.04k|	return k;
  835|  2.04k|	}
dtoa.c:rv_alloc:
 3640|  21.3k|{
 3641|  21.3k|	int j, k, *r;
 3642|       |
 3643|  21.3k|	j = sizeof(ULong);
 3644|  21.3k|	for(k = 0;
 3645|  21.3k|		sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i;
  ------------------
  |  Branch (3645:3): [True: 0, False: 21.3k]
  ------------------
 3646|  21.3k|		j <<= 1)
 3647|      0|			k++;
 3648|  21.3k|	r = (int*)Balloc(dalloc, k);
 3649|  21.3k|	*r = k;
 3650|  21.3k|	return
 3651|       |#ifndef MULTIPLE_THREADS
 3652|       |	dtoa_result =
 3653|       |#endif
 3654|  21.3k|		(char *)(r+1);
 3655|  21.3k|	}
dtoa.c:i2b:
  844|  83.2k|{
  845|  83.2k|	Bigint *b;
  846|       |
  847|  83.2k|	b = Balloc(dalloc, 1);
  848|  83.2k|	b->x[0] = i;
  849|  83.2k|	b->wds = 1;
  850|  83.2k|	return b;
  851|  83.2k|	}
dtoa.c:pow5mult:
  974|  20.4k|{
  975|  20.4k|	Bigint *b1, *p5, *p51;
  976|  20.4k|	int i;
  977|  20.4k|	static int p05[3] = { 5, 25, 125 };
  978|       |
  979|  20.4k|	if ((i = k & 3))
  ------------------
  |  Branch (979:6): [True: 19.9k, False: 491]
  ------------------
  980|  19.9k|		b = multadd(dalloc, b, p05[i-1], 0);
  981|       |
  982|  20.4k|	if (!(k >>= 2))
  ------------------
  |  Branch (982:6): [True: 6, False: 20.4k]
  ------------------
  983|      6|		return b;
  984|  20.4k|	if (!(p5 = p5s)) {
  ------------------
  |  Branch (984:6): [True: 1, False: 20.4k]
  ------------------
  985|       |		/* first time */
  986|      1|#ifdef MULTIPLE_THREADS
  987|      1|		ACQUIRE_DTOA_LOCK(1);
  988|      1|		if (!(p5 = p5s)) {
  ------------------
  |  Branch (988:7): [True: 1, False: 0]
  ------------------
  989|      1|			dalloc_init(&cache.h, PRIVATE_MEM);
  ------------------
  |  |  228|      1|#define PRIVATE_MEM 2304
  ------------------
  990|      1|			p5 = p5s = i2b(&cache.h, 625);
  991|      1|			p5->next = 0;
  992|      1|			}
  993|      1|		FREE_DTOA_LOCK(1);
  994|       |#else
  995|       |		dalloc_init(&cache.h, PRIVATE_MEM);
  996|       |		p5 = p5s = i2b(&cache.h, 625);
  997|       |		p5->next = 0;
  998|       |#endif
  999|      1|		}
 1000|  61.3k|	for(;;) {
 1001|  61.3k|		if (k & 1) {
  ------------------
  |  Branch (1001:7): [True: 21.0k, False: 40.2k]
  ------------------
 1002|  21.0k|			b1 = mult(dalloc, b, p5);
 1003|  21.0k|			Bfree(dalloc, b);
 1004|  21.0k|			b = b1;
 1005|  21.0k|			}
 1006|  61.3k|		if (!(k >>= 1))
  ------------------
  |  Branch (1006:7): [True: 20.4k, False: 40.8k]
  ------------------
 1007|  20.4k|			break;
 1008|  40.8k|		if (!(p51 = p5->next)) {
  ------------------
  |  Branch (1008:7): [True: 4, False: 40.8k]
  ------------------
 1009|      4|#ifdef MULTIPLE_THREADS
 1010|      4|			ACQUIRE_DTOA_LOCK(1);
 1011|      4|			if (!(p51 = p5->next)) {
  ------------------
  |  Branch (1011:8): [True: 4, False: 0]
  ------------------
 1012|      4|				p51 = p5->next = mult(&cache.h,p5,p5);
 1013|      4|				p51->next = 0;
 1014|      4|				}
 1015|      4|			FREE_DTOA_LOCK(1);
 1016|       |#else
 1017|       |			p51 = p5->next = mult(&cache.h,p5,p5);
 1018|       |			p51->next = 0;
 1019|       |#endif
 1020|      4|			}
 1021|  40.8k|		p5 = p51;
 1022|  40.8k|		}
 1023|  20.4k|	return b;
 1024|  20.4k|	}
dtoa.c:mult:
  860|  21.0k|{
  861|  21.0k|	Bigint *c;
  862|  21.0k|	int k, wa, wb, wc;
  863|  21.0k|	ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
  864|  21.0k|	ULong y;
  865|  21.0k|#ifdef ULLong
  866|  21.0k|	ULLong carry, z;
  ------------------
  |  |  515|  21.0k|#define ULLong unsigned Llong
  ------------------
  867|       |#else
  868|       |	ULong carry, z;
  869|       |#ifdef Pack_32
  870|       |	ULong z2;
  871|       |#endif
  872|       |#endif
  873|       |
  874|  21.0k|	if (a->wds < b->wds) {
  ------------------
  |  Branch (874:6): [True: 20.2k, False: 805]
  ------------------
  875|  20.2k|		c = a;
  876|  20.2k|		a = b;
  877|  20.2k|		b = c;
  878|  20.2k|		}
  879|  21.0k|	k = a->k;
  880|  21.0k|	wa = a->wds;
  881|  21.0k|	wb = b->wds;
  882|  21.0k|	wc = wa + wb;
  883|  21.0k|	if (wc > a->maxwds)
  ------------------
  |  Branch (883:6): [True: 20.1k, False: 923]
  ------------------
  884|  20.1k|		k++;
  885|  21.0k|	c = Balloc(dalloc, k);
  886|  84.1k|	for(x = c->x, xa = x + wc; x < xa; x++)
  ------------------
  |  Branch (886:29): [True: 63.0k, False: 21.0k]
  ------------------
  887|  63.0k|		*x = 0;
  888|  21.0k|	xa = a->x;
  889|  21.0k|	xae = xa + wa;
  890|  21.0k|	xb = b->x;
  891|  21.0k|	xbe = xb + wb;
  892|  21.0k|	xc0 = c->x;
  893|  21.0k|#ifdef ULLong
  894|  42.3k|	for(; xb < xbe; xc0++) {
  ------------------
  |  Branch (894:8): [True: 21.2k, False: 21.0k]
  ------------------
  895|  21.2k|		if ((y = *xb++)) {
  ------------------
  |  Branch (895:7): [True: 21.2k, False: 0]
  ------------------
  896|  21.2k|			x = xa;
  897|  21.2k|			xc = xc0;
  898|  21.2k|			carry = 0;
  899|  42.7k|			do {
  900|  42.7k|				z = *x++ * (ULLong)y + *xc + carry;
  901|  42.7k|				carry = z >> 32;
  902|  42.7k|				*xc++ = z & FFFFFFFF;
  ------------------
  |  |  497|  42.7k|#define FFFFFFFF 0xffffffffUL
  ------------------
  903|  42.7k|				}
  904|  42.7k|				while(x < xae);
  ------------------
  |  Branch (904:11): [True: 21.5k, False: 21.2k]
  ------------------
  905|  21.2k|			*xc = carry;
  906|  21.2k|			}
  907|  21.2k|		}
  908|       |#else
  909|       |#ifdef Pack_32
  910|       |	for(; xb < xbe; xb++, xc0++) {
  911|       |		if (y = *xb & 0xffff) {
  912|       |			x = xa;
  913|       |			xc = xc0;
  914|       |			carry = 0;
  915|       |			do {
  916|       |				z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
  917|       |				carry = z >> 16;
  918|       |				z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
  919|       |				carry = z2 >> 16;
  920|       |				Storeinc(xc, z2, z);
  921|       |				}
  922|       |				while(x < xae);
  923|       |			*xc = carry;
  924|       |			}
  925|       |		if (y = *xb >> 16) {
  926|       |			x = xa;
  927|       |			xc = xc0;
  928|       |			carry = 0;
  929|       |			z2 = *xc;
  930|       |			do {
  931|       |				z = (*x & 0xffff) * y + (*xc >> 16) + carry;
  932|       |				carry = z >> 16;
  933|       |				Storeinc(xc, z, z2);
  934|       |				z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
  935|       |				carry = z2 >> 16;
  936|       |				}
  937|       |				while(x < xae);
  938|       |			*xc = z2;
  939|       |			}
  940|       |		}
  941|       |#else
  942|       |	for(; xb < xbe; xc0++) {
  943|       |		if (y = *xb++) {
  944|       |			x = xa;
  945|       |			xc = xc0;
  946|       |			carry = 0;
  947|       |			do {
  948|       |				z = *x++ * y + *xc + carry;
  949|       |				carry = z >> 16;
  950|       |				*xc++ = z & 0xffff;
  951|       |				}
  952|       |				while(x < xae);
  953|       |			*xc = carry;
  954|       |			}
  955|       |		}
  956|       |#endif
  957|       |#endif
  958|  41.8k|	for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
  ------------------
  |  Branch (958:33): [True: 41.8k, False: 0]
  |  Branch (958:43): [True: 20.8k, False: 21.0k]
  ------------------
  959|  21.0k|	c->wds = wc;
  960|  21.0k|	return c;
  961|  21.0k|	}
dtoa.c:dshift:
 2178|  20.4k|{
 2179|  20.4k|	int rv = hi0bits(b->x[b->wds-1]) - 4;
 2180|  20.4k|	if (p2 > 0)
  ------------------
  |  Branch (2180:6): [True: 20.3k, False: 29]
  ------------------
 2181|  20.3k|		rv -= p2;
 2182|  20.4k|	return rv & kmask;
  ------------------
  |  | 1697|  20.4k|#define kmask 31
  ------------------
 2183|  20.4k|	}
dtoa.c:lshift:
 1033|   146k|{
 1034|   146k|	int i, k1, n, n1;
 1035|   146k|	Bigint *b1;
 1036|   146k|	ULong *x, *x1, *xe, z;
 1037|       |
 1038|   146k|#ifdef Pack_32
 1039|   146k|	n = k >> 5;
 1040|       |#else
 1041|       |	n = k >> 4;
 1042|       |#endif
 1043|   146k|	k1 = b->k;
 1044|   146k|	n1 = n + b->wds + 1;
 1045|   211k|	for(i = b->maxwds; n1 > i; i <<= 1)
  ------------------
  |  Branch (1045:21): [True: 64.4k, False: 146k]
  ------------------
 1046|  64.4k|		k1++;
 1047|   146k|	b1 = Balloc(dalloc, k1);
 1048|   146k|	x1 = b1->x;
 1049|   149k|	for(i = 0; i < n; i++)
  ------------------
  |  Branch (1049:13): [True: 3.10k, False: 146k]
  ------------------
 1050|  3.10k|		*x1++ = 0;
 1051|   146k|	x = b->x;
 1052|   146k|	xe = x + b->wds;
 1053|   146k|#ifdef Pack_32
 1054|   146k|	if (k &= 0x1f) {
  ------------------
  |  Branch (1054:6): [True: 146k, False: 80]
  ------------------
 1055|   146k|		k1 = 32 - k;
 1056|   146k|		z = 0;
 1057|   230k|		do {
 1058|   230k|			*x1++ = *x << k | z;
 1059|   230k|			z = *x++ >> k1;
 1060|   230k|			}
 1061|   230k|			while(x < xe);
  ------------------
  |  Branch (1061:10): [True: 84.1k, False: 146k]
  ------------------
 1062|   146k|		if ((*x1 = z))
  ------------------
  |  Branch (1062:7): [True: 492, False: 146k]
  ------------------
 1063|    492|			++n1;
 1064|   146k|		}
 1065|       |#else
 1066|       |	if (k &= 0xf) {
 1067|       |		k1 = 16 - k;
 1068|       |		z = 0;
 1069|       |		do {
 1070|       |			*x1++ = *x << k  & 0xffff | z;
 1071|       |			z = *x++ >> k1;
 1072|       |			}
 1073|       |			while(x < xe);
 1074|       |		if (*x1 = z)
 1075|       |			++n1;
 1076|       |		}
 1077|       |#endif
 1078|     80|	else do
 1079|     80|		*x1++ = *x++;
 1080|     80|		while(x < xe);
  ------------------
  |  Branch (1080:9): [True: 0, False: 80]
  ------------------
 1081|   146k|	b1->wds = n1 - 1;
 1082|   146k|	Bfree(dalloc, b);
 1083|   146k|	return b1;
 1084|   146k|	}
dtoa.c:cmp:
 1093|  1.39M|{
 1094|  1.39M|	ULong *xa, *xa0, *xb, *xb0;
 1095|  1.39M|	int i, j;
 1096|       |
 1097|  1.39M|	i = a->wds;
 1098|  1.39M|	j = b->wds;
 1099|       |#ifdef DEBUG
 1100|       |	if (i > 1 && !a->x[i-1])
 1101|       |		Bug("cmp called with a->x[a->wds-1] == 0");
 1102|       |	if (j > 1 && !b->x[j-1])
 1103|       |		Bug("cmp called with b->x[b->wds-1] == 0");
 1104|       |#endif
 1105|  1.39M|	if (i -= j)
  ------------------
  |  Branch (1105:6): [True: 327k, False: 1.06M]
  ------------------
 1106|   327k|		return i;
 1107|  1.06M|	xa0 = a->x;
 1108|  1.06M|	xa = xa0 + j;
 1109|  1.06M|	xb0 = b->x;
 1110|  1.06M|	xb = xb0 + j;
 1111|  1.10M|	for(;;) {
 1112|  1.10M|		if (*--xa != *--xb)
  ------------------
  |  Branch (1112:7): [True: 1.02M, False: 86.2k]
  ------------------
 1113|  1.02M|			return *xa < *xb ? -1 : 1;
  ------------------
  |  Branch (1113:11): [True: 674k, False: 348k]
  ------------------
 1114|  86.2k|		if (xa <= xa0)
  ------------------
  |  Branch (1114:7): [True: 42.3k, False: 43.8k]
  ------------------
 1115|  42.3k|			break;
 1116|  86.2k|		}
 1117|  42.3k|	return 0;
 1118|  1.06M|	}
dtoa.c:multadd:
  667|  1.02M|{
  668|  1.02M|	int i, wds;
  669|  1.02M|#ifdef ULLong
  670|  1.02M|	ULong *x;
  671|  1.02M|	ULLong carry, y;
  ------------------
  |  |  515|  1.02M|#define ULLong unsigned Llong
  ------------------
  672|       |#else
  673|       |	ULong carry, *x, y;
  674|       |#ifdef Pack_32
  675|       |	ULong xi, z;
  676|       |#endif
  677|       |#endif
  678|  1.02M|	Bigint *b1;
  679|       |
  680|  1.02M|	wds = b->wds;
  681|  1.02M|	x = b->x;
  682|  1.02M|	i = 0;
  683|  1.02M|	carry = a;
  684|  1.80M|	do {
  685|  1.80M|#ifdef ULLong
  686|  1.80M|		y = *x * (ULLong)m + carry;
  687|  1.80M|		carry = y >> 32;
  688|  1.80M|		*x++ = y & FFFFFFFF;
  ------------------
  |  |  497|  1.80M|#define FFFFFFFF 0xffffffffUL
  ------------------
  689|       |#else
  690|       |#ifdef Pack_32
  691|       |		xi = *x;
  692|       |		y = (xi & 0xffff) * m + carry;
  693|       |		z = (xi >> 16) * m + (y >> 16);
  694|       |		carry = z >> 16;
  695|       |		*x++ = (z << 16) + (y & 0xffff);
  696|       |#else
  697|       |		y = *x * m + carry;
  698|       |		carry = y >> 16;
  699|       |		*x++ = y & 0xffff;
  700|       |#endif
  701|       |#endif
  702|  1.80M|		}
  703|  1.80M|		while(++i < wds);
  ------------------
  |  Branch (703:9): [True: 780k, False: 1.02M]
  ------------------
  704|  1.02M|	if (carry) {
  ------------------
  |  Branch (704:6): [True: 64.4k, False: 962k]
  ------------------
  705|  64.4k|		if (wds >= b->maxwds) {
  ------------------
  |  Branch (705:7): [True: 20, False: 64.4k]
  ------------------
  706|     20|			b1 = Balloc(dalloc, b->k+1);
  707|     20|			Bcopy(b1, b);
  ------------------
  |  |  657|     20|#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
  |  |  658|     20|y->wds*sizeof(Long) + 2*sizeof(int))
  ------------------
  708|     20|			Bfree(dalloc, b);
  709|     20|			b = b1;
  710|     20|			}
  711|  64.4k|		b->x[wds++] = carry;
  712|  64.4k|		b->wds = wds;
  713|  64.4k|		}
  714|  1.02M|	return b;
  715|  1.02M|	}
dtoa.c:Balloc:
  609|   790k|{
  610|   790k|	int x;
  611|   790k|	Bigint *rv;
  612|   790k|	unsigned int len;
  613|       |
  614|   790k|	if (k <= Kmax && (rv = dalloc->freelist[k]))
  ------------------
  |  |  527|  1.58M|#define Kmax 7
  ------------------
  |  Branch (614:6): [True: 790k, False: 0]
  |  Branch (614:19): [True: 389k, False: 401k]
  ------------------
  615|   389k|		dalloc->freelist[k] = rv->next;
  616|   401k|	else {
  617|   401k|		x = 1 << k;
  618|   401k|		len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
  619|   401k|			/sizeof(double);
  620|   401k|		if (k <= Kmax && dalloc->pmem_next - dalloc->private_mem + len <= dalloc->pmem_len) {
  ------------------
  |  |  527|   802k|#define Kmax 7
  ------------------
  |  Branch (620:7): [True: 401k, False: 0]
  |  Branch (620:20): [True: 401k, False: 0]
  ------------------
  621|   401k|			rv = (Bigint*)dalloc->pmem_next;
  622|   401k|			dalloc->pmem_next += len;
  623|   401k|			}
  624|      0|		else {
  625|      0|			rv = (Bigint*)MALLOC(len*sizeof(double));
  ------------------
  |  |  224|      0|#define MALLOC malloc
  ------------------
  626|      0|			dalloc->used_heap = 1;
  627|      0|						}
  628|   401k|		rv->k = k;
  629|   401k|		rv->maxwds = x;
  630|   401k|		}
  631|   790k|	rv->sign = rv->wds = 0;
  632|   790k|	return rv;
  633|   790k|	}
dtoa.c:quorem:
 2192|   327k|{
 2193|   327k|	int n;
 2194|   327k|	ULong *bx, *bxe, q, *sx, *sxe;
 2195|   327k|#ifdef ULLong
 2196|   327k|	ULLong borrow, carry, y, ys;
  ------------------
  |  |  515|   327k|#define ULLong unsigned Llong
  ------------------
 2197|       |#else
 2198|       |	ULong borrow, carry, y, ys;
 2199|       |#ifdef Pack_32
 2200|       |	ULong si, z, zs;
 2201|       |#endif
 2202|       |#endif
 2203|       |
 2204|   327k|	n = S->wds;
 2205|       |#ifdef DEBUG
 2206|       |	/*debug*/ if (b->wds > n)
 2207|       |	/*debug*/	Bug("oversize b in quorem");
 2208|       |#endif
 2209|   327k|	if (b->wds < n)
  ------------------
  |  Branch (2209:6): [True: 0, False: 327k]
  ------------------
 2210|      0|		return 0;
 2211|   327k|	sx = S->x;
 2212|   327k|	sxe = sx + --n;
 2213|   327k|	bx = b->x;
 2214|   327k|	bxe = bx + n;
 2215|   327k|	q = *bxe / (*sxe + 1);	/* ensure q <= true quotient */
 2216|       |#ifdef DEBUG
 2217|       |#ifdef NO_STRTOD_BIGCOMP
 2218|       |	/*debug*/ if (q > 9)
 2219|       |#else
 2220|       |	/* An oversized q is possible when quorem is called from bigcomp and */
 2221|       |	/* the input is near, e.g., twice the smallest denormalized number. */
 2222|       |	/*debug*/ if (q > 15)
 2223|       |#endif
 2224|       |	/*debug*/	Bug("oversized quotient in quorem");
 2225|       |#endif
 2226|   327k|	if (q) {
  ------------------
  |  Branch (2226:6): [True: 267k, False: 59.2k]
  ------------------
 2227|   267k|		borrow = 0;
 2228|   267k|		carry = 0;
 2229|   541k|		do {
 2230|   541k|#ifdef ULLong
 2231|   541k|			ys = *sx++ * (ULLong)q + carry;
 2232|   541k|			carry = ys >> 32;
 2233|   541k|			y = *bx - (ys & FFFFFFFF) - borrow;
  ------------------
  |  |  497|   541k|#define FFFFFFFF 0xffffffffUL
  ------------------
 2234|   541k|			borrow = y >> 32 & (ULong)1;
 2235|   541k|			*bx++ = y & FFFFFFFF;
  ------------------
  |  |  497|   541k|#define FFFFFFFF 0xffffffffUL
  ------------------
 2236|       |#else
 2237|       |#ifdef Pack_32
 2238|       |			si = *sx++;
 2239|       |			ys = (si & 0xffff) * q + carry;
 2240|       |			zs = (si >> 16) * q + (ys >> 16);
 2241|       |			carry = zs >> 16;
 2242|       |			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
 2243|       |			borrow = (y & 0x10000) >> 16;
 2244|       |			z = (*bx >> 16) - (zs & 0xffff) - borrow;
 2245|       |			borrow = (z & 0x10000) >> 16;
 2246|       |			Storeinc(bx, z, y);
 2247|       |#else
 2248|       |			ys = *sx++ * q + carry;
 2249|       |			carry = ys >> 16;
 2250|       |			y = *bx - (ys & 0xffff) - borrow;
 2251|       |			borrow = (y & 0x10000) >> 16;
 2252|       |			*bx++ = y & 0xffff;
 2253|       |#endif
 2254|       |#endif
 2255|   541k|			}
 2256|   541k|			while(sx <= sxe);
  ------------------
  |  Branch (2256:10): [True: 273k, False: 267k]
  ------------------
 2257|   267k|		if (!*bxe) {
  ------------------
  |  Branch (2257:7): [True: 0, False: 267k]
  ------------------
 2258|      0|			bx = b->x;
 2259|      0|			while(--bxe > bx && !*bxe)
  ------------------
  |  Branch (2259:10): [True: 0, False: 0]
  |  Branch (2259:24): [True: 0, False: 0]
  ------------------
 2260|      0|				--n;
 2261|      0|			b->wds = n;
 2262|      0|			}
 2263|   267k|		}
 2264|   327k|	if (cmp(b, S) >= 0) {
  ------------------
  |  Branch (2264:6): [True: 347, False: 326k]
  ------------------
 2265|    347|		q++;
 2266|    347|		borrow = 0;
 2267|    347|		carry = 0;
 2268|    347|		bx = b->x;
 2269|    347|		sx = S->x;
 2270|    694|		do {
 2271|    694|#ifdef ULLong
 2272|    694|			ys = *sx++ + carry;
 2273|    694|			carry = ys >> 32;
 2274|    694|			y = *bx - (ys & FFFFFFFF) - borrow;
  ------------------
  |  |  497|    694|#define FFFFFFFF 0xffffffffUL
  ------------------
 2275|    694|			borrow = y >> 32 & (ULong)1;
 2276|    694|			*bx++ = y & FFFFFFFF;
  ------------------
  |  |  497|    694|#define FFFFFFFF 0xffffffffUL
  ------------------
 2277|       |#else
 2278|       |#ifdef Pack_32
 2279|       |			si = *sx++;
 2280|       |			ys = (si & 0xffff) + carry;
 2281|       |			zs = (si >> 16) + (ys >> 16);
 2282|       |			carry = zs >> 16;
 2283|       |			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
 2284|       |			borrow = (y & 0x10000) >> 16;
 2285|       |			z = (*bx >> 16) - (zs & 0xffff) - borrow;
 2286|       |			borrow = (z & 0x10000) >> 16;
 2287|       |			Storeinc(bx, z, y);
 2288|       |#else
 2289|       |			ys = *sx++ + carry;
 2290|       |			carry = ys >> 16;
 2291|       |			y = *bx - (ys & 0xffff) - borrow;
 2292|       |			borrow = (y & 0x10000) >> 16;
 2293|       |			*bx++ = y & 0xffff;
 2294|       |#endif
 2295|       |#endif
 2296|    694|			}
 2297|    694|			while(sx <= sxe);
  ------------------
  |  Branch (2297:10): [True: 347, False: 347]
  ------------------
 2298|    347|		bx = b->x;
 2299|    347|		bxe = bx + n;
 2300|    347|		if (!*bxe) {
  ------------------
  |  Branch (2300:7): [True: 347, False: 0]
  ------------------
 2301|    347|			while(--bxe > bx && !*bxe)
  ------------------
  |  Branch (2301:10): [True: 0, False: 347]
  |  Branch (2301:24): [True: 0, False: 0]
  ------------------
 2302|      0|				--n;
 2303|    347|			b->wds = n;
 2304|    347|			}
 2305|    347|		}
 2306|   327k|	return q;
 2307|   327k|	}
dtoa.c:diff:
 1127|   369k|{
 1128|   369k|	Bigint *c;
 1129|   369k|	int i, wa, wb;
 1130|   369k|	ULong *xa, *xae, *xb, *xbe, *xc;
 1131|   369k|#ifdef ULLong
 1132|   369k|	ULLong borrow, y;
  ------------------
  |  |  515|   369k|#define ULLong unsigned Llong
  ------------------
 1133|       |#else
 1134|       |	ULong borrow, y;
 1135|       |#ifdef Pack_32
 1136|       |	ULong z;
 1137|       |#endif
 1138|       |#endif
 1139|       |
 1140|   369k|	i = cmp(a,b);
 1141|   369k|	if (!i) {
  ------------------
  |  Branch (1141:6): [True: 1.41k, False: 367k]
  ------------------
 1142|  1.41k|		c = Balloc(dalloc, 0);
 1143|  1.41k|		c->wds = 1;
 1144|  1.41k|		c->x[0] = 0;
 1145|  1.41k|		return c;
 1146|  1.41k|		}
 1147|   367k|	if (i < 0) {
  ------------------
  |  Branch (1147:6): [True: 1.13k, False: 366k]
  ------------------
 1148|  1.13k|		c = a;
 1149|  1.13k|		a = b;
 1150|  1.13k|		b = c;
 1151|  1.13k|		i = 1;
 1152|  1.13k|		}
 1153|   366k|	else
 1154|   366k|		i = 0;
 1155|   367k|	c = Balloc(dalloc, a->k);
 1156|   367k|	c->sign = i;
 1157|   367k|	wa = a->wds;
 1158|   367k|	xa = a->x;
 1159|   367k|	xae = xa + wa;
 1160|   367k|	wb = b->wds;
 1161|   367k|	xb = b->x;
 1162|   367k|	xbe = xb + wb;
 1163|   367k|	xc = c->x;
 1164|   367k|	borrow = 0;
 1165|   367k|#ifdef ULLong
 1166|   577k|	do {
 1167|   577k|		y = (ULLong)*xa++ - *xb++ - borrow;
 1168|   577k|		borrow = y >> 32 & (ULong)1;
 1169|   577k|		*xc++ = y & FFFFFFFF;
  ------------------
  |  |  497|   577k|#define FFFFFFFF 0xffffffffUL
  ------------------
 1170|   577k|		}
 1171|   577k|		while(xb < xbe);
  ------------------
  |  Branch (1171:9): [True: 210k, False: 367k]
  ------------------
 1172|   530k|	while(xa < xae) {
  ------------------
  |  Branch (1172:8): [True: 163k, False: 367k]
  ------------------
 1173|   163k|		y = *xa++ - borrow;
 1174|   163k|		borrow = y >> 32 & (ULong)1;
 1175|   163k|		*xc++ = y & FFFFFFFF;
  ------------------
  |  |  497|   163k|#define FFFFFFFF 0xffffffffUL
  ------------------
 1176|   163k|		}
 1177|       |#else
 1178|       |#ifdef Pack_32
 1179|       |	do {
 1180|       |		y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
 1181|       |		borrow = (y & 0x10000) >> 16;
 1182|       |		z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
 1183|       |		borrow = (z & 0x10000) >> 16;
 1184|       |		Storeinc(xc, z, y);
 1185|       |		}
 1186|       |		while(xb < xbe);
 1187|       |	while(xa < xae) {
 1188|       |		y = (*xa & 0xffff) - borrow;
 1189|       |		borrow = (y & 0x10000) >> 16;
 1190|       |		z = (*xa++ >> 16) - borrow;
 1191|       |		borrow = (z & 0x10000) >> 16;
 1192|       |		Storeinc(xc, z, y);
 1193|       |		}
 1194|       |#else
 1195|       |	do {
 1196|       |		y = *xa++ - *xb++ - borrow;
 1197|       |		borrow = (y & 0x10000) >> 16;
 1198|       |		*xc++ = y & 0xffff;
 1199|       |		}
 1200|       |		while(xb < xbe);
 1201|       |	while(xa < xae) {
 1202|       |		y = *xa++ - borrow;
 1203|       |		borrow = (y & 0x10000) >> 16;
 1204|       |		*xc++ = y & 0xffff;
 1205|       |		}
 1206|       |#endif
 1207|       |#endif
 1208|   410k|	while(!*--xc)
  ------------------
  |  Branch (1208:8): [True: 42.3k, False: 367k]
  ------------------
 1209|  42.3k|		wa--;
 1210|   367k|	c->wds = wa;
 1211|   367k|	return c;
 1212|   369k|	}

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

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

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

_ZNK4llvh5APInt12isSingleWordEv:
  120|  16.4M|  bool isSingleWord() const { return BitWidth <= APINT_BITS_PER_WORD; }
_ZN4llvh5APInt15clearUnusedBitsEv:
  153|  2.34M|  APInt &clearUnusedBits() {
  154|       |    // Compute how many bits are used in the final word
  155|  2.34M|    unsigned WordBits = ((BitWidth-1) % APINT_BITS_PER_WORD) + 1;
  156|       |
  157|       |    // Mask out the high bits.
  158|  2.34M|    uint64_t mask = WORDTYPE_MAX >> (APINT_BITS_PER_WORD - WordBits);
  159|  2.34M|    if (isSingleWord())
  ------------------
  |  Branch (159:9): [True: 2.34M, False: 0]
  ------------------
  160|  2.34M|      U.VAL &= mask;
  161|      0|    else
  162|      0|      U.pVal[getNumWords() - 1] &= mask;
  163|  2.34M|    return *this;
  164|  2.34M|  }
_ZN4llvh5APIntC2Ejmb:
  284|  1.56M|      : BitWidth(numBits) {
  285|  1.56M|    assert(BitWidth && "bitwidth too small");
  286|  1.56M|    if (isSingleWord()) {
  ------------------
  |  Branch (286:9): [True: 1.56M, False: 0]
  ------------------
  287|  1.56M|      U.VAL = val;
  288|  1.56M|      clearUnusedBits();
  289|  1.56M|    } else {
  290|      0|      initSlowCase(val, isSigned);
  291|      0|    }
  292|  1.56M|  }
_ZN4llvh5APIntD2Ev:
  341|  3.90M|  ~APInt() {
  342|  3.90M|    if (needsCleanup())
  ------------------
  |  Branch (342:9): [True: 0, False: 3.90M]
  ------------------
  343|      0|      delete[] U.pVal;
  344|  3.90M|  }
_ZN4llvh5APIntC2Ev:
  351|  1.56M|  explicit APInt() : BitWidth(1) { U.VAL = 0; }
_ZNK4llvh5APInt12needsCleanupEv:
  354|  3.90M|  bool needsCleanup() const { return !isSingleWord(); }
_ZNK4llvh5APInt10getRawDataEv:
  680|      5|  const uint64_t *getRawData() const {
  681|      5|    if (isSingleWord())
  ------------------
  |  Branch (681:9): [True: 5, False: 0]
  ------------------
  682|      5|      return &U.VAL;
  683|      0|    return &U.pVal[0];
  684|      5|  }
_ZN4llvh5APIntaSEOS0_:
  753|  3.12M|  APInt &operator=(APInt &&that) {
  754|       |#ifdef _MSC_VER
  755|       |    // The MSVC std::shuffle implementation still does self-assignment.
  756|       |    if (this == &that)
  757|       |      return *this;
  758|       |#endif
  759|  3.12M|    assert(this != &that && "Self-move not supported");
  760|  3.12M|    if (!isSingleWord())
  ------------------
  |  Branch (760:9): [True: 0, False: 3.12M]
  ------------------
  761|      0|      delete[] U.pVal;
  762|       |
  763|       |    // Use memcpy so that type based alias analysis sees both VAL and pVal
  764|       |    // as modified.
  765|  3.12M|    memcpy(&U, &that.U, sizeof(U));
  766|       |
  767|  3.12M|    BitWidth = that.BitWidth;
  768|  3.12M|    that.BitWidth = 0;
  769|       |
  770|  3.12M|    return *this;
  771|  3.12M|  }
_ZNK4llvh5APInteqEm:
 1142|  1.56M|  bool operator==(uint64_t Val) const {
 1143|  1.56M|    return (isSingleWord() || getActiveBits() <= 64) && getZExtValue() == Val;
  ------------------
  |  Branch (1143:13): [True: 1.56M, False: 0]
  |  Branch (1143:31): [True: 0, False: 0]
  |  Branch (1143:57): [True: 781k, False: 781k]
  ------------------
 1144|  1.56M|  }
_ZNK4llvh5APIntneEm:
 1168|  1.56M|  bool operator!=(uint64_t Val) const { return !((*this) == Val); }
_ZNK4llvh5APInt11getBitWidthEv:
 1508|      5|  unsigned getBitWidth() const { return BitWidth; }
_ZNK4llvh5APInt11getNumWordsEv:
 1515|      5|  unsigned getNumWords() const { return getNumWords(BitWidth); }
_ZN4llvh5APInt11getNumWordsEj:
 1523|      5|  static unsigned getNumWords(unsigned BitWidth) {
 1524|      5|    return ((uint64_t)BitWidth + APINT_BITS_PER_WORD - 1) / APINT_BITS_PER_WORD;
 1525|      5|  }
_ZNK4llvh5APInt12getZExtValueEv:
 1562|  1.56M|  uint64_t getZExtValue() const {
 1563|  1.56M|    if (isSingleWord())
  ------------------
  |  Branch (1563:9): [True: 1.56M, False: 0]
  ------------------
 1564|  1.56M|      return U.VAL;
 1565|      0|    assert(getActiveBits() <= 64 && "Too many bits for uint64_t");
 1566|      0|    return U.pVal[0];
 1567|      0|  }
_ZN4llvh5APInt11tcIncrementEPmj:
 1935|      1|  static WordType tcIncrement(WordType *dst, unsigned parts) {
 1936|      1|    return tcAddPart(dst, 1, parts);
 1937|      1|  }

_ZN4llvh8ArrayRefIhEC2Ev:
   61|  5.97k|    /*implicit*/ ArrayRef() = default;
_ZNK4llvh15MutableArrayRefImE4dataEv:
  329|   305M|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefImE4dataEv:
  146|   305M|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIcEC2EPKcm:
   72|  20.8M|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIhE4sizeEv:
  149|  29.7M|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIhE4dataEv:
  146|  10.1M|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIhEC2EPKhm:
   72|  10.5M|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIcE4dataEv:
  146|  5.97M|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIcE4sizeEv:
  149|  27.3M|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIDsE4dataEv:
  146|  12.5M|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIDsE4sizeEv:
  149|  25.8M|    size_t size() const { return Length; }
_ZN4llvh8ArrayRefIDsEC2EPKDsm:
   72|  12.4M|      : Data(data), Length(length) {}
_ZN4llvh12makeArrayRefIhEENS_8ArrayRefIT_EEPKS2_m:
  457|  1.17M|  ArrayRef<T> makeArrayRef(const T *data, size_t length) {
  458|  1.17M|    return ArrayRef<T>(data, length);
  459|  1.17M|  }
_ZNK4llvh8ArrayRefIcE5beginEv:
  137|  18.5M|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIcE3endEv:
  138|  22.1M|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIDsE5beginEv:
  137|  13.2M|    iterator begin() const { return Data; }
_ZN4llvh12makeArrayRefIcEENS_8ArrayRefIT_EEPKS2_m:
  457|   390k|  ArrayRef<T> makeArrayRef(const T *data, size_t length) {
  458|   390k|    return ArrayRef<T>(data, length);
  459|   390k|  }
_ZNK4llvh8ArrayRefIhEcvNSt3__16vectorIhNS2_9allocatorIhEEEEEv:
  271|      5|    operator std::vector<T>() const {
  272|      5|      return std::vector<T>(Data, Data+Length);
  273|      5|    }
_ZN4llvheqIhEEbNS_8ArrayRefIT_EES3_:
  518|  4.91k|  inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) {
  519|  4.91k|    return LHS.equals(RHS);
  520|  4.91k|  }
_ZNK4llvh8ArrayRefIhE6equalsES1_:
  171|  4.91k|    bool equals(ArrayRef RHS) const {
  172|  4.91k|      if (Length != RHS.Length)
  ------------------
  |  Branch (172:11): [True: 0, False: 4.91k]
  ------------------
  173|      0|        return false;
  174|  4.91k|      return std::equal(begin(), end(), RHS.begin());
  175|  4.91k|    }
_ZNK4llvh8ArrayRefIhE3endEv:
  138|  10.6k|    iterator end() const { return Data + Length; }
_ZN4llvh10hash_valueIhEENS_9hash_codeENS_8ArrayRefIT_EE:
  535|      5|  template <typename T> hash_code hash_value(ArrayRef<T> S) {
  536|      5|    return hash_combine_range(S.begin(), S.end());
  537|      5|  }
_ZNK4llvh8ArrayRefINS_9StringRefEE5beginEv:
  137|   643k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefINS_9StringRefEE3endEv:
  138|  1.28M|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIhE5sliceEmm:
  179|  9.38M|    ArrayRef<T> slice(size_t N, size_t M) const {
  180|  9.38M|      assert(N+M <= size() && "Invalid specifier");
  181|  9.38M|      return ArrayRef<T>(data()+N, M);
  182|  9.38M|    }
_ZNK4llvh8ArrayRefIhE5sliceEm:
  185|     15|    ArrayRef<T> slice(size_t N) const { return slice(N, size() - N); }
_ZNK4llvh15MutableArrayRefImEixEm:
  417|   289M|    T &operator[](size_t Index) const {
  418|   289M|      assert(Index < this->size() && "Invalid index!");
  419|   289M|      return data()[Index];
  420|   289M|    }
_ZNK4llvh8ArrayRefImE4sizeEv:
  149|   301M|    size_t size() const { return Length; }
_ZNK4llvh15MutableArrayRefImE10drop_frontEm:
  362|  1.60M|    MutableArrayRef<T> drop_front(size_t N = 1) const {
  363|  1.60M|      assert(this->size() >= N && "Dropping more elements than exist");
  364|  1.60M|      return slice(N, this->size() - N);
  365|  1.60M|    }
_ZNK4llvh15MutableArrayRefImE5sliceEmm:
  351|  1.60M|    MutableArrayRef<T> slice(size_t N, size_t M) const {
  352|  1.60M|      assert(N + M <= this->size() && "Invalid specifier");
  353|  1.60M|      return MutableArrayRef<T>(this->data() + N, M);
  354|  1.60M|    }
_ZNK4llvh8ArrayRefIhE5beginEv:
  137|  35.3k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEE4sizeEv:
  149|   390k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE4sizeEv:
  149|   103k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE5beginEv:
  137|   159k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE3endEv:
  138|   159k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIN6hermes16StringTableEntryEEixEm:
  240|  4.74k|    const T &operator[](size_t Index) const {
  241|  4.74k|      assert(Index < Length && "Invalid index!");
  242|  4.74k|      return Data[Index];
  243|  4.74k|    }
_ZNK4llvh8ArrayRefIDsE3endEv:
  138|  24.9M|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefINSt3__14pairIjjEEE5emptyEv:
  144|  1.42k|    bool empty() const { return Length == 0; }
_ZN4llvh12makeArrayRefImEENS_8ArrayRefIT_EEPKS2_m:
  457|   781k|  ArrayRef<T> makeArrayRef(const T *data, size_t length) {
  458|   781k|    return ArrayRef<T>(data, length);
  459|   781k|  }
_ZN4llvh8ArrayRefIDsEC2IvEERKNS_25SmallVectorTemplateCommonIDsT_EE:
   83|   749k|      : Data(Vec.data()), Length(Vec.size()) {
   84|   749k|    }
_ZNK4llvh8ArrayRefIjE5beginEv:
  137|   677k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIjE3endEv:
  138|   490k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIjE4sizeEv:
  149|   991k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIjE10take_frontEm:
  212|  23.6k|    ArrayRef<T> take_front(size_t N = 1) const {
  213|  23.6k|      if (N >= size())
  ------------------
  |  Branch (213:11): [True: 21.8k, False: 1.82k]
  ------------------
  214|  21.8k|        return *this;
  215|  1.82k|      return drop_back(size() - N);
  216|  23.6k|    }
_ZNK4llvh8ArrayRefIjE9drop_backEm:
  194|  1.82k|    ArrayRef<T> drop_back(size_t N = 1) const {
  195|  1.82k|      assert(size() >= N && "Dropping more elements than exist");
  196|  1.82k|      return slice(0, size() - N);
  197|  1.82k|    }
_ZNK4llvh8ArrayRefIjE5sliceEmm:
  179|   212k|    ArrayRef<T> slice(size_t N, size_t M) const {
  180|   212k|      assert(N+M <= size() && "Invalid specifier");
  181|   212k|      return ArrayRef<T>(data()+N, M);
  182|   212k|    }
_ZNK4llvh8ArrayRefIjE4dataEv:
  146|   212k|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIjE10drop_frontEm:
  188|   210k|    ArrayRef<T> drop_front(size_t N = 1) const {
  189|   210k|      assert(size() >= N && "Dropping more elements than exist");
  190|   210k|      return slice(N, size() - N);
  191|   210k|    }
_ZNK4llvh8ArrayRefIjE5emptyEv:
  144|   186k|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIjE10take_whileIPFbjEEES1_T_:
  227|  93.4k|    template <class PredicateT> ArrayRef<T> take_while(PredicateT Pred) const {
  228|  93.4k|      return ArrayRef<T>(begin(), find_if_not(*this, Pred));
  229|  93.4k|    }
_ZNK4llvh8ArrayRefIjE10take_untilIPFbjEEES1_T_:
  233|  93.4k|    template <class PredicateT> ArrayRef<T> take_until(PredicateT Pred) const {
  234|  93.4k|      return ArrayRef<T>(begin(), find_if(*this, Pred));
  235|  93.4k|    }
_ZNK4llvh8ArrayRefIhEixEm:
  240|  8.50M|    const T &operator[](size_t Index) const {
  241|  8.50M|      assert(Index < Length && "Invalid index!");
  242|  8.50M|      return Data[Index];
  243|  8.50M|    }
_ZNK4llvh8ArrayRefINSt3__14pairIjjEEE5beginEv:
  137|     81|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefINSt3__14pairIjjEEE3endEv:
  138|    162|    iterator end() const { return Data + Length; }
_ZN4llvh19makeMutableArrayRefIN6hermes2vm18PropertyCacheEntryEEENS_15MutableArrayRefIT_EEPS5_m:
  509|  9.19k|  MutableArrayRef<T> makeMutableArrayRef(T *data, size_t length) {
  510|  9.19k|    return MutableArrayRef<T>(data, length);
  511|  9.19k|  }
_ZN4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEEC2EPS3_m:
  307|  9.19k|      : ArrayRef<T>(data, length) {}
_ZN4llvh8ArrayRefIN6hermes2vm18PropertyCacheEntryEEC2EPKS3_m:
   72|  9.19k|      : Data(data), Length(length) {}
_ZNK4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEE5beginEv:
  331|  9.19k|    iterator begin() const { return data(); }
_ZNK4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEE4dataEv:
  329|  18.3k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIN6hermes2vm18PropertyCacheEntryEE4dataEv:
  146|  18.3k|    const T *data() const { return Data; }
_ZNK4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEE3endEv:
  332|  9.19k|    iterator end() const { return data() + this->size(); }
_ZNK4llvh8ArrayRefIN6hermes2vm18PropertyCacheEntryEE4sizeEv:
  149|  9.19k|    size_t size() const { return Length; }
_ZN4llvh15MutableArrayRefImEC2Ev:
  297|   559k|    /*implicit*/ MutableArrayRef() = default;
_ZN4llvh8ArrayRefImEC2Ev:
   61|   559k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh15MutableArrayRefImEC2EPmm:
  307|  1.98M|      : ArrayRef<T>(data, length) {}
_ZN4llvh8ArrayRefImEC2EPKmm:
   72|  2.76M|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIDsEC2EPKDsS3_:
   76|      8|      : Data(begin), Length(end - begin) {}
_ZNK4llvh8ArrayRefIDsE5sliceEmm:
  179|  11.7M|    ArrayRef<T> slice(size_t N, size_t M) const {
  180|  11.7M|      assert(N+M <= size() && "Invalid specifier");
  181|  11.7M|      return ArrayRef<T>(data()+N, M);
  182|  11.7M|    }
_ZN4llvh8ArrayRefIhEC2INSt3__19allocatorIhEEEERKNS3_6vectorIhT_EE:
   89|  9.62k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvheqIDsEEbNS_8ArrayRefIT_EES3_:
  518|    388|  inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) {
  519|    388|    return LHS.equals(RHS);
  520|    388|  }
_ZNK4llvh8ArrayRefIDsE6equalsES1_:
  171|    388|    bool equals(ArrayRef RHS) const {
  172|    388|      if (Length != RHS.Length)
  ------------------
  |  Branch (172:11): [True: 0, False: 388]
  ------------------
  173|      0|        return false;
  174|    388|      return std::equal(begin(), end(), RHS.begin());
  175|    388|    }
_ZN4llvh8ArrayRefIjEC2IvEERKNS_25SmallVectorTemplateCommonIjT_EE:
   83|  93.3k|      : Data(Vec.data()), Length(Vec.size()) {
   84|  93.3k|    }
_ZN4llvh8ArrayRefIjEC2EPKjS3_:
   76|   186k|      : Data(begin), Length(end - begin) {}
_ZN4llvh8ArrayRefIjEC2EPKjm:
   72|   212k|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIN6hermes5regex14BracketRange32EE5beginEv:
  137|     86|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes5regex14BracketRange32EE3endEv:
  138|     86|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefImEixEm:
  240|   781k|    const T &operator[](size_t Index) const {
  241|   781k|      assert(Index < Length && "Invalid index!");
  242|   781k|      return Data[Index];
  243|   781k|    }
_ZN4llvh8ArrayRefIDsEC2ERKDs:
   68|  20.4k|      : Data(&OneElt), Length(1) {}
_ZN4llvh8ArrayRefIcEC2IvEERKNS_25SmallVectorTemplateCommonIcT_EE:
   83|  7.20k|      : Data(Vec.data()), Length(Vec.size()) {
   84|  7.20k|    }
_ZN4llvh15MutableArrayRefIN6hermes2vm17PinnedHermesValueEEC2Ev:
  297|    160|    /*implicit*/ MutableArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEEC2Ev:
   61|    160|    /*implicit*/ ArrayRef() = default;
_ZN4llvh15MutableArrayRefIN6hermes2vm17PinnedHermesValueEEC2EPS3_m:
  307|    160|      : ArrayRef<T>(data, length) {}
_ZN4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEEC2EPKS3_m:
   72|    160|      : Data(data), Length(length) {}
_ZN4llvh15MutableArrayRefIPN6hermes2vm8CallableEEC2ERNSt3__16vectorIS4_NS6_9allocatorIS4_EEEE:
  318|    320|    : ArrayRef<T>(Vec) {}
_ZN4llvh8ArrayRefIPN6hermes2vm8CallableEEC2INSt3__19allocatorIS4_EEEERKNS7_6vectorIS4_T_EE:
   89|    320|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEE5emptyEv:
  144|    160|    bool empty() const { return Length == 0; }
_ZNK4llvh15MutableArrayRefIN6hermes2vm17PinnedHermesValueEE4dataEv:
  329|    320|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEE4dataEv:
  146|    320|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEE4sizeEv:
  149|    160|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIhE5emptyEv:
  144|  23.4M|    bool empty() const { return Length == 0; }
_ZN4llvh8ArrayRefIcEC2EPKcS3_:
   76|     55|      : Data(begin), Length(end - begin) {}
_ZNK4llvh8ArrayRefIcEixEm:
  240|  91.3k|    const T &operator[](size_t Index) const {
  241|  91.3k|      assert(Index < Length && "Invalid index!");
  242|  91.3k|      return Data[Index];
  243|  91.3k|    }
_ZN4llvh8ArrayRefIcEC2ERKc:
   68|  20.4k|      : Data(&OneElt), Length(1) {}
_ZNK4llvh15MutableArrayRefIPN6hermes2vm8CallableEEixEm:
  417|  4.96k|    T &operator[](size_t Index) const {
  418|  4.96k|      assert(Index < this->size() && "Invalid index!");
  419|  4.96k|      return data()[Index];
  420|  4.96k|    }
_ZNK4llvh8ArrayRefIPN6hermes2vm8CallableEE4sizeEv:
  149|  4.96k|    size_t size() const { return Length; }
_ZNK4llvh15MutableArrayRefIPN6hermes2vm8CallableEE4dataEv:
  329|  4.96k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIPN6hermes2vm8CallableEE4dataEv:
  146|  4.96k|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIcEC2Ev:
   61|    247|    /*implicit*/ ArrayRef() = default;
_ZNK4llvh8ArrayRefIN6hermes10StringKind5EntryEE5beginEv:
  137|    516|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes10StringKind5EntryEE3endEv:
  138|    516|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIjEixEm:
  240|  17.8k|    const T &operator[](size_t Index) const {
  241|  17.8k|      assert(Index < Length && "Invalid index!");
  242|  17.8k|      return Data[Index];
  243|  17.8k|    }
_ZNK4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEEixEm:
  240|   390k|    const T &operator[](size_t Index) const {
  241|   390k|      assert(Index < Length && "Invalid index!");
  242|   390k|      return Data[Index];
  243|   390k|    }
_ZNK4llvh8ArrayRefIN6hermes16RegExpTableEntryEE4sizeEv:
  149|      7|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes16RegExpTableEntryEEixEm:
  240|      7|    const T &operator[](size_t Index) const {
  241|      7|      assert(Index < Length && "Invalid index!");
  242|      7|      return Data[Index];
  243|      7|    }
_ZNK4llvh8ArrayRefIcE5emptyEv:
  144|  1.17M|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIDsE5emptyEv:
  144|    980|    bool empty() const { return Length == 0; }
_ZN4llvh8ArrayRefIhEC2EPKhS3_:
   76|  5.23k|      : Data(begin), Length(end - begin) {}
_ZN4llvh8ArrayRefIDsEC2ILm11EEERAT__KDs:
   98|  6.25M|    /*implicit*/ constexpr ArrayRef(const T (&Arr)[N]) : Data(Arr), Length(N) {}
_ZN4llvh8ArrayRefIDsEC2ILm10EEERAT__KDs:
   98|  5.47M|    /*implicit*/ constexpr ArrayRef(const T (&Arr)[N]) : Data(Arr), Length(N) {}
_ZN4llvh8ArrayRefIN6hermes16StringTableEntryEEC2INSt3__19allocatorIS2_EEEERKNS5_6vectorIS2_T_EE:
   89|  5.62k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIPN6hermes7LiteralEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|    101|      : Data(Vec.data()), Length(Vec.size()) {
   84|    101|    }
_ZN4llvh8ArrayRefIPN6hermes10BasicBlockEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|   206k|      : Data(Vec.data()), Length(Vec.size()) {
   84|   206k|    }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE5beginEv:
  137|   622k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE3endEv:
  138|   622k|    iterator end() const { return Data + Length; }
_ZN4llvh8ArrayRefIjEC2Ev:
   61|    917|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2INS1_9allocatorIS3_EEEERKNS1_6vectorIS3_T_EE:
   89|    588|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes10StringKind5EntryEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|    196|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|    196|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes16RegExpTableEntryEEC2INSt3__19allocatorIS2_EEEERKNS5_6vectorIS2_T_EE:
   89|    196|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes3hbc23HBCExceptionHandlerInfoEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|     52|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIjEC2INSt3__19allocatorIjEEEERKNS3_6vectorIjT_EE:
   89|    196|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh8ArrayRefIN6hermes3hbc15SmallFuncHeaderEE4dataEv:
  146|    320|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIN6hermes3hbc15SmallFuncHeaderEEC2EPKS3_m:
   72|    320|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIN6hermes16StringTableEntryEE4sizeEv:
  149|  10.3k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes16StringTableEntryEE4dataEv:
  146|  10.1k|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes3hbc23HBCExceptionHandlerInfoEE4sizeEv:
  149|     52|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes3hbc21SmallStringTableEntryEE4dataEv:
  146|    320|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIN6hermes3hbc21SmallStringTableEntryEEC2EPKS3_m:
   72|    320|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|   103k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes10IdentifierEEC2IvEERKNS_25SmallVectorTemplateCommonIS2_T_EE:
   83|   103k|      : Data(Vec.data()), Length(Vec.size()) {
   84|   103k|    }
_ZN4llvh8ArrayRefIPN6hermes8FunctionEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|    392|      : Data(Vec.data()), Length(Vec.size()) {
   84|    392|    }
_ZNK4llvh8ArrayRefIPN6hermes8FunctionEE4sizeEv:
  149|    392|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes8FunctionEEixEm:
  240|   206k|    const T &operator[](size_t Index) const {
  241|   206k|      assert(Index < Length && "Invalid index!");
  242|   206k|      return Data[Index];
  243|   206k|    }
_ZN4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|   103k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes10StringKind5EntryEEC2Ev:
   61|    917|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEEC2Ev:
   61|    917|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes16RegExpTableEntryEEC2Ev:
   61|    917|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2Ev:
   61|  2.75k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes3hbc24OverflowStringTableEntryEEC2Ev:
   61|    640|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes3hbc15SmallFuncHeaderEEC2Ev:
   61|    320|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes3hbc21SmallStringTableEntryEEC2Ev:
   61|    320|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes10StringKind5EntryEEC2EPKS3_m:
   72|    320|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes3hbc24OverflowStringTableEntryEEC2EPKS3_m:
   72|    320|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEEC2EPKS3_m:
   72|    320|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes16RegExpTableEntryEEC2EPKS2_m:
   72|    320|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2EPKS3_m:
   72|    640|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIN6hermes3hbc23HBCExceptionHandlerInfoEEixEm:
  240|  38.5k|    const T &operator[](size_t Index) const {
  241|  38.5k|      assert(Index < Length && "Invalid index!");
  242|  38.5k|      return Data[Index];
  243|  38.5k|    }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE4sizeEv:
  149|    980|    size_t size() const { return Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE5beginEv:
  137|    980|    iterator begin() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE3endEv:
  138|    980|    iterator end() const { return Data + Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE5beginEv:
  331|    980|    iterator begin() const { return data(); }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE4dataEv:
  329|  1.96k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE4dataEv:
  146|  1.96k|    const T *data() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE3endEv:
  332|    980|    iterator end() const { return data() + this->size(); }
ConsecutiveStringStorage.cpp:_ZN4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEEC2ERNSt3__16vectorIS4_NS6_9allocatorIS4_EEEE:
  318|    980|    : ArrayRef<T>(Vec) {}
ConsecutiveStringStorage.cpp:_ZN4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEEC2INSt3__19allocatorIS4_EEEERKNS7_6vectorIS4_T_EE:
   89|  1.96k|      : Data(Vec.data()), Length(Vec.size()) {}
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE4sizeEv:
  149|    980|    size_t size() const { return Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE5beginEv:
  137|    980|    iterator begin() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE3endEv:
  138|    980|    iterator end() const { return Data + Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE5beginEv:
  331|    980|    iterator begin() const { return data(); }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE4dataEv:
  329|  1.96k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE4dataEv:
  146|  1.96k|    const T *data() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE3endEv:
  332|    980|    iterator end() const { return data() + this->size(); }
ConsecutiveStringStorage.cpp:_ZN4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEEC2ERNSt3__16vectorIS4_NS6_9allocatorIS4_EEEE:
  318|    980|    : ArrayRef<T>(Vec) {}
ConsecutiveStringStorage.cpp:_ZN4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEEC2INSt3__19allocatorIS4_EEEERKNS7_6vectorIS4_T_EE:
   89|  1.96k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIDsEC2INSt3__19allocatorIDsEEEERKNS3_6vectorIDsT_EE:
   89|  2.34k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEE5emptyEv:
  144|   103k|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEE5beginEv:
  137|   103k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEE3endEv:
  138|   103k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE5emptyEv:
  144|   103k|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE4sizeEv:
  149|      6|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE5beginEv:
  137|      6|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE3endEv:
  138|      6|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE5emptyEv:
  144|    196|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE4sizeEv:
  149|   103k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE5beginEv:
  137|   103k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE3endEv:
  138|   103k|    iterator end() const { return Data + Length; }
_ZN4llvh8ArrayRefIPN6hermes5ValueEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|   159k|      : Data(Vec.data()), Length(Vec.size()) {
   84|   159k|    }
_ZNK4llvh8ArrayRefIPN6hermes7LiteralEE4sizeEv:
  149|    101|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes7LiteralEEixEm:
  240|  1.64M|    const T &operator[](size_t Index) const {
  241|  1.64M|      assert(Index < Length && "Invalid index!");
  242|  1.64M|      return Data[Index];
  243|  1.64M|    }
_ZN4llvh15MutableArrayRefIN6hermes16StringTableEntryEEC2ERNSt3__16vectorIS2_NS4_9allocatorIS2_EEEE:
  318|    196|    : ArrayRef<T>(Vec) {}
_ZN4llvh8ArrayRefINS_9StringRefEEC2INSt3__19allocatorIS1_EEEERKNS4_6vectorIS1_T_EE:
   89|    196|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh15MutableArrayRefIN6hermes16StringTableEntryEEixEm:
  417|  10.1k|    T &operator[](size_t Index) const {
  418|  10.1k|      assert(Index < this->size() && "Invalid index!");
  419|  10.1k|      return data()[Index];
  420|  10.1k|    }
_ZNK4llvh15MutableArrayRefIN6hermes16StringTableEntryEE4dataEv:
  329|  10.1k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE6rbeginEv:
  140|   103k|    reverse_iterator rbegin() const { return reverse_iterator(end()); }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE4rendEv:
  141|   103k|    reverse_iterator rend() const { return reverse_iterator(begin()); }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE4sizeEv:
  149|   103k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE5emptyEv:
  144|   103k|    bool empty() const { return Length == 0; }
_ZN4llvh8ArrayRefINS_9StringRefEEC2ERKSt16initializer_listIS1_E:
  102|  14.9k|    : Data(Vec.begin() == Vec.end() ? (T*)nullptr : Vec.begin()),
  ------------------
  |  Branch (102:12): [True: 0, False: 14.9k]
  ------------------
  103|  14.9k|      Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes6parser9TokenKindEEC2ERKS3_:
   68|     11|      : Data(&OneElt), Length(1) {}
_ZNK4llvh8ArrayRefIN6hermes6parser9TokenKindEE4sizeEv:
  149|     22|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes6parser9TokenKindEEixEm:
  240|     11|    const T &operator[](size_t Index) const {
  241|     11|      assert(Index < Length && "Invalid index!");
  242|     11|      return Data[Index];
  243|     11|    }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE5beginEv:
  137|  1.81k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE3endEv:
  138|  1.81k|    iterator end() const { return Data + Length; }
_ZN4llvh8ArrayRefIN6hermes14CodePointRangeEEC2IvEERKNS_25SmallVectorTemplateCommonIS2_T_EE:
   83|  3.51k|      : Data(Vec.data()), Length(Vec.size()) {
   84|  3.51k|    }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE5emptyEv:
  144|    854|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE4sizeEv:
  149|    854|    size_t size() const { return Length; }
_ZN4llvh12makeArrayRefIN6hermes5regex14BracketRange32EEENS_8ArrayRefIT_EEPKS5_m:
  457|     86|  ArrayRef<T> makeArrayRef(const T *data, size_t length) {
  458|     86|    return ArrayRef<T>(data, length);
  459|     86|  }
_ZN4llvh8ArrayRefIN6hermes5regex14BracketRange32EEC2EPKS3_m:
   72|     86|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIhE4backEv:
  158|  10.9M|    const T &back() const {
  159|  10.9M|      assert(!empty());
  160|  10.9M|      return Data[Length-1];
  161|  10.9M|    }
_ZNK4llvh8ArrayRefIhE9drop_backEm:
  194|  8.98M|    ArrayRef<T> drop_back(size_t N = 1) const {
  195|  8.98M|      assert(size() >= N && "Dropping more elements than exist");
  196|  8.98M|      return slice(0, size() - N);
  197|  8.98M|    }
_ZN4llvh8ArrayRefINS_7SMRangeEEC2ERKS1_:
   68|    686|      : Data(&OneElt), Length(1) {}
_ZN4llvh8ArrayRefINS_7SMRangeEEC2ENS_8NoneTypeE:
   64|     86|    /*implicit*/ ArrayRef(NoneType) {}
_ZN4llvh8ArrayRefINS_7SMFixItEEC2ENS_8NoneTypeE:
   64|    772|    /*implicit*/ ArrayRef(NoneType) {}
_ZN4llvh12makeArrayRefIDsEENS_8ArrayRefIT_EEPKS2_S5_:
  463|      4|  ArrayRef<T> makeArrayRef(const T *begin, const T *end) {
  464|      4|    return ArrayRef<T>(begin, end);
  465|      4|  }
_ZNK4llvh8ArrayRefINS_7SMRangeEE4sizeEv:
  149|    721|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefINS_7SMRangeEEixEm:
  240|    686|    const T &operator[](size_t Index) const {
  241|    686|      assert(Index < Length && "Invalid index!");
  242|    686|      return Data[Index];
  243|    686|    }
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|    772|      : Data(Vec.data()), Length(Vec.size()) {
   84|    772|    }
_ZNK4llvh8ArrayRefINSt3__14pairIjjEEE3vecEv:
  264|    772|    std::vector<T> vec() const {
  265|    772|      return std::vector<T>(Data, Data+Length);
  266|    772|    }
_ZNK4llvh8ArrayRefINS_7SMFixItEE5beginEv:
  137|    772|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefINS_7SMFixItEE3endEv:
  138|    772|    iterator end() const { return Data + Length; }

_ZN4llvh9BitVectorD2Ev:
  164|   559k|  ~BitVector() { std::free(Bits.data()); }
_ZN4llvh9BitVectorC2Ev:
  135|   371k|  BitVector() : Size(0) {}
_ZN4llvh9BitVectorC2EOS0_:
  159|   187k|  BitVector(BitVector &&RHS) : Bits(RHS.Bits), Size(RHS.Size) {
  160|   187k|    RHS.Bits = MutableArrayRef<BitWord>();
  161|   187k|    RHS.Size = 0;
  162|   187k|  }
_ZNK4llvh9BitVector4sizeEv:
  170|   137M|  size_type size() const { return Size; }
_ZNK4llvh9BitVector3anyEv:
  181|  3.24M|  bool any() const {
  182|   133M|    for (unsigned i = 0; i < NumBitWords(size()); ++i)
  ------------------
  |  Branch (182:26): [True: 132M, False: 735k]
  ------------------
  183|   132M|      if (Bits[i] != 0)
  ------------------
  |  Branch (183:11): [True: 2.50M, False: 130M]
  ------------------
  184|  2.50M|        return true;
  185|   735k|    return false;
  186|  3.24M|  }
_ZNK4llvh9BitVector4noneEv:
  202|  3.24M|  bool none() const {
  203|  3.24M|    return !any();
  204|  3.24M|  }
_ZNK4llvh9BitVector13find_first_inEjj:
  208|  2.50M|  int find_first_in(unsigned Begin, unsigned End) const {
  209|  2.50M|    assert(Begin <= End && End <= Size);
  210|  2.50M|    if (Begin == End)
  ------------------
  |  Branch (210:9): [True: 0, False: 2.50M]
  ------------------
  211|      0|      return -1;
  212|       |
  213|  2.50M|    unsigned FirstWord = Begin / BITWORD_SIZE;
  214|  2.50M|    unsigned LastWord = (End - 1) / BITWORD_SIZE;
  215|       |
  216|       |    // Check subsequent words.
  217|  56.7M|    for (unsigned i = FirstWord; i <= LastWord; ++i) {
  ------------------
  |  Branch (217:34): [True: 56.7M, False: 0]
  ------------------
  218|  56.7M|      BitWord Copy = Bits[i];
  219|       |
  220|  56.7M|      if (i == FirstWord) {
  ------------------
  |  Branch (220:11): [True: 2.50M, False: 54.2M]
  ------------------
  221|  2.50M|        unsigned FirstBit = Begin % BITWORD_SIZE;
  222|  2.50M|        Copy &= maskTrailingZeros<BitWord>(FirstBit);
  223|  2.50M|      }
  224|       |
  225|  56.7M|      if (i == LastWord) {
  ------------------
  |  Branch (225:11): [True: 2.13M, False: 54.6M]
  ------------------
  226|  2.13M|        unsigned LastBit = (End - 1) % BITWORD_SIZE;
  227|  2.13M|        Copy &= maskTrailingOnes<BitWord>(LastBit + 1);
  228|  2.13M|      }
  229|  56.7M|      if (Copy != 0)
  ------------------
  |  Branch (229:11): [True: 2.50M, False: 54.2M]
  ------------------
  230|  2.50M|        return i * BITWORD_SIZE + countTrailingZeros(Copy);
  231|  56.7M|    }
  232|      0|    return -1;
  233|  2.50M|  }
_ZNK4llvh9BitVector10find_firstEv:
  332|  2.50M|  int find_first() const { return find_first_in(0, Size); }
_ZN4llvh9BitVector6resizeEjb:
  372|  1.10M|  void resize(unsigned N, bool t = false) {
  373|  1.10M|    if (N > getBitCapacity()) {
  ------------------
  |  Branch (373:9): [True: 372k, False: 736k]
  ------------------
  374|   372k|      unsigned OldCapacity = Bits.size();
  375|   372k|      grow(N);
  376|   372k|      init_words(Bits.drop_front(OldCapacity), t);
  377|   372k|    }
  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|  1.10M|    if (N > Size)
  ------------------
  |  Branch (382:9): [True: 1.10M, False: 0]
  ------------------
  383|  1.10M|      set_unused_bits(t);
  384|       |
  385|       |    // Update the size, and clear out any bits that are now unused
  386|  1.10M|    unsigned OldSize = Size;
  387|  1.10M|    Size = N;
  388|  1.10M|    if (t || N < OldSize)
  ------------------
  |  Branch (388:9): [True: 103k, False: 1.00M]
  |  Branch (388:14): [True: 0, False: 1.00M]
  ------------------
  389|   103k|      clear_unused_bits();
  390|  1.10M|  }
_ZN4llvh9BitVector7reserveEj:
  392|    676|  void reserve(unsigned N) {
  393|    676|    if (N > getBitCapacity())
  ------------------
  |  Branch (393:9): [True: 160, False: 516]
  ------------------
  394|    160|      grow(N);
  395|    676|  }
_ZN4llvh9BitVector3setEj:
  404|  11.2M|  BitVector &set(unsigned Idx) {
  405|  11.2M|    assert(Bits.data() && "Bits never allocated");
  406|  11.2M|    Bits[Idx / BITWORD_SIZE] |= BitWord(1) << (Idx % BITWORD_SIZE);
  407|  11.2M|    return *this;
  408|  11.2M|  }
_ZN4llvh9BitVector5resetEj:
  444|  2.50M|  BitVector &reset(unsigned Idx) {
  445|  2.50M|    Bits[Idx / BITWORD_SIZE] &= ~(BitWord(1) << (Idx % BITWORD_SIZE));
  446|  2.50M|    return *this;
  447|  2.50M|  }
_ZN4llvh9BitVector5resetEjj:
  450|   103k|  BitVector &reset(unsigned I, unsigned E) {
  451|   103k|    assert(I <= E && "Attempted to reset backwards range!");
  452|   103k|    assert(E <= size() && "Attempted to reset out-of-bounds range!");
  453|       |
  454|   103k|    if (I == E) return *this;
  ------------------
  |  Branch (454:9): [True: 0, False: 103k]
  ------------------
  455|       |
  456|   103k|    if (I / BITWORD_SIZE == E / BITWORD_SIZE) {
  ------------------
  |  Branch (456:9): [True: 103k, False: 0]
  ------------------
  457|   103k|      BitWord EMask = 1UL << (E % BITWORD_SIZE);
  458|   103k|      BitWord IMask = 1UL << (I % BITWORD_SIZE);
  459|   103k|      BitWord Mask = EMask - IMask;
  460|   103k|      Bits[I / BITWORD_SIZE] &= ~Mask;
  461|   103k|      return *this;
  462|   103k|    }
  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|   103k|  }
_ZNK4llvh9BitVectorixEj:
  496|  72.6M|  bool operator[](unsigned Idx) const {
  497|  72.6M|    assert (Idx < Size && "Out-of-bounds Bit access.");
  498|  72.6M|    BitWord Mask = BitWord(1) << (Idx % BITWORD_SIZE);
  499|  72.6M|    return (Bits[Idx / BITWORD_SIZE] & Mask) != 0;
  500|  72.6M|  }
_ZNK4llvh9BitVector4testEj:
  502|  72.6M|  bool test(unsigned Idx) const {
  503|  72.6M|    return (*this)[Idx];
  504|  72.6M|  }
_ZN4llvh9BitVector9push_backEb:
  507|   461k|  void push_back(bool Val) {
  508|   461k|    unsigned OldSize = Size;
  509|   461k|    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|   461k|    if (NewSize > getBitCapacity())
  ------------------
  |  Branch (513:9): [True: 246, False: 461k]
  ------------------
  514|    246|      resize(NewSize, false);
  515|   461k|    else
  516|   461k|      Size = NewSize;
  517|       |
  518|       |    // If true, set single bit.
  519|   461k|    if (Val)
  ------------------
  |  Branch (519:9): [True: 461k, False: 0]
  ------------------
  520|   461k|      set(OldSize);
  521|   461k|  }
_ZN4llvh9BitVector5resetERKS0_:
  577|   198k|  BitVector &reset(const BitVector &RHS) {
  578|   198k|    unsigned ThisWords = NumBitWords(size());
  579|   198k|    unsigned RHSWords  = NumBitWords(RHS.size());
  580|   198k|    unsigned i;
  581|  2.96M|    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
  ------------------
  |  Branch (581:17): [True: 2.77M, False: 198k]
  ------------------
  582|  2.77M|      Bits[i] &= ~RHS.Bits[i];
  583|   198k|    return *this;
  584|   198k|  }
_ZNK4llvh9BitVector4testERKS0_:
  588|  98.0k|  bool test(const BitVector &RHS) const {
  589|  98.0k|    unsigned ThisWords = NumBitWords(size());
  590|  98.0k|    unsigned RHSWords  = NumBitWords(RHS.size());
  591|  98.0k|    unsigned i;
  592|   952k|    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
  ------------------
  |  Branch (592:17): [True: 887k, False: 65.3k]
  ------------------
  593|   887k|      if ((Bits[i] & ~RHS.Bits[i]) != 0)
  ------------------
  |  Branch (593:11): [True: 32.7k, False: 854k]
  ------------------
  594|  32.7k|        return true;
  595|       |
  596|  65.3k|    for (; i != ThisWords ; ++i)
  ------------------
  |  Branch (596:12): [True: 0, False: 65.3k]
  ------------------
  597|      0|      if (Bits[i] != 0)
  ------------------
  |  Branch (597:11): [True: 0, False: 0]
  ------------------
  598|      0|        return true;
  599|       |
  600|  65.3k|    return false;
  601|  65.3k|  }
_ZN4llvh9BitVectoroRERKS0_:
  603|   197k|  BitVector &operator|=(const BitVector &RHS) {
  604|   197k|    if (size() < RHS.size())
  ------------------
  |  Branch (604:9): [True: 0, False: 197k]
  ------------------
  605|      0|      resize(RHS.size());
  606|  2.87M|    for (size_t i = 0, e = NumBitWords(RHS.size()); i != e; ++i)
  ------------------
  |  Branch (606:53): [True: 2.67M, False: 197k]
  ------------------
  607|  2.67M|      Bits[i] |= RHS.Bits[i];
  608|   197k|    return *this;
  609|   197k|  }
_ZN4llvh9BitVectoraSERKS0_:
  719|  66.0k|  const BitVector &operator=(const BitVector &RHS) {
  720|  66.0k|    if (this == &RHS) return *this;
  ------------------
  |  Branch (720:9): [True: 0, False: 66.0k]
  ------------------
  721|       |
  722|  66.0k|    Size = RHS.size();
  723|  66.0k|    unsigned RHSWords = NumBitWords(Size);
  724|  66.0k|    if (Size <= getBitCapacity()) {
  ------------------
  |  Branch (724:9): [True: 66.0k, False: 0]
  ------------------
  725|  66.0k|      if (Size)
  ------------------
  |  Branch (725:11): [True: 66.0k, False: 0]
  ------------------
  726|  66.0k|        std::memcpy(Bits.data(), RHS.Bits.data(), RHSWords * sizeof(BitWord));
  727|  66.0k|      clear_unused_bits();
  728|  66.0k|      return *this;
  729|  66.0k|    }
  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|      0|  }
_ZNK4llvh9BitVector11NumBitWordsEj:
  858|   136M|  unsigned NumBitWords(unsigned S) const {
  859|   136M|    return (S + BITWORD_SIZE-1) / BITWORD_SIZE;
  860|   136M|  }
_ZN4llvh9BitVector15set_unused_bitsEb:
  863|  1.65M|  void set_unused_bits(bool t = true) {
  864|       |    //  Set high words first.
  865|  1.65M|    unsigned UsedWords = NumBitWords(Size);
  866|  1.65M|    if (Bits.size() > UsedWords)
  ------------------
  |  Branch (866:9): [True: 1.23M, False: 412k]
  ------------------
  867|  1.23M|      init_words(Bits.drop_front(UsedWords), t);
  868|       |
  869|       |    //  Then set any stray high bits of the last used word.
  870|  1.65M|    unsigned ExtraBits = Size % BITWORD_SIZE;
  871|  1.65M|    if (ExtraBits) {
  ------------------
  |  Branch (871:9): [True: 898k, False: 751k]
  ------------------
  872|   898k|      BitWord ExtraBitMask = ~0UL << ExtraBits;
  873|   898k|      if (t)
  ------------------
  |  Branch (873:11): [True: 0, False: 898k]
  ------------------
  874|      0|        Bits[UsedWords-1] |= ExtraBitMask;
  875|   898k|      else
  876|   898k|        Bits[UsedWords-1] &= ~ExtraBitMask;
  877|   898k|    }
  878|  1.65M|  }
_ZN4llvh9BitVector17clear_unused_bitsEv:
  881|   541k|  void clear_unused_bits() {
  882|   541k|    set_unused_bits(false);
  883|   541k|  }
_ZN4llvh9BitVector4growEj:
  885|   372k|  void grow(unsigned NewSize) {
  886|   372k|    size_t NewCapacity = std::max<size_t>(NumBitWords(NewSize), Bits.size() * 2);
  887|   372k|    assert(NewCapacity > 0 && "realloc-ing zero space");
  888|   372k|    BitWord *NewBits = static_cast<BitWord *>(
  889|   372k|        safe_realloc(Bits.data(), NewCapacity * sizeof(BitWord)));
  890|   372k|    Bits = MutableArrayRef<BitWord>(NewBits, NewCapacity);
  891|   372k|    clear_unused_bits();
  892|   372k|  }
_ZN4llvh9BitVector10init_wordsENS_15MutableArrayRefImEEb:
  894|  1.60M|  void init_words(MutableArrayRef<BitWord> B, bool t) {
  895|  1.60M|    if (B.size() > 0)
  ------------------
  |  Branch (895:9): [True: 1.60M, False: 0]
  ------------------
  896|  1.60M|      memset(B.data(), 0 - (int)t, B.size() * sizeof(BitWord));
  897|  1.60M|  }
_ZNK4llvh9BitVector14getBitCapacityEv:
  929|  1.63M|  size_t getBitCapacity() const { return Bits.size() * BITWORD_SIZE; }

_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEED2Ev:
  687|    494|  ~DenseMap() {
  688|    494|    this->destroyAll();
  689|    494|    operator delete(Buckets);
  690|    494|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E10destroyAllEv:
  334|    494|  void destroyAll() {
  335|    494|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 493, False: 1]
  ------------------
  336|    493|      return;
  337|       |
  338|      1|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|     65|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 64, False: 1]
  ------------------
  340|     64|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 1, False: 63]
  ------------------
  341|     64|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 1, False: 0]
  ------------------
  342|      1|        P->getSecond().~ValueT();
  343|     64|      P->getFirst().~KeyT();
  344|     64|    }
  345|      1|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E13getNumBucketsEv:
  497|  2.46k|  unsigned getNumBuckets() const {
  498|  2.46k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.46k|  }
_ZNK4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE13getNumBucketsEv:
  791|  2.46k|  unsigned getNumBuckets() const {
  792|  2.46k|    return NumBuckets;
  793|  2.46k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E11getEmptyKeyEv:
  426|      6|  static const KeyT getEmptyKey() {
  427|      6|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|      6|                  "Must pass the derived type to this template!");
  429|      6|    return KeyInfoT::getEmptyKey();
  430|      6|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E15getTombstoneKeyEv:
  432|      4|  static const KeyT getTombstoneKey() {
  433|      4|    return KeyInfoT::getTombstoneKey();
  434|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E10getBucketsEv:
  493|      4|  BucketT *getBuckets() {
  494|      4|    return static_cast<DerivedT *>(this)->getBuckets();
  495|      4|  }
_ZNK4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE10getBucketsEv:
  787|  1.96k|  BucketT *getBuckets() const {
  788|  1.96k|    return Buckets;
  789|  1.96k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E13getBucketsEndEv:
  501|      2|  BucketT *getBucketsEnd() {
  502|      2|    return getBuckets() + getNumBuckets();
  503|      2|  }
_ZN4llvh6detail12DenseMapPairIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE8getFirstEv:
   47|    195|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE9getSecondEv:
   49|      2|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEED2Ev:
  687|  2.01k|  ~DenseMap() {
  688|  2.01k|    this->destroyAll();
  689|  2.01k|    operator delete(Buckets);
  690|  2.01k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E10destroyAllEv:
  334|  2.20k|  void destroyAll() {
  335|  2.20k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 1.59k, False: 618]
  ------------------
  336|  1.59k|      return;
  337|       |
  338|    618|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  54.0k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 53.4k, False: 618]
  ------------------
  340|  53.4k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 10.6k, False: 42.7k]
  ------------------
  341|  53.4k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 10.6k, False: 0]
  ------------------
  342|  10.6k|        P->getSecond().~ValueT();
  343|  53.4k|      P->getFirst().~KeyT();
  344|  53.4k|    }
  345|    618|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13getNumBucketsEv:
  497|  8.63M|  unsigned getNumBuckets() const {
  498|  8.63M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  8.63M|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE13getNumBucketsEv:
  791|  8.63M|  unsigned getNumBuckets() const {
  792|  8.63M|    return NumBuckets;
  793|  8.63M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E11getEmptyKeyEv:
  426|  2.17M|  static const KeyT getEmptyKey() {
  427|  2.17M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  2.17M|                  "Must pass the derived type to this template!");
  429|  2.17M|    return KeyInfoT::getEmptyKey();
  430|  2.17M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E15getTombstoneKeyEv:
  432|  2.16M|  static const KeyT getTombstoneKey() {
  433|  2.16M|    return KeyInfoT::getTombstoneKey();
  434|  2.16M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E10getBucketsEv:
  493|  6.45M|  BucketT *getBuckets() {
  494|  6.45M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  6.45M|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE10getBucketsEv:
  787|  8.62M|  BucketT *getBuckets() const {
  788|  8.62M|    return Buckets;
  789|  8.62M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13getBucketsEndEv:
  501|  6.45M|  BucketT *getBucketsEnd() {
  502|  6.45M|    return getBuckets() + getNumBuckets();
  503|  6.45M|  }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEjE8getFirstEv:
   47|   275k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEjE9getSecondEv:
   49|  52.1k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E4findERKS5_:
  154|    119|  iterator find(const_arg_type_t<KeyT> Val) {
  155|    119|    BucketT *TheBucket;
  156|    119|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 71, False: 48]
  ------------------
  157|     71|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|     48|    return end();
  159|    119|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E15LookupBucketForIS5_EEbRKT_RPSA_:
  632|    185|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    185|    const BucketT *ConstFoundBucket;
  634|    185|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    185|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    185|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    185|    return Result;
  638|    185|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E15LookupBucketForIS5_EEbRKT_RPKSA_:
  582|    185|                       const BucketT *&FoundBucket) const {
  583|    185|    const BucketT *BucketsPtr = getBuckets();
  584|    185|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    185|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 36, False: 149]
  ------------------
  587|     36|      FoundBucket = nullptr;
  588|     36|      return false;
  589|     36|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    149|    const BucketT *FoundTombstone = nullptr;
  593|    149|    const KeyT EmptyKey = getEmptyKey();
  594|    149|    const KeyT TombstoneKey = getTombstoneKey();
  595|    149|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    149|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    149|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|    149|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    149|    unsigned ProbeAmt = 1;
  601|    149|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    149|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    149|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    149|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 71, False: 78]
  |  |  ------------------
  ------------------
  605|     71|        FoundBucket = ThisBucket;
  606|     71|        return true;
  607|     71|      }
  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|     78|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     78|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 78, 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|     78|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 78]
  ------------------
  615|     78|        return false;
  616|     78|      }
  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|    149|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E10getBucketsEv:
  489|    185|  const BucketT *getBuckets() const {
  490|    185|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    185|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE10getBucketsEv:
  787|    662|  BucketT *getBuckets() const {
  788|    662|    return Buckets;
  789|    662|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13getNumBucketsEv:
  497|    924|  unsigned getNumBuckets() const {
  498|    924|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    924|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE13getNumBucketsEv:
  791|    924|  unsigned getNumBuckets() const {
  792|    924|    return NumBuckets;
  793|    924|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E11getEmptyKeyEv:
  426|    233|  static const KeyT getEmptyKey() {
  427|    233|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    233|                  "Must pass the derived type to this template!");
  429|    233|    return KeyInfoT::getEmptyKey();
  430|    233|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E15getTombstoneKeyEv:
  432|    167|  static const KeyT getTombstoneKey() {
  433|    167|    return KeyInfoT::getTombstoneKey();
  434|    167|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E12getHashValueERKS5_:
  417|    149|  static unsigned getHashValue(const KeyT &Val) {
  418|    149|    return KeyInfoT::getHashValue(Val);
  419|    149|  }
_ZNK4llvh6detail12DenseMapPairINSt3__14pairINS_9StringRefES4_EEjE8getFirstEv:
   48|    227|  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|    238|                        bool NoAdvance=false) {
  440|    238|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 238]
  ------------------
  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|    238|    return iterator(P, E, Epoch, NoAdvance);
  445|    238|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E10getBucketsEv:
  493|    477|  BucketT *getBuckets() {
  494|    477|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    477|  }
_ZN4llvh6detail12DenseMapPairINSt3__14pairINS_9StringRefES4_EEjE8getFirstEv:
   47|  3.60k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13getBucketsEndEv:
  501|    441|  BucketT *getBucketsEnd() {
  502|    441|    return getBuckets() + getNumBuckets();
  503|    441|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E3endEv:
   85|    167|  inline iterator end() {
   86|    167|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|    167|  }
_ZNK4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb0EEneERKSA_:
 1190|    119|  bool operator!=(const NonConstIterator &RHS) const {
 1191|    119|    return !(*this == RHS);
 1192|    119|  }
_ZNK4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb0EEeqERKSA_:
 1180|    119|  bool operator==(const NonConstIterator &RHS) const {
 1181|    119|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|    119|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|    119|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|    119|           "comparing incomparable iterators!");
 1185|    119|    return Ptr == RHS.Ptr;
 1186|    119|  }
_ZNK4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb0EEptEv:
 1166|     71|  pointer operator->() const {
 1167|     71|    assert(isHandleInSync() && "invalid iterator access!");
 1168|     71|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 71]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|     71|    return Ptr;
 1171|     71|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_EixEOS5_:
  315|     48|  ValueT &operator[](KeyT &&Key) {
  316|     48|    return FindAndConstruct(std::move(Key)).second;
  317|     48|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16FindAndConstructEOS5_:
  307|     48|  value_type& FindAndConstruct(KeyT &&Key) {
  308|     48|    BucketT *TheBucket;
  309|     48|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 48]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|     48|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|     48|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16InsertIntoBucketIS5_JEEEPSA_SE_OT_DpOT0_:
  519|     48|                            ValueArgs &&... Values) {
  520|     48|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     48|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     48|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     48|    return TheBucket;
  525|     48|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E20InsertIntoBucketImplIS5_EEPSA_RKS5_RKT_SE_:
  539|     48|                                BucketT *TheBucket) {
  540|     48|    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|     48|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     48|    unsigned NumBuckets = getNumBuckets();
  553|     48|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     48|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 18, False: 30]
  |  |  ------------------
  ------------------
  554|     18|      this->grow(NumBuckets * 2);
  555|     18|      LookupBucketFor(Lookup, TheBucket);
  556|     18|      NumBuckets = getNumBuckets();
  557|     30|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     30|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 30]
  |  |  ------------------
  ------------------
  558|     30|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     48|    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|     48|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     48|    const KeyT EmptyKey = getEmptyKey();
  570|     48|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 48]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     48|    return TheBucket;
  574|     48|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13getNumEntriesEv:
  457|     96|  unsigned getNumEntries() const {
  458|     96|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|     96|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE13getNumEntriesEv:
  771|     96|  unsigned getNumEntries() const {
  772|     96|    return NumEntries;
  773|     96|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E4growEj:
  509|     18|  void grow(unsigned AtLeast) {
  510|     18|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     18|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE4growEj:
  736|     18|  void grow(unsigned AtLeast) {
  737|     18|    unsigned OldNumBuckets = NumBuckets;
  738|     18|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     18|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     18|    assert(Buckets);
  742|     18|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 18, False: 0]
  ------------------
  743|     18|      this->BaseT::initEmpty();
  744|     18|      return;
  745|     18|    }
  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|    214|  bool allocateBuckets(unsigned Num) {
  796|    214|    NumBuckets = Num;
  797|    214|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 18]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|     18|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     18|    return true;
  804|    214|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E9initEmptyEv:
  347|     18|  void initEmpty() {
  348|     18|    setNumEntries(0);
  349|     18|    setNumTombstones(0);
  350|       |
  351|     18|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     18|           "# initial buckets must be a power of two!");
  353|     18|    const KeyT EmptyKey = getEmptyKey();
  354|  1.17k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 1.15k, False: 18]
  ------------------
  355|  1.15k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13setNumEntriesEj:
  461|     66|  void setNumEntries(unsigned Num) {
  462|     66|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     66|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE13setNumEntriesEj:
  775|     66|  void setNumEntries(unsigned Num) {
  776|     66|    NumEntries = Num;
  777|     66|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16setNumTombstonesEj:
  477|     18|  void setNumTombstones(unsigned Num) {
  478|     18|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     18|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE16setNumTombstonesEj:
  783|     18|  void setNumTombstones(unsigned Num) {
  784|     18|    NumTombstones = Num;
  785|     18|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16getNumTombstonesEv:
  473|     30|  unsigned getNumTombstones() const {
  474|     30|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     30|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE16getNumTombstonesEv:
  779|     30|  unsigned getNumTombstones() const {
  780|     30|    return NumTombstones;
  781|     30|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E19incrementNumEntriesEv:
  465|     48|  void incrementNumEntries() {
  466|     48|    setNumEntries(getNumEntries() + 1);
  467|     48|  }
_ZN4llvh6detail12DenseMapPairINSt3__14pairINS_9StringRefES4_EEjE9getSecondEv:
   49|     96|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E4findERKS3_:
  154|      5|  iterator find(const_arg_type_t<KeyT> Val) {
  155|      5|    BucketT *TheBucket;
  156|      5|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 5]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|      5|    return end();
  159|      5|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPS8_:
  632|     15|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|     15|    const BucketT *ConstFoundBucket;
  634|     15|    bool Result = const_cast<const DenseMapBase *>(this)
  635|     15|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|     15|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|     15|    return Result;
  638|     15|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  582|     15|                       const BucketT *&FoundBucket) const {
  583|     15|    const BucketT *BucketsPtr = getBuckets();
  584|     15|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|     15|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 10, False: 5]
  ------------------
  587|     10|      FoundBucket = nullptr;
  588|     10|      return false;
  589|     10|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|      5|    const BucketT *FoundTombstone = nullptr;
  593|      5|    const KeyT EmptyKey = getEmptyKey();
  594|      5|    const KeyT TombstoneKey = getTombstoneKey();
  595|      5|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|      5|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|      5|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      5|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|      5|    unsigned ProbeAmt = 1;
  601|      5|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|      5|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|      5|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|      5|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  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|      5|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|      5|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5, 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|      5|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 5]
  ------------------
  615|      5|        return false;
  616|      5|      }
  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|      5|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  489|     15|  const BucketT *getBuckets() const {
  490|     15|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|     15|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE10getBucketsEv:
  787|     55|  BucketT *getBuckets() const {
  788|     55|    return Buckets;
  789|     55|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumBucketsEv:
  497|    261|  unsigned getNumBuckets() const {
  498|    261|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    261|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|    261|  unsigned getNumBuckets() const {
  792|    261|    return NumBuckets;
  793|    261|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E11getEmptyKeyEv:
  426|     20|  static const KeyT getEmptyKey() {
  427|     20|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|     20|                  "Must pass the derived type to this template!");
  429|     20|    return KeyInfoT::getEmptyKey();
  430|     20|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15getTombstoneKeyEv:
  432|     10|  static const KeyT getTombstoneKey() {
  433|     10|    return KeyInfoT::getTombstoneKey();
  434|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E12getHashValueERKS3_:
  417|      5|  static unsigned getHashValue(const KeyT &Val) {
  418|      5|    return KeyInfoT::getHashValue(Val);
  419|      5|  }
_ZNK4llvh6detail12DenseMapPairINS_8ArrayRefIhEEjE8getFirstEv:
   48|     10|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E12makeIteratorEPS8_SB_RNS_14DebugEpochBaseEb:
  439|     10|                        bool NoAdvance=false) {
  440|     10|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 10]
  ------------------
  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|     10|    return iterator(P, E, Epoch, NoAdvance);
  445|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  493|     40|  BucketT *getBuckets() {
  494|     40|    return static_cast<DerivedT *>(this)->getBuckets();
  495|     40|  }
_ZN4llvh6detail12DenseMapPairINS_8ArrayRefIhEEjE8getFirstEv:
   47|    975|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getBucketsEndEv:
  501|     30|  BucketT *getBucketsEnd() {
  502|     30|    return getBuckets() + getNumBuckets();
  503|     30|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E3endEv:
   85|     10|  inline iterator end() {
   86|     10|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|     10|  }
_ZNK4llvh16DenseMapIteratorINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEneERKS8_:
 1190|      5|  bool operator!=(const NonConstIterator &RHS) const {
 1191|      5|    return !(*this == RHS);
 1192|      5|  }
_ZNK4llvh16DenseMapIteratorINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEeqERKS8_:
 1180|      5|  bool operator==(const NonConstIterator &RHS) const {
 1181|      5|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|      5|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|      5|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|      5|           "comparing incomparable iterators!");
 1185|      5|    return Ptr == RHS.Ptr;
 1186|      5|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_EixEOS3_:
  315|      5|  ValueT &operator[](KeyT &&Key) {
  316|      5|    return FindAndConstruct(std::move(Key)).second;
  317|      5|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16FindAndConstructEOS3_:
  307|      5|  value_type& FindAndConstruct(KeyT &&Key) {
  308|      5|    BucketT *TheBucket;
  309|      5|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 5]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|      5|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|      5|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16InsertIntoBucketIS3_JEEEPS8_SC_OT_DpOT0_:
  519|      5|                            ValueArgs &&... Values) {
  520|      5|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|      5|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|      5|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|      5|    return TheBucket;
  525|      5|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E20InsertIntoBucketImplIS3_EEPS8_RKS3_RKT_SC_:
  539|      5|                                BucketT *TheBucket) {
  540|      5|    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|      5|    unsigned NewNumEntries = getNumEntries() + 1;
  552|      5|    unsigned NumBuckets = getNumBuckets();
  553|      5|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 5, False: 0]
  |  |  ------------------
  ------------------
  554|      5|      this->grow(NumBuckets * 2);
  555|      5|      LookupBucketFor(Lookup, TheBucket);
  556|      5|      NumBuckets = getNumBuckets();
  557|      5|    } 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|      5|    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|      5|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|      5|    const KeyT EmptyKey = getEmptyKey();
  570|      5|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 5]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|      5|    return TheBucket;
  574|      5|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumEntriesEv:
  457|     10|  unsigned getNumEntries() const {
  458|     10|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|     10|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumEntriesEv:
  771|     10|  unsigned getNumEntries() const {
  772|     10|    return NumEntries;
  773|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E4growEj:
  509|      5|  void grow(unsigned AtLeast) {
  510|      5|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      5|  }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4growEj:
  736|      5|  void grow(unsigned AtLeast) {
  737|      5|    unsigned OldNumBuckets = NumBuckets;
  738|      5|    BucketT *OldBuckets = Buckets;
  739|       |
  740|      5|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|      5|    assert(Buckets);
  742|      5|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 5, False: 0]
  ------------------
  743|      5|      this->BaseT::initEmpty();
  744|      5|      return;
  745|      5|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|    201|  bool allocateBuckets(unsigned Num) {
  796|    201|    NumBuckets = Num;
  797|    201|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 5]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|      5|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      5|    return true;
  804|    201|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E9initEmptyEv:
  347|      5|  void initEmpty() {
  348|      5|    setNumEntries(0);
  349|      5|    setNumTombstones(0);
  350|       |
  351|      5|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      5|           "# initial buckets must be a power of two!");
  353|      5|    const KeyT EmptyKey = getEmptyKey();
  354|    325|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 320, False: 5]
  ------------------
  355|    320|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      5|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13setNumEntriesEj:
  461|     10|  void setNumEntries(unsigned Num) {
  462|     10|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     10|  }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13setNumEntriesEj:
  775|     10|  void setNumEntries(unsigned Num) {
  776|     10|    NumEntries = Num;
  777|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16setNumTombstonesEj:
  477|      5|  void setNumTombstones(unsigned Num) {
  478|      5|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      5|  }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE16setNumTombstonesEj:
  783|      5|  void setNumTombstones(unsigned Num) {
  784|      5|    NumTombstones = Num;
  785|      5|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E19incrementNumEntriesEv:
  465|      5|  void incrementNumEntries() {
  466|      5|    setNumEntries(getNumEntries() + 1);
  467|      5|  }
_ZN4llvh6detail12DenseMapPairINS_8ArrayRefIhEEjE9getSecondEv:
   49|     10|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E4sizeEv:
  102|  1.07M|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13getNumEntriesEv:
  457|  1.10M|  unsigned getNumEntries() const {
  458|  1.10M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.10M|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE13getNumEntriesEv:
  771|  1.10M|  unsigned getNumEntries() const {
  772|  1.10M|    return NumEntries;
  773|  1.10M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E4findERKS2_:
  154|  2.14M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  2.14M|    BucketT *TheBucket;
  156|  2.14M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 2.13M, False: 10.3k]
  ------------------
  157|  2.13M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|  10.3k|    return end();
  159|  2.14M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E15LookupBucketForIS2_EEbRKT_RPS7_:
  632|  2.16M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  2.16M|    const BucketT *ConstFoundBucket;
  634|  2.16M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  2.16M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  2.16M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  2.16M|    return Result;
  638|  2.16M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E15LookupBucketForIS2_EEbRKT_RPKS7_:
  582|  2.16M|                       const BucketT *&FoundBucket) const {
  583|  2.16M|    const BucketT *BucketsPtr = getBuckets();
  584|  2.16M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  2.16M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 1.23k, False: 2.16M]
  ------------------
  587|  1.23k|      FoundBucket = nullptr;
  588|  1.23k|      return false;
  589|  1.23k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  2.16M|    const BucketT *FoundTombstone = nullptr;
  593|  2.16M|    const KeyT EmptyKey = getEmptyKey();
  594|  2.16M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  2.16M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  2.16M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  2.16M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  2.16M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  2.16M|    unsigned ProbeAmt = 1;
  601|  2.51M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  2.51M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  2.51M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  2.51M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.13M, False: 379k]
  |  |  ------------------
  ------------------
  605|  2.13M|        FoundBucket = ThisBucket;
  606|  2.13M|        return true;
  607|  2.13M|      }
  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|   379k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   379k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 30.8k, False: 348k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  30.8k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 30.8k]
  ------------------
  615|  30.8k|        return false;
  616|  30.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|   348k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 348k]
  ------------------
  621|   348k|          !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|   348k|      BucketNo += ProbeAmt++;
  627|   348k|      BucketNo &= (NumBuckets-1);
  628|   348k|    }
  629|  2.16M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E10getBucketsEv:
  489|  2.16M|  const BucketT *getBuckets() const {
  490|  2.16M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  2.16M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E12getHashValueERKS2_:
  417|  2.16M|  static unsigned getHashValue(const KeyT &Val) {
  418|  2.16M|    return KeyInfoT::getHashValue(Val);
  419|  2.16M|  }
_ZNK4llvh6detail12DenseMapPairINS_9StringRefEjE8getFirstEv:
   48|  3.24M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E12makeIteratorEPS7_SA_RNS_14DebugEpochBaseEb:
  439|  4.30M|                        bool NoAdvance=false) {
  440|  4.30M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 4.30M]
  ------------------
  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.30M|    return iterator(P, E, Epoch, NoAdvance);
  445|  4.30M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E3endEv:
   85|  2.15M|  inline iterator end() {
   86|  2.15M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  2.15M|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEneERKS7_:
 1190|  1.07M|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  1.07M|    return !(*this == RHS);
 1192|  1.07M|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEptEv:
 1166|  2.13M|  pointer operator->() const {
 1167|  2.13M|    assert(isHandleInSync() && "invalid iterator access!");
 1168|  2.13M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 2.13M]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|  2.13M|    return Ptr;
 1171|  2.13M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E6insertEONSt3__14pairIS2_jEE:
  206|  10.6k|  std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
  207|  10.6k|    return try_emplace(std::move(KV.first), std::move(KV.second));
  208|  10.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E11try_emplaceIJjEEENSt3__14pairINS_16DenseMapIteratorIS2_jS4_S7_Lb0EEEbEEOS2_DpOT_:
  214|  10.6k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|  10.6k|    BucketT *TheBucket;
  216|  10.6k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 0, False: 10.6k]
  ------------------
  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|  10.6k|    TheBucket =
  223|  10.6k|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|  10.6k|    return std::make_pair(
  225|  10.6k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|  10.6k|             true);
  227|  10.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E16InsertIntoBucketIS2_JjEEEPS7_SB_OT_DpOT0_:
  519|  10.6k|                            ValueArgs &&... Values) {
  520|  10.6k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  10.6k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  10.6k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  10.6k|    return TheBucket;
  525|  10.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E20InsertIntoBucketImplIS2_EEPS7_RKS2_RKT_SB_:
  539|  10.6k|                                BucketT *TheBucket) {
  540|  10.6k|    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|  10.6k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  10.6k|    unsigned NumBuckets = getNumBuckets();
  553|  10.6k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  10.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 743, False: 9.89k]
  |  |  ------------------
  ------------------
  554|    743|      this->grow(NumBuckets * 2);
  555|    743|      LookupBucketFor(Lookup, TheBucket);
  556|    743|      NumBuckets = getNumBuckets();
  557|  9.89k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  9.89k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 9.89k]
  |  |  ------------------
  ------------------
  558|  9.89k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  10.6k|    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|  10.6k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  10.6k|    const KeyT EmptyKey = getEmptyKey();
  570|  10.6k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 10.6k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  10.6k|    return TheBucket;
  574|  10.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E4growEj:
  509|    743|  void grow(unsigned AtLeast) {
  510|    743|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    743|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE4growEj:
  736|    743|  void grow(unsigned AtLeast) {
  737|    743|    unsigned OldNumBuckets = NumBuckets;
  738|    743|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    743|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    743|    assert(Buckets);
  742|    743|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 618, False: 125]
  ------------------
  743|    618|      this->BaseT::initEmpty();
  744|    618|      return;
  745|    618|    }
  746|       |
  747|    125|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    125|    operator delete(OldBuckets);
  751|    125|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE15allocateBucketsEj:
  795|  2.95k|  bool allocateBuckets(unsigned Num) {
  796|  2.95k|    NumBuckets = Num;
  797|  2.95k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 2.20k, False: 743]
  ------------------
  798|  2.20k|      Buckets = nullptr;
  799|  2.20k|      return false;
  800|  2.20k|    }
  801|       |
  802|    743|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    743|    return true;
  804|  2.95k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E9initEmptyEv:
  347|    743|  void initEmpty() {
  348|    743|    setNumEntries(0);
  349|    743|    setNumTombstones(0);
  350|       |
  351|    743|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    743|           "# initial buckets must be a power of two!");
  353|    743|    const KeyT EmptyKey = getEmptyKey();
  354|  68.0k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 67.3k, False: 743]
  ------------------
  355|  67.3k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    743|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13setNumEntriesEj:
  461|  21.6k|  void setNumEntries(unsigned Num) {
  462|  21.6k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  21.6k|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE13setNumEntriesEj:
  775|  21.6k|  void setNumEntries(unsigned Num) {
  776|  21.6k|    NumEntries = Num;
  777|  21.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E16setNumTombstonesEj:
  477|    743|  void setNumTombstones(unsigned Num) {
  478|    743|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    743|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE16setNumTombstonesEj:
  783|    743|  void setNumTombstones(unsigned Num) {
  784|    743|    NumTombstones = Num;
  785|    743|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E18moveFromOldBucketsEPS7_SA_:
  369|    125|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    125|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    125|    const KeyT EmptyKey = getEmptyKey();
  374|    125|    const KeyT TombstoneKey = getTombstoneKey();
  375|  14.0k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 13.8k, False: 125]
  ------------------
  376|  13.8k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 10.2k, False: 3.59k]
  ------------------
  377|  13.8k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 10.2k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  10.2k|        BucketT *DestBucket;
  380|  10.2k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  10.2k|        (void)FoundVal; // silence warning.
  382|  10.2k|        assert(!FoundVal && "Key already in new map?");
  383|  10.2k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  10.2k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  10.2k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  10.2k|        B->getSecond().~ValueT();
  389|  10.2k|      }
  390|  13.8k|      B->getFirst().~KeyT();
  391|  13.8k|    }
  392|    125|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E16getNumTombstonesEv:
  473|  9.89k|  unsigned getNumTombstones() const {
  474|  9.89k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  9.89k|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE16getNumTombstonesEv:
  779|  9.89k|  unsigned getNumTombstones() const {
  780|  9.89k|    return NumTombstones;
  781|  9.89k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E19incrementNumEntriesEv:
  465|  20.9k|  void incrementNumEntries() {
  466|  20.9k|    setNumEntries(getNumEntries() + 1);
  467|  20.9k|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEeqERKS7_:
 1180|  2.14M|  bool operator==(const NonConstIterator &RHS) const {
 1181|  2.14M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  2.14M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  2.14M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  2.14M|           "comparing incomparable iterators!");
 1185|  2.14M|    return Ptr == RHS.Ptr;
 1186|  2.14M|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE4initEj:
  726|    247|  void init(unsigned InitNumEntries) {
  727|    247|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    247|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 247]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    247|    } else {
  731|    247|      NumEntries = 0;
  732|    247|      NumTombstones = 0;
  733|    247|    }
  734|    247|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|    247|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    247|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 247, False: 0]
  ------------------
  363|    247|      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|    247|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE15allocateBucketsEj:
  795|  1.32k|  bool allocateBuckets(unsigned Num) {
  796|  1.32k|    NumBuckets = Num;
  797|  1.32k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 247, False: 1.08k]
  ------------------
  798|    247|      Buckets = nullptr;
  799|    247|      return false;
  800|    247|    }
  801|       |
  802|  1.08k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|  1.08k|    return true;
  804|  1.32k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E9initEmptyEv:
  347|  1.08k|  void initEmpty() {
  348|  1.08k|    setNumEntries(0);
  349|  1.08k|    setNumTombstones(0);
  350|       |
  351|  1.08k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|  1.08k|           "# initial buckets must be a power of two!");
  353|  1.08k|    const KeyT EmptyKey = getEmptyKey();
  354|  1.16M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 1.16M, False: 1.08k]
  ------------------
  355|  1.16M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|  1.08k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13setNumEntriesEj:
  461|   722k|  void setNumEntries(unsigned Num) {
  462|   722k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   722k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE13setNumEntriesEj:
  775|   722k|  void setNumEntries(unsigned Num) {
  776|   722k|    NumEntries = Num;
  777|   722k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E16setNumTombstonesEj:
  477|  1.08k|  void setNumTombstones(unsigned Num) {
  478|  1.08k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  1.08k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE16setNumTombstonesEj:
  783|  1.08k|  void setNumTombstones(unsigned Num) {
  784|  1.08k|    NumTombstones = Num;
  785|  1.08k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13getNumBucketsEv:
  497|  30.3M|  unsigned getNumBuckets() const {
  498|  30.3M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  30.3M|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE13getNumBucketsEv:
  791|  30.3M|  unsigned getNumBuckets() const {
  792|  30.3M|    return NumBuckets;
  793|  30.3M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E11getEmptyKeyEv:
  426|  8.20M|  static const KeyT getEmptyKey() {
  427|  8.20M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  8.20M|                  "Must pass the derived type to this template!");
  429|  8.20M|    return KeyInfoT::getEmptyKey();
  430|  8.20M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E10getBucketsEv:
  493|  22.1M|  BucketT *getBuckets() {
  494|  22.1M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  22.1M|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE10getBucketsEv:
  787|  30.0M|  BucketT *getBuckets() const {
  788|  30.0M|    return Buckets;
  789|  30.0M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13getBucketsEndEv:
  501|  22.1M|  BucketT *getBucketsEnd() {
  502|  22.1M|    return getBuckets() + getNumBuckets();
  503|  22.1M|  }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEPN6hermes12UniqueStringEE8getFirstEv:
   47|  6.07M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E10destroyAllEv:
  334|    247|  void destroyAll() {
  335|    247|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 247]
  ------------------
  336|      0|      return;
  337|       |
  338|    247|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   588k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 588k, False: 247]
  ------------------
  340|   588k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 292k, False: 295k]
  ------------------
  341|   588k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 292k, False: 0]
  ------------------
  342|   292k|        P->getSecond().~ValueT();
  343|   588k|      P->getFirst().~KeyT();
  344|   588k|    }
  345|    247|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E15getTombstoneKeyEv:
  432|  7.90M|  static const KeyT getTombstoneKey() {
  433|  7.90M|    return KeyInfoT::getTombstoneKey();
  434|  7.90M|  }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEPN6hermes12UniqueStringEE9getSecondEv:
   49|  1.87M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E4findERKS2_:
  154|  7.18M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  7.18M|    BucketT *TheBucket;
  156|  7.18M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 6.89M, False: 292k]
  ------------------
  157|  6.89M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   292k|    return end();
  159|  7.18M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E15LookupBucketForIS2_EEbRKT_RPSA_:
  632|  7.90M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  7.90M|    const BucketT *ConstFoundBucket;
  634|  7.90M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  7.90M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  7.90M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  7.90M|    return Result;
  638|  7.90M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E15LookupBucketForIS2_EEbRKT_RPKSA_:
  582|  7.90M|                       const BucketT *&FoundBucket) const {
  583|  7.90M|    const BucketT *BucketsPtr = getBuckets();
  584|  7.90M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  7.90M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 494, False: 7.90M]
  ------------------
  587|    494|      FoundBucket = nullptr;
  588|    494|      return false;
  589|    494|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  7.90M|    const BucketT *FoundTombstone = nullptr;
  593|  7.90M|    const KeyT EmptyKey = getEmptyKey();
  594|  7.90M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  7.90M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  7.90M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  7.90M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  7.90M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  7.90M|    unsigned ProbeAmt = 1;
  601|  13.0M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  13.0M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  13.0M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  13.0M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 6.89M, False: 6.17M]
  |  |  ------------------
  ------------------
  605|  6.89M|        FoundBucket = ThisBucket;
  606|  6.89M|        return true;
  607|  6.89M|      }
  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.17M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  6.17M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.01M, False: 5.15M]
  |  |  ------------------
  ------------------
  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.01M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1.01M]
  ------------------
  615|  1.01M|        return false;
  616|  1.01M|      }
  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|  5.15M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 5.15M]
  ------------------
  621|  5.15M|          !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|  5.15M|      BucketNo += ProbeAmt++;
  627|  5.15M|      BucketNo &= (NumBuckets-1);
  628|  5.15M|    }
  629|  7.90M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E10getBucketsEv:
  489|  7.90M|  const BucketT *getBuckets() const {
  490|  7.90M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  7.90M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E12getHashValueERKS2_:
  417|  7.90M|  static unsigned getHashValue(const KeyT &Val) {
  418|  7.90M|    return KeyInfoT::getHashValue(Val);
  419|  7.90M|  }
_ZNK4llvh6detail12DenseMapPairINS_9StringRefEPN6hermes12UniqueStringEE8getFirstEv:
   48|  24.3M|  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|  14.6M|                        bool NoAdvance=false) {
  440|  14.6M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 14.6M]
  ------------------
  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|  14.6M|    return iterator(P, E, Epoch, NoAdvance);
  445|  14.6M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E3endEv:
   85|  7.47M|  inline iterator end() {
   86|  7.47M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  7.47M|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb0EEneERKSA_:
 1190|  7.18M|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  7.18M|    return !(*this == RHS);
 1192|  7.18M|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb0EEeqERKSA_:
 1180|  7.18M|  bool operator==(const NonConstIterator &RHS) const {
 1181|  7.18M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  7.18M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  7.18M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  7.18M|           "comparing incomparable iterators!");
 1185|  7.18M|    return Ptr == RHS.Ptr;
 1186|  7.18M|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb0EEptEv:
 1166|  6.89M|  pointer operator->() const {
 1167|  6.89M|    assert(isHandleInSync() && "invalid iterator access!");
 1168|  6.89M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 6.89M]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|  6.89M|    return Ptr;
 1171|  6.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E6insertEONSt3__14pairIS2_S5_EE:
  206|   292k|  std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
  207|   292k|    return try_emplace(std::move(KV.first), std::move(KV.second));
  208|   292k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E11try_emplaceIJS5_EEENSt3__14pairINS_16DenseMapIteratorIS2_S5_S7_SA_Lb0EEEbEEOS2_DpOT_:
  214|   292k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|   292k|    BucketT *TheBucket;
  216|   292k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 0, False: 292k]
  ------------------
  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|   292k|    TheBucket =
  223|   292k|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|   292k|    return std::make_pair(
  225|   292k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|   292k|             true);
  227|   292k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E16InsertIntoBucketIS2_JS5_EEEPSA_SE_OT_DpOT0_:
  519|   292k|                            ValueArgs &&... Values) {
  520|   292k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   292k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   292k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   292k|    return TheBucket;
  525|   292k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E20InsertIntoBucketImplIS2_EEPSA_RKS2_RKT_SE_:
  539|   292k|                                BucketT *TheBucket) {
  540|   292k|    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|   292k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   292k|    unsigned NumBuckets = getNumBuckets();
  553|   292k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   292k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.08k, False: 291k]
  |  |  ------------------
  ------------------
  554|  1.08k|      this->grow(NumBuckets * 2);
  555|  1.08k|      LookupBucketFor(Lookup, TheBucket);
  556|  1.08k|      NumBuckets = getNumBuckets();
  557|   291k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   291k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 291k]
  |  |  ------------------
  ------------------
  558|   291k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   292k|    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|   292k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   292k|    const KeyT EmptyKey = getEmptyKey();
  570|   292k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 292k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   292k|    return TheBucket;
  574|   292k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13getNumEntriesEv:
  457|  1.01M|  unsigned getNumEntries() const {
  458|  1.01M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.01M|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE13getNumEntriesEv:
  771|  1.01M|  unsigned getNumEntries() const {
  772|  1.01M|    return NumEntries;
  773|  1.01M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E4growEj:
  509|  1.08k|  void grow(unsigned AtLeast) {
  510|  1.08k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|  1.08k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE4growEj:
  736|  1.08k|  void grow(unsigned AtLeast) {
  737|  1.08k|    unsigned OldNumBuckets = NumBuckets;
  738|  1.08k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|  1.08k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|  1.08k|    assert(Buckets);
  742|  1.08k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 247, False: 833]
  ------------------
  743|    247|      this->BaseT::initEmpty();
  744|    247|      return;
  745|    247|    }
  746|       |
  747|    833|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    833|    operator delete(OldBuckets);
  751|    833|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E18moveFromOldBucketsEPSA_SD_:
  369|    833|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    833|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    833|    const KeyT EmptyKey = getEmptyKey();
  374|    833|    const KeyT TombstoneKey = getTombstoneKey();
  375|   573k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 572k, False: 833]
  ------------------
  376|   572k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 428k, False: 143k]
  ------------------
  377|   572k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 428k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   428k|        BucketT *DestBucket;
  380|   428k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   428k|        (void)FoundVal; // silence warning.
  382|   428k|        assert(!FoundVal && "Key already in new map?");
  383|   428k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   428k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   428k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   428k|        B->getSecond().~ValueT();
  389|   428k|      }
  390|   572k|      B->getFirst().~KeyT();
  391|   572k|    }
  392|    833|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E16getNumTombstonesEv:
  473|   291k|  unsigned getNumTombstones() const {
  474|   291k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   291k|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE16getNumTombstonesEv:
  779|   291k|  unsigned getNumTombstones() const {
  780|   291k|    return NumTombstones;
  781|   291k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E19incrementNumEntriesEv:
  465|   721k|  void incrementNumEntries() {
  466|   721k|    setNumEntries(getNumEntries() + 1);
  467|   721k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_EixERKj:
  303|      2|  ValueT &operator[](const KeyT &Key) {
  304|      2|    return FindAndConstruct(Key).second;
  305|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E16FindAndConstructERKj:
  295|      2|  value_type& FindAndConstruct(const KeyT &Key) {
  296|      2|    BucketT *TheBucket;
  297|      2|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 1, False: 1]
  ------------------
  298|      1|      return *TheBucket;
  299|       |
  300|      1|    return *InsertIntoBucket(TheBucket, Key);
  301|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E15LookupBucketForIjEEbRKT_RPSD_:
  632|      3|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|      3|    const BucketT *ConstFoundBucket;
  634|      3|    bool Result = const_cast<const DenseMapBase *>(this)
  635|      3|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|      3|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|      3|    return Result;
  638|      3|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E15LookupBucketForIjEEbRKT_RPKSD_:
  582|    395|                       const BucketT *&FoundBucket) const {
  583|    395|    const BucketT *BucketsPtr = getBuckets();
  584|    395|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    395|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 392, False: 3]
  ------------------
  587|    392|      FoundBucket = nullptr;
  588|    392|      return false;
  589|    392|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|      3|    const BucketT *FoundTombstone = nullptr;
  593|      3|    const KeyT EmptyKey = getEmptyKey();
  594|      3|    const KeyT TombstoneKey = getTombstoneKey();
  595|      3|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|      3|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|      3|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      3|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|      3|    unsigned ProbeAmt = 1;
  601|      3|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|      3|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|      3|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|      3|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2, False: 1]
  |  |  ------------------
  ------------------
  605|      2|        FoundBucket = ThisBucket;
  606|      2|        return true;
  607|      2|      }
  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|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|      1|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1, 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|      1|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1]
  ------------------
  615|      1|        return false;
  616|      1|      }
  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|      3|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E10getBucketsEv:
  489|  1.96k|  const BucketT *getBuckets() const {
  490|  1.96k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  1.96k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E12getHashValueERKj:
  417|      3|  static unsigned getHashValue(const KeyT &Val) {
  418|      3|    return KeyInfoT::getHashValue(Val);
  419|      3|  }
_ZNK4llvh6detail12DenseMapPairIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE8getFirstEv:
   48|      4|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E16InsertIntoBucketIRKjJEEEPSD_SJ_OT_DpOT0_:
  519|      1|                            ValueArgs &&... Values) {
  520|      1|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|      1|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|      1|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|      1|    return TheBucket;
  525|      1|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E20InsertIntoBucketImplIjEEPSD_RKjRKT_SH_:
  539|      1|                                BucketT *TheBucket) {
  540|      1|    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|    unsigned NewNumEntries = getNumEntries() + 1;
  552|      1|    unsigned NumBuckets = getNumBuckets();
  553|      1|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  554|      1|      this->grow(NumBuckets * 2);
  555|      1|      LookupBucketFor(Lookup, TheBucket);
  556|      1|      NumBuckets = getNumBuckets();
  557|      1|    } 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|      1|    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|      1|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|      1|    const KeyT EmptyKey = getEmptyKey();
  570|      1|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 1]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|      1|    return TheBucket;
  574|      1|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E13getNumEntriesEv:
  457|      2|  unsigned getNumEntries() const {
  458|      2|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|      2|  }
_ZNK4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE13getNumEntriesEv:
  771|      2|  unsigned getNumEntries() const {
  772|      2|    return NumEntries;
  773|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E4growEj:
  509|      1|  void grow(unsigned AtLeast) {
  510|      1|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      1|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE4growEj:
  736|      1|  void grow(unsigned AtLeast) {
  737|      1|    unsigned OldNumBuckets = NumBuckets;
  738|      1|    BucketT *OldBuckets = Buckets;
  739|       |
  740|      1|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|      1|    assert(Buckets);
  742|      1|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 1, False: 0]
  ------------------
  743|      1|      this->BaseT::initEmpty();
  744|      1|      return;
  745|      1|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE15allocateBucketsEj:
  795|    495|  bool allocateBuckets(unsigned Num) {
  796|    495|    NumBuckets = Num;
  797|    495|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 494, False: 1]
  ------------------
  798|    494|      Buckets = nullptr;
  799|    494|      return false;
  800|    494|    }
  801|       |
  802|      1|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      1|    return true;
  804|    495|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E9initEmptyEv:
  347|      1|  void initEmpty() {
  348|      1|    setNumEntries(0);
  349|      1|    setNumTombstones(0);
  350|       |
  351|      1|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      1|           "# initial buckets must be a power of two!");
  353|      1|    const KeyT EmptyKey = getEmptyKey();
  354|     65|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 64, False: 1]
  ------------------
  355|     64|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      1|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E13setNumEntriesEj:
  461|      2|  void setNumEntries(unsigned Num) {
  462|      2|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|      2|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE13setNumEntriesEj:
  775|      2|  void setNumEntries(unsigned Num) {
  776|      2|    NumEntries = Num;
  777|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E16setNumTombstonesEj:
  477|      1|  void setNumTombstones(unsigned Num) {
  478|      1|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      1|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE16setNumTombstonesEj:
  783|      1|  void setNumTombstones(unsigned Num) {
  784|      1|    NumTombstones = Num;
  785|      1|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E19incrementNumEntriesEv:
  465|      1|  void incrementNumEntries() {
  466|      1|    setNumEntries(getNumEntries() + 1);
  467|      1|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E4findERKj:
  160|    392|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|    392|    const BucketT *TheBucket;
  162|    392|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 1, False: 391]
  ------------------
  163|      1|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|    391|    return end();
  165|    392|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E17makeConstIteratorEPKSD_SH_RKNS_14DebugEpochBaseEb:
  449|    784|                                   const bool NoAdvance=false) const {
  450|    784|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 784]
  ------------------
  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|    784|    return const_iterator(P, E, Epoch, NoAdvance);
  455|    784|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E13getBucketsEndEv:
  505|  1.56k|  const BucketT *getBucketsEnd() const {
  506|  1.56k|    return getBuckets() + getNumBuckets();
  507|  1.56k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E3endEv:
   95|    783|  inline const_iterator end() const {
   96|    783|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|    783|  }
_ZNK4llvh16DenseMapIteratorIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EELb1EEeqERKSD_:
 1173|    392|  bool operator==(const ConstIterator &RHS) const {
 1174|    392|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|    392|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|    392|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|    392|           "comparing incomparable iterators!");
 1178|    392|    return Ptr == RHS.Ptr;
 1179|    392|  }
_ZNK4llvh16DenseMapIteratorIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EELb1EEptEv:
 1166|      1|  pointer operator->() const {
 1167|      1|    assert(isHandleInSync() && "invalid iterator access!");
 1168|      1|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 1]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|      1|    return Ptr;
 1171|      1|  }
_ZNK4llvh16DenseMapIteratorIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EELb1EEneERKSD_:
 1187|    196|  bool operator!=(const ConstIterator &RHS) const {
 1188|    196|    return !(*this == RHS);
 1189|    196|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE4initEj:
  726|    247|  void init(unsigned InitNumEntries) {
  727|    247|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    247|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 247]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    247|    } else {
  731|    247|      NumEntries = 0;
  732|    247|      NumTombstones = 0;
  733|    247|    }
  734|    247|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    247|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    247|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 247, False: 0]
  ------------------
  363|    247|      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|    247|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE15allocateBucketsEj:
  795|    328|  bool allocateBuckets(unsigned Num) {
  796|    328|    NumBuckets = Num;
  797|    328|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 247, False: 81]
  ------------------
  798|    247|      Buckets = nullptr;
  799|    247|      return false;
  800|    247|    }
  801|       |
  802|     81|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     81|    return true;
  804|    328|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E9initEmptyEv:
  347|     81|  void initEmpty() {
  348|     81|    setNumEntries(0);
  349|     81|    setNumTombstones(0);
  350|       |
  351|     81|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     81|           "# initial buckets must be a power of two!");
  353|     81|    const KeyT EmptyKey = getEmptyKey();
  354|  5.26k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 5.18k, False: 81]
  ------------------
  355|  5.18k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13setNumEntriesEj:
  461|    162|  void setNumEntries(unsigned Num) {
  462|    162|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    162|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE13setNumEntriesEj:
  775|    162|  void setNumEntries(unsigned Num) {
  776|    162|    NumEntries = Num;
  777|    162|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16setNumTombstonesEj:
  477|     81|  void setNumTombstones(unsigned Num) {
  478|     81|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     81|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE16setNumTombstonesEj:
  783|     81|  void setNumTombstones(unsigned Num) {
  784|     81|    NumTombstones = Num;
  785|     81|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13getNumBucketsEv:
  497|  1.05k|  unsigned getNumBuckets() const {
  498|  1.05k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.05k|  }
_ZNK4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE13getNumBucketsEv:
  791|  1.05k|  unsigned getNumBuckets() const {
  792|  1.05k|    return NumBuckets;
  793|  1.05k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E11getEmptyKeyEv:
  426|    486|  static const KeyT getEmptyKey() {
  427|    486|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    486|                  "Must pass the derived type to this template!");
  429|    486|    return KeyInfoT::getEmptyKey();
  430|    486|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E10getBucketsEv:
  493|    324|  BucketT *getBuckets() {
  494|    324|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    324|  }
_ZNK4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE10getBucketsEv:
  787|    648|  BucketT *getBuckets() const {
  788|    648|    return Buckets;
  789|    648|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13getBucketsEndEv:
  501|    162|  BucketT *getBucketsEnd() {
  502|    162|    return getBuckets() + getNumBuckets();
  503|    162|  }
_ZN4llvh6detail12DenseMapPairINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoEE8getFirstEv:
   47|  15.7k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E10destroyAllEv:
  334|    247|  void destroyAll() {
  335|    247|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 166, False: 81]
  ------------------
  336|    166|      return;
  337|       |
  338|     81|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  5.26k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 5.18k, False: 81]
  ------------------
  340|  5.18k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 81, False: 5.10k]
  ------------------
  341|  5.18k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 81, False: 0]
  ------------------
  342|     81|        P->getSecond().~ValueT();
  343|  5.18k|      P->getFirst().~KeyT();
  344|  5.18k|    }
  345|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E15getTombstoneKeyEv:
  432|    324|  static const KeyT getTombstoneKey() {
  433|    324|    return KeyInfoT::getTombstoneKey();
  434|    324|  }
_ZN4llvh6detail12DenseMapPairINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoEE9getSecondEv:
   49|    162|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE4initEj:
  959|  4.21k|  void init(unsigned InitBuckets) {
  960|  4.21k|    Small = true;
  961|  4.21k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 4.21k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|  4.21k|    this->BaseT::initEmpty();
  966|  4.21k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E9initEmptyEv:
  347|  4.21k|  void initEmpty() {
  348|  4.21k|    setNumEntries(0);
  349|  4.21k|    setNumTombstones(0);
  350|       |
  351|  4.21k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|  4.21k|           "# initial buckets must be a power of two!");
  353|  4.21k|    const KeyT EmptyKey = getEmptyKey();
  354|  21.0k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 16.8k, False: 4.21k]
  ------------------
  355|  16.8k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|  4.21k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13setNumEntriesEj:
  461|  5.95k|  void setNumEntries(unsigned Num) {
  462|  5.95k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  5.95k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE13setNumEntriesEj:
 1046|  5.95k|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|  5.95k|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|  5.95k|    NumEntries = Num;
 1050|  5.95k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E16setNumTombstonesEj:
  477|  5.95k|  void setNumTombstones(unsigned Num) {
  478|  5.95k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  5.95k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16setNumTombstonesEj:
 1056|  5.95k|  void setNumTombstones(unsigned Num) {
 1057|  5.95k|    NumTombstones = Num;
 1058|  5.95k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13getNumBucketsEv:
  497|   654k|  unsigned getNumBuckets() const {
  498|   654k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   654k|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE13getNumBucketsEv:
 1093|   656k|  unsigned getNumBuckets() const {
 1094|   656k|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 656k, False: 0]
  ------------------
 1095|   656k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E11getEmptyKeyEv:
  426|   636k|  static const KeyT getEmptyKey() {
  427|   636k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   636k|                  "Must pass the derived type to this template!");
  429|   636k|    return KeyInfoT::getEmptyKey();
  430|   636k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E10getBucketsEv:
  493|  22.0k|  BucketT *getBuckets() {
  494|  22.0k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  22.0k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE10getBucketsEv:
 1088|  22.0k|  BucketT *getBuckets() {
 1089|  22.0k|    return const_cast<BucketT *>(
 1090|  22.0k|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|  22.0k|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE10getBucketsEv:
 1084|   648k|  const BucketT *getBuckets() const {
 1085|   648k|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 648k, False: 0]
  ------------------
 1086|   648k|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16getInlineBucketsEv:
 1060|   658k|  const BucketT *getInlineBuckets() const {
 1061|   658k|    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|   658k|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|   658k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13getBucketsEndEv:
  501|  10.1k|  BucketT *getBucketsEnd() {
  502|  10.1k|    return getBuckets() + getNumBuckets();
  503|  10.1k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE4swapERS8_:
  862|  1.23k|  void swap(SmallDenseMap& RHS) {
  863|  1.23k|    unsigned TmpNumEntries = RHS.NumEntries;
  864|  1.23k|    RHS.NumEntries = NumEntries;
  865|  1.23k|    NumEntries = TmpNumEntries;
  866|  1.23k|    std::swap(NumTombstones, RHS.NumTombstones);
  867|       |
  868|  1.23k|    const KeyT EmptyKey = this->getEmptyKey();
  869|  1.23k|    const KeyT TombstoneKey = this->getTombstoneKey();
  870|  1.23k|    if (Small && RHS.Small) {
  ------------------
  |  Branch (870:9): [True: 1.23k, False: 0]
  |  Branch (870:18): [True: 1.23k, 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|  6.17k|      for (unsigned i = 0, e = InlineBuckets; i != e; ++i) {
  ------------------
  |  Branch (875:47): [True: 4.94k, False: 1.23k]
  ------------------
  876|  4.94k|        BucketT *LHSB = &getInlineBuckets()[i],
  877|  4.94k|                *RHSB = &RHS.getInlineBuckets()[i];
  878|  4.94k|        bool hasLHSValue = (!KeyInfoT::isEqual(LHSB->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (878:29): [True: 0, False: 4.94k]
  ------------------
  879|  4.94k|                            !KeyInfoT::isEqual(LHSB->getFirst(), TombstoneKey));
  ------------------
  |  Branch (879:29): [True: 0, False: 0]
  ------------------
  880|  4.94k|        bool hasRHSValue = (!KeyInfoT::isEqual(RHSB->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (880:29): [True: 0, False: 4.94k]
  ------------------
  881|  4.94k|                            !KeyInfoT::isEqual(RHSB->getFirst(), TombstoneKey));
  ------------------
  |  Branch (881:29): [True: 0, False: 0]
  ------------------
  882|  4.94k|        if (hasLHSValue && hasRHSValue) {
  ------------------
  |  Branch (882:13): [True: 0, False: 4.94k]
  |  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|  4.94k|        std::swap(LHSB->getFirst(), RHSB->getFirst());
  889|  4.94k|        if (hasLHSValue) {
  ------------------
  |  Branch (889:13): [True: 0, False: 4.94k]
  ------------------
  890|      0|          ::new (&RHSB->getSecond()) ValueT(std::move(LHSB->getSecond()));
  891|      0|          LHSB->getSecond().~ValueT();
  892|  4.94k|        } else if (hasRHSValue) {
  ------------------
  |  Branch (892:20): [True: 0, False: 4.94k]
  ------------------
  893|      0|          ::new (&LHSB->getSecond()) ValueT(std::move(RHSB->getSecond()));
  894|      0|          RHSB->getSecond().~ValueT();
  895|      0|        }
  896|  4.94k|      }
  897|  1.23k|      return;
  898|  1.23k|    }
  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|   632k|  static const KeyT getTombstoneKey() {
  433|   632k|    return KeyInfoT::getTombstoneKey();
  434|   632k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16getInlineBucketsEv:
 1068|  9.88k|  BucketT *getInlineBuckets() {
 1069|  9.88k|    return const_cast<BucketT *>(
 1070|  9.88k|      const_cast<const SmallDenseMap *>(this)->getInlineBuckets());
 1071|  9.88k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E10destroyAllEv:
  334|  5.95k|  void destroyAll() {
  335|  5.95k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 5.95k]
  ------------------
  336|      0|      return;
  337|       |
  338|  5.95k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  29.7k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 23.8k, False: 5.95k]
  ------------------
  340|  23.8k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 23.8k]
  ------------------
  341|  23.8k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  23.8k|      P->getFirst().~KeyT();
  344|  23.8k|    }
  345|  5.95k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE17deallocateBucketsEv:
 1097|  5.95k|  void deallocateBuckets() {
 1098|  5.95k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 5.95k, False: 0]
  ------------------
 1099|  5.95k|      return;
 1100|       |
 1101|      0|    operator delete(getLargeRep()->Buckets);
 1102|      0|    getLargeRep()->~LargeRep();
 1103|      0|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE15allocateBucketsEj:
  795|    453|  bool allocateBuckets(unsigned Num) {
  796|    453|    NumBuckets = Num;
  797|    453|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 257]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    257|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    257|    return true;
  804|    453|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E9initEmptyEv:
  347|    257|  void initEmpty() {
  348|    257|    setNumEntries(0);
  349|    257|    setNumTombstones(0);
  350|       |
  351|    257|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    257|           "# initial buckets must be a power of two!");
  353|    257|    const KeyT EmptyKey = getEmptyKey();
  354|  31.9k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 31.6k, False: 257]
  ------------------
  355|  31.6k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    257|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13setNumEntriesEj:
  461|  18.7k|  void setNumEntries(unsigned Num) {
  462|  18.7k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  18.7k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE13setNumEntriesEj:
  775|  18.7k|  void setNumEntries(unsigned Num) {
  776|  18.7k|    NumEntries = Num;
  777|  18.7k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16setNumTombstonesEj:
  477|    372|  void setNumTombstones(unsigned Num) {
  478|    372|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    372|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE16setNumTombstonesEj:
  783|    372|  void setNumTombstones(unsigned Num) {
  784|    372|    NumTombstones = Num;
  785|    372|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13getNumBucketsEv:
  497|  29.5k|  unsigned getNumBuckets() const {
  498|  29.5k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  29.5k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE13getNumBucketsEv:
  791|  29.5k|  unsigned getNumBuckets() const {
  792|  29.5k|    return NumBuckets;
  793|  29.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E11getEmptyKeyEv:
  426|  28.5k|  static const KeyT getEmptyKey() {
  427|  28.5k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  28.5k|                  "Must pass the derived type to this template!");
  429|  28.5k|    return KeyInfoT::getEmptyKey();
  430|  28.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E10getBucketsEv:
  493|    974|  BucketT *getBuckets() {
  494|    974|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    974|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE10getBucketsEv:
  787|  19.5k|  BucketT *getBuckets() const {
  788|  19.5k|    return Buckets;
  789|  19.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13getBucketsEndEv:
  501|    487|  BucketT *getBucketsEnd() {
  502|    487|    return getBuckets() + getNumBuckets();
  503|    487|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyEE8getFirstEv:
   47|   169k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|    392|  void init(unsigned InitNumEntries) {
  727|    392|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    392|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 392]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    392|    } else {
  731|    392|      NumEntries = 0;
  732|    392|      NumTombstones = 0;
  733|    392|    }
  734|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|    392|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    392|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 392, False: 0]
  ------------------
  363|    392|      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|    392|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|    588|  bool allocateBuckets(unsigned Num) {
  796|    588|    NumBuckets = Num;
  797|    588|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 392, False: 196]
  ------------------
  798|    392|      Buckets = nullptr;
  799|    392|      return false;
  800|    392|    }
  801|       |
  802|    196|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    196|    return true;
  804|    588|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E9initEmptyEv:
  347|    196|  void initEmpty() {
  348|    196|    setNumEntries(0);
  349|    196|    setNumTombstones(0);
  350|       |
  351|    196|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    196|           "# initial buckets must be a power of two!");
  353|    196|    const KeyT EmptyKey = getEmptyKey();
  354|  12.7k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 12.5k, False: 196]
  ------------------
  355|  12.5k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13setNumEntriesEj:
  461|    486|  void setNumEntries(unsigned Num) {
  462|    486|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    486|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13setNumEntriesEj:
  775|    486|  void setNumEntries(unsigned Num) {
  776|    486|    NumEntries = Num;
  777|    486|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16setNumTombstonesEj:
  477|    196|  void setNumTombstones(unsigned Num) {
  478|    196|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE16setNumTombstonesEj:
  783|    196|  void setNumTombstones(unsigned Num) {
  784|    196|    NumTombstones = Num;
  785|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumBucketsEv:
  497|   208k|  unsigned getNumBuckets() const {
  498|   208k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   208k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|   208k|  unsigned getNumBuckets() const {
  792|   208k|    return NumBuckets;
  793|   208k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E11getEmptyKeyEv:
  426|   104k|  static const KeyT getEmptyKey() {
  427|   104k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   104k|                  "Must pass the derived type to this template!");
  429|   104k|    return KeyInfoT::getEmptyKey();
  430|   104k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  493|   104k|  BucketT *getBuckets() {
  494|   104k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   104k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE10getBucketsEv:
  787|   207k|  BucketT *getBuckets() const {
  788|   207k|    return Buckets;
  789|   207k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getBucketsEndEv:
  501|   103k|  BucketT *getBucketsEnd() {
  502|   103k|    return getBuckets() + getNumBuckets();
  503|   103k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEjE8getFirstEv:
   47|  38.5k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|    196|  bool allocateBuckets(unsigned Num) {
  796|    196|    NumBuckets = Num;
  797|    196|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 0]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|  1.03M|  unsigned getNumBuckets() const {
  498|  1.03M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.03M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|  1.03M|  unsigned getNumBuckets() const {
  792|  1.03M|    return NumBuckets;
  793|  1.03M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|  1.03M|  BucketT *getBuckets() const {
  788|  1.03M|    return Buckets;
  789|  1.03M|  }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS2_9allocatorIS6_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS9_EEEEjS9_SB_SE_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEE15allocateBucketsEj:
  795|    196|  bool allocateBuckets(unsigned Num) {
  796|    196|    NumBuckets = Num;
  797|    196|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 0]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS2_9allocatorIS6_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS9_EEEEjS9_SB_SE_E13getNumBucketsEv:
  497|    196|  unsigned getNumBuckets() const {
  498|    196|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    196|  }
_ZNK4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEE13getNumBucketsEv:
  791|    196|  unsigned getNumBuckets() const {
  792|    196|    return NumBuckets;
  793|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 81, False: 115]
  ------------------
  336|     81|      return;
  337|       |
  338|    115|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  19.6k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 19.5k, False: 115]
  ------------------
  340|  19.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 19.5k]
  ------------------
  341|  19.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  19.5k|      P->getFirst().~KeyT();
  344|  19.5k|    }
  345|    115|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E15getTombstoneKeyEv:
  432|  18.8k|  static const KeyT getTombstoneKey() {
  433|  18.8k|    return KeyInfoT::getTombstoneKey();
  434|  18.8k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyEE9getSecondEv:
   49|  36.3k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|    392|  void destroyAll() {
  335|    392|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 196, False: 196]
  ------------------
  336|    196|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  12.7k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 12.5k, False: 196]
  ------------------
  340|  12.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 290, False: 12.2k]
  ------------------
  341|  12.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 290, False: 0]
  ------------------
  342|    290|        P->getSecond().~ValueT();
  343|  12.5k|      P->getFirst().~KeyT();
  344|  12.5k|    }
  345|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15getTombstoneKeyEv:
  432|   103k|  static const KeyT getTombstoneKey() {
  433|   103k|    return KeyInfoT::getTombstoneKey();
  434|   103k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEjE9getSecondEv:
   49|    580|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 196, False: 0]
  ------------------
  336|    196|      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|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 196, False: 0]
  ------------------
  336|    196|      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|   103k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   103k|    const BucketT *ConstFoundBucket;
  634|   103k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   103k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   103k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   103k|    return Result;
  638|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  582|   103k|                       const BucketT *&FoundBucket) const {
  583|   103k|    const BucketT *BucketsPtr = getBuckets();
  584|   103k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 103k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   103k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   103k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 290]
  |  |  ------------------
  ------------------
  605|   103k|        FoundBucket = ThisBucket;
  606|   103k|        return true;
  607|   103k|      }
  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|    290|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    290|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 290, 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|    290|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 290]
  ------------------
  615|    290|        return false;
  616|    290|      }
  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|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  489|   103k|  const BucketT *getBuckets() const {
  490|   103k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E12getHashValueERKS3_:
  417|   103k|  static unsigned getHashValue(const KeyT &Val) {
  418|   103k|    return KeyInfoT::getHashValue(Val);
  419|   103k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEjE8getFirstEv:
   48|   103k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E12makeIteratorEPS8_SB_RNS_14DebugEpochBaseEb:
  439|   103k|                        bool NoAdvance=false) {
  440|   103k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 103k]
  ------------------
  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|   103k|    return iterator(P, E, Epoch, NoAdvance);
  445|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E20InsertIntoBucketImplIS3_EEPS8_RKS3_RKT_SC_:
  539|    290|                                BucketT *TheBucket) {
  540|    290|    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|    290|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    290|    unsigned NumBuckets = getNumBuckets();
  553|    290|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    290|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 196, False: 94]
  |  |  ------------------
  ------------------
  554|    196|      this->grow(NumBuckets * 2);
  555|    196|      LookupBucketFor(Lookup, TheBucket);
  556|    196|      NumBuckets = getNumBuckets();
  557|    196|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     94|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 94]
  |  |  ------------------
  ------------------
  558|     94|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    290|    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|    290|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    290|    const KeyT EmptyKey = getEmptyKey();
  570|    290|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 290]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    290|    return TheBucket;
  574|    290|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumEntriesEv:
  457|    580|  unsigned getNumEntries() const {
  458|    580|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    580|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumEntriesEv:
  771|    580|  unsigned getNumEntries() const {
  772|    580|    return NumEntries;
  773|    580|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E4growEj:
  509|    196|  void grow(unsigned AtLeast) {
  510|    196|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4growEj:
  736|    196|  void grow(unsigned AtLeast) {
  737|    196|    unsigned OldNumBuckets = NumBuckets;
  738|    196|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    196|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    196|    assert(Buckets);
  742|    196|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 0]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  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|     94|  unsigned getNumTombstones() const {
  474|     94|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     94|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE16getNumTombstonesEv:
  779|     94|  unsigned getNumTombstones() const {
  780|     94|    return NumTombstones;
  781|     94|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E19incrementNumEntriesEv:
  465|    290|  void incrementNumEntries() {
  466|    290|    setNumEntries(getNumEntries() + 1);
  467|    290|  }
_ZNK4llvh16DenseMapIteratorIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEptEv:
 1166|   206k|  pointer operator->() const {
 1167|   206k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   206k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 206k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   206k|    return Ptr;
 1171|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|  1.03M|  const BucketT *getBuckets() const {
  490|  1.03M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  1.03M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4findEPKS3_:
  160|   207k|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|   207k|    const BucketT *TheBucket;
  162|   207k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 0, False: 207k]
  ------------------
  163|      0|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|   207k|    return end();
  165|   207k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPKSC_:
  582|   207k|                       const BucketT *&FoundBucket) const {
  583|   207k|    const BucketT *BucketsPtr = getBuckets();
  584|   207k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   207k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 207k, False: 0]
  ------------------
  587|   207k|      FoundBucket = nullptr;
  588|   207k|      return false;
  589|   207k|    }
  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|   414k|                                   const bool NoAdvance=false) const {
  450|   414k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 414k]
  ------------------
  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|   414k|    return const_iterator(P, E, Epoch, NoAdvance);
  455|   414k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  505|   828k|  const BucketT *getBucketsEnd() const {
  506|   828k|    return getBuckets() + getNumBuckets();
  507|   828k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E3endEv:
   95|   414k|  inline const_iterator end() const {
   96|   414k|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|   414k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb1EEeqERKSC_:
 1173|   207k|  bool operator==(const ConstIterator &RHS) const {
 1174|   207k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|   207k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|   207k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|   207k|           "comparing incomparable iterators!");
 1178|   207k|    return Ptr == RHS.Ptr;
 1179|   207k|  }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getNumBucketsEv:
  497|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    676|  void destroyAll() {
  335|    676|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 480, False: 196]
  ------------------
  336|    480|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   209k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 209k, False: 196]
  ------------------
  340|   209k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 106k]
  ------------------
  341|   209k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|   209k|      P->getFirst().~KeyT();
  344|   209k|    }
  345|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getNumBucketsEv:
  497|  17.8M|  unsigned getNumBuckets() const {
  498|  17.8M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  17.8M|  }
_ZNK4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13getNumBucketsEv:
  791|  17.8M|  unsigned getNumBuckets() const {
  792|  17.8M|    return NumBuckets;
  793|  17.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E11getEmptyKeyEv:
  426|  4.71M|  static const KeyT getEmptyKey() {
  427|  4.71M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  4.71M|                  "Must pass the derived type to this template!");
  429|  4.71M|    return KeyInfoT::getEmptyKey();
  430|  4.71M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E15getTombstoneKeyEv:
  432|  4.60M|  static const KeyT getTombstoneKey() {
  433|  4.60M|    return KeyInfoT::getTombstoneKey();
  434|  4.60M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E10getBucketsEv:
  493|  1.34M|  BucketT *getBuckets() {
  494|  1.34M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.34M|  }
_ZNK4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE10getBucketsEv:
  787|  17.7M|  BucketT *getBuckets() const {
  788|  17.7M|    return Buckets;
  789|  17.7M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getBucketsEndEv:
  501|  1.34M|  BucketT *getBucketsEnd() {
  502|  1.34M|    return getBuckets() + getNumBuckets();
  503|  1.34M|  }
_ZN4llvh6detail12DenseMapPairIjjE8getFirstEv:
   47|  2.12M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIjjE9getSecondEv:
   49|   649k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|  10.2k|  unsigned getNumBuckets() const {
  498|  10.2k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  10.2k|  }
_ZNK4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|  10.2k|  unsigned getNumBuckets() const {
  792|  10.2k|    return NumBuckets;
  793|  10.2k|  }
_ZNK4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE10getBucketsEv:
  787|  10.1k|  BucketT *getBuckets() const {
  788|  10.1k|    return Buckets;
  789|  10.1k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEEEjS3_S5_S8_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEEEdjS6_S9_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E6lookupERKj:
  189|   390k|  ValueT lookup(const_arg_type_t<KeyT> Val) const {
  190|   390k|    const BucketT *TheBucket;
  191|   390k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (191:9): [True: 390k, False: 38]
  ------------------
  192|   390k|      return TheBucket->getSecond();
  193|     38|    return ValueT();
  194|   390k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E15LookupBucketForIjEEbRKT_RPKSA_:
  582|   390k|                       const BucketT *&FoundBucket) const {
  583|   390k|    const BucketT *BucketsPtr = getBuckets();
  584|   390k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   390k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 105, False: 390k]
  ------------------
  587|    105|      FoundBucket = nullptr;
  588|    105|      return false;
  589|    105|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   390k|    const BucketT *FoundTombstone = nullptr;
  593|   390k|    const KeyT EmptyKey = getEmptyKey();
  594|   390k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   390k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   390k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   390k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   390k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   390k|    unsigned ProbeAmt = 1;
  601|   390k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   390k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   390k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   390k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 390k, False: 44]
  |  |  ------------------
  ------------------
  605|   390k|        FoundBucket = ThisBucket;
  606|   390k|        return true;
  607|   390k|      }
  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|     44|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     44|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 44, 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|     44|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 44]
  ------------------
  615|     44|        return false;
  616|     44|      }
  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|   390k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10getBucketsEv:
  489|   390k|  const BucketT *getBuckets() const {
  490|   390k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   390k|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE10getBucketsEv:
  787|   396k|  BucketT *getBuckets() const {
  788|   396k|    return Buckets;
  789|   396k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13getNumBucketsEv:
  497|   396k|  unsigned getNumBuckets() const {
  498|   396k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   396k|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13getNumBucketsEv:
  791|   396k|  unsigned getNumBuckets() const {
  792|   396k|    return NumBuckets;
  793|   396k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E11getEmptyKeyEv:
  426|   390k|  static const KeyT getEmptyKey() {
  427|   390k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   390k|                  "Must pass the derived type to this template!");
  429|   390k|    return KeyInfoT::getEmptyKey();
  430|   390k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E15getTombstoneKeyEv:
  432|   390k|  static const KeyT getTombstoneKey() {
  433|   390k|    return KeyInfoT::getTombstoneKey();
  434|   390k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E12getHashValueERKj:
  417|   390k|  static unsigned getHashValue(const KeyT &Val) {
  418|   390k|    return KeyInfoT::getHashValue(Val);
  419|   390k|  }
_ZNK4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE8getFirstEv:
   48|   390k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE9getSecondEv:
   50|   390k|  const ValueT &getSecond() const { return std::pair<KeyT, ValueT>::second; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E5countERKj:
  149|     38|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|     38|    const BucketT *TheBucket;
  151|     38|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 0, False: 38]
  ------------------
  152|     38|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_EixERKj:
  303|     38|  ValueT &operator[](const KeyT &Key) {
  304|     38|    return FindAndConstruct(Key).second;
  305|     38|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16FindAndConstructERKj:
  295|     38|  value_type& FindAndConstruct(const KeyT &Key) {
  296|     38|    BucketT *TheBucket;
  297|     38|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 38]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|     38|    return *InsertIntoBucket(TheBucket, Key);
  301|     38|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E15LookupBucketForIjEEbRKT_RPSA_:
  632|     73|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|     73|    const BucketT *ConstFoundBucket;
  634|     73|    bool Result = const_cast<const DenseMapBase *>(this)
  635|     73|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|     73|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|     73|    return Result;
  638|     73|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16InsertIntoBucketIRKjJEEEPSA_SG_OT_DpOT0_:
  519|     38|                            ValueArgs &&... Values) {
  520|     38|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     38|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     38|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     38|    return TheBucket;
  525|     38|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E20InsertIntoBucketImplIjEEPSA_RKjRKT_SE_:
  539|     38|                                BucketT *TheBucket) {
  540|     38|    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|     38|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     38|    unsigned NumBuckets = getNumBuckets();
  553|     38|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     38|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 35, False: 3]
  |  |  ------------------
  ------------------
  554|     35|      this->grow(NumBuckets * 2);
  555|     35|      LookupBucketFor(Lookup, TheBucket);
  556|     35|      NumBuckets = getNumBuckets();
  557|     35|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  558|      3|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     38|    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|     38|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     38|    const KeyT EmptyKey = getEmptyKey();
  570|     38|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 38]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     38|    return TheBucket;
  574|     38|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13getNumEntriesEv:
  457|  1.39k|  unsigned getNumEntries() const {
  458|  1.39k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.39k|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13getNumEntriesEv:
  771|  1.39k|  unsigned getNumEntries() const {
  772|  1.39k|    return NumEntries;
  773|  1.39k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E4growEj:
  509|     35|  void grow(unsigned AtLeast) {
  510|     35|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     35|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE4growEj:
  736|     35|  void grow(unsigned AtLeast) {
  737|     35|    unsigned OldNumBuckets = NumBuckets;
  738|     35|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     35|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     35|    assert(Buckets);
  742|     35|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 35, False: 0]
  ------------------
  743|     35|      this->BaseT::initEmpty();
  744|     35|      return;
  745|     35|    }
  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|    632|  bool allocateBuckets(unsigned Num) {
  796|    632|    NumBuckets = Num;
  797|    632|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 597, False: 35]
  ------------------
  798|    597|      Buckets = nullptr;
  799|    597|      return false;
  800|    597|    }
  801|       |
  802|     35|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     35|    return true;
  804|    632|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E9initEmptyEv:
  347|     35|  void initEmpty() {
  348|     35|    setNumEntries(0);
  349|     35|    setNumTombstones(0);
  350|       |
  351|     35|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     35|           "# initial buckets must be a power of two!");
  353|     35|    const KeyT EmptyKey = getEmptyKey();
  354|  2.27k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.24k, False: 35]
  ------------------
  355|  2.24k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     35|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13setNumEntriesEj:
  461|     73|  void setNumEntries(unsigned Num) {
  462|     73|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     73|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13setNumEntriesEj:
  775|     73|  void setNumEntries(unsigned Num) {
  776|     73|    NumEntries = Num;
  777|     73|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16setNumTombstonesEj:
  477|     35|  void setNumTombstones(unsigned Num) {
  478|     35|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     35|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE16setNumTombstonesEj:
  783|     35|  void setNumTombstones(unsigned Num) {
  784|     35|    NumTombstones = Num;
  785|     35|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10getBucketsEv:
  493|  5.42k|  BucketT *getBuckets() {
  494|  5.42k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  5.42k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13getBucketsEndEv:
  501|  5.10k|  BucketT *getBucketsEnd() {
  502|  5.10k|    return getBuckets() + getNumBuckets();
  503|  5.10k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16getNumTombstonesEv:
  473|      3|  unsigned getNumTombstones() const {
  474|      3|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|      3|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE16getNumTombstonesEv:
  779|      3|  unsigned getNumTombstones() const {
  780|      3|    return NumTombstones;
  781|      3|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E19incrementNumEntriesEv:
  465|     38|  void incrementNumEntries() {
  466|     38|    setNumEntries(getNumEntries() + 1);
  467|     38|  }
_ZN4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE8getFirstEv:
   47|  23.0k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE9getSecondEv:
   49|     76|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEEmjS3_S6_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEEmjS3_S6_E13getNumBucketsEv:
  497|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEEmjS3_S6_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes4inst4InstENS2_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S9_EEEES6_S9_SB_SE_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes4inst4InstENS2_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S9_EEEES6_S9_SB_SE_E13getNumBucketsEv:
  497|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes4inst4InstENS2_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S9_EEEES6_S9_SB_SE_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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_E5beginEv:
   76|  2.79k|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|  2.79k|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 2.79k]
  ------------------
   80|      0|      return end();
   81|  2.79k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 2.79k]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|  2.79k|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|  2.79k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E5emptyEv:
   99|  2.79k|  LLVM_NODISCARD bool empty() const {
  100|  2.79k|    return getNumEntries() == 0;
  101|  2.79k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumEntriesEv:
  457|  38.8k|  unsigned getNumEntries() const {
  458|  38.8k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  38.8k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumEntriesEv:
 1042|  38.8k|  unsigned getNumEntries() const {
 1043|  38.8k|    return NumEntries;
 1044|  38.8k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E12makeIteratorEPSD_SG_RNS_14DebugEpochBaseEb:
  439|   857k|                        bool NoAdvance=false) {
  440|   857k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 857k]
  ------------------
  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|   857k|    return iterator(P, E, Epoch, NoAdvance);
  445|   857k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEEE8getFirstEv:
   47|   317k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|  19.1k|  void AdvancePastEmptyBuckets() {
 1212|  19.1k|    assert(Ptr <= End);
 1213|  19.1k|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|  19.1k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|  93.9k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 91.2k, False: 2.79k]
  |  Branch (1216:27): [True: 74.8k, False: 16.3k]
  ------------------
 1217|  91.2k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 16.3k]
  ------------------
 1218|  74.8k|      ++Ptr;
 1219|  19.1k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getBucketsEndEv:
  501|  1.43M|  BucketT *getBucketsEnd() {
  502|  1.43M|    return getBuckets() + getNumBuckets();
  503|  1.43M|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumBucketsEv:
  497|  1.74M|  unsigned getNumBuckets() const {
  498|  1.74M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.74M|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumBucketsEv:
 1093|  1.74M|  unsigned getNumBuckets() const {
 1094|  1.74M|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 565k, False: 1.18M]
  ------------------
 1095|  1.74M|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE11getLargeRepEv:
 1073|  2.36M|  const LargeRep *getLargeRep() const {
 1074|  2.36M|    assert(!Small);
 1075|       |    // Note, same rule about aliasing as with getInlineBuckets.
 1076|  2.36M|    return reinterpret_cast<const LargeRep *>(storage.buffer);
 1077|  2.36M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  493|  1.44M|  BucketT *getBuckets() {
  494|  1.44M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.44M|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE10getBucketsEv:
 1088|  1.44M|  BucketT *getBuckets() {
 1089|  1.44M|    return const_cast<BucketT *>(
 1090|  1.44M|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|  1.44M|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE10getBucketsEv:
 1084|  1.73M|  const BucketT *getBuckets() const {
 1085|  1.73M|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 558k, False: 1.17M]
  ------------------
 1086|  1.73M|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16getInlineBucketsEv:
 1060|   558k|  const BucketT *getInlineBuckets() const {
 1061|   558k|    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|   558k|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|   558k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E3endEv:
   85|   570k|  inline iterator end() {
   86|   570k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   570k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEneERKSD_:
 1190|  20.5k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  20.5k|    return !(*this == RHS);
 1192|  20.5k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEeqERKSD_:
 1180|   579k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   579k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   579k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   579k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   579k|           "comparing incomparable iterators!");
 1185|   579k|    return Ptr == RHS.Ptr;
 1186|   579k|  }
_ZN4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEppEv:
 1194|  16.3k|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|  16.3k|    assert(isHandleInSync() && "invalid iterator access!");
 1196|  16.3k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 16.3k]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|  16.3k|    ++Ptr;
 1202|  16.3k|    AdvancePastEmptyBuckets();
 1203|  16.3k|    return *this;
 1204|  16.3k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEdeEv:
 1160|  10.9k|  reference operator*() const {
 1161|  10.9k|    assert(isHandleInSync() && "invalid iterator access!");
 1162|  10.9k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 10.9k]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|  10.9k|    return *Ptr;
 1165|  10.9k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10destroyAllEv:
  334|  2.09k|  void destroyAll() {
  335|  2.09k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 2.09k]
  ------------------
  336|      0|      return;
  337|       |
  338|  2.09k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  48.8k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 46.7k, False: 2.09k]
  ------------------
  340|  46.7k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 10.9k, False: 35.8k]
  ------------------
  341|  46.7k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 10.9k, False: 0]
  ------------------
  342|  10.9k|        P->getSecond().~ValueT();
  343|  46.7k|      P->getFirst().~KeyT();
  344|  46.7k|    }
  345|  2.09k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E11getEmptyKeyEv:
  426|   311k|  static const KeyT getEmptyKey() {
  427|   311k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   311k|                  "Must pass the derived type to this template!");
  429|   311k|    return KeyInfoT::getEmptyKey();
  430|   311k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15getTombstoneKeyEv:
  432|   297k|  static const KeyT getTombstoneKey() {
  433|   297k|    return KeyInfoT::getTombstoneKey();
  434|   297k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEEE9getSecondEv:
   49|  37.8k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE17deallocateBucketsEv:
 1097|  2.09k|  void deallocateBuckets() {
 1098|  2.09k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 1.56k, False: 535]
  ------------------
 1099|  1.56k|      return;
 1100|       |
 1101|    535|    operator delete(getLargeRep()->Buckets);
 1102|    535|    getLargeRep()->~LargeRep();
 1103|    535|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE11getLargeRepEv:
 1079|  1.60k|  LargeRep *getLargeRep() {
 1080|  1.60k|    return const_cast<LargeRep *>(
 1081|  1.60k|      const_cast<const SmallDenseMap *>(this)->getLargeRep());
 1082|  1.60k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4findERKS5_:
  154|   280k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   280k|    BucketT *TheBucket;
  156|   280k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 273k, False: 7.35k]
  ------------------
  157|   273k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|  7.35k|    return end();
  159|   280k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPSD_:
  632|   294k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   294k|    const BucketT *ConstFoundBucket;
  634|   294k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   294k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   294k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   294k|    return Result;
  638|   294k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPKSD_:
  582|   294k|                       const BucketT *&FoundBucket) const {
  583|   294k|    const BucketT *BucketsPtr = getBuckets();
  584|   294k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   294k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 294k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   294k|    const BucketT *FoundTombstone = nullptr;
  593|   294k|    const KeyT EmptyKey = getEmptyKey();
  594|   294k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   294k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   294k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   294k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   294k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   294k|    unsigned ProbeAmt = 1;
  601|   376k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   376k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   376k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   376k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 273k, False: 103k]
  |  |  ------------------
  ------------------
  605|   273k|        FoundBucket = ThisBucket;
  606|   273k|        return true;
  607|   273k|      }
  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|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 21.4k, False: 82.4k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  21.4k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 21.4k]
  ------------------
  615|  21.4k|        return false;
  616|  21.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|  82.4k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 82.4k]
  ------------------
  621|  82.4k|          !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|  82.4k|      BucketNo += ProbeAmt++;
  627|  82.4k|      BucketNo &= (NumBuckets-1);
  628|  82.4k|    }
  629|   294k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  489|   294k|  const BucketT *getBuckets() const {
  490|   294k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   294k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E12getHashValueERKS5_:
  417|   294k|  static unsigned getHashValue(const KeyT &Val) {
  418|   294k|    return KeyInfoT::getHashValue(Val);
  419|   294k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEEE8getFirstEv:
   48|   563k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEptEv:
 1166|   550k|  pointer operator->() const {
 1167|   550k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   550k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 550k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   550k|    return Ptr;
 1171|   550k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E11try_emplaceIJRNS3_7RuntimeERNS3_6HandleIS7_EEEEENSt3__14pairINS_16DenseMapIteratorIS5_S8_SA_SD_Lb0EEEbEERKS5_DpOT_:
  233|  10.9k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|  10.9k|    BucketT *TheBucket;
  235|  10.9k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 10.9k]
  ------------------
  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|  10.9k|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|  10.9k|    return std::make_pair(
  243|  10.9k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|  10.9k|             true);
  245|  10.9k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16InsertIntoBucketIRKS5_JRNS3_7RuntimeERNS3_6HandleIS7_EEEEEPSD_SO_OT_DpOT0_:
  519|  10.9k|                            ValueArgs &&... Values) {
  520|  10.9k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  10.9k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  10.9k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  10.9k|    return TheBucket;
  525|  10.9k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E20InsertIntoBucketImplIS5_EEPSD_RKS5_RKT_SH_:
  539|  10.9k|                                BucketT *TheBucket) {
  540|  10.9k|    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|  10.9k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  10.9k|    unsigned NumBuckets = getNumBuckets();
  553|  10.9k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  10.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 535, False: 10.3k]
  |  |  ------------------
  ------------------
  554|    535|      this->grow(NumBuckets * 2);
  555|    535|      LookupBucketFor(Lookup, TheBucket);
  556|    535|      NumBuckets = getNumBuckets();
  557|  10.3k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  10.3k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.3k]
  |  |  ------------------
  ------------------
  558|  10.3k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  10.9k|    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|  10.9k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  10.9k|    const KeyT EmptyKey = getEmptyKey();
  570|  10.9k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 10.9k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  10.9k|    return TheBucket;
  574|  10.9k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4growEj:
  509|    535|  void grow(unsigned AtLeast) {
  510|    535|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    535|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4growEj:
  968|    535|  void grow(unsigned AtLeast) {
  969|    535|    if (AtLeast >= InlineBuckets)
  ------------------
  |  Branch (969:9): [True: 535, False: 0]
  ------------------
  970|    535|      AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast-1));
  971|       |
  972|    535|    if (Small) {
  ------------------
  |  Branch (972:9): [True: 535, False: 0]
  ------------------
  973|    535|      if (AtLeast < InlineBuckets)
  ------------------
  |  Branch (973:11): [True: 0, False: 535]
  ------------------
  974|      0|        return; // Nothing to do.
  975|       |
  976|       |      // First move the inline buckets into a temporary storage.
  977|    535|      AlignedCharArrayUnion<BucketT[InlineBuckets]> TmpStorage;
  978|    535|      BucketT *TmpBegin = reinterpret_cast<BucketT *>(TmpStorage.buffer);
  979|    535|      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|    535|      const KeyT EmptyKey = this->getEmptyKey();
  984|    535|      const KeyT TombstoneKey = this->getTombstoneKey();
  985|  4.81k|      for (BucketT *P = getBuckets(), *E = P + InlineBuckets; P != E; ++P) {
  ------------------
  |  Branch (985:63): [True: 4.28k, False: 535]
  ------------------
  986|  4.28k|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (986:13): [True: 2.67k, False: 1.60k]
  ------------------
  987|  4.28k|            !KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (987:13): [True: 2.67k, False: 0]
  ------------------
  988|  2.67k|          assert(size_t(TmpEnd - TmpBegin) < InlineBuckets &&
  989|  2.67k|                 "Too many inline buckets!");
  990|  2.67k|          ::new (&TmpEnd->getFirst()) KeyT(std::move(P->getFirst()));
  991|  2.67k|          ::new (&TmpEnd->getSecond()) ValueT(std::move(P->getSecond()));
  992|  2.67k|          ++TmpEnd;
  993|  2.67k|          P->getSecond().~ValueT();
  994|  2.67k|        }
  995|  4.28k|        P->getFirst().~KeyT();
  996|  4.28k|      }
  997|       |
  998|       |      // Now make this map use the large rep, and move all the entries back
  999|       |      // into it.
 1000|    535|      Small = false;
 1001|    535|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1002|    535|      this->moveFromOldBuckets(TmpBegin, TmpEnd);
 1003|    535|      return;
 1004|    535|    }
 1005|       |
 1006|      0|    LargeRep OldRep = std::move(*getLargeRep());
 1007|      0|    getLargeRep()->~LargeRep();
 1008|      0|    if (AtLeast <= InlineBuckets) {
  ------------------
  |  Branch (1008:9): [True: 0, False: 0]
  ------------------
 1009|      0|      Small = true;
 1010|      0|    } else {
 1011|      0|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1012|      0|    }
 1013|       |
 1014|      0|    this->moveFromOldBuckets(OldRep.Buckets, OldRep.Buckets+OldRep.NumBuckets);
 1015|       |
 1016|       |    // Free the old table.
 1017|      0|    operator delete(OldRep.Buckets);
 1018|      0|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE15allocateBucketsEj:
 1105|    535|  LargeRep allocateBuckets(unsigned Num) {
 1106|    535|    assert(Num > InlineBuckets && "Must allocate more buckets than are inline");
 1107|    535|    LargeRep Rep = {
 1108|    535|      static_cast<BucketT*>(operator new(sizeof(BucketT) * Num)), Num
 1109|    535|    };
 1110|    535|    return Rep;
 1111|    535|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E18moveFromOldBucketsEPSD_SG_:
  369|    535|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    535|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    535|    const KeyT EmptyKey = getEmptyKey();
  374|    535|    const KeyT TombstoneKey = getTombstoneKey();
  375|  3.21k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 2.67k, False: 535]
  ------------------
  376|  2.67k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 2.67k, False: 0]
  ------------------
  377|  2.67k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 2.67k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  2.67k|        BucketT *DestBucket;
  380|  2.67k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  2.67k|        (void)FoundVal; // silence warning.
  382|  2.67k|        assert(!FoundVal && "Key already in new map?");
  383|  2.67k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  2.67k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  2.67k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  2.67k|        B->getSecond().~ValueT();
  389|  2.67k|      }
  390|  2.67k|      B->getFirst().~KeyT();
  391|  2.67k|    }
  392|    535|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E9initEmptyEv:
  347|  2.63k|  void initEmpty() {
  348|  2.63k|    setNumEntries(0);
  349|  2.63k|    setNumTombstones(0);
  350|       |
  351|  2.63k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|  2.63k|           "# initial buckets must be a power of two!");
  353|  2.63k|    const KeyT EmptyKey = getEmptyKey();
  354|  53.6k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 51.0k, False: 2.63k]
  ------------------
  355|  51.0k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|  2.63k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13setNumEntriesEj:
  461|  16.2k|  void setNumEntries(unsigned Num) {
  462|  16.2k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  16.2k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13setNumEntriesEj:
 1046|  16.2k|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|  16.2k|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|  16.2k|    NumEntries = Num;
 1050|  16.2k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16setNumTombstonesEj:
  477|  2.63k|  void setNumTombstones(unsigned Num) {
  478|  2.63k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  2.63k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16setNumTombstonesEj:
 1056|  2.63k|  void setNumTombstones(unsigned Num) {
 1057|  2.63k|    NumTombstones = Num;
 1058|  2.63k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16getNumTombstonesEv:
  473|  10.3k|  unsigned getNumTombstones() const {
  474|  10.3k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  10.3k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16getNumTombstonesEv:
 1052|  10.3k|  unsigned getNumTombstones() const {
 1053|  10.3k|    return NumTombstones;
 1054|  10.3k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E19incrementNumEntriesEv:
  465|  13.5k|  void incrementNumEntries() {
  466|  13.5k|    setNumEntries(getNumEntries() + 1);
  467|  13.5k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4sizeEv:
  102|  11.5k|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|    516|  unsigned getNumBuckets() const {
  498|    516|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    516|  }
_ZNK4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|    516|  unsigned getNumBuckets() const {
  792|    516|    return NumBuckets;
  793|    516|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS6_9allocatorIbEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SA_EEEES5_SA_SC_SF_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS6_9allocatorIbEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SA_EEEES5_SA_SC_SF_E13getNumBucketsEv:
  497|    160|  unsigned getNumBuckets() const {
  498|    160|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    160|  }
_ZNK4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEE13getNumBucketsEv:
  791|    160|  unsigned getNumBuckets() const {
  792|    160|    return NumBuckets;
  793|    160|  }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumBucketsEv:
  497|  1.51k|  unsigned getNumBuckets() const {
  498|  1.51k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.51k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumBucketsEv:
  791|  1.51k|  unsigned getNumBuckets() const {
  792|  1.51k|    return NumBuckets;
  793|  1.51k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  493|  1.35k|  BucketT *getBuckets() {
  494|  1.35k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.35k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
  787|  1.35k|  BucketT *getBuckets() const {
  788|  1.35k|    return Buckets;
  789|  1.35k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getBucketsEndEv:
  501|  1.35k|  BucketT *getBucketsEnd() {
  502|  1.35k|    return getBuckets() + getNumBuckets();
  503|  1.35k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160, False: 0]
  ------------------
  336|    160|      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|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|    392|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|    516|  ~DenseMap() {
  688|    516|    this->destroyAll();
  689|    516|    operator delete(Buckets);
  690|    516|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|    516|  void destroyAll() {
  335|    516|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 516, False: 0]
  ------------------
  336|    516|      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|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|    516|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|    516|  void init(unsigned InitNumEntries) {
  727|    516|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    516|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 516]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    516|    } else {
  731|    516|      NumEntries = 0;
  732|    516|      NumTombstones = 0;
  733|    516|    }
  734|    516|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    516|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    516|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 516, False: 0]
  ------------------
  363|    516|      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|    516|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|    516|  bool allocateBuckets(unsigned Num) {
  796|    516|    NumBuckets = Num;
  797|    516|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 516, False: 0]
  ------------------
  798|    516|      Buckets = nullptr;
  799|    516|      return false;
  800|    516|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    516|  }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEED2Ev:
  687|    676|  ~DenseMap() {
  688|    676|    this->destroyAll();
  689|    676|    operator delete(Buckets);
  690|    676|  }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEC2Ej:
  669|    676|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE4initEj:
  726|    676|  void init(unsigned InitNumEntries) {
  727|    676|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    676|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 676]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    676|    } else {
  731|    676|      NumEntries = 0;
  732|    676|      NumTombstones = 0;
  733|    676|    }
  734|    676|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E31getMinBucketToReserveForEntriesEj:
  360|    676|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    676|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 676, False: 0]
  ------------------
  363|    676|      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|    676|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE15allocateBucketsEj:
  795|    905|  bool allocateBuckets(unsigned Num) {
  796|    905|    NumBuckets = Num;
  797|    905|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 676, False: 229]
  ------------------
  798|    676|      Buckets = nullptr;
  799|    676|      return false;
  800|    676|    }
  801|       |
  802|    229|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    229|    return true;
  804|    905|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E9initEmptyEv:
  347|    229|  void initEmpty() {
  348|    229|    setNumEntries(0);
  349|    229|    setNumTombstones(0);
  350|       |
  351|    229|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    229|           "# initial buckets must be a power of two!");
  353|    229|    const KeyT EmptyKey = getEmptyKey();
  354|   406k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 406k, False: 229]
  ------------------
  355|   406k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    229|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13setNumEntriesEj:
  461|   251k|  void setNumEntries(unsigned Num) {
  462|   251k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   251k|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13setNumEntriesEj:
  775|   251k|  void setNumEntries(unsigned Num) {
  776|   251k|    NumEntries = Num;
  777|   251k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E16setNumTombstonesEj:
  477|    229|  void setNumTombstones(unsigned Num) {
  478|    229|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    229|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE16setNumTombstonesEj:
  783|    229|  void setNumTombstones(unsigned Num) {
  784|    229|    NumTombstones = Num;
  785|    229|  }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEEEjS3_S5_S8_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEEEdjS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E4findERKj:
  154|   412k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   412k|    BucketT *TheBucket;
  156|   412k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 309k, False: 103k]
  ------------------
  157|   309k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   103k|    return end();
  159|   412k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E15LookupBucketForIjEEbRKT_RPS6_:
  632|   664k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   664k|    const BucketT *ConstFoundBucket;
  634|   664k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   664k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   664k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   664k|    return Result;
  638|   664k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E15LookupBucketForIjEEbRKT_RPKS6_:
  582|  4.60M|                       const BucketT *&FoundBucket) const {
  583|  4.60M|    const BucketT *BucketsPtr = getBuckets();
  584|  4.60M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  4.60M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 392, False: 4.60M]
  ------------------
  587|    392|      FoundBucket = nullptr;
  588|    392|      return false;
  589|    392|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  4.60M|    const BucketT *FoundTombstone = nullptr;
  593|  4.60M|    const KeyT EmptyKey = getEmptyKey();
  594|  4.60M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  4.60M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  4.60M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  4.60M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  4.60M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  4.60M|    unsigned ProbeAmt = 1;
  601|  4.60M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  4.60M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  4.60M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  4.60M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.25M, False: 354k]
  |  |  ------------------
  ------------------
  605|  4.25M|        FoundBucket = ThisBucket;
  606|  4.25M|        return true;
  607|  4.25M|      }
  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|   354k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   354k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 354k, 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|   354k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 354k]
  ------------------
  615|   354k|        return false;
  616|   354k|      }
  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.60M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E10getBucketsEv:
  489|  16.4M|  const BucketT *getBuckets() const {
  490|  16.4M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  16.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E12getHashValueERKj:
  417|  4.60M|  static unsigned getHashValue(const KeyT &Val) {
  418|  4.60M|    return KeyInfoT::getHashValue(Val);
  419|  4.60M|  }
_ZNK4llvh6detail12DenseMapPairIjjE8getFirstEv:
   48|  4.96M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E12makeIteratorEPS6_S9_RNS_14DebugEpochBaseEb:
  439|   825k|                        bool NoAdvance=false) {
  440|   825k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 825k]
  ------------------
  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|   825k|    return iterator(P, E, Epoch, NoAdvance);
  445|   825k|  }
_ZN4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb0EEC2EPS5_S7_RKNS_14DebugEpochBaseEb:
 1140|   825k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   825k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   825k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 825k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E3endEv:
   85|   516k|  inline iterator end() {
   86|   516k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   516k|  }
_ZNK4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb0EEeqERKS6_:
 1180|   412k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   412k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   412k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   412k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   412k|           "comparing incomparable iterators!");
 1185|   412k|    return Ptr == RHS.Ptr;
 1186|   412k|  }
_ZNK4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb0EEptEv:
 1166|   309k|  pointer operator->() const {
 1167|   309k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   309k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 309k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   309k|    return Ptr;
 1171|   309k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getNumEntriesEv:
  457|   354k|  unsigned getNumEntries() const {
  458|   354k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   354k|  }
_ZNK4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13getNumEntriesEv:
  771|   354k|  unsigned getNumEntries() const {
  772|   354k|    return NumEntries;
  773|   354k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E16getNumTombstonesEv:
  473|   103k|  unsigned getNumTombstones() const {
  474|   103k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   103k|  }
_ZNK4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE16getNumTombstonesEv:
  779|   103k|  unsigned getNumTombstones() const {
  780|   103k|    return NumTombstones;
  781|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E20InsertIntoBucketImplIjEEPS6_RKjRKT_SA_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 229, False: 103k]
  |  |  ------------------
  ------------------
  554|    229|      this->grow(NumBuckets * 2);
  555|    229|      LookupBucketFor(Lookup, TheBucket);
  556|    229|      NumBuckets = getNumBuckets();
  557|   103k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  558|   103k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E4growEj:
  509|    229|  void grow(unsigned AtLeast) {
  510|    229|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    229|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE4growEj:
  736|    229|  void grow(unsigned AtLeast) {
  737|    229|    unsigned OldNumBuckets = NumBuckets;
  738|    229|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    229|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    229|    assert(Buckets);
  742|    229|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 33]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  746|       |
  747|     33|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     33|    operator delete(OldBuckets);
  751|     33|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E18moveFromOldBucketsEPS6_S9_:
  369|     33|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     33|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     33|    const KeyT EmptyKey = getEmptyKey();
  374|     33|    const KeyT TombstoneKey = getTombstoneKey();
  375|   196k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 196k, False: 33]
  ------------------
  376|   196k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 147k, False: 49.2k]
  ------------------
  377|   196k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 147k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   147k|        BucketT *DestBucket;
  380|   147k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   147k|        (void)FoundVal; // silence warning.
  382|   147k|        assert(!FoundVal && "Key already in new map?");
  383|   147k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   147k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   147k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   147k|        B->getSecond().~ValueT();
  389|   147k|      }
  390|   196k|      B->getFirst().~KeyT();
  391|   196k|    }
  392|     33|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E19incrementNumEntriesEv:
  465|   250k|  void incrementNumEntries() {
  466|   250k|    setNumEntries(getNumEntries() + 1);
  467|   250k|  }
_ZNK4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb0EEneERKS6_:
 1190|   412k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   412k|    return !(*this == RHS);
 1192|   412k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E5emptyEv:
   99|    160|  LLVM_NODISCARD bool empty() const {
  100|    160|    return getNumEntries() == 0;
  101|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumEntriesEv:
  457|    160|  unsigned getNumEntries() const {
  458|    160|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    160|  }
_ZNK4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumEntriesEv:
  771|    160|  unsigned getNumEntries() const {
  772|    160|    return NumEntries;
  773|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E5emptyEv:
   99|    226|  LLVM_NODISCARD bool empty() const {
  100|    226|    return getNumEntries() == 0;
  101|    226|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPS8_:
  632|  10.1k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  10.1k|    const BucketT *ConstFoundBucket;
  634|  10.1k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  10.1k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  10.1k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  10.1k|    return Result;
  638|  10.1k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  582|  10.1k|                       const BucketT *&FoundBucket) const {
  583|  10.1k|    const BucketT *BucketsPtr = getBuckets();
  584|  10.1k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  10.1k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 10.1k, False: 0]
  ------------------
  587|  10.1k|      FoundBucket = nullptr;
  588|  10.1k|      return false;
  589|  10.1k|    }
  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|  10.1k|  const BucketT *getBuckets() const {
  490|  10.1k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  10.1k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E5eraseERKS3_:
  276|  10.1k|  bool erase(const KeyT &Val) {
  277|  10.1k|    BucketT *TheBucket;
  278|  10.1k|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 10.1k, False: 0]
  ------------------
  279|  10.1k|      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|  10.1k|  }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 0]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    160|  }
_ZN4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEC2EPS6_S8_RKNS_14DebugEpochBaseEb:
 1140|  4.30M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  4.30M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  4.30M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 4.30M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEEC2Ej:
  669|  1.62k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE4initEj:
  726|  2.20k|  void init(unsigned InitNumEntries) {
  727|  2.20k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|  2.20k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 2.20k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|  2.20k|    } else {
  731|  2.20k|      NumEntries = 0;
  732|  2.20k|      NumTombstones = 0;
  733|  2.20k|    }
  734|  2.20k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E31getMinBucketToReserveForEntriesEj:
  360|  2.20k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|  2.20k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 2.20k, False: 0]
  ------------------
  363|  2.20k|      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.20k|  }
_ZN4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEC2EPSC_SE_RKNS_14DebugEpochBaseEb:
 1140|   857k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   857k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   857k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 854k, False: 2.79k]
  ------------------
 1144|  2.79k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 2.79k]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|  2.79k|    AdvancePastEmptyBuckets();
 1149|  2.79k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEED2Ev:
  857|  2.09k|  ~SmallDenseMap() {
  858|  2.09k|    this->destroyAll();
  859|  2.09k|    deallocateBuckets();
  860|  2.09k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEC2Ej:
  837|  2.09k|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|  2.09k|    init(NumInitBuckets);
  839|  2.09k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4initEj:
  959|  2.09k|  void init(unsigned InitBuckets) {
  960|  2.09k|    Small = true;
  961|  2.09k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 2.09k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|  2.09k|    this->BaseT::initEmpty();
  966|  2.09k|  }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEC2Ej:
  669|     52|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEE4initEj:
  726|     52|  void init(unsigned InitNumEntries) {
  727|     52|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     52|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 52]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     52|    } else {
  731|     52|      NumEntries = 0;
  732|     52|      NumTombstones = 0;
  733|     52|    }
  734|     52|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_jEEEES6_jS8_SB_E31getMinBucketToReserveForEntriesEj:
  360|     52|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     52|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 52, False: 0]
  ------------------
  363|     52|      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|     52|  }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEE15allocateBucketsEj:
  795|     52|  bool allocateBuckets(unsigned Num) {
  796|     52|    NumBuckets = Num;
  797|     52|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 52, False: 0]
  ------------------
  798|     52|      Buckets = nullptr;
  799|     52|      return false;
  800|     52|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     52|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_jEEEES6_jS8_SB_E13getNumBucketsEv:
  497|     52|  unsigned getNumBuckets() const {
  498|     52|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     52|  }
_ZNK4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEE13getNumBucketsEv:
  791|     52|  unsigned getNumBuckets() const {
  792|     52|    return NumBuckets;
  793|     52|  }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEED2Ev:
  687|     52|  ~DenseMap() {
  688|     52|    this->destroyAll();
  689|     52|    operator delete(Buckets);
  690|     52|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_jEEEES6_jS8_SB_E10destroyAllEv:
  334|     52|  void destroyAll() {
  335|     52|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 52, False: 0]
  ------------------
  336|     52|      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|    527|  ~DenseMap() {
  688|    527|    this->destroyAll();
  689|    527|    operator delete(Buckets);
  690|    527|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|    527|  void destroyAll() {
  335|    527|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 527, False: 0]
  ------------------
  336|    527|      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|    547|  unsigned getNumBuckets() const {
  498|    547|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    547|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|    547|  unsigned getNumBuckets() const {
  792|    547|    return NumBuckets;
  793|    547|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  493|     16|  BucketT *getBuckets() {
  494|     16|    return static_cast<DerivedT *>(this)->getBuckets();
  495|     16|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE10getBucketsEv:
  787|     20|  BucketT *getBuckets() const {
  788|     20|    return Buckets;
  789|     20|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getBucketsEndEv:
  501|     16|  BucketT *getBucketsEnd() {
  502|     16|    return getBuckets() + getNumBuckets();
  503|     16|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEED2Ev:
  857|    208|  ~SmallDenseMap() {
  858|    208|    this->destroyAll();
  859|    208|    deallocateBuckets();
  860|    208|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E10destroyAllEv:
  334|    208|  void destroyAll() {
  335|    208|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 208]
  ------------------
  336|      0|      return;
  337|       |
  338|    208|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  3.53k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 3.32k, False: 208]
  ------------------
  340|  3.32k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 3.32k]
  ------------------
  341|  3.32k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  3.32k|      P->getFirst().~KeyT();
  344|  3.32k|    }
  345|    208|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getNumBucketsEv:
  497|  1.04k|  unsigned getNumBuckets() const {
  498|  1.04k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.04k|  }
_ZNK4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13getNumBucketsEv:
 1093|  1.04k|  unsigned getNumBuckets() const {
 1094|  1.04k|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 1.04k, False: 0]
  ------------------
 1095|  1.04k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E11getEmptyKeyEv:
  426|    416|  static const KeyT getEmptyKey() {
  427|    416|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    416|                  "Must pass the derived type to this template!");
  429|    416|    return KeyInfoT::getEmptyKey();
  430|    416|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E15getTombstoneKeyEv:
  432|    208|  static const KeyT getTombstoneKey() {
  433|    208|    return KeyInfoT::getTombstoneKey();
  434|    208|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E10getBucketsEv:
  493|    832|  BucketT *getBuckets() {
  494|    832|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    832|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE10getBucketsEv:
 1088|    832|  BucketT *getBuckets() {
 1089|    832|    return const_cast<BucketT *>(
 1090|    832|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|    832|  }
_ZNK4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE10getBucketsEv:
 1084|    832|  const BucketT *getBuckets() const {
 1085|    832|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 832, False: 0]
  ------------------
 1086|    832|  }
_ZNK4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE16getInlineBucketsEv:
 1060|    832|  const BucketT *getInlineBuckets() const {
 1061|    832|    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|    832|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|    832|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getBucketsEndEv:
  501|    416|  BucketT *getBucketsEnd() {
  502|    416|    return getBuckets() + getNumBuckets();
  503|    416|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE17deallocateBucketsEv:
 1097|    208|  void deallocateBuckets() {
 1098|    208|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 208, False: 0]
  ------------------
 1099|    208|      return;
 1100|       |
 1101|      0|    operator delete(getLargeRep()->Buckets);
 1102|      0|    getLargeRep()->~LargeRep();
 1103|      0|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEC2Ej:
  837|    208|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|    208|    init(NumInitBuckets);
  839|    208|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE4initEj:
  959|    208|  void init(unsigned InitBuckets) {
  960|    208|    Small = true;
  961|    208|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 208]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|    208|    this->BaseT::initEmpty();
  966|    208|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E9initEmptyEv:
  347|    208|  void initEmpty() {
  348|    208|    setNumEntries(0);
  349|    208|    setNumTombstones(0);
  350|       |
  351|    208|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    208|           "# initial buckets must be a power of two!");
  353|    208|    const KeyT EmptyKey = getEmptyKey();
  354|  3.53k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 3.32k, False: 208]
  ------------------
  355|  3.32k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    208|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13setNumEntriesEj:
  461|    208|  void setNumEntries(unsigned Num) {
  462|    208|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    208|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13setNumEntriesEj:
 1046|    208|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|    208|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|    208|    NumEntries = Num;
 1050|    208|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E16setNumTombstonesEj:
  477|    208|  void setNumTombstones(unsigned Num) {
  478|    208|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    208|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE16setNumTombstonesEj:
 1056|    208|  void setNumTombstones(unsigned Num) {
 1057|    208|    NumTombstones = Num;
 1058|    208|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|    122|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|    527|  void init(unsigned InitNumEntries) {
  727|    527|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    527|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 527]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    527|    } else {
  731|    527|      NumEntries = 0;
  732|    527|      NumTombstones = 0;
  733|    527|    }
  734|    527|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|    527|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    527|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 527, False: 0]
  ------------------
  363|    527|      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|    527|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|    527|  bool allocateBuckets(unsigned Num) {
  796|    527|    NumBuckets = Num;
  797|    527|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 527, False: 0]
  ------------------
  798|    527|      Buckets = nullptr;
  799|    527|      return false;
  800|    527|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    527|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E4findERKS3_:
  154|      4|  iterator find(const_arg_type_t<KeyT> Val) {
  155|      4|    BucketT *TheBucket;
  156|      4|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 4]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|      4|    return end();
  159|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPS8_:
  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_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  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: 4, False: 0]
  ------------------
  587|      4|      FoundBucket = nullptr;
  588|      4|      return false;
  589|      4|    }
  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_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  489|      4|  const BucketT *getBuckets() const {
  490|      4|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E12makeIteratorEPS8_SB_RNS_14DebugEpochBaseEb:
  439|      8|                        bool NoAdvance=false) {
  440|      8|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 8]
  ------------------
  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|    return iterator(P, E, Epoch, NoAdvance);
  445|      8|  }
_ZN4llvh16DenseMapIteratorINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEC2EPS7_S9_RKNS_14DebugEpochBaseEb:
 1140|      8|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|      8|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|      8|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 8, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh16DenseMapIteratorINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEeqERKS8_:
 1180|      4|  bool operator==(const NonConstIterator &RHS) const {
 1181|      4|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|      4|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|      4|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|      4|           "comparing incomparable iterators!");
 1185|      4|    return Ptr == RHS.Ptr;
 1186|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E3endEv:
   85|      8|  inline iterator end() {
   86|      8|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|      8|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumEntriesEv:
  457|    241|  unsigned getNumEntries() const {
  458|    241|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    241|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumEntriesEv:
  771|    241|  unsigned getNumEntries() const {
  772|    241|    return NumEntries;
  773|    241|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E4sizeEv:
  102|    241|  unsigned size() const { return getNumEntries(); }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE15allocateBucketsEj:
  795|   206k|  bool allocateBuckets(unsigned Num) {
  796|   206k|    NumBuckets = Num;
  797|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 103k]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|   103k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   103k|    return true;
  804|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E9initEmptyEv:
  347|   103k|  void initEmpty() {
  348|   103k|    setNumEntries(0);
  349|   103k|    setNumTombstones(0);
  350|       |
  351|   103k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   103k|           "# initial buckets must be a power of two!");
  353|   103k|    const KeyT EmptyKey = getEmptyKey();
  354|  6.72M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 6.61M, False: 103k]
  ------------------
  355|  6.61M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E13setNumEntriesEj:
  461|   206k|  void setNumEntries(unsigned Num) {
  462|   206k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   206k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE13setNumEntriesEj:
  775|   206k|  void setNumEntries(unsigned Num) {
  776|   206k|    NumEntries = Num;
  777|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E16setNumTombstonesEj:
  477|   103k|  void setNumTombstones(unsigned Num) {
  478|   103k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   103k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE16setNumTombstonesEj:
  783|   103k|  void setNumTombstones(unsigned Num) {
  784|   103k|    NumTombstones = Num;
  785|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E13getNumBucketsEv:
  497|  1.34M|  unsigned getNumBuckets() const {
  498|  1.34M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.34M|  }
_ZNK4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE13getNumBucketsEv:
  791|  1.34M|  unsigned getNumBuckets() const {
  792|  1.34M|    return NumBuckets;
  793|  1.34M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E11getEmptyKeyEv:
  426|   517k|  static const KeyT getEmptyKey() {
  427|   517k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   517k|                  "Must pass the derived type to this template!");
  429|   517k|    return KeyInfoT::getEmptyKey();
  430|   517k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E10getBucketsEv:
  493|   723k|  BucketT *getBuckets() {
  494|   723k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   723k|  }
_ZNK4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE10getBucketsEv:
  787|  1.03M|  BucketT *getBuckets() const {
  788|  1.03M|    return Buckets;
  789|  1.03M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E13getBucketsEndEv:
  501|   516k|  BucketT *getBucketsEnd() {
  502|   516k|    return getBuckets() + getNumBuckets();
  503|   516k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEEE8getFirstEv:
   47|  20.1M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE15allocateBucketsEj:
  795|   206k|  bool allocateBuckets(unsigned Num) {
  796|   206k|    NumBuckets = Num;
  797|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 103k]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|   103k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   103k|    return true;
  804|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E9initEmptyEv:
  347|   103k|  void initEmpty() {
  348|   103k|    setNumEntries(0);
  349|   103k|    setNumTombstones(0);
  350|       |
  351|   103k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   103k|           "# initial buckets must be a power of two!");
  353|   103k|    const KeyT EmptyKey = getEmptyKey();
  354|  6.72M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 6.61M, False: 103k]
  ------------------
  355|  6.61M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13setNumEntriesEj:
  461|   206k|  void setNumEntries(unsigned Num) {
  462|   206k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   206k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13setNumEntriesEj:
  775|   206k|  void setNumEntries(unsigned Num) {
  776|   206k|    NumEntries = Num;
  777|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16setNumTombstonesEj:
  477|   103k|  void setNumTombstones(unsigned Num) {
  478|   103k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   103k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE16setNumTombstonesEj:
  783|   103k|  void setNumTombstones(unsigned Num) {
  784|   103k|    NumTombstones = Num;
  785|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getNumBucketsEv:
  497|  2.06M|  unsigned getNumBuckets() const {
  498|  2.06M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.06M|  }
_ZNK4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13getNumBucketsEv:
  791|  2.06M|  unsigned getNumBuckets() const {
  792|  2.06M|    return NumBuckets;
  793|  2.06M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E11getEmptyKeyEv:
  426|   620k|  static const KeyT getEmptyKey() {
  427|   620k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   620k|                  "Must pass the derived type to this template!");
  429|   620k|    return KeyInfoT::getEmptyKey();
  430|   620k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10getBucketsEv:
  493|  1.13M|  BucketT *getBuckets() {
  494|  1.13M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.13M|  }
_ZNK4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE10getBucketsEv:
  787|  1.86M|  BucketT *getBuckets() const {
  788|  1.86M|    return Buckets;
  789|  1.86M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getBucketsEndEv:
  501|   827k|  BucketT *getBucketsEnd() {
  502|   827k|    return getBuckets() + getNumBuckets();
  503|   827k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEEE8getFirstEv:
   47|  26.8M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 103k]
  ------------------
  336|      0|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  6.72M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 6.61M, False: 103k]
  ------------------
  340|  6.61M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 6.51M]
  ------------------
  341|  6.61M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|  6.61M|      P->getFirst().~KeyT();
  344|  6.61M|    }
  345|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E15getTombstoneKeyEv:
  432|   310k|  static const KeyT getTombstoneKey() {
  433|   310k|    return KeyInfoT::getTombstoneKey();
  434|   310k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEEE9getSecondEv:
   49|   206k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 103k]
  ------------------
  336|      0|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  6.72M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 6.61M, False: 103k]
  ------------------
  340|  6.61M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 6.51M]
  ------------------
  341|  6.61M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|  6.61M|      P->getFirst().~KeyT();
  344|  6.61M|    }
  345|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15getTombstoneKeyEv:
  432|   413k|  static const KeyT getTombstoneKey() {
  433|   413k|    return KeyInfoT::getTombstoneKey();
  434|   413k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEEE9getSecondEv:
   49|   206k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEC2Ej:
  669|    597|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE4initEj:
  726|    597|  void init(unsigned InitNumEntries) {
  727|    597|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    597|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 597]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    597|    } else {
  731|    597|      NumEntries = 0;
  732|    597|      NumTombstones = 0;
  733|    597|    }
  734|    597|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|    597|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    597|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 597, False: 0]
  ------------------
  363|    597|      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|    597|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE15allocateBucketsEj:
  795|    597|  bool allocateBuckets(unsigned Num) {
  796|    597|    NumBuckets = Num;
  797|    597|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 597, False: 0]
  ------------------
  798|    597|      Buckets = nullptr;
  799|    597|      return false;
  800|    597|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    597|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getNumBucketsEv:
  497|  3.91k|  unsigned getNumBuckets() const {
  498|  3.91k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  3.91k|  }
_ZNK4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE13getNumBucketsEv:
  791|  3.91k|  unsigned getNumBuckets() const {
  792|  3.91k|    return NumBuckets;
  793|  3.91k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E10getBucketsEv:
  493|  3.32k|  BucketT *getBuckets() {
  494|  3.32k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  3.32k|  }
_ZNK4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE10getBucketsEv:
  787|  3.32k|  BucketT *getBuckets() const {
  788|  3.32k|    return Buckets;
  789|  3.32k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getBucketsEndEv:
  501|  3.32k|  BucketT *getBucketsEnd() {
  502|  3.32k|    return getBuckets() + getNumBuckets();
  503|  3.32k|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEC2Ej:
  669|    597|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE4initEj:
  726|    597|  void init(unsigned InitNumEntries) {
  727|    597|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    597|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 597]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    597|    } else {
  731|    597|      NumEntries = 0;
  732|    597|      NumTombstones = 0;
  733|    597|    }
  734|    597|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|    597|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    597|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 597, False: 0]
  ------------------
  363|    597|      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|    597|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEED2Ev:
  687|    597|  ~DenseMap() {
  688|    597|    this->destroyAll();
  689|    597|    operator delete(Buckets);
  690|    597|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E10destroyAllEv:
  334|    597|  void destroyAll() {
  335|    597|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 597, False: 0]
  ------------------
  336|    597|      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|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEED2Ev:
  687|    597|  ~DenseMap() {
  688|    597|    this->destroyAll();
  689|    597|    operator delete(Buckets);
  690|    597|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10destroyAllEv:
  334|    597|  void destroyAll() {
  335|    597|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 562, False: 35]
  ------------------
  336|    562|      return;
  337|       |
  338|     35|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  2.27k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 2.24k, False: 35]
  ------------------
  340|  2.24k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 38, False: 2.20k]
  ------------------
  341|  2.24k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 38, False: 0]
  ------------------
  342|     38|        P->getSecond().~ValueT();
  343|  2.24k|      P->getFirst().~KeyT();
  344|  2.24k|    }
  345|     35|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E5beginEv:
   76|  1.32k|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|  1.32k|    if (empty())
  ------------------
  |  Branch (79:9): [True: 1.07k, False: 249]
  ------------------
   80|  1.07k|      return end();
   81|    249|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 249]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|    249|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|    249|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E5emptyEv:
   99|  1.32k|  LLVM_NODISCARD bool empty() const {
  100|  1.32k|    return getNumEntries() == 0;
  101|  1.32k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|  2.64k|                        bool NoAdvance=false) {
  440|  2.64k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 2.64k]
  ------------------
  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.64k|    return iterator(P, E, Epoch, NoAdvance);
  445|  2.64k|  }
_ZN4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1140|  2.64k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  2.64k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  2.64k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 2.39k, False: 249]
  ------------------
 1144|    249|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 249]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|    249|    AdvancePastEmptyBuckets();
 1149|    249|  }
_ZN4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|    498|  void AdvancePastEmptyBuckets() {
 1212|    498|    assert(Ptr <= End);
 1213|    498|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|    498|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|  16.1k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 15.9k, False: 249]
  |  Branch (1216:27): [True: 15.6k, False: 249]
  ------------------
 1217|  15.9k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 249]
  ------------------
 1218|  15.6k|      ++Ptr;
 1219|    498|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E3endEv:
   85|  2.39k|  inline iterator end() {
   86|  2.39k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  2.39k|  }
_ZNK4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEneERKSA_:
 1190|  1.57k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  1.57k|    return !(*this == RHS);
 1192|  1.57k|  }
_ZNK4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEeqERKSA_:
 1180|  1.57k|  bool operator==(const NonConstIterator &RHS) const {
 1181|  1.57k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  1.57k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  1.57k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  1.57k|           "comparing incomparable iterators!");
 1185|  1.57k|    return Ptr == RHS.Ptr;
 1186|  1.57k|  }
_ZN4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEppEv:
 1194|    249|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|    249|    assert(isHandleInSync() && "invalid iterator access!");
 1196|    249|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 249]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|    249|    ++Ptr;
 1202|    249|    AdvancePastEmptyBuckets();
 1203|    249|    return *this;
 1204|    249|  }
_ZNK4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEdeEv:
 1160|    249|  reference operator*() const {
 1161|    249|    assert(isHandleInSync() && "invalid iterator access!");
 1162|    249|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 249]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|    249|    return *Ptr;
 1165|    249|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E5beginEv:
   76|    830|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|    830|    if (empty())
  ------------------
  |  Branch (79:9): [True: 830, False: 0]
  ------------------
   80|    830|      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|    830|  LLVM_NODISCARD bool empty() const {
  100|    830|    return getNumEntries() == 0;
  101|    830|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getNumEntriesEv:
  457|    830|  unsigned getNumEntries() const {
  458|    830|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    830|  }
_ZNK4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE13getNumEntriesEv:
  771|    830|  unsigned getNumEntries() const {
  772|    830|    return NumEntries;
  773|    830|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|  1.66k|                        bool NoAdvance=false) {
  440|  1.66k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 1.66k]
  ------------------
  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.66k|    return iterator(P, E, Epoch, NoAdvance);
  445|  1.66k|  }
_ZN4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1140|  1.66k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  1.66k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  1.66k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 1.66k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E3endEv:
   85|  1.66k|  inline iterator end() {
   86|  1.66k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  1.66k|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb0EEneERKSB_:
 1190|    830|  bool operator!=(const NonConstIterator &RHS) const {
 1191|    830|    return !(*this == RHS);
 1192|    830|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb0EEeqERKSB_:
 1180|    830|  bool operator==(const NonConstIterator &RHS) const {
 1181|    830|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|    830|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|    830|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|    830|           "comparing incomparable iterators!");
 1185|    830|    return Ptr == RHS.Ptr;
 1186|    830|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E5beginEv:
   76|    339|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|    339|    if (empty())
  ------------------
  |  Branch (79:9): [True: 339, False: 0]
  ------------------
   80|    339|      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|    339|  LLVM_NODISCARD bool empty() const {
  100|    339|    return getNumEntries() == 0;
  101|    339|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumEntriesEv:
  457|    339|  unsigned getNumEntries() const {
  458|    339|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    339|  }
_ZNK4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumEntriesEv:
  771|    339|  unsigned getNumEntries() const {
  772|    339|    return NumEntries;
  773|    339|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E3endEv:
   85|    678|  inline iterator end() {
   86|    678|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|    678|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|    678|                        bool NoAdvance=false) {
  440|    678|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 678]
  ------------------
  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|    678|    return iterator(P, E, Epoch, NoAdvance);
  445|    678|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1140|    678|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|    678|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|    678|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 678, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb1EEC2ILb0EvEERKNS0_IS4_S6_S8_SA_XT_EEE:
 1158|    339|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb0EEneERKNS0_IS4_S6_S8_SA_Lb1EEE:
 1187|    339|  bool operator!=(const ConstIterator &RHS) const {
 1188|    339|    return !(*this == RHS);
 1189|    339|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb0EEeqERKNS0_IS4_S6_S8_SA_Lb1EEE:
 1173|    339|  bool operator==(const ConstIterator &RHS) const {
 1174|    339|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|    339|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|    339|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|    339|           "comparing incomparable iterators!");
 1178|    339|    return Ptr == RHS.Ptr;
 1179|    339|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E4findERKj:
  160|  3.94M|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|  3.94M|    const BucketT *TheBucket;
  162|  3.94M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 3.94M, False: 0]
  ------------------
  163|  3.94M|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|      0|    return end();
  165|  3.94M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E17makeConstIteratorEPKS6_SA_RKNS_14DebugEpochBaseEb:
  449|  7.89M|                                   const bool NoAdvance=false) const {
  450|  7.89M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 7.89M]
  ------------------
  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|  7.89M|    return const_iterator(P, E, Epoch, NoAdvance);
  455|  7.89M|  }
_ZN4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb1EEC2EPKS5_S8_RKNS_14DebugEpochBaseEb:
 1140|  7.89M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  7.89M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  7.89M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 7.89M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getBucketsEndEv:
  505|  11.8M|  const BucketT *getBucketsEnd() const {
  506|  11.8M|    return getBuckets() + getNumBuckets();
  507|  11.8M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E3endEv:
   95|  3.94M|  inline const_iterator end() const {
   96|  3.94M|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|  3.94M|  }
_ZNK4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb1EEneERKS6_:
 1187|  3.94M|  bool operator!=(const ConstIterator &RHS) const {
 1188|  3.94M|    return !(*this == RHS);
 1189|  3.94M|  }
_ZNK4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb1EEeqERKS6_:
 1173|  3.94M|  bool operator==(const ConstIterator &RHS) const {
 1174|  3.94M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|  3.94M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|  3.94M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|  3.94M|           "comparing incomparable iterators!");
 1178|  3.94M|    return Ptr == RHS.Ptr;
 1179|  3.94M|  }
_ZNK4llvh16DenseMapIteratorIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEELb1EEptEv:
 1166|  3.94M|  pointer operator->() const {
 1167|  3.94M|    assert(isHandleInSync() && "invalid iterator access!");
 1168|  3.94M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 3.94M]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|  3.94M|    return Ptr;
 1171|  3.94M|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEEC2Ej:
  669|    160|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE4initEj:
  726|    160|  void init(unsigned InitNumEntries) {
  727|    160|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    160|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 160]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    160|    } else {
  731|    160|      NumEntries = 0;
  732|    160|      NumTombstones = 0;
  733|    160|    }
  734|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E31getMinBucketToReserveForEntriesEj:
  360|    160|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    160|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 160, False: 0]
  ------------------
  363|    160|      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|    160|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE15allocateBucketsEj:
  795|    320|  bool allocateBuckets(unsigned Num) {
  796|    320|    NumBuckets = Num;
  797|    320|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 160, False: 160]
  ------------------
  798|    160|      Buckets = nullptr;
  799|    160|      return false;
  800|    160|    }
  801|       |
  802|    160|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    160|    return true;
  804|    320|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E9initEmptyEv:
  347|    160|  void initEmpty() {
  348|    160|    setNumEntries(0);
  349|    160|    setNumTombstones(0);
  350|       |
  351|    160|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    160|           "# initial buckets must be a power of two!");
  353|    160|    const KeyT EmptyKey = getEmptyKey();
  354|  10.4k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 10.2k, False: 160]
  ------------------
  355|  10.2k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13setNumEntriesEj:
  461|    480|  void setNumEntries(unsigned Num) {
  462|    480|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    480|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13setNumEntriesEj:
  775|    480|  void setNumEntries(unsigned Num) {
  776|    480|    NumEntries = Num;
  777|    480|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16setNumTombstonesEj:
  477|    320|  void setNumTombstones(unsigned Num) {
  478|    320|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    320|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE16setNumTombstonesEj:
  783|    320|  void setNumTombstones(unsigned Num) {
  784|    320|    NumTombstones = Num;
  785|    320|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getNumBucketsEv:
  497|  2.08k|  unsigned getNumBuckets() const {
  498|  2.08k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.08k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13getNumBucketsEv:
  791|  2.08k|  unsigned getNumBuckets() const {
  792|  2.08k|    return NumBuckets;
  793|  2.08k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E11getEmptyKeyEv:
  426|    800|  static const KeyT getEmptyKey() {
  427|    800|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    800|                  "Must pass the derived type to this template!");
  429|    800|    return KeyInfoT::getEmptyKey();
  430|    800|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10getBucketsEv:
  493|  1.28k|  BucketT *getBuckets() {
  494|  1.28k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.28k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE10getBucketsEv:
  787|  1.76k|  BucketT *getBuckets() const {
  788|  1.76k|    return Buckets;
  789|  1.76k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getBucketsEndEv:
  501|    800|  BucketT *getBucketsEnd() {
  502|    800|    return getBuckets() + getNumBuckets();
  503|    800|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEEE8getFirstEv:
   47|  41.7k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEED2Ev:
  687|    160|  ~DenseMap() {
  688|    160|    this->destroyAll();
  689|    160|    operator delete(Buckets);
  690|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10destroyAllEv:
  334|    160|  void destroyAll() {
  335|    160|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 160]
  ------------------
  336|      0|      return;
  337|       |
  338|    160|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  10.4k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 10.2k, False: 160]
  ------------------
  340|  10.2k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 160, False: 10.0k]
  ------------------
  341|  10.2k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 160]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  10.2k|      P->getFirst().~KeyT();
  344|  10.2k|    }
  345|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15getTombstoneKeyEv:
  432|    640|  static const KeyT getTombstoneKey() {
  433|    640|    return KeyInfoT::getTombstoneKey();
  434|    640|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEEE9getSecondEv:
   49|    320|  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|    160|  ValueT &operator[](KeyT &&Key) {
  316|    160|    return FindAndConstruct(std::move(Key)).second;
  317|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16FindAndConstructEOS5_:
  307|    160|  value_type& FindAndConstruct(KeyT &&Key) {
  308|    160|    BucketT *TheBucket;
  309|    160|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 160]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|    160|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIS5_EEbRKT_RPSJ_:
  632|    480|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    480|    const BucketT *ConstFoundBucket;
  634|    480|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    480|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    480|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    480|    return Result;
  638|    480|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIS5_EEbRKT_RPKSJ_:
  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: 160, False: 320]
  ------------------
  587|    160|      FoundBucket = nullptr;
  588|    160|      return false;
  589|    160|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    320|    const BucketT *FoundTombstone = nullptr;
  593|    320|    const KeyT EmptyKey = getEmptyKey();
  594|    320|    const KeyT TombstoneKey = getTombstoneKey();
  595|    320|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    320|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    320|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|    320|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    320|    unsigned ProbeAmt = 1;
  601|    320|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    320|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    320|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    320|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 160, False: 160]
  |  |  ------------------
  ------------------
  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|    160|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    160|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 160, 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|    160|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 160]
  ------------------
  615|    160|        return false;
  616|    160|      }
  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|    320|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10getBucketsEv:
  489|    480|  const BucketT *getBuckets() const {
  490|    480|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    480|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E12getHashValueERKS5_:
  417|    320|  static unsigned getHashValue(const KeyT &Val) {
  418|    320|    return KeyInfoT::getHashValue(Val);
  419|    320|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEEE8getFirstEv:
   48|    480|  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|    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_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E20InsertIntoBucketImplIS5_EEPSJ_RKS5_RKT_SN_:
  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: 160, False: 0]
  |  |  ------------------
  ------------------
  554|    160|      this->grow(NumBuckets * 2);
  555|    160|      LookupBucketFor(Lookup, TheBucket);
  556|    160|      NumBuckets = getNumBuckets();
  557|    160|    } 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|    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|    160|    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_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getNumEntriesEv:
  457|    640|  unsigned getNumEntries() const {
  458|    640|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    640|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13getNumEntriesEv:
  771|    640|  unsigned getNumEntries() const {
  772|    640|    return NumEntries;
  773|    640|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E4growEj:
  509|    160|  void grow(unsigned AtLeast) {
  510|    160|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    160|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE4growEj:
  736|    160|  void grow(unsigned AtLeast) {
  737|    160|    unsigned OldNumBuckets = NumBuckets;
  738|    160|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    160|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    160|    assert(Buckets);
  742|    160|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 160, False: 0]
  ------------------
  743|    160|      this->BaseT::initEmpty();
  744|    160|      return;
  745|    160|    }
  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|    160|  unsigned getNumTombstones() const {
  474|    160|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    160|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE16getNumTombstonesEv:
  779|    160|  unsigned getNumTombstones() const {
  780|    160|    return NumTombstones;
  781|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E19incrementNumEntriesEv:
  465|    160|  void incrementNumEntries() {
  466|    160|    setNumEntries(getNumEntries() + 1);
  467|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5eraseERKS5_:
  276|    160|  bool erase(const KeyT &Val) {
  277|    160|    BucketT *TheBucket;
  278|    160|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 0, False: 160]
  ------------------
  279|      0|      return false; // not in map.
  280|       |
  281|    160|    TheBucket->getSecond().~ValueT();
  282|    160|    TheBucket->getFirst() = getTombstoneKey();
  283|    160|    decrementNumEntries();
  284|    160|    incrementNumTombstones();
  285|    160|    return true;
  286|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E19decrementNumEntriesEv:
  469|    160|  void decrementNumEntries() {
  470|    160|    setNumEntries(getNumEntries() - 1);
  471|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E22incrementNumTombstonesEv:
  481|    160|  void incrementNumTombstones() {
  482|    160|    setNumTombstones(getNumTombstones() + 1);
  483|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5beginEv:
   76|    160|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|    160|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 160]
  ------------------
   80|      0|      return end();
   81|    160|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 160]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|    160|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5emptyEv:
   99|    160|  LLVM_NODISCARD bool empty() const {
  100|    160|    return getNumEntries() == 0;
  101|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E12makeIteratorEPSJ_SM_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|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEC2EPSI_SK_RKNS_14DebugEpochBaseEb:
 1140|    320|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|    320|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|    320|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 160, False: 160]
  ------------------
 1144|    160|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 160]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|    160|    AdvancePastEmptyBuckets();
 1149|    160|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|    320|  void AdvancePastEmptyBuckets() {
 1212|    320|    assert(Ptr <= End);
 1213|    320|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|    320|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|  10.4k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 10.2k, False: 160]
  |  Branch (1216:27): [True: 10.0k, False: 160]
  ------------------
 1217|  10.2k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 160]
  ------------------
 1218|  10.0k|      ++Ptr;
 1219|    320|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E3endEv:
   85|    160|  inline iterator end() {
   86|    160|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|    160|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEneERKSJ_:
 1190|    320|  bool operator!=(const NonConstIterator &RHS) const {
 1191|    320|    return !(*this == RHS);
 1192|    320|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEeqERKSJ_:
 1180|    320|  bool operator==(const NonConstIterator &RHS) const {
 1181|    320|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|    320|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|    320|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|    320|           "comparing incomparable iterators!");
 1185|    320|    return Ptr == RHS.Ptr;
 1186|    320|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEppEi:
 1205|    160|  DenseMapIterator operator++(int) {  // Postincrement
 1206|    160|    assert(isHandleInSync() && "invalid iterator access!");
 1207|    160|    DenseMapIterator tmp = *this; ++*this; return tmp;
 1208|    160|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEppEv:
 1194|    160|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|    160|    assert(isHandleInSync() && "invalid iterator access!");
 1196|    160|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 160]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|    160|    ++Ptr;
 1202|    160|    AdvancePastEmptyBuckets();
 1203|    160|    return *this;
 1204|    160|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEptEv:
 1166|    320|  pointer operator->() const {
 1167|    320|    assert(isHandleInSync() && "invalid iterator access!");
 1168|    320|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 320]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|    320|    return Ptr;
 1171|    320|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|    425|  bool allocateBuckets(unsigned Num) {
  796|    425|    NumBuckets = Num;
  797|    425|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 229]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    229|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    229|    return true;
  804|    425|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E9initEmptyEv:
  347|    229|  void initEmpty() {
  348|    229|    setNumEntries(0);
  349|    229|    setNumTombstones(0);
  350|       |
  351|    229|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    229|           "# initial buckets must be a power of two!");
  353|    229|    const KeyT EmptyKey = getEmptyKey();
  354|   406k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 406k, False: 229]
  ------------------
  355|   406k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    229|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13setNumEntriesEj:
  461|   251k|  void setNumEntries(unsigned Num) {
  462|   251k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   251k|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13setNumEntriesEj:
  775|   251k|  void setNumEntries(unsigned Num) {
  776|   251k|    NumEntries = Num;
  777|   251k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16setNumTombstonesEj:
  477|    229|  void setNumTombstones(unsigned Num) {
  478|    229|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    229|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16setNumTombstonesEj:
  783|    229|  void setNumTombstones(unsigned Num) {
  784|    229|    NumTombstones = Num;
  785|    229|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|  1.28M|  unsigned getNumBuckets() const {
  498|  1.28M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.28M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|  1.28M|  unsigned getNumBuckets() const {
  792|  1.28M|    return NumBuckets;
  793|  1.28M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11getEmptyKeyEv:
  426|   561k|  static const KeyT getEmptyKey() {
  427|   561k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   561k|                  "Must pass the derived type to this template!");
  429|   561k|    return KeyInfoT::getEmptyKey();
  430|   561k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  493|   724k|  BucketT *getBuckets() {
  494|   724k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   724k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE10getBucketsEv:
  787|  1.18M|  BucketT *getBuckets() const {
  788|  1.18M|    return Buckets;
  789|  1.18M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getBucketsEndEv:
  501|   723k|  BucketT *getBucketsEnd() {
  502|   723k|    return getBuckets() + getNumBuckets();
  503|   723k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionEjE8getFirstEv:
   47|  2.11M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|    425|  bool allocateBuckets(unsigned Num) {
  796|    425|    NumBuckets = Num;
  797|    425|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 229]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    229|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    229|    return true;
  804|    425|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E9initEmptyEv:
  347|    229|  void initEmpty() {
  348|    229|    setNumEntries(0);
  349|    229|    setNumTombstones(0);
  350|       |
  351|    229|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    229|           "# initial buckets must be a power of two!");
  353|    229|    const KeyT EmptyKey = getEmptyKey();
  354|   406k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 406k, False: 229]
  ------------------
  355|   406k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    229|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13setNumEntriesEj:
  461|   251k|  void setNumEntries(unsigned Num) {
  462|   251k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   251k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13setNumEntriesEj:
  775|   251k|  void setNumEntries(unsigned Num) {
  776|   251k|    NumEntries = Num;
  777|   251k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16setNumTombstonesEj:
  477|    229|  void setNumTombstones(unsigned Num) {
  478|    229|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    229|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16setNumTombstonesEj:
  783|    229|  void setNumTombstones(unsigned Num) {
  784|    229|    NumTombstones = Num;
  785|    229|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|  19.2M|  unsigned getNumBuckets() const {
  498|  19.2M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  19.2M|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|  19.2M|  unsigned getNumBuckets() const {
  792|  19.2M|    return NumBuckets;
  793|  19.2M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11getEmptyKeyEv:
  426|  5.05M|  static const KeyT getEmptyKey() {
  427|  5.05M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  5.05M|                  "Must pass the derived type to this template!");
  429|  5.05M|    return KeyInfoT::getEmptyKey();
  430|  5.05M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  493|  14.1M|  BucketT *getBuckets() {
  494|  14.1M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  14.1M|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE10getBucketsEv:
  787|  19.1M|  BucketT *getBuckets() const {
  788|  19.1M|    return Buckets;
  789|  19.1M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getBucketsEndEv:
  501|  14.1M|  BucketT *getBucketsEnd() {
  502|  14.1M|    return getBuckets() + getNumBuckets();
  503|  14.1M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEjE8getFirstEv:
   47|  2.11M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 103k, False: 196]
  ------------------
  729|   103k|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 103k]
  ------------------
  363|    196|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|   103k|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   103k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
  795|   103k|  bool allocateBuckets(unsigned Num) {
  796|   103k|    NumBuckets = Num;
  797|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 103k]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|   103k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   103k|    return true;
  804|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E9initEmptyEv:
  347|   103k|  void initEmpty() {
  348|   103k|    setNumEntries(0);
  349|   103k|    setNumTombstones(0);
  350|       |
  351|   103k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   103k|           "# initial buckets must be a power of two!");
  353|   103k|    const KeyT EmptyKey = getEmptyKey();
  354|  13.7M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 13.6M, False: 103k]
  ------------------
  355|  13.6M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13setNumEntriesEj:
  461|   457k|  void setNumEntries(unsigned Num) {
  462|   457k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   457k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13setNumEntriesEj:
  775|   457k|  void setNumEntries(unsigned Num) {
  776|   457k|    NumEntries = Num;
  777|   457k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16setNumTombstonesEj:
  477|   103k|  void setNumTombstones(unsigned Num) {
  478|   103k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   103k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16setNumTombstonesEj:
  783|   103k|  void setNumTombstones(unsigned Num) {
  784|   103k|    NumTombstones = Num;
  785|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|  10.4M|  unsigned getNumBuckets() const {
  498|  10.4M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  10.4M|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
  791|  10.4M|  unsigned getNumBuckets() const {
  792|  10.4M|    return NumBuckets;
  793|  10.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E11getEmptyKeyEv:
  426|  5.25M|  static const KeyT getEmptyKey() {
  427|  5.25M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  5.25M|                  "Must pass the derived type to this template!");
  429|  5.25M|    return KeyInfoT::getEmptyKey();
  430|  5.25M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10getBucketsEv:
  493|  5.11M|  BucketT *getBuckets() {
  494|  5.11M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  5.11M|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE10getBucketsEv:
  787|  9.95M|  BucketT *getBuckets() const {
  788|  9.95M|    return Buckets;
  789|  9.95M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getBucketsEndEv:
  501|  4.90M|  BucketT *getBucketsEnd() {
  502|  4.90M|    return getBuckets() + getNumBuckets();
  503|  4.90M|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE15allocateBucketsEj:
  795|    425|  bool allocateBuckets(unsigned Num) {
  796|    425|    NumBuckets = Num;
  797|    425|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 229]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    229|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    229|    return true;
  804|    425|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E9initEmptyEv:
  347|    229|  void initEmpty() {
  348|    229|    setNumEntries(0);
  349|    229|    setNumTombstones(0);
  350|       |
  351|    229|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    229|           "# initial buckets must be a power of two!");
  353|    229|    const KeyT EmptyKey = getEmptyKey();
  354|   406k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 406k, False: 229]
  ------------------
  355|   406k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    229|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13setNumEntriesEj:
  461|   251k|  void setNumEntries(unsigned Num) {
  462|   251k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   251k|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13setNumEntriesEj:
  775|   251k|  void setNumEntries(unsigned Num) {
  776|   251k|    NumEntries = Num;
  777|   251k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16setNumTombstonesEj:
  477|    229|  void setNumTombstones(unsigned Num) {
  478|    229|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    229|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16setNumTombstonesEj:
  783|    229|  void setNumTombstones(unsigned Num) {
  784|    229|    NumTombstones = Num;
  785|    229|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getNumBucketsEv:
  497|   976k|  unsigned getNumBuckets() const {
  498|   976k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   976k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumBucketsEv:
  791|   976k|  unsigned getNumBuckets() const {
  792|   976k|    return NumBuckets;
  793|   976k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E11getEmptyKeyEv:
  426|   561k|  static const KeyT getEmptyKey() {
  427|   561k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   561k|                  "Must pass the derived type to this template!");
  429|   561k|    return KeyInfoT::getEmptyKey();
  430|   561k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  493|   414k|  BucketT *getBuckets() {
  494|   414k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   414k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE10getBucketsEv:
  787|   872k|  BucketT *getBuckets() const {
  788|   872k|    return Buckets;
  789|   872k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getBucketsEndEv:
  501|   414k|  BucketT *getBucketsEnd() {
  502|   414k|    return getBuckets() + getNumBuckets();
  503|   414k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEEE8getFirstEv:
   47|  2.11M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEC2Ej:
  669|    392|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4initEj:
  726|    588|  void init(unsigned InitNumEntries) {
  727|    588|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    588|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 588]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    588|    } else {
  731|    588|      NumEntries = 0;
  732|    588|      NumTombstones = 0;
  733|    588|    }
  734|    588|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|    588|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    588|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 588, False: 0]
  ------------------
  363|    588|      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|    588|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE15allocateBucketsEj:
  795|    617|  bool allocateBuckets(unsigned Num) {
  796|    617|    NumBuckets = Num;
  797|    617|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 588, False: 29]
  ------------------
  798|    588|      Buckets = nullptr;
  799|    588|      return false;
  800|    588|    }
  801|       |
  802|     29|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     29|    return true;
  804|    617|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E9initEmptyEv:
  347|     29|  void initEmpty() {
  348|     29|    setNumEntries(0);
  349|     29|    setNumTombstones(0);
  350|       |
  351|     29|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     29|           "# initial buckets must be a power of two!");
  353|     29|    const KeyT EmptyKey = getEmptyKey();
  354|  1.88k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 1.85k, False: 29]
  ------------------
  355|  1.85k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     29|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13setNumEntriesEj:
  461|    130|  void setNumEntries(unsigned Num) {
  462|    130|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    130|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13setNumEntriesEj:
  775|    130|  void setNumEntries(unsigned Num) {
  776|    130|    NumEntries = Num;
  777|    130|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16setNumTombstonesEj:
  477|     29|  void setNumTombstones(unsigned Num) {
  478|     29|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     29|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16setNumTombstonesEj:
  783|     29|  void setNumTombstones(unsigned Num) {
  784|     29|    NumTombstones = Num;
  785|     29|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumBucketsEv:
  497|  1.09k|  unsigned getNumBuckets() const {
  498|  1.09k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.09k|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumBucketsEv:
  791|  1.09k|  unsigned getNumBuckets() const {
  792|  1.09k|    return NumBuckets;
  793|  1.09k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E11getEmptyKeyEv:
  426|    360|  static const KeyT getEmptyKey() {
  427|    360|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    360|                  "Must pass the derived type to this template!");
  429|    360|    return KeyInfoT::getEmptyKey();
  430|    360|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  493|    116|  BucketT *getBuckets() {
  494|    116|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    116|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE10getBucketsEv:
  787|    375|  BucketT *getBuckets() const {
  788|    375|    return Buckets;
  789|    375|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getBucketsEndEv:
  501|     58|  BucketT *getBucketsEnd() {
  502|     58|    return getBuckets() + getNumBuckets();
  503|     58|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes11InstructionENSt3__14pairIjjEEE8getFirstEv:
   47|  5.87k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
  795|    196|  bool allocateBuckets(unsigned Num) {
  796|    196|    NumBuckets = Num;
  797|    196|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 0]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|    196|  unsigned getNumBuckets() const {
  498|    196|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    196|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
  791|    196|  unsigned getNumBuckets() const {
  792|    196|    return NumBuckets;
  793|    196|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEEC2EOS7_:
  676|    392|  DenseMap(DenseMap &&other) : BaseT() {
  677|    392|    init(0);
  678|    392|    swap(other);
  679|    392|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE4swapERS7_:
  692|    588|  void swap(DenseMap& RHS) {
  693|    588|    this->incrementEpoch();
  694|    588|    RHS.incrementEpoch();
  695|    588|    std::swap(Buckets, RHS.Buckets);
  696|    588|    std::swap(NumEntries, RHS.NumEntries);
  697|    588|    std::swap(NumTombstones, RHS.NumTombstones);
  698|    588|    std::swap(NumBuckets, RHS.NumBuckets);
  699|    588|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E5countES5_:
  149|    115|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|    115|    const BucketT *TheBucket;
  151|    115|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 14, False: 101]
  ------------------
  152|    115|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPKSD_:
  582|    259|                       const BucketT *&FoundBucket) const {
  583|    259|    const BucketT *BucketsPtr = getBuckets();
  584|    259|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    259|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 58, False: 201]
  ------------------
  587|     58|      FoundBucket = nullptr;
  588|     58|      return false;
  589|     58|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    201|    const BucketT *FoundTombstone = nullptr;
  593|    201|    const KeyT EmptyKey = getEmptyKey();
  594|    201|    const KeyT TombstoneKey = getTombstoneKey();
  595|    201|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    201|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    201|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|    201|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    201|    unsigned ProbeAmt = 1;
  601|    215|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    215|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    215|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    215|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 28, False: 187]
  |  |  ------------------
  ------------------
  605|     28|        FoundBucket = ThisBucket;
  606|     28|        return true;
  607|     28|      }
  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|    187|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    187|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 173, False: 14]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    173|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 173]
  ------------------
  615|    173|        return false;
  616|    173|      }
  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|     14|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 14]
  ------------------
  621|     14|          !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|     14|      BucketNo += ProbeAmt++;
  627|     14|      BucketNo &= (NumBuckets-1);
  628|     14|    }
  629|    201|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  489|    259|  const BucketT *getBuckets() const {
  490|    259|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    259|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15getTombstoneKeyEv:
  432|    230|  static const KeyT getTombstoneKey() {
  433|    230|    return KeyInfoT::getTombstoneKey();
  434|    230|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E12getHashValueERKS5_:
  417|    201|  static unsigned getHashValue(const KeyT &Val) {
  418|    201|    return KeyInfoT::getHashValue(Val);
  419|    201|  }
_ZNK4llvh6detail12DenseMapPairIPKN6hermes11InstructionENSt3__14pairIjjEEE8getFirstEv:
   48|    416|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_EixERKS5_:
  303|    115|  ValueT &operator[](const KeyT &Key) {
  304|    115|    return FindAndConstruct(Key).second;
  305|    115|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16FindAndConstructERKS5_:
  295|    115|  value_type& FindAndConstruct(const KeyT &Key) {
  296|    115|    BucketT *TheBucket;
  297|    115|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 14, False: 101]
  ------------------
  298|     14|      return *TheBucket;
  299|       |
  300|    101|    return *InsertIntoBucket(TheBucket, Key);
  301|    115|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPSD_:
  632|    144|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    144|    const BucketT *ConstFoundBucket;
  634|    144|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    144|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    144|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    144|    return Result;
  638|    144|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16InsertIntoBucketIRKS5_JEEEPSD_SJ_OT_DpOT0_:
  519|    101|                            ValueArgs &&... Values) {
  520|    101|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    101|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    101|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    101|    return TheBucket;
  525|    101|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E20InsertIntoBucketImplIS5_EEPSD_RKS5_RKT_SH_:
  539|    101|                                BucketT *TheBucket) {
  540|    101|    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|    101|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    101|    unsigned NumBuckets = getNumBuckets();
  553|    101|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    101|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 29, False: 72]
  |  |  ------------------
  ------------------
  554|     29|      this->grow(NumBuckets * 2);
  555|     29|      LookupBucketFor(Lookup, TheBucket);
  556|     29|      NumBuckets = getNumBuckets();
  557|     72|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     72|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 72]
  |  |  ------------------
  ------------------
  558|     72|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    101|    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|    101|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    101|    const KeyT EmptyKey = getEmptyKey();
  570|    101|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 101]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    101|    return TheBucket;
  574|    101|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumEntriesEv:
  457|    398|  unsigned getNumEntries() const {
  458|    398|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    398|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumEntriesEv:
  771|    398|  unsigned getNumEntries() const {
  772|    398|    return NumEntries;
  773|    398|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4growEj:
  509|     29|  void grow(unsigned AtLeast) {
  510|     29|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     29|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4growEj:
  736|     29|  void grow(unsigned AtLeast) {
  737|     29|    unsigned OldNumBuckets = NumBuckets;
  738|     29|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     29|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     29|    assert(Buckets);
  742|     29|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 29, False: 0]
  ------------------
  743|     29|      this->BaseT::initEmpty();
  744|     29|      return;
  745|     29|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16getNumTombstonesEv:
  473|     72|  unsigned getNumTombstones() const {
  474|     72|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     72|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16getNumTombstonesEv:
  779|     72|  unsigned getNumTombstones() const {
  780|     72|    return NumTombstones;
  781|     72|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E19incrementNumEntriesEv:
  465|    101|  void incrementNumEntries() {
  466|    101|    setNumEntries(getNumEntries() + 1);
  467|    101|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes11InstructionENSt3__14pairIjjEEE9getSecondEv:
   49|    202|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEED2Ev:
  687|    392|  ~DenseMap() {
  688|    392|    this->destroyAll();
  689|    392|    operator delete(Buckets);
  690|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10destroyAllEv:
  334|    588|  void destroyAll() {
  335|    588|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 559, False: 29]
  ------------------
  336|    559|      return;
  337|       |
  338|     29|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.88k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.85k, False: 29]
  ------------------
  340|  1.85k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 101, False: 1.75k]
  ------------------
  341|  1.85k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 101, False: 0]
  ------------------
  342|    101|        P->getSecond().~ValueT();
  343|  1.85k|      P->getFirst().~KeyT();
  344|  1.85k|    }
  345|     29|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb1EEC2EPKSB_SE_RKNS_14DebugEpochBaseEb:
 1140|   414k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   414k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   414k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 414k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE15allocateBucketsEj:
  795|    392|  bool allocateBuckets(unsigned Num) {
  796|    392|    NumBuckets = Num;
  797|    392|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 196]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    196|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    196|    return true;
  804|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E9initEmptyEv:
  347|    196|  void initEmpty() {
  348|    196|    setNumEntries(0);
  349|    196|    setNumTombstones(0);
  350|       |
  351|    196|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    196|           "# initial buckets must be a power of two!");
  353|    196|    const KeyT EmptyKey = getEmptyKey();
  354|  12.7k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 12.5k, False: 196]
  ------------------
  355|  12.5k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13setNumEntriesEj:
  461|    588|  void setNumEntries(unsigned Num) {
  462|    588|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    588|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE13setNumEntriesEj:
  775|    588|  void setNumEntries(unsigned Num) {
  776|    588|    NumEntries = Num;
  777|    588|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16setNumTombstonesEj:
  477|    196|  void setNumTombstones(unsigned Num) {
  478|    196|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    196|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE16setNumTombstonesEj:
  783|    196|  void setNumTombstones(unsigned Num) {
  784|    196|    NumTombstones = Num;
  785|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13getNumBucketsEv:
  497|  4.11k|  unsigned getNumBuckets() const {
  498|  4.11k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  4.11k|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE13getNumBucketsEv:
  791|  4.11k|  unsigned getNumBuckets() const {
  792|  4.11k|    return NumBuckets;
  793|  4.11k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E11getEmptyKeyEv:
  426|  1.17k|  static const KeyT getEmptyKey() {
  427|  1.17k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  1.17k|                  "Must pass the derived type to this template!");
  429|  1.17k|    return KeyInfoT::getEmptyKey();
  430|  1.17k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E10getBucketsEv:
  493|  2.35k|  BucketT *getBuckets() {
  494|  2.35k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  2.35k|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE10getBucketsEv:
  787|  3.33k|  BucketT *getBuckets() const {
  788|  3.33k|    return Buckets;
  789|  3.33k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13getBucketsEndEv:
  501|  1.96k|  BucketT *getBucketsEnd() {
  502|  1.96k|    return getBuckets() + getNumBuckets();
  503|  1.96k|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataEE8getFirstEv:
   47|  38.8k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE15allocateBucketsEj:
  795|   104k|  bool allocateBuckets(unsigned Num) {
  796|   104k|    NumBuckets = Num;
  797|   104k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 889]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|    889|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    889|    return true;
  804|   104k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E9initEmptyEv:
  347|    889|  void initEmpty() {
  348|    889|    setNumEntries(0);
  349|    889|    setNumTombstones(0);
  350|       |
  351|    889|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    889|           "# initial buckets must be a power of two!");
  353|    889|    const KeyT EmptyKey = getEmptyKey();
  354|   124k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 124k, False: 889]
  ------------------
  355|   124k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    889|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13setNumEntriesEj:
  461|  71.8k|  void setNumEntries(unsigned Num) {
  462|  71.8k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  71.8k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13setNumEntriesEj:
  775|  71.8k|  void setNumEntries(unsigned Num) {
  776|  71.8k|    NumEntries = Num;
  777|  71.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16setNumTombstonesEj:
  477|  1.23k|  void setNumTombstones(unsigned Num) {
  478|  1.23k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  1.23k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16setNumTombstonesEj:
  783|  1.23k|  void setNumTombstones(unsigned Num) {
  784|  1.23k|    NumTombstones = Num;
  785|  1.23k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumBucketsEv:
  497|  3.47M|  unsigned getNumBuckets() const {
  498|  3.47M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  3.47M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumBucketsEv:
  791|  3.47M|  unsigned getNumBuckets() const {
  792|  3.47M|    return NumBuckets;
  793|  3.47M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E11getEmptyKeyEv:
  426|  3.36M|  static const KeyT getEmptyKey() {
  427|  3.36M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  3.36M|                  "Must pass the derived type to this template!");
  429|  3.36M|    return KeyInfoT::getEmptyKey();
  430|  3.36M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  493|  5.97k|  BucketT *getBuckets() {
  494|  5.97k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  5.97k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
  787|  3.33M|  BucketT *getBuckets() const {
  788|  3.33M|    return Buckets;
  789|  3.33M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getBucketsEndEv:
  501|  3.68k|  BucketT *getBucketsEnd() {
  502|  3.68k|    return getBuckets() + getNumBuckets();
  503|  3.68k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoEE8getFirstEv:
   47|   940k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|   206k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|   206k|  void init(unsigned InitNumEntries) {
  727|   206k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   206k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 206k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   206k|    } else {
  731|   206k|      NumEntries = 0;
  732|   206k|      NumTombstones = 0;
  733|   206k|    }
  734|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|   206k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   206k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 206k, False: 0]
  ------------------
  363|   206k|      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|   206k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|   208k|  bool allocateBuckets(unsigned Num) {
  796|   208k|    NumBuckets = Num;
  797|   208k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 206k, False: 2.01k]
  ------------------
  798|   206k|      Buckets = nullptr;
  799|   206k|      return false;
  800|   206k|    }
  801|       |
  802|  2.01k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|  2.01k|    return true;
  804|   208k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E9initEmptyEv:
  347|  2.01k|  void initEmpty() {
  348|  2.01k|    setNumEntries(0);
  349|  2.01k|    setNumTombstones(0);
  350|       |
  351|  2.01k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|  2.01k|           "# initial buckets must be a power of two!");
  353|  2.01k|    const KeyT EmptyKey = getEmptyKey();
  354|  11.5M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 11.5M, False: 2.01k]
  ------------------
  355|  11.5M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|  2.01k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13setNumEntriesEj:
  461|  7.20M|  void setNumEntries(unsigned Num) {
  462|  7.20M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  7.20M|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13setNumEntriesEj:
  775|  7.20M|  void setNumEntries(unsigned Num) {
  776|  7.20M|    NumEntries = Num;
  777|  7.20M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16setNumTombstonesEj:
  477|  2.01k|  void setNumTombstones(unsigned Num) {
  478|  2.01k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  2.01k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16setNumTombstonesEj:
  783|  2.01k|  void setNumTombstones(unsigned Num) {
  784|  2.01k|    NumTombstones = Num;
  785|  2.01k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|  87.0M|  unsigned getNumBuckets() const {
  498|  87.0M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  87.0M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|  87.0M|  unsigned getNumBuckets() const {
  792|  87.0M|    return NumBuckets;
  793|  87.0M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11getEmptyKeyEv:
  426|  30.8M|  static const KeyT getEmptyKey() {
  427|  30.8M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  30.8M|                  "Must pass the derived type to this template!");
  429|  30.8M|    return KeyInfoT::getEmptyKey();
  430|  30.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  493|  56.0M|  BucketT *getBuckets() {
  494|  56.0M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  56.0M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE10getBucketsEv:
  787|  83.9M|  BucketT *getBuckets() const {
  788|  83.9M|    return Buckets;
  789|  83.9M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getBucketsEndEv:
  501|  56.0M|  BucketT *getBucketsEnd() {
  502|  56.0M|    return getBuckets() + getNumBuckets();
  503|  56.0M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes11InstructionEjE8getFirstEv:
   47|  60.4M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE15allocateBucketsEj:
  795|   208k|  bool allocateBuckets(unsigned Num) {
  796|   208k|    NumBuckets = Num;
  797|   208k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 105k]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|   105k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   105k|    return true;
  804|   208k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E9initEmptyEv:
  347|   105k|  void initEmpty() {
  348|   105k|    setNumEntries(0);
  349|   105k|    setNumTombstones(0);
  350|       |
  351|   105k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   105k|           "# initial buckets must be a power of two!");
  353|   105k|    const KeyT EmptyKey = getEmptyKey();
  354|  40.6M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 40.5M, False: 105k]
  ------------------
  355|  40.5M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   105k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13setNumEntriesEj:
  461|  22.1M|  void setNumEntries(unsigned Num) {
  462|  22.1M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  22.1M|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13setNumEntriesEj:
  775|  22.1M|  void setNumEntries(unsigned Num) {
  776|  22.1M|    NumEntries = Num;
  777|  22.1M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16setNumTombstonesEj:
  477|   105k|  void setNumTombstones(unsigned Num) {
  478|   105k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   105k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16setNumTombstonesEj:
  783|   105k|  void setNumTombstones(unsigned Num) {
  784|   105k|    NumTombstones = Num;
  785|   105k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumBucketsEv:
  497|   138M|  unsigned getNumBuckets() const {
  498|   138M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   138M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumBucketsEv:
  791|   138M|  unsigned getNumBuckets() const {
  792|   138M|    return NumBuckets;
  793|   138M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E11getEmptyKeyEv:
  426|   138M|  static const KeyT getEmptyKey() {
  427|   138M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   138M|                  "Must pass the derived type to this template!");
  429|   138M|    return KeyInfoT::getEmptyKey();
  430|   138M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  493|   417k|  BucketT *getBuckets() {
  494|   417k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   417k|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE10getBucketsEv:
  787|   129M|  BucketT *getBuckets() const {
  788|   129M|    return Buckets;
  789|   129M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getBucketsEndEv:
  501|   208k|  BucketT *getBucketsEnd() {
  502|   208k|    return getBuckets() + getNumBuckets();
  503|   208k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueENS2_8RegisterEE8getFirstEv:
   47|   200M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 103k]
  ------------------
  336|      0|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  23.7M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 23.6M, False: 103k]
  ------------------
  340|  23.6M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 9.34M, False: 14.2M]
  ------------------
  341|  23.6M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 9.34M, False: 0]
  ------------------
  342|  9.34M|        P->getSecond().~ValueT();
  343|  23.6M|      P->getFirst().~KeyT();
  344|  23.6M|    }
  345|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15getTombstoneKeyEv:
  432|   128M|  static const KeyT getTombstoneKey() {
  433|   128M|    return KeyInfoT::getTombstoneKey();
  434|   128M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueENS2_8RegisterEE9getSecondEv:
   49|  56.9M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|   206k|  ~DenseMap() {
  688|   206k|    this->destroyAll();
  689|   206k|    operator delete(Buckets);
  690|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|   206k|  void destroyAll() {
  335|   206k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 206k, False: 350]
  ------------------
  336|   206k|      return;
  337|       |
  338|    350|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  5.76M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 5.76M, False: 350]
  ------------------
  340|  5.76M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 2.89M, False: 2.86M]
  ------------------
  341|  5.76M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 2.89M, False: 0]
  ------------------
  342|  2.89M|        P->getSecond().~ValueT();
  343|  5.76M|      P->getFirst().~KeyT();
  344|  5.76M|    }
  345|    350|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15getTombstoneKeyEv:
  432|  27.9M|  static const KeyT getTombstoneKey() {
  433|  27.9M|    return KeyInfoT::getTombstoneKey();
  434|  27.9M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes11InstructionEjE9getSecondEv:
   49|  18.7M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 102k, False: 350]
  ------------------
  336|   102k|      return;
  337|       |
  338|    350|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  73.5k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 73.2k, False: 350]
  ------------------
  340|  73.2k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 73.2k]
  ------------------
  341|  73.2k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  73.2k|      P->getFirst().~KeyT();
  344|  73.2k|    }
  345|    350|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15getTombstoneKeyEv:
  432|  3.32M|  static const KeyT getTombstoneKey() {
  433|  3.32M|    return KeyInfoT::getTombstoneKey();
  434|  3.32M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoEE9getSecondEv:
   49|   178k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|   207k|  bool allocateBuckets(unsigned Num) {
  796|   207k|    NumBuckets = Num;
  797|   207k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 104k]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|   104k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   104k|    return true;
  804|   207k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E9initEmptyEv:
  347|   104k|  void initEmpty() {
  348|   104k|    setNumEntries(0);
  349|   104k|    setNumTombstones(0);
  350|       |
  351|   104k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   104k|           "# initial buckets must be a power of two!");
  353|   104k|    const KeyT EmptyKey = getEmptyKey();
  354|  9.37M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 9.26M, False: 104k]
  ------------------
  355|  9.26M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   104k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13setNumEntriesEj:
  461|  1.94M|  void setNumEntries(unsigned Num) {
  462|  1.94M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.94M|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13setNumEntriesEj:
  775|  1.94M|  void setNumEntries(unsigned Num) {
  776|  1.94M|    NumEntries = Num;
  777|  1.94M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16setNumTombstonesEj:
  477|   104k|  void setNumTombstones(unsigned Num) {
  478|   104k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   104k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16setNumTombstonesEj:
  783|   104k|  void setNumTombstones(unsigned Num) {
  784|   104k|    NumTombstones = Num;
  785|   104k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|   127M|  unsigned getNumBuckets() const {
  498|   127M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   127M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|   127M|  unsigned getNumBuckets() const {
  792|   127M|    return NumBuckets;
  793|   127M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11getEmptyKeyEv:
  426|   126M|  static const KeyT getEmptyKey() {
  427|   126M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   126M|                  "Must pass the derived type to this template!");
  429|   126M|    return KeyInfoT::getEmptyKey();
  430|   126M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  493|   828k|  BucketT *getBuckets() {
  494|   828k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   828k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|   126M|  BucketT *getBuckets() const {
  788|   126M|    return Buckets;
  789|   126M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  501|   620k|  BucketT *getBucketsEnd() {
  502|   620k|    return getBuckets() + getNumBuckets();
  503|   620k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjS4_EEE8getFirstEv:
   47|  36.2M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEC2Ej:
  669|   206k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4initEj:
  726|   310k|  void init(unsigned InitNumEntries) {
  727|   310k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   310k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 310k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   310k|    } else {
  731|   310k|      NumEntries = 0;
  732|   310k|      NumTombstones = 0;
  733|   310k|    }
  734|   310k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E31getMinBucketToReserveForEntriesEj:
  360|   310k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   310k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 310k, False: 0]
  ------------------
  363|   310k|      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|   310k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE15allocateBucketsEj:
  795|   413k|  bool allocateBuckets(unsigned Num) {
  796|   413k|    NumBuckets = Num;
  797|   413k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 310k, False: 103k]
  ------------------
  798|   310k|      Buckets = nullptr;
  799|   310k|      return false;
  800|   310k|    }
  801|       |
  802|   103k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   103k|    return true;
  804|   413k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E9initEmptyEv:
  347|   103k|  void initEmpty() {
  348|   103k|    setNumEntries(0);
  349|   103k|    setNumTombstones(0);
  350|       |
  351|   103k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   103k|           "# initial buckets must be a power of two!");
  353|   103k|    const KeyT EmptyKey = getEmptyKey();
  354|  6.71M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 6.61M, False: 103k]
  ------------------
  355|  6.61M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13setNumEntriesEj:
  461|   206k|  void setNumEntries(unsigned Num) {
  462|   206k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   206k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13setNumEntriesEj:
  775|   206k|  void setNumEntries(unsigned Num) {
  776|   206k|    NumEntries = Num;
  777|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16setNumTombstonesEj:
  477|   103k|  void setNumTombstones(unsigned Num) {
  478|   103k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   103k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16setNumTombstonesEj:
  783|   103k|  void setNumTombstones(unsigned Num) {
  784|   103k|    NumTombstones = Num;
  785|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumBucketsEv:
  497|  1.98M|  unsigned getNumBuckets() const {
  498|  1.98M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.98M|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumBucketsEv:
  791|  1.98M|  unsigned getNumBuckets() const {
  792|  1.98M|    return NumBuckets;
  793|  1.98M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11getEmptyKeyEv:
  426|  1.15M|  static const KeyT getEmptyKey() {
  427|  1.15M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  1.15M|                  "Must pass the derived type to this template!");
  429|  1.15M|    return KeyInfoT::getEmptyKey();
  430|  1.15M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  493|   516k|  BucketT *getBuckets() {
  494|   516k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   516k|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
  787|  1.46M|  BucketT *getBuckets() const {
  788|  1.46M|    return Buckets;
  789|  1.46M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getBucketsEndEv:
  501|   310k|  BucketT *getBucketsEnd() {
  502|   310k|    return getBuckets() + getNumBuckets();
  503|   310k|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE15allocateBucketsEj:
  795|   103k|  bool allocateBuckets(unsigned Num) {
  796|   103k|    NumBuckets = Num;
  797|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 100]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|    100|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    100|    return true;
  804|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E9initEmptyEv:
  347|    100|  void initEmpty() {
  348|    100|    setNumEntries(0);
  349|    100|    setNumTombstones(0);
  350|       |
  351|    100|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    100|           "# initial buckets must be a power of two!");
  353|    100|    const KeyT EmptyKey = getEmptyKey();
  354|   142k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 142k, False: 100]
  ------------------
  355|   142k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    100|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13setNumEntriesEj:
  461|  93.7k|  void setNumEntries(unsigned Num) {
  462|  93.7k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  93.7k|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13setNumEntriesEj:
  775|  93.7k|  void setNumEntries(unsigned Num) {
  776|  93.7k|    NumEntries = Num;
  777|  93.7k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16setNumTombstonesEj:
  477|    100|  void setNumTombstones(unsigned Num) {
  478|    100|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    100|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16setNumTombstonesEj:
  783|    100|  void setNumTombstones(unsigned Num) {
  784|    100|    NumTombstones = Num;
  785|    100|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumBucketsEv:
  497|  19.4M|  unsigned getNumBuckets() const {
  498|  19.4M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  19.4M|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumBucketsEv:
  791|  19.4M|  unsigned getNumBuckets() const {
  792|  19.4M|    return NumBuckets;
  793|  19.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E11getEmptyKeyEv:
  426|  19.3M|  static const KeyT getEmptyKey() {
  427|  19.3M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  19.3M|                  "Must pass the derived type to this template!");
  429|  19.3M|    return KeyInfoT::getEmptyKey();
  430|  19.3M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  493|    308|  BucketT *getBuckets() {
  494|    308|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    308|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE10getBucketsEv:
  787|  19.3M|  BucketT *getBuckets() const {
  788|  19.3M|    return Buckets;
  789|  19.3M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getBucketsEndEv:
  501|    172|  BucketT *getBucketsEnd() {
  502|    172|    return getBuckets() + getNumBuckets();
  503|    172|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9CatchInstENS2_17CatchCoverageInfoEE8getFirstEv:
   47|   875k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|   103k|  bool allocateBuckets(unsigned Num) {
  796|   103k|    NumBuckets = Num;
  797|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 0]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|   103k|  unsigned getNumBuckets() const {
  498|   103k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   103k|  }
_ZNK4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|   103k|  unsigned getNumBuckets() const {
  792|   103k|    return NumBuckets;
  793|   103k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEC2Ej:
  669|   206k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE4initEj:
  726|   206k|  void init(unsigned InitNumEntries) {
  727|   206k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   206k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 206k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   206k|    } else {
  731|   206k|      NumEntries = 0;
  732|   206k|      NumTombstones = 0;
  733|   206k|    }
  734|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E31getMinBucketToReserveForEntriesEj:
  360|   206k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   206k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 206k, False: 0]
  ------------------
  363|   206k|      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|   206k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE15allocateBucketsEj:
  795|   253k|  bool allocateBuckets(unsigned Num) {
  796|   253k|    NumBuckets = Num;
  797|   253k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 206k, False: 46.6k]
  ------------------
  798|   206k|      Buckets = nullptr;
  799|   206k|      return false;
  800|   206k|    }
  801|       |
  802|  46.6k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|  46.6k|    return true;
  804|   253k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E9initEmptyEv:
  347|  46.6k|  void initEmpty() {
  348|  46.6k|    setNumEntries(0);
  349|  46.6k|    setNumTombstones(0);
  350|       |
  351|  46.6k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|  46.6k|           "# initial buckets must be a power of two!");
  353|  46.6k|    const KeyT EmptyKey = getEmptyKey();
  354|  3.03M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.99M, False: 46.6k]
  ------------------
  355|  2.99M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|  46.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13setNumEntriesEj:
  461|   101k|  void setNumEntries(unsigned Num) {
  462|   101k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   101k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE13setNumEntriesEj:
  775|   101k|  void setNumEntries(unsigned Num) {
  776|   101k|    NumEntries = Num;
  777|   101k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16setNumTombstonesEj:
  477|  46.6k|  void setNumTombstones(unsigned Num) {
  478|  46.6k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  46.6k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE16setNumTombstonesEj:
  783|  46.6k|  void setNumTombstones(unsigned Num) {
  784|  46.6k|    NumTombstones = Num;
  785|  46.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13getNumBucketsEv:
  497|  1.11M|  unsigned getNumBuckets() const {
  498|  1.11M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.11M|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE13getNumBucketsEv:
  791|  1.11M|  unsigned getNumBuckets() const {
  792|  1.11M|    return NumBuckets;
  793|  1.11M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E11getEmptyKeyEv:
  426|   719k|  static const KeyT getEmptyKey() {
  427|   719k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   719k|                  "Must pass the derived type to this template!");
  429|   719k|    return KeyInfoT::getEmptyKey();
  430|   719k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E10getBucketsEv:
  493|   186k|  BucketT *getBuckets() {
  494|   186k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   186k|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE10getBucketsEv:
  787|   808k|  BucketT *getBuckets() const {
  788|   808k|    return Buckets;
  789|   808k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13getBucketsEndEv:
  501|  93.2k|  BucketT *getBucketsEnd() {
  502|  93.2k|    return getBuckets() + getNumBuckets();
  503|  93.2k|  }
_ZN4llvh6detail12DenseMapPairIjhE8getFirstEv:
   47|  9.14M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1140|  14.6M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  14.6M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  14.6M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 14.6M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEED2Ev:
  687|   206k|  ~DenseMap() {
  688|   206k|    this->destroyAll();
  689|   206k|    operator delete(Buckets);
  690|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E10destroyAllEv:
  334|   206k|  void destroyAll() {
  335|   206k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 160k, False: 46.5k]
  ------------------
  336|   160k|      return;
  337|       |
  338|  46.5k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  3.03M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 2.98M, False: 46.5k]
  ------------------
  340|  2.98M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 51.1k, False: 2.93M]
  ------------------
  341|  2.98M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 51.1k, False: 0]
  ------------------
  342|  51.1k|        P->getSecond().~ValueT();
  343|  2.98M|      P->getFirst().~KeyT();
  344|  2.98M|    }
  345|  46.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E15getTombstoneKeyEv:
  432|   621k|  static const KeyT getTombstoneKey() {
  433|   621k|    return KeyInfoT::getTombstoneKey();
  434|   621k|  }
_ZN4llvh6detail12DenseMapPairIjhE9getSecondEv:
   49|   112k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 103k, False: 0]
  ------------------
  336|   103k|      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|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 103k, False: 18]
  ------------------
  336|   103k|      return;
  337|       |
  338|     18|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  72.0k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 72.0k, False: 18]
  ------------------
  340|  72.0k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 40.6k, False: 31.3k]
  ------------------
  341|  72.0k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 40.6k, False: 0]
  ------------------
  342|  40.6k|        P->getSecond().~ValueT();
  343|  72.0k|      P->getFirst().~KeyT();
  344|  72.0k|    }
  345|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15getTombstoneKeyEv:
  432|  19.3M|  static const KeyT getTombstoneKey() {
  433|  19.3M|    return KeyInfoT::getTombstoneKey();
  434|  19.3M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9CatchInstENS2_17CatchCoverageInfoEE9getSecondEv:
   49|   240k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEED2Ev:
  687|   206k|  ~DenseMap() {
  688|   206k|    this->destroyAll();
  689|   206k|    operator delete(Buckets);
  690|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10destroyAllEv:
  334|   310k|  void destroyAll() {
  335|   310k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 206k, False: 103k]
  ------------------
  336|   206k|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  6.71M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 6.61M, False: 103k]
  ------------------
  340|  6.61M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 6.51M]
  ------------------
  341|  6.61M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|  6.61M|      P->getFirst().~KeyT();
  344|  6.61M|    }
  345|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15getTombstoneKeyEv:
  432|   947k|  static const KeyT getTombstoneKey() {
  433|   947k|    return KeyInfoT::getTombstoneKey();
  434|   947k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 103k]
  ------------------
  336|      0|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  8.04M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 7.94M, False: 103k]
  ------------------
  340|  7.94M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 843k, False: 7.09M]
  ------------------
  341|  7.94M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 843k, False: 0]
  ------------------
  342|   843k|        P->getSecond().~ValueT();
  343|  7.94M|      P->getFirst().~KeyT();
  344|  7.94M|    }
  345|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15getTombstoneKeyEv:
  432|   125M|  static const KeyT getTombstoneKey() {
  433|   125M|    return KeyInfoT::getTombstoneKey();
  434|   125M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjS4_EEE9getSecondEv:
   49|  4.67M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 103k]
  ------------------
  336|      0|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  6.71M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 6.61M, False: 103k]
  ------------------
  340|  6.61M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 6.51M]
  ------------------
  341|  6.61M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|  6.61M|      P->getFirst().~KeyT();
  344|  6.61M|    }
  345|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumBucketsEv:
  497|  17.6M|  unsigned getNumBuckets() const {
  498|  17.6M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  17.6M|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumBucketsEv:
  791|  17.6M|  unsigned getNumBuckets() const {
  792|  17.6M|    return NumBuckets;
  793|  17.6M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E11getEmptyKeyEv:
  426|  4.59M|  static const KeyT getEmptyKey() {
  427|  4.59M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  4.59M|                  "Must pass the derived type to this template!");
  429|  4.59M|    return KeyInfoT::getEmptyKey();
  430|  4.59M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15getTombstoneKeyEv:
  432|  4.38M|  static const KeyT getTombstoneKey() {
  433|  4.38M|    return KeyInfoT::getTombstoneKey();
  434|  4.38M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  493|  12.9M|  BucketT *getBuckets() {
  494|  12.9M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  12.9M|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
  787|  17.3M|  BucketT *getBuckets() const {
  788|  17.3M|    return Buckets;
  789|  17.3M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getBucketsEndEv:
  501|  12.7M|  BucketT *getBucketsEnd() {
  502|  12.7M|    return getBuckets() + getNumBuckets();
  503|  12.7M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstEE8getFirstEv:
   47|  20.1M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstEE9getSecondEv:
   49|   206k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 196]
  ------------------
  336|      0|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  12.7k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 12.5k, False: 196]
  ------------------
  340|  12.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 392, False: 12.1k]
  ------------------
  341|  12.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 392, False: 0]
  ------------------
  342|    392|        P->getSecond().~ValueT();
  343|  12.5k|      P->getFirst().~KeyT();
  344|  12.5k|    }
  345|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E15getTombstoneKeyEv:
  432|    588|  static const KeyT getTombstoneKey() {
  433|    588|    return KeyInfoT::getTombstoneKey();
  434|    588|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataEE9getSecondEv:
   49|    784|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 196, False: 0]
  ------------------
  336|    196|      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|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 178, False: 18]
  ------------------
  336|    178|      return;
  337|       |
  338|     18|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.17k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.15k, False: 18]
  ------------------
  340|  1.15k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 48, False: 1.10k]
  ------------------
  341|  1.15k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 48, False: 0]
  ------------------
  342|     48|        P->getSecond().~ValueT();
  343|  1.15k|      P->getFirst().~KeyT();
  344|  1.15k|    }
  345|     18|  }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 191, False: 5]
  ------------------
  336|    191|      return;
  337|       |
  338|      5|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    325|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 320, False: 5]
  ------------------
  340|    320|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 5, False: 315]
  ------------------
  341|    320|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 5, False: 0]
  ------------------
  342|      5|        P->getSecond().~ValueT();
  343|    320|      P->getFirst().~KeyT();
  344|    320|    }
  345|      5|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 196]
  ------------------
  336|      0|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   209k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 209k, False: 196]
  ------------------
  340|   209k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 105k]
  ------------------
  341|   209k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|   209k|      P->getFirst().~KeyT();
  344|   209k|    }
  345|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15getTombstoneKeyEv:
  432|   457k|  static const KeyT getTombstoneKey() {
  433|   457k|    return KeyInfoT::getTombstoneKey();
  434|   457k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEEE9getSecondEv:
   49|   649k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 103k]
  ------------------
  336|      0|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  13.5M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 13.4M, False: 103k]
  ------------------
  340|  13.4M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 13.3M]
  ------------------
  341|  13.4M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|  13.4M|      P->getFirst().~KeyT();
  344|  13.4M|    }
  345|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15getTombstoneKeyEv:
  432|  4.94M|  static const KeyT getTombstoneKey() {
  433|  4.94M|    return KeyInfoT::getTombstoneKey();
  434|  4.94M|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 196]
  ------------------
  336|      0|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   209k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 209k, False: 196]
  ------------------
  340|   209k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 106k]
  ------------------
  341|   209k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|   209k|      P->getFirst().~KeyT();
  344|   209k|    }
  345|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15getTombstoneKeyEv:
  432|  4.94M|  static const KeyT getTombstoneKey() {
  433|  4.94M|    return KeyInfoT::getTombstoneKey();
  434|  4.94M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEjE9getSecondEv:
   49|   649k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 196]
  ------------------
  336|      0|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   209k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 209k, False: 196]
  ------------------
  340|   209k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 103k, False: 105k]
  ------------------
  341|   209k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 103k, False: 0]
  ------------------
  342|   103k|        P->getSecond().~ValueT();
  343|   209k|      P->getFirst().~KeyT();
  344|   209k|    }
  345|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15getTombstoneKeyEv:
  432|   457k|  static const KeyT getTombstoneKey() {
  433|   457k|    return KeyInfoT::getTombstoneKey();
  434|   457k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionEjE9getSecondEv:
   49|   649k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S3_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S3_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEEES2_S4_S6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S3_EEE15allocateBucketsEj:
  795|    196|  bool allocateBuckets(unsigned Num) {
  796|    196|    NumBuckets = Num;
  797|    196|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 0]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEEES2_S4_S6_S9_E13getNumBucketsEv:
  497|    196|  unsigned getNumBuckets() const {
  498|    196|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    196|  }
_ZNK4llvh8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S3_EEE13getNumBucketsEv:
  791|    196|  unsigned getNumBuckets() const {
  792|    196|    return NumBuckets;
  793|    196|  }
_ZN4llvh8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S3_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefENS_11SmallVectorIcLj32EEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEEES2_S4_S6_S9_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 196, False: 0]
  ------------------
  336|    196|      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|  }
_ZN4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEEC2Ej:
  837|    196|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|    196|    init(NumInitBuckets);
  839|    196|  }
_ZN4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE4initEj:
  959|    196|  void init(unsigned InitBuckets) {
  960|    196|    Small = true;
  961|    196|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 196]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|    196|    this->BaseT::initEmpty();
  966|    196|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E9initEmptyEv:
  347|    196|  void initEmpty() {
  348|    196|    setNumEntries(0);
  349|    196|    setNumTombstones(0);
  350|       |
  351|    196|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    196|           "# initial buckets must be a power of two!");
  353|    196|    const KeyT EmptyKey = getEmptyKey();
  354|    980|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 784, False: 196]
  ------------------
  355|    784|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    196|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E13setNumEntriesEj:
  461|    392|  void setNumEntries(unsigned Num) {
  462|    392|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    392|  }
_ZN4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE13setNumEntriesEj:
 1046|    392|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|    392|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|    392|    NumEntries = Num;
 1050|    392|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E16setNumTombstonesEj:
  477|    196|  void setNumTombstones(unsigned Num) {
  478|    196|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    196|  }
_ZN4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE16setNumTombstonesEj:
 1056|    196|  void setNumTombstones(unsigned Num) {
 1057|    196|    NumTombstones = Num;
 1058|    196|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E13getNumBucketsEv:
  497|   415k|  unsigned getNumBuckets() const {
  498|   415k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   415k|  }
_ZNK4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE13getNumBucketsEv:
 1093|   415k|  unsigned getNumBuckets() const {
 1094|   415k|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 415k, False: 0]
  ------------------
 1095|   415k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E11getEmptyKeyEv:
  426|   104k|  static const KeyT getEmptyKey() {
  427|   104k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   104k|                  "Must pass the derived type to this template!");
  429|   104k|    return KeyInfoT::getEmptyKey();
  430|   104k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E10getBucketsEv:
  493|   311k|  BucketT *getBuckets() {
  494|   311k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   311k|  }
_ZN4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE10getBucketsEv:
 1088|   311k|  BucketT *getBuckets() {
 1089|   311k|    return const_cast<BucketT *>(
 1090|   311k|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|   311k|  }
_ZNK4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE10getBucketsEv:
 1084|   414k|  const BucketT *getBuckets() const {
 1085|   414k|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 414k, False: 0]
  ------------------
 1086|   414k|  }
_ZNK4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE16getInlineBucketsEv:
 1060|   414k|  const BucketT *getInlineBuckets() const {
 1061|   414k|    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|   414k|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|   414k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E13getBucketsEndEv:
  501|   310k|  BucketT *getBucketsEnd() {
  502|   310k|    return getBuckets() + getNumBuckets();
  503|   310k|  }
_ZN4llvh6detail12DenseMapPairIjN6hermes3hbc18FileAndSourceMapIdEE8getFirstEv:
   47|  2.94k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEED2Ev:
  857|    196|  ~SmallDenseMap() {
  858|    196|    this->destroyAll();
  859|    196|    deallocateBuckets();
  860|    196|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 196]
  ------------------
  336|      0|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    980|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 784, False: 196]
  ------------------
  340|    784|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 196, False: 588]
  ------------------
  341|    784|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 196, False: 0]
  ------------------
  342|    196|        P->getSecond().~ValueT();
  343|    784|      P->getFirst().~KeyT();
  344|    784|    }
  345|    196|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E15getTombstoneKeyEv:
  432|   103k|  static const KeyT getTombstoneKey() {
  433|   103k|    return KeyInfoT::getTombstoneKey();
  434|   103k|  }
_ZN4llvh6detail12DenseMapPairIjN6hermes3hbc18FileAndSourceMapIdEE9getSecondEv:
   49|    392|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE17deallocateBucketsEv:
 1097|    196|  void deallocateBuckets() {
 1098|    196|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 196, False: 0]
  ------------------
 1099|    196|      return;
 1100|       |
 1101|      0|    operator delete(getLargeRep()->Buckets);
 1102|      0|    getLargeRep()->~LargeRep();
 1103|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4findEPKS3_:
  160|  1.08M|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|  1.08M|    const BucketT *TheBucket;
  162|  1.08M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 493k, False: 588k]
  ------------------
  163|   493k|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|   588k|    return end();
  165|  1.08M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIPKS3_EEbRKT_RPKSG_:
  582|  1.08M|                       const BucketT *&FoundBucket) const {
  583|  1.08M|    const BucketT *BucketsPtr = getBuckets();
  584|  1.08M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.08M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 588k, False: 493k]
  ------------------
  587|   588k|      FoundBucket = nullptr;
  588|   588k|      return false;
  589|   588k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   493k|    const BucketT *FoundTombstone = nullptr;
  593|   493k|    const KeyT EmptyKey = getEmptyKey();
  594|   493k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   493k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   493k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   493k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   493k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   493k|    unsigned ProbeAmt = 1;
  601|  1.21M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  1.21M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  1.21M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  1.21M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 493k, False: 726k]
  |  |  ------------------
  ------------------
  605|   493k|        FoundBucket = ThisBucket;
  606|   493k|        return true;
  607|   493k|      }
  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|   726k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   726k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 726k]
  |  |  ------------------
  ------------------
  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|   726k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 726k]
  ------------------
  621|   726k|          !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|   726k|      BucketNo += ProbeAmt++;
  627|   726k|      BucketNo &= (NumBuckets-1);
  628|   726k|    }
  629|   493k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  489|  6.71M|  const BucketT *getBuckets() const {
  490|  6.71M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  6.71M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE10getBucketsEv:
  787|  6.71M|  BucketT *getBuckets() const {
  788|  6.71M|    return Buckets;
  789|  6.71M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getNumBucketsEv:
  497|  7.20M|  unsigned getNumBuckets() const {
  498|  7.20M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  7.20M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumBucketsEv:
  791|  7.20M|  unsigned getNumBuckets() const {
  792|  7.20M|    return NumBuckets;
  793|  7.20M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E11getEmptyKeyEv:
  426|  2.78M|  static const KeyT getEmptyKey() {
  427|  2.78M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  2.78M|                  "Must pass the derived type to this template!");
  429|  2.78M|    return KeyInfoT::getEmptyKey();
  430|  2.78M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15getTombstoneKeyEv:
  432|  2.28M|  static const KeyT getTombstoneKey() {
  433|  2.28M|    return KeyInfoT::getTombstoneKey();
  434|  2.28M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueIPKS3_EEjRKT_:
  422|   493k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   493k|    return KeyInfoT::getHashValue(Val);
  424|   493k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEEE8getFirstEv:
   48|  11.2M|  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|  2.16M|                                   const bool NoAdvance=false) const {
  450|  2.16M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 2.16M]
  ------------------
  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.16M|    return const_iterator(P, E, Epoch, NoAdvance);
  455|  2.16M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getBucketsEndEv:
  505|  3.83M|  const BucketT *getBucketsEnd() const {
  506|  3.83M|    return getBuckets() + getNumBuckets();
  507|  3.83M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E3endEv:
   95|  1.67M|  inline const_iterator end() const {
   96|  1.67M|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|  1.67M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEneERKSG_:
 1187|  1.08M|  bool operator!=(const ConstIterator &RHS) const {
 1188|  1.08M|    return !(*this == RHS);
 1189|  1.08M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEeqERKSG_:
 1173|  1.08M|  bool operator==(const ConstIterator &RHS) const {
 1174|  1.08M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|  1.08M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|  1.08M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|  1.08M|           "comparing incomparable iterators!");
 1178|  1.08M|    return Ptr == RHS.Ptr;
 1179|  1.08M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEptEv:
 1166|   493k|  pointer operator->() const {
 1167|   493k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   493k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 493k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   493k|    return Ptr;
 1171|   493k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E5clearEv:
  113|     13|  void clear() {
  114|     13|    incrementEpoch();
  115|     13|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 13, False: 0]
  |  Branch (115:33): [True: 13, 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|  1.79M|  unsigned getNumEntries() const {
  458|  1.79M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.79M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumEntriesEv:
  771|  1.79M|  unsigned getNumEntries() const {
  772|  1.79M|    return NumEntries;
  773|  1.79M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16getNumTombstonesEv:
  473|   492k|  unsigned getNumTombstones() const {
  474|   492k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   492k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16getNumTombstonesEv:
  779|   492k|  unsigned getNumTombstones() const {
  780|   492k|    return NumTombstones;
  781|   492k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10destroyAllEv:
  334|     13|  void destroyAll() {
  335|     13|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 13]
  ------------------
  336|      0|      return;
  337|       |
  338|     13|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.08M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.08M, False: 13]
  ------------------
  340|  1.08M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 492k, False: 588k]
  ------------------
  341|  1.08M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 492k, False: 0]
  ------------------
  342|   492k|        P->getSecond().~ValueT();
  343|  1.08M|      P->getFirst().~KeyT();
  344|  1.08M|    }
  345|     13|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E9initEmptyEv:
  347|    146|  void initEmpty() {
  348|    146|    setNumEntries(0);
  349|    146|    setNumTombstones(0);
  350|       |
  351|    146|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    146|           "# initial buckets must be a power of two!");
  353|    146|    const KeyT EmptyKey = getEmptyKey();
  354|  2.16M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.16M, False: 146]
  ------------------
  355|  2.16M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    146|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4initEj:
  726|     13|  void init(unsigned InitNumEntries) {
  727|     13|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     13|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 13]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     13|    } else {
  731|     13|      NumEntries = 0;
  732|     13|      NumTombstones = 0;
  733|     13|    }
  734|     13|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E31getMinBucketToReserveForEntriesEj:
  360|     13|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     13|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 13, False: 0]
  ------------------
  363|     13|      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|     13|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE15allocateBucketsEj:
  795|    159|  bool allocateBuckets(unsigned Num) {
  796|    159|    NumBuckets = Num;
  797|    159|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 13, False: 146]
  ------------------
  798|     13|      Buckets = nullptr;
  799|     13|      return false;
  800|     13|    }
  801|       |
  802|    146|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    146|    return true;
  804|    159|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  493|    318|  BucketT *getBuckets() {
  494|    318|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    318|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getBucketsEndEv:
  501|    159|  BucketT *getBucketsEnd() {
  502|    159|    return getBuckets() + getNumBuckets();
  503|    159|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEEE8getFirstEv:
   47|  11.2M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEEE9getSecondEv:
   49|  3.41M|  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|  1.30M|  void setNumEntries(unsigned Num) {
  462|  1.30M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.30M|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13setNumEntriesEj:
  775|  1.30M|  void setNumEntries(unsigned Num) {
  776|  1.30M|    NumEntries = Num;
  777|  1.30M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16setNumTombstonesEj:
  477|    146|  void setNumTombstones(unsigned Num) {
  478|    146|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    146|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16setNumTombstonesEj:
  783|    146|  void setNumTombstones(unsigned Num) {
  784|    146|    NumTombstones = Num;
  785|    146|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E4findERKj:
  154|   103k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   103k|    BucketT *TheBucket;
  156|   103k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 103k, False: 196]
  ------------------
  157|   103k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|    196|    return end();
  159|   103k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E15LookupBucketForIjEEbRKT_RPS9_:
  632|   103k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   103k|    const BucketT *ConstFoundBucket;
  634|   103k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   103k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   103k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   103k|    return Result;
  638|   103k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E15LookupBucketForIjEEbRKT_RPKS9_:
  582|   103k|                       const BucketT *&FoundBucket) const {
  583|   103k|    const BucketT *BucketsPtr = getBuckets();
  584|   103k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 103k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   103k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   103k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 392]
  |  |  ------------------
  ------------------
  605|   103k|        FoundBucket = ThisBucket;
  606|   103k|        return true;
  607|   103k|      }
  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|    392|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    392|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 392, 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|    392|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 392]
  ------------------
  615|    392|        return false;
  616|    392|      }
  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|   103k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E10getBucketsEv:
  489|   103k|  const BucketT *getBuckets() const {
  490|   103k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   103k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E12getHashValueERKj:
  417|   103k|  static unsigned getHashValue(const KeyT &Val) {
  418|   103k|    return KeyInfoT::getHashValue(Val);
  419|   103k|  }
_ZNK4llvh6detail12DenseMapPairIjN6hermes3hbc18FileAndSourceMapIdEE8getFirstEv:
   48|   103k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|   206k|                        bool NoAdvance=false) {
  440|   206k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 206k]
  ------------------
  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|   206k|    return iterator(P, E, Epoch, NoAdvance);
  445|   206k|  }
_ZN4llvh16DenseMapIteratorIjN6hermes3hbc18FileAndSourceMapIdENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1140|   206k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   206k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   206k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 206k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes3hbc18FileAndSourceMapIdENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EELb0EEneERKS9_:
 1190|   103k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   103k|    return !(*this == RHS);
 1192|   103k|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes3hbc18FileAndSourceMapIdENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EELb0EEeqERKS9_:
 1180|   103k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   103k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   103k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   103k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   103k|           "comparing incomparable iterators!");
 1185|   103k|    return Ptr == RHS.Ptr;
 1186|   103k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E3endEv:
   85|   103k|  inline iterator end() {
   86|   103k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   103k|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes3hbc18FileAndSourceMapIdENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EELb0EEdeEv:
 1160|   103k|  reference operator*() const {
 1161|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1162|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 103k]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|   103k|    return *Ptr;
 1165|   103k|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes3hbc18FileAndSourceMapIdENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EELb0EEptEv:
 1166|   103k|  pointer operator->() const {
 1167|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 103k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   103k|    return Ptr;
 1171|   103k|  }
_ZN4llvh16DenseMapIteratorIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EELb1EEC2EPKSC_SF_RKNS_14DebugEpochBaseEb:
 1140|    784|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|    784|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|    784|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 784, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E11try_emplaceIJS4_EEENSt3__14pairINS_16DenseMapIteratorIjS4_S6_S9_Lb0EEEbEERKjDpOT_:
  233|    196|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|    196|    BucketT *TheBucket;
  235|    196|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 196]
  ------------------
  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|    196|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|    196|    return std::make_pair(
  243|    196|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|    196|             true);
  245|    196|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E16InsertIntoBucketIRKjJS4_EEEPS9_SF_OT_DpOT0_:
  519|    196|                            ValueArgs &&... Values) {
  520|    196|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    196|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    196|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    196|    return TheBucket;
  525|    196|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E20InsertIntoBucketImplIjEEPS9_RKjRKT_SD_:
  539|    196|                                BucketT *TheBucket) {
  540|    196|    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|    196|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    196|    unsigned NumBuckets = getNumBuckets();
  553|    196|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    196|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 196]
  |  |  ------------------
  ------------------
  554|      0|      this->grow(NumBuckets * 2);
  555|      0|      LookupBucketFor(Lookup, TheBucket);
  556|      0|      NumBuckets = getNumBuckets();
  557|    196|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    196|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 196]
  |  |  ------------------
  ------------------
  558|    196|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    196|    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|    196|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    196|    const KeyT EmptyKey = getEmptyKey();
  570|    196|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 196]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    196|    return TheBucket;
  574|    196|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E13getNumEntriesEv:
  457|    392|  unsigned getNumEntries() const {
  458|    392|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    392|  }
_ZNK4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE13getNumEntriesEv:
 1042|    392|  unsigned getNumEntries() const {
 1043|    392|    return NumEntries;
 1044|    392|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E16getNumTombstonesEv:
  473|    196|  unsigned getNumTombstones() const {
  474|    196|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    196|  }
_ZNK4llvh13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEE16getNumTombstonesEv:
 1052|    196|  unsigned getNumTombstones() const {
 1053|    196|    return NumTombstones;
 1054|    196|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjN6hermes3hbc18FileAndSourceMapIdELj4ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEEjS4_S6_S9_E19incrementNumEntriesEv:
  465|    196|  void incrementNumEntries() {
  466|    196|    setNumEntries(getNumEntries() + 1);
  467|    196|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEC2Ej:
  837|   103k|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|   103k|    init(NumInitBuckets);
  839|   103k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4initEj:
  959|   103k|  void init(unsigned InitBuckets) {
  960|   103k|    Small = true;
  961|   103k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 103k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|   103k|    this->BaseT::initEmpty();
  966|   103k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE11getLargeRepEv:
 1079|  3.14k|  LargeRep *getLargeRep() {
 1080|  3.14k|    return const_cast<LargeRep *>(
 1081|  3.14k|      const_cast<const SmallDenseMap *>(this)->getLargeRep());
 1082|  3.14k|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE11getLargeRepEv:
 1073|  6.66M|  const LargeRep *getLargeRep() const {
 1074|  6.66M|    assert(!Small);
 1075|       |    // Note, same rule about aliasing as with getInlineBuckets.
 1076|  6.66M|    return reinterpret_cast<const LargeRep *>(storage.buffer);
 1077|  6.66M|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE15allocateBucketsEj:
 1105|  1.04k|  LargeRep allocateBuckets(unsigned Num) {
 1106|  1.04k|    assert(Num > InlineBuckets && "Must allocate more buckets than are inline");
 1107|  1.04k|    LargeRep Rep = {
 1108|  1.04k|      static_cast<BucketT*>(operator new(sizeof(BucketT) * Num)), Num
 1109|  1.04k|    };
 1110|  1.04k|    return Rep;
 1111|  1.04k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E9initEmptyEv:
  347|   104k|  void initEmpty() {
  348|   104k|    setNumEntries(0);
  349|   104k|    setNumTombstones(0);
  350|       |
  351|   104k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   104k|           "# initial buckets must be a power of two!");
  353|   104k|    const KeyT EmptyKey = getEmptyKey();
  354|  4.43M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 4.32M, False: 104k]
  ------------------
  355|  4.32M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   104k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13setNumEntriesEj:
  461|  1.84M|  void setNumEntries(unsigned Num) {
  462|  1.84M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.84M|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13setNumEntriesEj:
 1046|  1.84M|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|  1.84M|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|  1.84M|    NumEntries = Num;
 1050|  1.84M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16setNumTombstonesEj:
  477|   104k|  void setNumTombstones(unsigned Num) {
  478|   104k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   104k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16setNumTombstonesEj:
 1056|   104k|  void setNumTombstones(unsigned Num) {
 1057|   104k|    NumTombstones = Num;
 1058|   104k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumBucketsEv:
  497|  4.49M|  unsigned getNumBuckets() const {
  498|  4.49M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  4.49M|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumBucketsEv:
 1093|  4.49M|  unsigned getNumBuckets() const {
 1094|  4.49M|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 842k, False: 3.64M]
  ------------------
 1095|  4.49M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11getEmptyKeyEv:
  426|  3.43M|  static const KeyT getEmptyKey() {
  427|  3.43M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  3.43M|                  "Must pass the derived type to this template!");
  429|  3.43M|    return KeyInfoT::getEmptyKey();
  430|  3.43M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  493|  1.15M|  BucketT *getBuckets() {
  494|  1.15M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.15M|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
 1088|  1.15M|  BucketT *getBuckets() {
 1089|  1.15M|    return const_cast<BucketT *>(
 1090|  1.15M|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|  1.15M|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
 1084|  3.64M|  const BucketT *getBuckets() const {
 1085|  3.64M|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 632k, False: 3.01M]
  ------------------
 1086|  3.64M|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16getInlineBucketsEv:
 1060|   632k|  const BucketT *getInlineBuckets() const {
 1061|   632k|    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|   632k|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|   632k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getBucketsEndEv:
  501|   948k|  BucketT *getBucketsEnd() {
  502|   948k|    return getBuckets() + getNumBuckets();
  503|   948k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11try_emplaceIJRS7_EEENSt3__14pairINS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEEbEERKS5_DpOT_:
  233|   740k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|   740k|    BucketT *TheBucket;
  235|   740k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 740k]
  ------------------
  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|   740k|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|   740k|    return std::make_pair(
  243|   740k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|   740k|             true);
  245|   740k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPSB_:
  632|  1.74M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  1.74M|    const BucketT *ConstFoundBucket;
  634|  1.74M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  1.74M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  1.74M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  1.74M|    return Result;
  638|  1.74M|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPKSB_:
  582|  2.48M|                       const BucketT *&FoundBucket) const {
  583|  2.48M|    const BucketT *BucketsPtr = getBuckets();
  584|  2.48M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  2.48M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 2.48M]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  2.48M|    const BucketT *FoundTombstone = nullptr;
  593|  2.48M|    const KeyT EmptyKey = getEmptyKey();
  594|  2.48M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  2.48M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  2.48M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  2.48M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  2.48M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  2.48M|    unsigned ProbeAmt = 1;
  601|  4.91M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  4.91M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  4.91M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  4.91M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 15, False: 4.91M]
  |  |  ------------------
  ------------------
  605|     15|        FoundBucket = ThisBucket;
  606|     15|        return true;
  607|     15|      }
  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.91M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  4.91M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.48M, False: 2.42M]
  |  |  ------------------
  ------------------
  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.48M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 2.48M]
  ------------------
  615|  2.48M|        return false;
  616|  2.48M|      }
  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.42M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 2.42M]
  ------------------
  621|  2.42M|          !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.42M|      BucketNo += ProbeAmt++;
  627|  2.42M|      BucketNo &= (NumBuckets-1);
  628|  2.42M|    }
  629|  2.48M|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  489|  2.48M|  const BucketT *getBuckets() const {
  490|  2.48M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  2.48M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15getTombstoneKeyEv:
  432|  2.59M|  static const KeyT getTombstoneKey() {
  433|  2.59M|    return KeyInfoT::getTombstoneKey();
  434|  2.59M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12getHashValueERKS5_:
  417|  2.48M|  static unsigned getHashValue(const KeyT &Val) {
  418|  2.48M|    return KeyInfoT::getHashValue(Val);
  419|  2.48M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|   740k|                        bool NoAdvance=false) {
  440|   740k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 740k]
  ------------------
  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|   740k|    return iterator(P, E, Epoch, NoAdvance);
  445|   740k|  }
_ZN4llvh16DenseMapIteratorIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1140|   843k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   843k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   843k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 843k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16InsertIntoBucketIRKS5_JRS7_EEEPSB_SI_OT_DpOT0_:
  519|   740k|                            ValueArgs &&... Values) {
  520|   740k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   740k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   740k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   740k|    return TheBucket;
  525|   740k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E20InsertIntoBucketImplIS5_EEPSB_RKS5_RKT_SF_:
  539|   740k|                                BucketT *TheBucket) {
  540|   740k|    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|   740k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   740k|    unsigned NumBuckets = getNumBuckets();
  553|   740k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   740k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.04k, False: 739k]
  |  |  ------------------
  ------------------
  554|  1.04k|      this->grow(NumBuckets * 2);
  555|  1.04k|      LookupBucketFor(Lookup, TheBucket);
  556|  1.04k|      NumBuckets = getNumBuckets();
  557|   739k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   739k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 739k]
  |  |  ------------------
  ------------------
  558|   739k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   740k|    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|   740k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   740k|    const KeyT EmptyKey = getEmptyKey();
  570|   740k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 740k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   740k|    return TheBucket;
  574|   740k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumEntriesEv:
  457|  2.47M|  unsigned getNumEntries() const {
  458|  2.47M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  2.47M|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumEntriesEv:
 1042|  2.47M|  unsigned getNumEntries() const {
 1043|  2.47M|    return NumEntries;
 1044|  2.47M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E4growEj:
  509|  1.04k|  void grow(unsigned AtLeast) {
  510|  1.04k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|  1.04k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4growEj:
  968|  1.04k|  void grow(unsigned AtLeast) {
  969|  1.04k|    if (AtLeast >= InlineBuckets)
  ------------------
  |  Branch (969:9): [True: 1.04k, False: 0]
  ------------------
  970|  1.04k|      AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast-1));
  971|       |
  972|  1.04k|    if (Small) {
  ------------------
  |  Branch (972:9): [True: 330, False: 718]
  ------------------
  973|    330|      if (AtLeast < InlineBuckets)
  ------------------
  |  Branch (973:11): [True: 0, False: 330]
  ------------------
  974|      0|        return; // Nothing to do.
  975|       |
  976|       |      // First move the inline buckets into a temporary storage.
  977|    330|      AlignedCharArrayUnion<BucketT[InlineBuckets]> TmpStorage;
  978|    330|      BucketT *TmpBegin = reinterpret_cast<BucketT *>(TmpStorage.buffer);
  979|    330|      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|    330|      const KeyT EmptyKey = this->getEmptyKey();
  984|    330|      const KeyT TombstoneKey = this->getTombstoneKey();
  985|  5.61k|      for (BucketT *P = getBuckets(), *E = P + InlineBuckets; P != E; ++P) {
  ------------------
  |  Branch (985:63): [True: 5.28k, False: 330]
  ------------------
  986|  5.28k|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (986:13): [True: 3.63k, False: 1.65k]
  ------------------
  987|  5.28k|            !KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (987:13): [True: 3.63k, False: 0]
  ------------------
  988|  3.63k|          assert(size_t(TmpEnd - TmpBegin) < InlineBuckets &&
  989|  3.63k|                 "Too many inline buckets!");
  990|  3.63k|          ::new (&TmpEnd->getFirst()) KeyT(std::move(P->getFirst()));
  991|  3.63k|          ::new (&TmpEnd->getSecond()) ValueT(std::move(P->getSecond()));
  992|  3.63k|          ++TmpEnd;
  993|  3.63k|          P->getSecond().~ValueT();
  994|  3.63k|        }
  995|  5.28k|        P->getFirst().~KeyT();
  996|  5.28k|      }
  997|       |
  998|       |      // Now make this map use the large rep, and move all the entries back
  999|       |      // into it.
 1000|    330|      Small = false;
 1001|    330|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1002|    330|      this->moveFromOldBuckets(TmpBegin, TmpEnd);
 1003|    330|      return;
 1004|    330|    }
 1005|       |
 1006|    718|    LargeRep OldRep = std::move(*getLargeRep());
 1007|    718|    getLargeRep()->~LargeRep();
 1008|    718|    if (AtLeast <= InlineBuckets) {
  ------------------
  |  Branch (1008:9): [True: 0, False: 718]
  ------------------
 1009|      0|      Small = true;
 1010|    718|    } else {
 1011|    718|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1012|    718|    }
 1013|       |
 1014|    718|    this->moveFromOldBuckets(OldRep.Buckets, OldRep.Buckets+OldRep.NumBuckets);
 1015|       |
 1016|       |    // Free the old table.
 1017|    718|    operator delete(OldRep.Buckets);
 1018|    718|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E18moveFromOldBucketsEPSB_SE_:
  369|  1.04k|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|  1.04k|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|  1.04k|    const KeyT EmptyKey = getEmptyKey();
  374|  1.04k|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.33M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.33M, False: 1.04k]
  ------------------
  376|  1.33M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 998k, False: 332k]
  ------------------
  377|  1.33M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 998k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   998k|        BucketT *DestBucket;
  380|   998k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   998k|        (void)FoundVal; // silence warning.
  382|   998k|        assert(!FoundVal && "Key already in new map?");
  383|   998k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   998k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   998k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   998k|        B->getSecond().~ValueT();
  389|   998k|      }
  390|  1.33M|      B->getFirst().~KeyT();
  391|  1.33M|    }
  392|  1.04k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16getNumTombstonesEv:
  473|   739k|  unsigned getNumTombstones() const {
  474|   739k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   739k|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16getNumTombstonesEv:
 1052|   739k|  unsigned getNumTombstones() const {
 1053|   739k|    return NumTombstones;
 1054|   739k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E19incrementNumEntriesEv:
  465|  1.73M|  void incrementNumEntries() {
  466|  1.73M|    setNumEntries(getNumEntries() + 1);
  467|  1.73M|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E5countES5_:
  149|   749k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|   749k|    const BucketT *TheBucket;
  151|   749k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 15, False: 749k]
  ------------------
  152|   749k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEED2Ev:
  857|   103k|  ~SmallDenseMap() {
  858|   103k|    this->destroyAll();
  859|   103k|    deallocateBuckets();
  860|   103k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 103k]
  ------------------
  336|      0|      return;
  337|       |
  338|   103k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  3.10M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 2.99M, False: 103k]
  ------------------
  340|  2.99M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 740k, False: 2.25M]
  ------------------
  341|  2.99M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 740k, False: 0]
  ------------------
  342|   740k|        P->getSecond().~ValueT();
  343|  2.99M|      P->getFirst().~KeyT();
  344|  2.99M|    }
  345|   103k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE17deallocateBucketsEv:
 1097|   103k|  void deallocateBuckets() {
 1098|   103k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 103k, False: 330]
  ------------------
 1099|   103k|      return;
 1100|       |
 1101|    330|    operator delete(getLargeRep()->Buckets);
 1102|    330|    getLargeRep()->~LargeRep();
 1103|    330|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEaSEOSB_:
  707|   103k|  DenseMap& operator=(DenseMap &&other) {
  708|   103k|    this->destroyAll();
  709|   103k|    operator delete(Buckets);
  710|   103k|    init(0);
  711|   103k|    swap(other);
  712|   103k|    return *this;
  713|   103k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4swapERSB_:
  692|   103k|  void swap(DenseMap& RHS) {
  693|   103k|    this->incrementEpoch();
  694|   103k|    RHS.incrementEpoch();
  695|   103k|    std::swap(Buckets, RHS.Buckets);
  696|   103k|    std::swap(NumEntries, RHS.NumEntries);
  697|   103k|    std::swap(NumTombstones, RHS.NumTombstones);
  698|   103k|    std::swap(NumBuckets, RHS.NumBuckets);
  699|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11try_emplaceIJRS7_EEENSt3__14pairINS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEEbEERKS5_DpOT_:
  233|   103k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|   103k|    BucketT *TheBucket;
  235|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 103k]
  ------------------
  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|   103k|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|   103k|    return std::make_pair(
  243|   103k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|   103k|             true);
  245|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPSB_:
  632|   206k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   206k|    const BucketT *ConstFoundBucket;
  634|   206k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   206k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   206k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   206k|    return Result;
  638|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPKSB_:
  582|   947k|                       const BucketT *&FoundBucket) const {
  583|   947k|    const BucketT *BucketsPtr = getBuckets();
  584|   947k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   947k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 103k, False: 843k]
  ------------------
  587|   103k|      FoundBucket = nullptr;
  588|   103k|      return false;
  589|   103k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   843k|    const BucketT *FoundTombstone = nullptr;
  593|   843k|    const KeyT EmptyKey = getEmptyKey();
  594|   843k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   843k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   843k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   843k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   843k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   843k|    unsigned ProbeAmt = 1;
  601|   853k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   853k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   853k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   853k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 750k]
  |  |  ------------------
  ------------------
  605|   103k|        FoundBucket = ThisBucket;
  606|   103k|        return true;
  607|   103k|      }
  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|   750k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   750k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 740k, False: 9.89k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   740k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 740k]
  ------------------
  615|   740k|        return false;
  616|   740k|      }
  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|  9.89k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 9.89k]
  ------------------
  621|  9.89k|          !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|  9.89k|      BucketNo += ProbeAmt++;
  627|  9.89k|      BucketNo &= (NumBuckets-1);
  628|  9.89k|    }
  629|   843k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  489|   947k|  const BucketT *getBuckets() const {
  490|   947k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   947k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12getHashValueERKS5_:
  417|   843k|  static unsigned getHashValue(const KeyT &Val) {
  418|   843k|    return KeyInfoT::getHashValue(Val);
  419|   843k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|   103k|                        bool NoAdvance=false) {
  440|   103k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 103k]
  ------------------
  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|   103k|    return iterator(P, E, Epoch, NoAdvance);
  445|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16InsertIntoBucketIRKS5_JRS7_EEEPSB_SI_OT_DpOT0_:
  519|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E20InsertIntoBucketImplIS5_EEPSB_RKS5_RKT_SF_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 103k, False: 15]
  |  |  ------------------
  ------------------
  554|   103k|      this->grow(NumBuckets * 2);
  555|   103k|      LookupBucketFor(Lookup, TheBucket);
  556|   103k|      NumBuckets = getNumBuckets();
  557|   103k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     15|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15]
  |  |  ------------------
  ------------------
  558|     15|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumEntriesEv:
  457|   206k|  unsigned getNumEntries() const {
  458|   206k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   206k|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumEntriesEv:
  771|   206k|  unsigned getNumEntries() const {
  772|   206k|    return NumEntries;
  773|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E4growEj:
  509|   103k|  void grow(unsigned AtLeast) {
  510|   103k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   103k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4growEj:
  736|   103k|  void grow(unsigned AtLeast) {
  737|   103k|    unsigned OldNumBuckets = NumBuckets;
  738|   103k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   103k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   103k|    assert(Buckets);
  742|   103k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 103k, False: 0]
  ------------------
  743|   103k|      this->BaseT::initEmpty();
  744|   103k|      return;
  745|   103k|    }
  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|     15|  unsigned getNumTombstones() const {
  474|     15|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     15|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16getNumTombstonesEv:
  779|     15|  unsigned getNumTombstones() const {
  780|     15|    return NumTombstones;
  781|     15|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E19incrementNumEntriesEv:
  465|   103k|  void incrementNumEntries() {
  466|   103k|    setNumEntries(getNumEntries() + 1);
  467|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_EixEOS4_:
  315|   123M|  ValueT &operator[](KeyT &&Key) {
  316|   123M|    return FindAndConstruct(std::move(Key)).second;
  317|   123M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16FindAndConstructEOS4_:
  307|   123M|  value_type& FindAndConstruct(KeyT &&Key) {
  308|   123M|    BucketT *TheBucket;
  309|   123M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 123M, False: 103k]
  ------------------
  310|   123M|      return *TheBucket;
  311|       |
  312|   103k|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|   123M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPSC_:
  632|   125M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   125M|    const BucketT *ConstFoundBucket;
  634|   125M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   125M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   125M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   125M|    return Result;
  638|   125M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPKSC_:
  582|   125M|                       const BucketT *&FoundBucket) const {
  583|   125M|    const BucketT *BucketsPtr = getBuckets();
  584|   125M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   125M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 103k, False: 125M]
  ------------------
  587|   103k|      FoundBucket = nullptr;
  588|   103k|      return false;
  589|   103k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   125M|    const BucketT *FoundTombstone = nullptr;
  593|   125M|    const KeyT EmptyKey = getEmptyKey();
  594|   125M|    const KeyT TombstoneKey = getTombstoneKey();
  595|   125M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   125M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   125M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   125M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   125M|    unsigned ProbeAmt = 1;
  601|   177M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   177M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   177M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   177M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 123M, False: 53.7M]
  |  |  ------------------
  ------------------
  605|   123M|        FoundBucket = ThisBucket;
  606|   123M|        return true;
  607|   123M|      }
  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|  53.7M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  53.7M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.83M, False: 51.8M]
  |  |  ------------------
  ------------------
  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.83M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1.83M]
  ------------------
  615|  1.83M|        return false;
  616|  1.83M|      }
  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|  51.8M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 51.8M]
  ------------------
  621|  51.8M|          !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|  51.8M|      BucketNo += ProbeAmt++;
  627|  51.8M|      BucketNo &= (NumBuckets-1);
  628|  51.8M|    }
  629|   125M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|   125M|  const BucketT *getBuckets() const {
  490|   125M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   125M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueERKS4_:
  417|   125M|  static unsigned getHashValue(const KeyT &Val) {
  418|   125M|    return KeyInfoT::getHashValue(Val);
  419|   125M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjS4_EEE8getFirstEv:
   48|   283M|  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|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E20InsertIntoBucketImplIS4_EEPSC_RKS4_RKT_SG_:
  539|   843k|                                BucketT *TheBucket) {
  540|   843k|    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|   843k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   843k|    unsigned NumBuckets = getNumBuckets();
  553|   843k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   843k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 104k, False: 739k]
  |  |  ------------------
  ------------------
  554|   104k|      this->grow(NumBuckets * 2);
  555|   104k|      LookupBucketFor(Lookup, TheBucket);
  556|   104k|      NumBuckets = getNumBuckets();
  557|   739k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   739k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 739k]
  |  |  ------------------
  ------------------
  558|   739k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   843k|    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|   843k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   843k|    const KeyT EmptyKey = getEmptyKey();
  570|   843k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 843k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   843k|    return TheBucket;
  574|   843k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|  2.68M|  unsigned getNumEntries() const {
  458|  2.68M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  2.68M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|  2.68M|  unsigned getNumEntries() const {
  772|  2.68M|    return NumEntries;
  773|  2.68M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4growEj:
  509|   104k|  void grow(unsigned AtLeast) {
  510|   104k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   104k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4growEj:
  736|   104k|  void grow(unsigned AtLeast) {
  737|   104k|    unsigned OldNumBuckets = NumBuckets;
  738|   104k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   104k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   104k|    assert(Buckets);
  742|   104k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 103k, False: 721]
  ------------------
  743|   103k|      this->BaseT::initEmpty();
  744|   103k|      return;
  745|   103k|    }
  746|       |
  747|    721|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    721|    operator delete(OldBuckets);
  751|    721|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E18moveFromOldBucketsEPSC_SF_:
  369|    721|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    721|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    721|    const KeyT EmptyKey = getEmptyKey();
  374|    721|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.32M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.32M, False: 721]
  ------------------
  376|  1.32M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 995k, False: 332k]
  ------------------
  377|  1.32M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 995k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   995k|        BucketT *DestBucket;
  380|   995k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   995k|        (void)FoundVal; // silence warning.
  382|   995k|        assert(!FoundVal && "Key already in new map?");
  383|   995k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   995k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   995k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   995k|        B->getSecond().~ValueT();
  389|   995k|      }
  390|  1.32M|      B->getFirst().~KeyT();
  391|  1.32M|    }
  392|    721|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16getNumTombstonesEv:
  473|   739k|  unsigned getNumTombstones() const {
  474|   739k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   739k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16getNumTombstonesEv:
  779|   739k|  unsigned getNumTombstones() const {
  780|   739k|    return NumTombstones;
  781|   739k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19incrementNumEntriesEv:
  465|  1.83M|  void incrementNumEntries() {
  466|  1.83M|    setNumEntries(getNumEntries() + 1);
  467|  1.83M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_EixEOS4_:
  315|  8.49M|  ValueT &operator[](KeyT &&Key) {
  316|  8.49M|    return FindAndConstruct(std::move(Key)).second;
  317|  8.49M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16FindAndConstructEOS4_:
  307|  8.49M|  value_type& FindAndConstruct(KeyT &&Key) {
  308|  8.49M|    BucketT *TheBucket;
  309|  8.49M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 8.49M, False: 0]
  ------------------
  310|  8.49M|      return *TheBucket;
  311|       |
  312|      0|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|  8.49M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPSA_:
  632|  19.3M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  19.3M|    const BucketT *ConstFoundBucket;
  634|  19.3M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  19.3M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  19.3M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  19.3M|    return Result;
  638|  19.3M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPKSA_:
  582|  19.3M|                       const BucketT *&FoundBucket) const {
  583|  19.3M|    const BucketT *BucketsPtr = getBuckets();
  584|  19.3M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  19.3M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 18, False: 19.3M]
  ------------------
  587|     18|      FoundBucket = nullptr;
  588|     18|      return false;
  589|     18|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  19.3M|    const BucketT *FoundTombstone = nullptr;
  593|  19.3M|    const KeyT EmptyKey = getEmptyKey();
  594|  19.3M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  19.3M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  19.3M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  19.3M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  19.3M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  19.3M|    unsigned ProbeAmt = 1;
  601|  30.3M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  30.3M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  30.3M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  30.3M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 19.2M, False: 11.0M]
  |  |  ------------------
  ------------------
  605|  19.2M|        FoundBucket = ThisBucket;
  606|  19.2M|        return true;
  607|  19.2M|      }
  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|  11.0M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  11.0M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 93.7k, False: 10.9M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  93.7k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 93.7k]
  ------------------
  615|  93.7k|        return false;
  616|  93.7k|      }
  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|  10.9M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 10.9M]
  ------------------
  621|  10.9M|          !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|  10.9M|      BucketNo += ProbeAmt++;
  627|  10.9M|      BucketNo &= (NumBuckets-1);
  628|  10.9M|    }
  629|  19.3M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  489|  19.3M|  const BucketT *getBuckets() const {
  490|  19.3M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  19.3M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12getHashValueERKS4_:
  417|  19.3M|  static unsigned getHashValue(const KeyT &Val) {
  418|  19.3M|    return KeyInfoT::getHashValue(Val);
  419|  19.3M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes9CatchInstENS2_17CatchCoverageInfoEE8getFirstEv:
   48|  52.4M|  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|  40.6k|                                BucketT *TheBucket) {
  540|  40.6k|    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|  40.6k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  40.6k|    unsigned NumBuckets = getNumBuckets();
  553|  40.6k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  40.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 100, False: 40.5k]
  |  |  ------------------
  ------------------
  554|    100|      this->grow(NumBuckets * 2);
  555|    100|      LookupBucketFor(Lookup, TheBucket);
  556|    100|      NumBuckets = getNumBuckets();
  557|  40.5k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  40.5k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 40.5k]
  |  |  ------------------
  ------------------
  558|  40.5k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  40.6k|    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|  40.6k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  40.6k|    const KeyT EmptyKey = getEmptyKey();
  570|  40.6k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 40.6k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  40.6k|    return TheBucket;
  574|  40.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumEntriesEv:
  457|   237k|  unsigned getNumEntries() const {
  458|   237k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   237k|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumEntriesEv:
  771|   237k|  unsigned getNumEntries() const {
  772|   237k|    return NumEntries;
  773|   237k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E4growEj:
  509|    100|  void grow(unsigned AtLeast) {
  510|    100|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    100|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4growEj:
  736|    100|  void grow(unsigned AtLeast) {
  737|    100|    unsigned OldNumBuckets = NumBuckets;
  738|    100|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    100|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    100|    assert(Buckets);
  742|    100|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 18, False: 82]
  ------------------
  743|     18|      this->BaseT::initEmpty();
  744|     18|      return;
  745|     18|    }
  746|       |
  747|     82|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     82|    operator delete(OldBuckets);
  751|     82|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E18moveFromOldBucketsEPSA_SD_:
  369|     82|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     82|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     82|    const KeyT EmptyKey = getEmptyKey();
  374|     82|    const KeyT TombstoneKey = getTombstoneKey();
  375|  70.9k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 70.8k, False: 82]
  ------------------
  376|  70.8k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 53.0k, False: 17.7k]
  ------------------
  377|  70.8k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 53.0k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  53.0k|        BucketT *DestBucket;
  380|  53.0k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  53.0k|        (void)FoundVal; // silence warning.
  382|  53.0k|        assert(!FoundVal && "Key already in new map?");
  383|  53.0k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  53.0k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  53.0k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  53.0k|        B->getSecond().~ValueT();
  389|  53.0k|      }
  390|  70.8k|      B->getFirst().~KeyT();
  391|  70.8k|    }
  392|     82|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16getNumTombstonesEv:
  473|  40.5k|  unsigned getNumTombstones() const {
  474|  40.5k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  40.5k|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16getNumTombstonesEv:
  779|  40.5k|  unsigned getNumTombstones() const {
  780|  40.5k|    return NumTombstones;
  781|  40.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E19incrementNumEntriesEv:
  465|  93.6k|  void incrementNumEntries() {
  466|  93.6k|    setNumEntries(getNumEntries() + 1);
  467|  93.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|   103k|  unsigned getNumEntries() const {
  458|   103k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   103k|  }
_ZNK4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|   103k|  unsigned getNumEntries() const {
  772|   103k|    return NumEntries;
  773|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_EixERKS4_:
  303|  1.34M|  ValueT &operator[](const KeyT &Key) {
  304|  1.34M|    return FindAndConstruct(Key).second;
  305|  1.34M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16FindAndConstructERKS4_:
  295|  1.34M|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  1.34M|    BucketT *TheBucket;
  297|  1.34M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 604k, False: 740k]
  ------------------
  298|   604k|      return *TheBucket;
  299|       |
  300|   740k|    return *InsertIntoBucket(TheBucket, Key);
  301|  1.34M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16InsertIntoBucketIRKS4_JEEEPSC_SI_OT_DpOT0_:
  519|   740k|                            ValueArgs &&... Values) {
  520|   740k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   740k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   740k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   740k|    return TheBucket;
  525|   740k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E5emptyEv:
   99|   103k|  LLVM_NODISCARD bool empty() const {
  100|   103k|    return getNumEntries() == 0;
  101|   103k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|     18|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|     18|  void init(unsigned InitNumEntries) {
  727|     18|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     18|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 18]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     18|    } else {
  731|     18|      NumEntries = 0;
  732|     18|      NumTombstones = 0;
  733|     18|    }
  734|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|     18|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     18|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 18, False: 0]
  ------------------
  363|     18|      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|     18|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|    215|  bool allocateBuckets(unsigned Num) {
  796|    215|    NumBuckets = Num;
  797|    215|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 18, False: 197]
  ------------------
  798|     18|      Buckets = nullptr;
  799|     18|      return false;
  800|     18|    }
  801|       |
  802|    197|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    197|    return true;
  804|    215|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E9initEmptyEv:
  347|    197|  void initEmpty() {
  348|    197|    setNumEntries(0);
  349|    197|    setNumTombstones(0);
  350|       |
  351|    197|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    197|           "# initial buckets must be a power of two!");
  353|    197|    const KeyT EmptyKey = getEmptyKey();
  354|  2.55M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.55M, False: 197]
  ------------------
  355|  2.55M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    197|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13setNumEntriesEj:
  461|  1.56M|  void setNumEntries(unsigned Num) {
  462|  1.56M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.56M|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13setNumEntriesEj:
  775|  1.56M|  void setNumEntries(unsigned Num) {
  776|  1.56M|    NumEntries = Num;
  777|  1.56M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16setNumTombstonesEj:
  477|    197|  void setNumTombstones(unsigned Num) {
  478|    197|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    197|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16setNumTombstonesEj:
  783|    197|  void setNumTombstones(unsigned Num) {
  784|    197|    NumTombstones = Num;
  785|    197|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|  45.0M|  unsigned getNumBuckets() const {
  498|  45.0M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  45.0M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|  45.0M|  unsigned getNumBuckets() const {
  792|  45.0M|    return NumBuckets;
  793|  45.0M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11getEmptyKeyEv:
  426|  12.8M|  static const KeyT getEmptyKey() {
  427|  12.8M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  12.8M|                  "Must pass the derived type to this template!");
  429|  12.8M|    return KeyInfoT::getEmptyKey();
  430|  12.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  493|  32.1M|  BucketT *getBuckets() {
  494|  32.1M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  32.1M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|  44.4M|  BucketT *getBuckets() const {
  788|  44.4M|    return Buckets;
  789|  44.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  501|  32.1M|  BucketT *getBucketsEnd() {
  502|  32.1M|    return getBuckets() + getNumBuckets();
  503|  32.1M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjjEEE8getFirstEv:
   47|  13.3M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|     18|  ~DenseMap() {
  688|     18|    this->destroyAll();
  689|     18|    operator delete(Buckets);
  690|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|     18|  void destroyAll() {
  335|     18|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 18]
  ------------------
  336|      0|      return;
  337|       |
  338|     18|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.27M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.27M, False: 18]
  ------------------
  340|  1.27M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 604k, False: 673k]
  ------------------
  341|  1.27M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 604k, False: 0]
  ------------------
  342|   604k|        P->getSecond().~ValueT();
  343|  1.27M|      P->getFirst().~KeyT();
  344|  1.27M|    }
  345|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15getTombstoneKeyEv:
  432|  12.2M|  static const KeyT getTombstoneKey() {
  433|  12.2M|    return KeyInfoT::getTombstoneKey();
  434|  12.2M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjjEEE9getSecondEv:
   49|  4.08M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5beginEv:
   76|     18|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|     18|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 18]
  ------------------
   80|      0|      return end();
   81|     18|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 18]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|     18|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|     18|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5emptyEv:
   99|     18|  LLVM_NODISCARD bool empty() const {
  100|     18|    return getNumEntries() == 0;
  101|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12makeIteratorEPSC_SF_RNS_14DebugEpochBaseEb:
  439|   206k|                        bool NoAdvance=false) {
  440|   206k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 206k]
  ------------------
  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|   206k|    return iterator(P, E, Epoch, NoAdvance);
  445|   206k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1140|   206k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   206k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   206k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 206k, False: 18]
  ------------------
 1144|     18|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 18]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|     18|    AdvancePastEmptyBuckets();
 1149|     18|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|   604k|  void AdvancePastEmptyBuckets() {
 1212|   604k|    assert(Ptr <= End);
 1213|   604k|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|   604k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|  1.27M|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 1.27M, False: 18]
  |  Branch (1216:27): [True: 673k, False: 604k]
  ------------------
 1217|  1.27M|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 604k]
  ------------------
 1218|   673k|      ++Ptr;
 1219|   604k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E3endEv:
   85|   206k|  inline iterator end() {
   86|   206k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   206k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEneERKSC_:
 1190|   604k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   604k|    return !(*this == RHS);
 1192|   604k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEppEv:
 1194|   604k|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|   604k|    assert(isHandleInSync() && "invalid iterator access!");
 1196|   604k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 604k]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|   604k|    ++Ptr;
 1202|   604k|    AdvancePastEmptyBuckets();
 1203|   604k|    return *this;
 1204|   604k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEdeEv:
 1160|   604k|  reference operator*() const {
 1161|   604k|    assert(isHandleInSync() && "invalid iterator access!");
 1162|   604k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 604k]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|   604k|    return *Ptr;
 1165|   604k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_EixERKS4_:
  303|   604k|  ValueT &operator[](const KeyT &Key) {
  304|   604k|    return FindAndConstruct(Key).second;
  305|   604k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16FindAndConstructERKS4_:
  295|   604k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   604k|    BucketT *TheBucket;
  297|   604k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 604k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   604k|    return *InsertIntoBucket(TheBucket, Key);
  301|   604k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPSC_:
  632|  1.56M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  1.56M|    const BucketT *ConstFoundBucket;
  634|  1.56M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  1.56M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  1.56M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  1.56M|    return Result;
  638|  1.56M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPKSC_:
  582|  1.56M|                       const BucketT *&FoundBucket) const {
  583|  1.56M|    const BucketT *BucketsPtr = getBuckets();
  584|  1.56M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.56M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 18, False: 1.56M]
  ------------------
  587|     18|      FoundBucket = nullptr;
  588|     18|      return false;
  589|     18|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.56M|    const BucketT *FoundTombstone = nullptr;
  593|  1.56M|    const KeyT EmptyKey = getEmptyKey();
  594|  1.56M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.56M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.56M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.56M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  1.56M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.56M|    unsigned ProbeAmt = 1;
  601|  6.33M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  6.33M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  6.33M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  6.33M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 6.33M]
  |  |  ------------------
  ------------------
  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|  6.33M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  6.33M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.56M, False: 4.77M]
  |  |  ------------------
  ------------------
  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.56M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1.56M]
  ------------------
  615|  1.56M|        return false;
  616|  1.56M|      }
  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.77M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 4.77M]
  ------------------
  621|  4.77M|          !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.77M|      BucketNo += ProbeAmt++;
  627|  4.77M|      BucketNo &= (NumBuckets-1);
  628|  4.77M|    }
  629|  1.56M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|  12.2M|  const BucketT *getBuckets() const {
  490|  12.2M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  12.2M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueERKS4_:
  417|  1.56M|  static unsigned getHashValue(const KeyT &Val) {
  418|  1.56M|    return KeyInfoT::getHashValue(Val);
  419|  1.56M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjjEEE8getFirstEv:
   48|  43.1M|  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|   604k|                            ValueArgs &&... Values) {
  520|   604k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   604k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   604k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   604k|    return TheBucket;
  525|   604k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E20InsertIntoBucketImplIS4_EEPSC_RKS4_RKT_SG_:
  539|   604k|                                BucketT *TheBucket) {
  540|   604k|    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|   604k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   604k|    unsigned NumBuckets = getNumBuckets();
  553|   604k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   604k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 197, False: 604k]
  |  |  ------------------
  ------------------
  554|    197|      this->grow(NumBuckets * 2);
  555|    197|      LookupBucketFor(Lookup, TheBucket);
  556|    197|      NumBuckets = getNumBuckets();
  557|   604k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   604k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 604k]
  |  |  ------------------
  ------------------
  558|   604k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   604k|    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|   604k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   604k|    const KeyT EmptyKey = getEmptyKey();
  570|   604k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 604k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   604k|    return TheBucket;
  574|   604k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|  2.16M|  unsigned getNumEntries() const {
  458|  2.16M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  2.16M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|  2.16M|  unsigned getNumEntries() const {
  772|  2.16M|    return NumEntries;
  773|  2.16M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4growEj:
  509|    197|  void grow(unsigned AtLeast) {
  510|    197|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    197|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4growEj:
  736|    197|  void grow(unsigned AtLeast) {
  737|    197|    unsigned OldNumBuckets = NumBuckets;
  738|    197|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    197|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    197|    assert(Buckets);
  742|    197|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 18, False: 179]
  ------------------
  743|     18|      this->BaseT::initEmpty();
  744|     18|      return;
  745|     18|    }
  746|       |
  747|    179|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    179|    operator delete(OldBuckets);
  751|    179|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E18moveFromOldBucketsEPSC_SF_:
  369|    179|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    179|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    179|    const KeyT EmptyKey = getEmptyKey();
  374|    179|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.27M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.27M, False: 179]
  ------------------
  376|  1.27M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 957k, False: 319k]
  ------------------
  377|  1.27M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 957k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   957k|        BucketT *DestBucket;
  380|   957k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   957k|        (void)FoundVal; // silence warning.
  382|   957k|        assert(!FoundVal && "Key already in new map?");
  383|   957k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   957k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   957k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   957k|        B->getSecond().~ValueT();
  389|   957k|      }
  390|  1.27M|      B->getFirst().~KeyT();
  391|  1.27M|    }
  392|    179|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16getNumTombstonesEv:
  473|   604k|  unsigned getNumTombstones() const {
  474|   604k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   604k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16getNumTombstonesEv:
  779|   604k|  unsigned getNumTombstones() const {
  780|   604k|    return NumTombstones;
  781|   604k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19incrementNumEntriesEv:
  465|  1.56M|  void incrementNumEntries() {
  466|  1.56M|    setNumEntries(getNumEntries() + 1);
  467|  1.56M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5emptyEv:
   99|   103k|  LLVM_NODISCARD bool empty() const {
  100|   103k|    return getNumEntries() == 0;
  101|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_EixERKS4_:
  303|  10.8M|  ValueT &operator[](const KeyT &Key) {
  304|  10.8M|    return FindAndConstruct(Key).second;
  305|  10.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16FindAndConstructERKS4_:
  295|  10.8M|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  10.8M|    BucketT *TheBucket;
  297|  10.8M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 10.7M, False: 40.6k]
  ------------------
  298|  10.7M|      return *TheBucket;
  299|       |
  300|  40.6k|    return *InsertIntoBucket(TheBucket, Key);
  301|  10.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16InsertIntoBucketIRKS4_JEEEPSA_SG_OT_DpOT0_:
  519|  40.6k|                            ValueArgs &&... Values) {
  520|  40.6k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  40.6k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  40.6k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  40.6k|    return TheBucket;
  525|  40.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E5countES5_:
  149|   740k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|   740k|    const BucketT *TheBucket;
  151|   740k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 103k, False: 637k]
  ------------------
  152|   740k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4findEPKS3_:
  154|   103k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   103k|    BucketT *TheBucket;
  156|   103k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 103k]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   103k|    return end();
  159|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPSC_:
  632|   103k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   103k|    const BucketT *ConstFoundBucket;
  634|   103k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   103k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   103k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   103k|    return Result;
  638|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPKSC_:
  582|   103k|                       const BucketT *&FoundBucket) const {
  583|   103k|    const BucketT *BucketsPtr = getBuckets();
  584|   103k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 103k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   105k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   105k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   105k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   105k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 105k]
  |  |  ------------------
  ------------------
  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|   105k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   105k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 1.93k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   103k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 103k]
  ------------------
  615|   103k|        return false;
  616|   103k|      }
  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.93k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.93k]
  ------------------
  621|  1.93k|          !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.93k|      BucketNo += ProbeAmt++;
  627|  1.93k|      BucketNo &= (NumBuckets-1);
  628|  1.93k|    }
  629|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueIPKS3_EEjRKT_:
  422|   103k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   103k|    return KeyInfoT::getHashValue(Val);
  424|   103k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEeqERKSC_:
 1180|   707k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   707k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   707k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   707k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   707k|           "comparing incomparable iterators!");
 1185|   707k|    return Ptr == RHS.Ptr;
 1186|   707k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_EixERKj:
  303|   571k|  ValueT &operator[](const KeyT &Key) {
  304|   571k|    return FindAndConstruct(Key).second;
  305|   571k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16FindAndConstructERKj:
  295|   571k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   571k|    BucketT *TheBucket;
  297|   571k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 520k, False: 51.1k]
  ------------------
  298|   520k|      return *TheBucket;
  299|       |
  300|  51.1k|    return *InsertIntoBucket(TheBucket, Key);
  301|   571k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E15LookupBucketForIjEEbRKT_RPS6_:
  632|   621k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   621k|    const BucketT *ConstFoundBucket;
  634|   621k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   621k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   621k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   621k|    return Result;
  638|   621k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E15LookupBucketForIjEEbRKT_RPKS6_:
  582|   621k|                       const BucketT *&FoundBucket) const {
  583|   621k|    const BucketT *BucketsPtr = getBuckets();
  584|   621k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   621k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 46.5k, False: 575k]
  ------------------
  587|  46.5k|      FoundBucket = nullptr;
  588|  46.5k|      return false;
  589|  46.5k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   575k|    const BucketT *FoundTombstone = nullptr;
  593|   575k|    const KeyT EmptyKey = getEmptyKey();
  594|   575k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   575k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   575k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   575k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   575k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   575k|    unsigned ProbeAmt = 1;
  601|   578k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   578k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   578k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   578k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 520k, False: 57.5k]
  |  |  ------------------
  ------------------
  605|   520k|        FoundBucket = ThisBucket;
  606|   520k|        return true;
  607|   520k|      }
  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|  57.5k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  57.5k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 54.7k, False: 2.81k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  54.7k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 54.7k]
  ------------------
  615|  54.7k|        return false;
  616|  54.7k|      }
  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.81k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 2.81k]
  ------------------
  621|  2.81k|          !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.81k|      BucketNo += ProbeAmt++;
  627|  2.81k|      BucketNo &= (NumBuckets-1);
  628|  2.81k|    }
  629|   575k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E10getBucketsEv:
  489|   621k|  const BucketT *getBuckets() const {
  490|   621k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   621k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E12getHashValueERKj:
  417|   575k|  static unsigned getHashValue(const KeyT &Val) {
  418|   575k|    return KeyInfoT::getHashValue(Val);
  419|   575k|  }
_ZNK4llvh6detail12DenseMapPairIjhE8getFirstEv:
   48|   638k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16InsertIntoBucketIRKjJEEEPS6_SC_OT_DpOT0_:
  519|  51.1k|                            ValueArgs &&... Values) {
  520|  51.1k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  51.1k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  51.1k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  51.1k|    return TheBucket;
  525|  51.1k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E20InsertIntoBucketImplIjEEPS6_RKjRKT_SA_:
  539|  51.1k|                                BucketT *TheBucket) {
  540|  51.1k|    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|  51.1k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  51.1k|    unsigned NumBuckets = getNumBuckets();
  553|  51.1k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  51.1k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 46.6k, False: 4.50k]
  |  |  ------------------
  ------------------
  554|  46.6k|      this->grow(NumBuckets * 2);
  555|  46.6k|      LookupBucketFor(Lookup, TheBucket);
  556|  46.6k|      NumBuckets = getNumBuckets();
  557|  46.6k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  4.50k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.50k]
  |  |  ------------------
  ------------------
  558|  4.50k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  51.1k|    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|  51.1k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  51.1k|    const KeyT EmptyKey = getEmptyKey();
  570|  51.1k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 51.1k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  51.1k|    return TheBucket;
  574|  51.1k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13getNumEntriesEv:
  457|   105k|  unsigned getNumEntries() const {
  458|   105k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   105k|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE13getNumEntriesEv:
  771|   105k|  unsigned getNumEntries() const {
  772|   105k|    return NumEntries;
  773|   105k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E4growEj:
  509|  46.6k|  void grow(unsigned AtLeast) {
  510|  46.6k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|  46.6k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE4growEj:
  736|  46.6k|  void grow(unsigned AtLeast) {
  737|  46.6k|    unsigned OldNumBuckets = NumBuckets;
  738|  46.6k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|  46.6k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|  46.6k|    assert(Buckets);
  742|  46.6k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 46.5k, False: 35]
  ------------------
  743|  46.5k|      this->BaseT::initEmpty();
  744|  46.5k|      return;
  745|  46.5k|    }
  746|       |
  747|     35|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     35|    operator delete(OldBuckets);
  751|     35|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E18moveFromOldBucketsEPS6_S9_:
  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|  4.83k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 4.80k, False: 35]
  ------------------
  376|  4.80k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 3.56k, False: 1.23k]
  ------------------
  377|  4.80k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 3.56k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  3.56k|        BucketT *DestBucket;
  380|  3.56k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  3.56k|        (void)FoundVal; // silence warning.
  382|  3.56k|        assert(!FoundVal && "Key already in new map?");
  383|  3.56k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  3.56k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  3.56k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  3.56k|        B->getSecond().~ValueT();
  389|  3.56k|      }
  390|  4.80k|      B->getFirst().~KeyT();
  391|  4.80k|    }
  392|     35|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16getNumTombstonesEv:
  473|  4.50k|  unsigned getNumTombstones() const {
  474|  4.50k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  4.50k|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE16getNumTombstonesEv:
  779|  4.50k|  unsigned getNumTombstones() const {
  780|  4.50k|    return NumTombstones;
  781|  4.50k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E19incrementNumEntriesEv:
  465|  54.6k|  void incrementNumEntries() {
  466|  54.6k|    setNumEntries(getNumEntries() + 1);
  467|  54.6k|  }
_ZN4llvh16DenseMapIteratorINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEC2EPS7_S9_RKNS_14DebugEpochBaseEb:
 1140|     10|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|     10|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|     10|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 10, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEEaSEOS7_:
  707|    196|  DenseMap& operator=(DenseMap &&other) {
  708|    196|    this->destroyAll();
  709|    196|    operator delete(Buckets);
  710|    196|    init(0);
  711|    196|    swap(other);
  712|    196|    return *this;
  713|    196|  }
_ZN4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1140|    238|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|    238|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|    238|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 238, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 185, False: 11]
  ------------------
  336|    185|      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: 97, False: 607]
  ------------------
  341|    704|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 97, False: 0]
  ------------------
  342|     97|        P->getSecond().~ValueT();
  343|    704|      P->getFirst().~KeyT();
  344|    704|    }
  345|     11|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|   206k|  unsigned getNumBuckets() const {
  498|   206k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   206k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|   206k|  unsigned getNumBuckets() const {
  792|   206k|    return NumBuckets;
  793|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11getEmptyKeyEv:
  426|   103k|  static const KeyT getEmptyKey() {
  427|   103k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   103k|                  "Must pass the derived type to this template!");
  429|   103k|    return KeyInfoT::getEmptyKey();
  430|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15getTombstoneKeyEv:
  432|   103k|  static const KeyT getTombstoneKey() {
  433|   103k|    return KeyInfoT::getTombstoneKey();
  434|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  493|   103k|  BucketT *getBuckets() {
  494|   103k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   103k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE10getBucketsEv:
  787|   206k|  BucketT *getBuckets() const {
  788|   206k|    return Buckets;
  789|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getBucketsEndEv:
  501|   103k|  BucketT *getBucketsEnd() {
  502|   103k|    return getBuckets() + getNumBuckets();
  503|   103k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringEjE8getFirstEv:
   47|  2.40k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringEjE9getSecondEv:
   49|    194|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4findEPKS3_:
  154|   206k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   206k|    BucketT *TheBucket;
  156|   206k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 103k, False: 103k]
  ------------------
  157|   103k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   103k|    return end();
  159|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPS9_:
  632|   206k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   206k|    const BucketT *ConstFoundBucket;
  634|   206k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   206k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   206k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   206k|    return Result;
  638|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPKS9_:
  582|   206k|                       const BucketT *&FoundBucket) const {
  583|   206k|    const BucketT *BucketsPtr = getBuckets();
  584|   206k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 206k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   206k|    const BucketT *FoundTombstone = nullptr;
  593|   206k|    const KeyT EmptyKey = getEmptyKey();
  594|   206k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   206k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   206k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   206k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   206k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   206k|    unsigned ProbeAmt = 1;
  601|   422k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   422k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   422k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   422k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 319k]
  |  |  ------------------
  ------------------
  605|   103k|        FoundBucket = ThisBucket;
  606|   103k|        return true;
  607|   103k|      }
  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|   319k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   319k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 215k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   103k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 103k]
  ------------------
  615|   103k|        return false;
  616|   103k|      }
  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|   215k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 215k]
  ------------------
  621|   215k|          !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|   215k|      BucketNo += ProbeAmt++;
  627|   215k|      BucketNo &= (NumBuckets-1);
  628|   215k|    }
  629|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  489|   457k|  const BucketT *getBuckets() const {
  490|   457k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   457k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueIPKS3_EEjRKT_:
  422|   206k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   206k|    return KeyInfoT::getHashValue(Val);
  424|   206k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes8FunctionEjE8getFirstEv:
   48|  2.05M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|   413k|                        bool NoAdvance=false) {
  440|   413k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 413k]
  ------------------
  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|   413k|    return iterator(P, E, Epoch, NoAdvance);
  445|   413k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1140|   413k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   413k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   413k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 413k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEneERKS9_:
 1190|   206k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   206k|    return !(*this == RHS);
 1192|   206k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEeqERKS9_:
 1180|   206k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   206k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   206k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   206k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   206k|           "comparing incomparable iterators!");
 1185|   206k|    return Ptr == RHS.Ptr;
 1186|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E3endEv:
   85|   310k|  inline iterator end() {
   86|   310k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   310k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEptEv:
 1166|   103k|  pointer operator->() const {
 1167|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 103k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   103k|    return Ptr;
 1171|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4sizeEv:
  102|   103k|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumEntriesEv:
  457|   457k|  unsigned getNumEntries() const {
  458|   457k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   457k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumEntriesEv:
  771|   457k|  unsigned getNumEntries() const {
  772|   457k|    return NumEntries;
  773|   457k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_EixERKS4_:
  303|   103k|  ValueT &operator[](const KeyT &Key) {
  304|   103k|    return FindAndConstruct(Key).second;
  305|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16FindAndConstructERKS4_:
  295|   103k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   103k|    BucketT *TheBucket;
  297|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 103k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   103k|    return *InsertIntoBucket(TheBucket, Key);
  301|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|   251k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   251k|    const BucketT *ConstFoundBucket;
  634|   251k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   251k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   251k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   251k|    return Result;
  638|   251k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|   251k|                       const BucketT *&FoundBucket) const {
  583|   251k|    const BucketT *BucketsPtr = getBuckets();
  584|   251k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   251k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 251k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   251k|    const BucketT *FoundTombstone = nullptr;
  593|   251k|    const KeyT EmptyKey = getEmptyKey();
  594|   251k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   251k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   251k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   251k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   251k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   251k|    unsigned ProbeAmt = 1;
  601|   448k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   448k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   448k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   448k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 448k]
  |  |  ------------------
  ------------------
  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|   448k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   448k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 251k, False: 196k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   251k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 251k]
  ------------------
  615|   251k|        return false;
  616|   251k|      }
  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|   196k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 196k]
  ------------------
  621|   196k|          !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|   196k|      BucketNo += ProbeAmt++;
  627|   196k|      BucketNo &= (NumBuckets-1);
  628|   196k|    }
  629|   251k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueERKS4_:
  417|   251k|  static unsigned getHashValue(const KeyT &Val) {
  418|   251k|    return KeyInfoT::getHashValue(Val);
  419|   251k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16InsertIntoBucketIRKS4_JEEEPS9_SF_OT_DpOT0_:
  519|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 229, False: 103k]
  |  |  ------------------
  ------------------
  554|    229|      this->grow(NumBuckets * 2);
  555|    229|      LookupBucketFor(Lookup, TheBucket);
  556|    229|      NumBuckets = getNumBuckets();
  557|   103k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  558|   103k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4growEj:
  509|    229|  void grow(unsigned AtLeast) {
  510|    229|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    229|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4growEj:
  736|    229|  void grow(unsigned AtLeast) {
  737|    229|    unsigned OldNumBuckets = NumBuckets;
  738|    229|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    229|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    229|    assert(Buckets);
  742|    229|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 33]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  746|       |
  747|     33|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     33|    operator delete(OldBuckets);
  751|     33|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E18moveFromOldBucketsEPS9_SC_:
  369|     33|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     33|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     33|    const KeyT EmptyKey = getEmptyKey();
  374|     33|    const KeyT TombstoneKey = getTombstoneKey();
  375|   196k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 196k, False: 33]
  ------------------
  376|   196k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 147k, False: 49.2k]
  ------------------
  377|   196k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 147k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   147k|        BucketT *DestBucket;
  380|   147k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   147k|        (void)FoundVal; // silence warning.
  382|   147k|        assert(!FoundVal && "Key already in new map?");
  383|   147k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   147k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   147k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   147k|        B->getSecond().~ValueT();
  389|   147k|      }
  390|   196k|      B->getFirst().~KeyT();
  391|   196k|    }
  392|     33|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16getNumTombstonesEv:
  473|   103k|  unsigned getNumTombstones() const {
  474|   103k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   103k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16getNumTombstonesEv:
  779|   103k|  unsigned getNumTombstones() const {
  780|   103k|    return NumTombstones;
  781|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E19incrementNumEntriesEv:
  465|   251k|  void incrementNumEntries() {
  466|   251k|    setNumEntries(getNumEntries() + 1);
  467|   251k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E11try_emplaceIJRS6_EEENSt3__14pairINS_16DenseMapIteratorIS4_S6_S8_SA_Lb0EEEbEERKS4_DpOT_:
  233|  4.69M|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|  4.69M|    BucketT *TheBucket;
  235|  4.69M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 4.48M, False: 206k]
  ------------------
  236|  4.48M|      return std::make_pair(
  237|  4.48M|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  238|  4.48M|               false); // Already in map.
  239|       |
  240|       |    // Otherwise, insert the new element.
  241|   206k|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|   206k|    return std::make_pair(
  243|   206k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|   206k|             true);
  245|  4.69M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15LookupBucketForIS4_EEbRKT_RPSA_:
  632|  4.84M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  4.84M|    const BucketT *ConstFoundBucket;
  634|  4.84M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  4.84M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  4.84M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  4.84M|    return Result;
  638|  4.84M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15LookupBucketForIS4_EEbRKT_RPKSA_:
  582|  4.84M|                       const BucketT *&FoundBucket) const {
  583|  4.84M|    const BucketT *BucketsPtr = getBuckets();
  584|  4.84M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  4.84M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 4.84M]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  4.84M|    const BucketT *FoundTombstone = nullptr;
  593|  4.84M|    const KeyT EmptyKey = getEmptyKey();
  594|  4.84M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  4.84M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  4.84M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  4.84M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  4.84M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  4.84M|    unsigned ProbeAmt = 1;
  601|  5.75M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  5.75M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  5.75M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  5.75M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.48M, False: 1.26M]
  |  |  ------------------
  ------------------
  605|  4.48M|        FoundBucket = ThisBucket;
  606|  4.48M|        return true;
  607|  4.48M|      }
  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.26M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  1.26M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 354k, False: 909k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   354k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 354k]
  ------------------
  615|   354k|        return false;
  616|   354k|      }
  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|   909k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 909k]
  ------------------
  621|   909k|          !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|   909k|      BucketNo += ProbeAmt++;
  627|   909k|      BucketNo &= (NumBuckets-1);
  628|   909k|    }
  629|  4.84M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10getBucketsEv:
  489|  4.84M|  const BucketT *getBuckets() const {
  490|  4.84M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  4.84M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E12getHashValueERKS4_:
  417|  4.84M|  static unsigned getHashValue(const KeyT &Val) {
  418|  4.84M|    return KeyInfoT::getHashValue(Val);
  419|  4.84M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|  4.69M|                        bool NoAdvance=false) {
  440|  4.69M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 4.69M]
  ------------------
  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.69M|    return iterator(P, E, Epoch, NoAdvance);
  445|  4.69M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1140|  4.69M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  4.69M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  4.69M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 4.69M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16InsertIntoBucketIRKS4_JRS6_EEEPSA_SH_OT_DpOT0_:
  519|   206k|                            ValueArgs &&... Values) {
  520|   206k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   206k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   206k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   206k|    return TheBucket;
  525|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E20InsertIntoBucketImplIS4_EEPSA_RKS4_RKT_SE_:
  539|   206k|                                BucketT *TheBucket) {
  540|   206k|    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|   206k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   206k|    unsigned NumBuckets = getNumBuckets();
  553|   206k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   206k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 229, False: 206k]
  |  |  ------------------
  ------------------
  554|    229|      this->grow(NumBuckets * 2);
  555|    229|      LookupBucketFor(Lookup, TheBucket);
  556|    229|      NumBuckets = getNumBuckets();
  557|   206k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   206k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 206k]
  |  |  ------------------
  ------------------
  558|   206k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   206k|    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|   206k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   206k|    const KeyT EmptyKey = getEmptyKey();
  570|   206k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 206k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   206k|    return TheBucket;
  574|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumEntriesEv:
  457|   767k|  unsigned getNumEntries() const {
  458|   767k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   767k|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumEntriesEv:
  771|   767k|  unsigned getNumEntries() const {
  772|   767k|    return NumEntries;
  773|   767k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E4growEj:
  509|    229|  void grow(unsigned AtLeast) {
  510|    229|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    229|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4growEj:
  736|    229|  void grow(unsigned AtLeast) {
  737|    229|    unsigned OldNumBuckets = NumBuckets;
  738|    229|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    229|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    229|    assert(Buckets);
  742|    229|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 33]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  746|       |
  747|     33|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     33|    operator delete(OldBuckets);
  751|     33|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E18moveFromOldBucketsEPSA_SD_:
  369|     33|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     33|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     33|    const KeyT EmptyKey = getEmptyKey();
  374|     33|    const KeyT TombstoneKey = getTombstoneKey();
  375|   196k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 196k, False: 33]
  ------------------
  376|   196k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 147k, False: 49.2k]
  ------------------
  377|   196k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 147k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   147k|        BucketT *DestBucket;
  380|   147k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   147k|        (void)FoundVal; // silence warning.
  382|   147k|        assert(!FoundVal && "Key already in new map?");
  383|   147k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   147k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   147k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   147k|        B->getSecond().~ValueT();
  389|   147k|      }
  390|   196k|      B->getFirst().~KeyT();
  391|   196k|    }
  392|     33|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16getNumTombstonesEv:
  473|   206k|  unsigned getNumTombstones() const {
  474|   206k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   206k|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16getNumTombstonesEv:
  779|   206k|  unsigned getNumTombstones() const {
  780|   206k|    return NumTombstones;
  781|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E19incrementNumEntriesEv:
  465|   354k|  void incrementNumEntries() {
  466|   354k|    setNumEntries(getNumEntries() + 1);
  467|   354k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4findEPKS3_:
  154|  4.69M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  4.69M|    BucketT *TheBucket;
  156|  4.69M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 4.59M, False: 103k]
  ------------------
  157|  4.59M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   103k|    return end();
  159|  4.69M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPS9_:
  632|  4.69M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  4.69M|    const BucketT *ConstFoundBucket;
  634|  4.69M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  4.69M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  4.69M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  4.69M|    return Result;
  638|  4.69M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPKS9_:
  582|  4.69M|                       const BucketT *&FoundBucket) const {
  583|  4.69M|    const BucketT *BucketsPtr = getBuckets();
  584|  4.69M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  4.69M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 4.69M]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  4.69M|    const BucketT *FoundTombstone = nullptr;
  593|  4.69M|    const KeyT EmptyKey = getEmptyKey();
  594|  4.69M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  4.69M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  4.69M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  4.69M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  4.69M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  4.69M|    unsigned ProbeAmt = 1;
  601|  5.68M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  5.68M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  5.68M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  5.68M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.59M, False: 1.08M]
  |  |  ------------------
  ------------------
  605|  4.59M|        FoundBucket = ThisBucket;
  606|  4.59M|        return true;
  607|  4.59M|      }
  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.08M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  1.08M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 985k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   103k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 103k]
  ------------------
  615|   103k|        return false;
  616|   103k|      }
  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|   985k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 985k]
  ------------------
  621|   985k|          !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|   985k|      BucketNo += ProbeAmt++;
  627|   985k|      BucketNo &= (NumBuckets-1);
  628|   985k|    }
  629|  4.69M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  489|  4.94M|  const BucketT *getBuckets() const {
  490|  4.94M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  4.94M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueIPKS3_EEjRKT_:
  422|  4.69M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  4.69M|    return KeyInfoT::getHashValue(Val);
  424|  4.69M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEjE8getFirstEv:
   48|  8.83M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|  9.39M|                        bool NoAdvance=false) {
  440|  9.39M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 9.39M]
  ------------------
  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|  9.39M|    return iterator(P, E, Epoch, NoAdvance);
  445|  9.39M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1140|  9.39M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  9.39M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  9.39M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 9.39M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEneERKS9_:
 1190|  4.69M|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  4.69M|    return !(*this == RHS);
 1192|  4.69M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEeqERKS9_:
 1180|  4.69M|  bool operator==(const NonConstIterator &RHS) const {
 1181|  4.69M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  4.69M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  4.69M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  4.69M|           "comparing incomparable iterators!");
 1185|  4.69M|    return Ptr == RHS.Ptr;
 1186|  4.69M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E3endEv:
   85|  4.79M|  inline iterator end() {
   86|  4.79M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  4.79M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEptEv:
 1166|  4.59M|  pointer operator->() const {
 1167|  4.59M|    assert(isHandleInSync() && "invalid iterator access!");
 1168|  4.59M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 4.59M]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|  4.59M|    return Ptr;
 1171|  4.59M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4sizeEv:
  102|   103k|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumEntriesEv:
  457|   457k|  unsigned getNumEntries() const {
  458|   457k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   457k|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumEntriesEv:
  771|   457k|  unsigned getNumEntries() const {
  772|   457k|    return NumEntries;
  773|   457k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_EixERKS4_:
  303|   103k|  ValueT &operator[](const KeyT &Key) {
  304|   103k|    return FindAndConstruct(Key).second;
  305|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16FindAndConstructERKS4_:
  295|   103k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   103k|    BucketT *TheBucket;
  297|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 103k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   103k|    return *InsertIntoBucket(TheBucket, Key);
  301|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|   251k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   251k|    const BucketT *ConstFoundBucket;
  634|   251k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   251k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   251k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   251k|    return Result;
  638|   251k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|   251k|                       const BucketT *&FoundBucket) const {
  583|   251k|    const BucketT *BucketsPtr = getBuckets();
  584|   251k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   251k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 250k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   250k|    const BucketT *FoundTombstone = nullptr;
  593|   250k|    const KeyT EmptyKey = getEmptyKey();
  594|   250k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   250k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   250k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   250k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   250k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   250k|    unsigned ProbeAmt = 1;
  601|   444k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   444k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   444k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   444k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 444k]
  |  |  ------------------
  ------------------
  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|   444k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   444k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 250k, False: 193k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   250k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 250k]
  ------------------
  615|   250k|        return false;
  616|   250k|      }
  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|   193k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 193k]
  ------------------
  621|   193k|          !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|   193k|      BucketNo += ProbeAmt++;
  627|   193k|      BucketNo &= (NumBuckets-1);
  628|   193k|    }
  629|   250k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueERKS4_:
  417|   250k|  static unsigned getHashValue(const KeyT &Val) {
  418|   250k|    return KeyInfoT::getHashValue(Val);
  419|   250k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16InsertIntoBucketIRKS4_JEEEPS9_SF_OT_DpOT0_:
  519|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 229, False: 103k]
  |  |  ------------------
  ------------------
  554|    229|      this->grow(NumBuckets * 2);
  555|    229|      LookupBucketFor(Lookup, TheBucket);
  556|    229|      NumBuckets = getNumBuckets();
  557|   103k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  558|   103k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4growEj:
  509|    229|  void grow(unsigned AtLeast) {
  510|    229|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    229|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4growEj:
  736|    229|  void grow(unsigned AtLeast) {
  737|    229|    unsigned OldNumBuckets = NumBuckets;
  738|    229|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    229|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    229|    assert(Buckets);
  742|    229|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 33]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  746|       |
  747|     33|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     33|    operator delete(OldBuckets);
  751|     33|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E18moveFromOldBucketsEPS9_SC_:
  369|     33|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     33|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     33|    const KeyT EmptyKey = getEmptyKey();
  374|     33|    const KeyT TombstoneKey = getTombstoneKey();
  375|   196k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 196k, False: 33]
  ------------------
  376|   196k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 147k, False: 49.2k]
  ------------------
  377|   196k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 147k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   147k|        BucketT *DestBucket;
  380|   147k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   147k|        (void)FoundVal; // silence warning.
  382|   147k|        assert(!FoundVal && "Key already in new map?");
  383|   147k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   147k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   147k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   147k|        B->getSecond().~ValueT();
  389|   147k|      }
  390|   196k|      B->getFirst().~KeyT();
  391|   196k|    }
  392|     33|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16getNumTombstonesEv:
  473|   103k|  unsigned getNumTombstones() const {
  474|   103k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   103k|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16getNumTombstonesEv:
  779|   103k|  unsigned getNumTombstones() const {
  780|   103k|    return NumTombstones;
  781|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E19incrementNumEntriesEv:
  465|   250k|  void incrementNumEntries() {
  466|   250k|    setNumEntries(getNumEntries() + 1);
  467|   250k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_EixERKj:
  303|   103k|  ValueT &operator[](const KeyT &Key) {
  304|   103k|    return FindAndConstruct(Key).second;
  305|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E16FindAndConstructERKj:
  295|   103k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   103k|    BucketT *TheBucket;
  297|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 103k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   103k|    return *InsertIntoBucket(TheBucket, Key);
  301|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E16InsertIntoBucketIRKjJEEEPS6_SC_OT_DpOT0_:
  519|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4findEPKS3_:
  154|   103k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   103k|    BucketT *TheBucket;
  156|   103k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 103k]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   103k|    return end();
  159|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIPKS3_EEbRKT_RPSG_:
  632|   103k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   103k|    const BucketT *ConstFoundBucket;
  634|   103k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   103k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   103k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   103k|    return Result;
  638|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIPKS3_EEbRKT_RPKSG_:
  582|   103k|                       const BucketT *&FoundBucket) const {
  583|   103k|    const BucketT *BucketsPtr = getBuckets();
  584|   103k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 103k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   260k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   260k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   260k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   260k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 260k]
  |  |  ------------------
  ------------------
  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|   260k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   260k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 157k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   103k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 103k]
  ------------------
  615|   103k|        return false;
  616|   103k|      }
  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|   157k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 157k]
  ------------------
  621|   157k|          !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|   157k|      BucketNo += ProbeAmt++;
  627|   157k|      BucketNo &= (NumBuckets-1);
  628|   157k|    }
  629|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  489|   458k|  const BucketT *getBuckets() const {
  490|   458k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   458k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueIPKS3_EEjRKT_:
  422|   103k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   103k|    return KeyInfoT::getHashValue(Val);
  424|   103k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEEE8getFirstEv:
   48|  2.05M|  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|   206k|                        bool NoAdvance=false) {
  440|   206k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 206k]
  ------------------
  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|   206k|    return iterator(P, E, Epoch, NoAdvance);
  445|   206k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb0EEC2EPSF_SH_RKNS_14DebugEpochBaseEb:
 1140|   206k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   206k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   206k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 206k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E3endEv:
   85|   206k|  inline iterator end() {
   86|   206k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   206k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb0EEeqERKSG_:
 1180|   103k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   103k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   103k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   103k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   103k|           "comparing incomparable iterators!");
 1185|   103k|    return Ptr == RHS.Ptr;
 1186|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_EixERKS4_:
  303|   206k|  ValueT &operator[](const KeyT &Key) {
  304|   206k|    return FindAndConstruct(Key).second;
  305|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16FindAndConstructERKS4_:
  295|   206k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   206k|    BucketT *TheBucket;
  297|   206k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 103k, False: 103k]
  ------------------
  298|   103k|      return *TheBucket;
  299|       |
  300|   103k|    return *InsertIntoBucket(TheBucket, Key);
  301|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPSG_:
  632|   354k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   354k|    const BucketT *ConstFoundBucket;
  634|   354k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   354k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   354k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   354k|    return Result;
  638|   354k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPKSG_:
  582|   354k|                       const BucketT *&FoundBucket) const {
  583|   354k|    const BucketT *BucketsPtr = getBuckets();
  584|   354k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   354k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 354k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   354k|    const BucketT *FoundTombstone = nullptr;
  593|   354k|    const KeyT EmptyKey = getEmptyKey();
  594|   354k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   354k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   354k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   354k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   354k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   354k|    unsigned ProbeAmt = 1;
  601|   610k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   610k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   610k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   610k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 506k]
  |  |  ------------------
  ------------------
  605|   103k|        FoundBucket = ThisBucket;
  606|   103k|        return true;
  607|   103k|      }
  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|   506k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   506k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 251k, False: 255k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   251k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 251k]
  ------------------
  615|   251k|        return false;
  616|   251k|      }
  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|   255k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 255k]
  ------------------
  621|   255k|          !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|   255k|      BucketNo += ProbeAmt++;
  627|   255k|      BucketNo &= (NumBuckets-1);
  628|   255k|    }
  629|   354k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueERKS4_:
  417|   354k|  static unsigned getHashValue(const KeyT &Val) {
  418|   354k|    return KeyInfoT::getHashValue(Val);
  419|   354k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16InsertIntoBucketIRKS4_JEEEPSG_SM_OT_DpOT0_:
  519|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E20InsertIntoBucketImplIS4_EEPSG_RKS4_RKT_SK_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 229, False: 103k]
  |  |  ------------------
  ------------------
  554|    229|      this->grow(NumBuckets * 2);
  555|    229|      LookupBucketFor(Lookup, TheBucket);
  556|    229|      NumBuckets = getNumBuckets();
  557|   103k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  558|   103k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getNumEntriesEv:
  457|   354k|  unsigned getNumEntries() const {
  458|   354k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   354k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumEntriesEv:
  771|   354k|  unsigned getNumEntries() const {
  772|   354k|    return NumEntries;
  773|   354k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4growEj:
  509|    229|  void grow(unsigned AtLeast) {
  510|    229|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    229|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4growEj:
  736|    229|  void grow(unsigned AtLeast) {
  737|    229|    unsigned OldNumBuckets = NumBuckets;
  738|    229|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    229|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    229|    assert(Buckets);
  742|    229|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 33]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  746|       |
  747|     33|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     33|    operator delete(OldBuckets);
  751|     33|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E18moveFromOldBucketsEPSG_SJ_:
  369|     33|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     33|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     33|    const KeyT EmptyKey = getEmptyKey();
  374|     33|    const KeyT TombstoneKey = getTombstoneKey();
  375|   196k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 196k, False: 33]
  ------------------
  376|   196k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 147k, False: 49.2k]
  ------------------
  377|   196k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 147k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   147k|        BucketT *DestBucket;
  380|   147k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   147k|        (void)FoundVal; // silence warning.
  382|   147k|        assert(!FoundVal && "Key already in new map?");
  383|   147k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   147k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   147k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   147k|        B->getSecond().~ValueT();
  389|   147k|      }
  390|   196k|      B->getFirst().~KeyT();
  391|   196k|    }
  392|     33|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16getNumTombstonesEv:
  473|   103k|  unsigned getNumTombstones() const {
  474|   103k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   103k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16getNumTombstonesEv:
  779|   103k|  unsigned getNumTombstones() const {
  780|   103k|    return NumTombstones;
  781|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E19incrementNumEntriesEv:
  465|   251k|  void incrementNumEntries() {
  466|   251k|    setNumEntries(getNumEntries() + 1);
  467|   251k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E5emptyEv:
   99|    196|  LLVM_NODISCARD bool empty() const {
  100|    196|    return getNumEntries() == 0;
  101|    196|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEaSEOSD_:
  707|    196|  DenseMap& operator=(DenseMap &&other) {
  708|    196|    this->destroyAll();
  709|    196|    operator delete(Buckets);
  710|    196|    init(0);
  711|    196|    swap(other);
  712|    196|    return *this;
  713|    196|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4swapERSD_:
  692|    196|  void swap(DenseMap& RHS) {
  693|    196|    this->incrementEpoch();
  694|    196|    RHS.incrementEpoch();
  695|    196|    std::swap(Buckets, RHS.Buckets);
  696|    196|    std::swap(NumEntries, RHS.NumEntries);
  697|    196|    std::swap(NumTombstones, RHS.NumTombstones);
  698|    196|    std::swap(NumBuckets, RHS.NumBuckets);
  699|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4sizeEv:
  102|    392|  unsigned size() const { return getNumEntries(); }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E5clearEv:
  113|   103k|  void clear() {
  114|   103k|    incrementEpoch();
  115|   103k|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 0, False: 103k]
  |  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|   103k|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 103k, False: 4]
  |  Branch (119:50): [True: 103k, False: 239]
  ------------------
  120|   103k|      shrink_and_clear();
  121|   103k|      return;
  122|   103k|    }
  123|       |
  124|    243|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|    243|    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|   212k|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P)
  ------------------
  |  Branch (127:61): [True: 212k, False: 243]
  ------------------
  128|   212k|        P->getFirst() = EmptyKey;
  129|    243|    } 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|    243|    setNumEntries(0);
  145|    243|    setNumTombstones(0);
  146|    243|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16shrink_and_clearEv:
  513|   103k|  void shrink_and_clear() {
  514|   103k|    static_cast<DerivedT *>(this)->shrink_and_clear();
  515|   103k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16shrink_and_clearEv:
  753|   103k|  void shrink_and_clear() {
  754|   103k|    unsigned OldNumEntries = NumEntries;
  755|   103k|    this->destroyAll();
  756|       |
  757|       |    // Reduce the number of buckets.
  758|   103k|    unsigned NewNumBuckets = 0;
  759|   103k|    if (OldNumEntries)
  ------------------
  |  Branch (759:9): [True: 103k, False: 0]
  ------------------
  760|   103k|      NewNumBuckets = std::max(64, 1 << (Log2_32_Ceil(OldNumEntries) + 1));
  761|   103k|    if (NewNumBuckets == NumBuckets) {
  ------------------
  |  Branch (761:9): [True: 0, False: 103k]
  ------------------
  762|      0|      this->BaseT::initEmpty();
  763|      0|      return;
  764|      0|    }
  765|       |
  766|   103k|    operator delete(Buckets);
  767|   103k|    init(NewNumBuckets);
  768|   103k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEEC2Ej:
  837|  1.23k|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|  1.23k|    init(NumInitBuckets);
  839|  1.23k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEED2Ev:
  857|  4.21k|  ~SmallDenseMap() {
  858|  4.21k|    this->destroyAll();
  859|  4.21k|    deallocateBuckets();
  860|  4.21k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEEC2ERKS8_:
  841|  1.74k|  SmallDenseMap(const SmallDenseMap &other) : BaseT() {
  842|  1.74k|    init(0);
  843|  1.74k|    copyFrom(other);
  844|  1.74k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE8copyFromERKS8_:
  948|  1.74k|  void copyFrom(const SmallDenseMap& other) {
  949|  1.74k|    this->destroyAll();
  950|  1.74k|    deallocateBuckets();
  951|  1.74k|    Small = true;
  952|  1.74k|    if (other.getNumBuckets() > InlineBuckets) {
  ------------------
  |  Branch (952:9): [True: 0, False: 1.74k]
  ------------------
  953|      0|      Small = false;
  954|      0|      new (getLargeRep()) LargeRep(allocateBuckets(other.getNumBuckets()));
  955|      0|    }
  956|  1.74k|    this->BaseT::copyFrom(other);
  957|  1.74k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E8copyFromIS9_EEvRKNS0_IT_S2_S4_S6_S8_EE:
  396|  1.74k|      const DenseMapBase<OtherBaseT, KeyT, ValueT, KeyInfoT, BucketT> &other) {
  397|  1.74k|    assert(&other != this);
  398|  1.74k|    assert(getNumBuckets() == other.getNumBuckets());
  399|       |
  400|  1.74k|    setNumEntries(other.getNumEntries());
  401|  1.74k|    setNumTombstones(other.getNumTombstones());
  402|       |
  403|  1.74k|    if (isPodLike<KeyT>::value && isPodLike<ValueT>::value)
  ------------------
  |  Branch (403:9): [Folded - Ignored]
  |  Branch (403:35): [Folded - Ignored]
  ------------------
  404|  1.74k|      memcpy(reinterpret_cast<void *>(getBuckets()), other.getBuckets(),
  405|  1.74k|             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|  1.74k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13getNumEntriesEv:
  457|  1.74k|  unsigned getNumEntries() const {
  458|  1.74k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.74k|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE13getNumEntriesEv:
 1042|  1.74k|  unsigned getNumEntries() const {
 1043|  1.74k|    return NumEntries;
 1044|  1.74k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E16getNumTombstonesEv:
  473|  1.74k|  unsigned getNumTombstones() const {
  474|  1.74k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  1.74k|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16getNumTombstonesEv:
 1052|  1.74k|  unsigned getNumTombstones() const {
 1053|  1.74k|    return NumTombstones;
 1054|  1.74k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E10getBucketsEv:
  489|   626k|  const BucketT *getBuckets() const {
  490|   626k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   626k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEEC2Ej:
  669|    247|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEEC2EOS8_:
  846|  1.23k|  SmallDenseMap(SmallDenseMap &&other) : BaseT() {
  847|  1.23k|    init(0);
  848|  1.23k|    swap(other);
  849|  1.23k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEED2Ev:
  687|    247|  ~DenseMap() {
  688|    247|    this->destroyAll();
  689|    247|    operator delete(Buckets);
  690|    247|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEED2Ev:
  687|    247|  ~DenseMap() {
  688|    247|    this->destroyAll();
  689|    247|    operator delete(Buckets);
  690|    247|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E13getNumBucketsEv:
  497|  10.3k|  unsigned getNumBuckets() const {
  498|  10.3k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  10.3k|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE13getNumBucketsEv:
  791|  10.3k|  unsigned getNumBuckets() const {
  792|  10.3k|    return NumBuckets;
  793|  10.3k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE15allocateBucketsEj:
  795|  10.3k|  bool allocateBuckets(unsigned Num) {
  796|  10.3k|    NumBuckets = Num;
  797|  10.3k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 10.3k, False: 0]
  ------------------
  798|  10.3k|      Buckets = nullptr;
  799|  10.3k|      return false;
  800|  10.3k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|  10.3k|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E13getNumBucketsEv:
  497|    815|  unsigned getNumBuckets() const {
  498|    815|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    815|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE13getNumBucketsEv:
  791|    815|  unsigned getNumBuckets() const {
  792|    815|    return NumBuckets;
  793|    815|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE15allocateBucketsEj:
  795|    815|  bool allocateBuckets(unsigned Num) {
  796|    815|    NumBuckets = Num;
  797|    815|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 815, False: 0]
  ------------------
  798|    815|      Buckets = nullptr;
  799|    815|      return false;
  800|    815|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    815|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEED2Ev:
  687|    815|  ~DenseMap() {
  688|    815|    this->destroyAll();
  689|    815|    operator delete(Buckets);
  690|    815|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E10destroyAllEv:
  334|    815|  void destroyAll() {
  335|    815|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 815, False: 0]
  ------------------
  336|    815|      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|  10.3k|  ~DenseMap() {
  688|  10.3k|    this->destroyAll();
  689|  10.3k|    operator delete(Buckets);
  690|  10.3k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E10destroyAllEv:
  334|  10.3k|  void destroyAll() {
  335|  10.3k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 10.3k, False: 0]
  ------------------
  336|  10.3k|      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|  4.91k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4initEj:
  726|  10.3k|  void init(unsigned InitNumEntries) {
  727|  10.3k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|  10.3k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 10.3k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|  10.3k|    } else {
  731|  10.3k|      NumEntries = 0;
  732|  10.3k|      NumTombstones = 0;
  733|  10.3k|    }
  734|  10.3k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E31getMinBucketToReserveForEntriesEj:
  360|  10.3k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|  10.3k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 10.3k, False: 0]
  ------------------
  363|  10.3k|      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|  10.3k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2EOSD_:
  676|  5.42k|  DenseMap(DenseMap &&other) : BaseT() {
  677|  5.42k|    init(0);
  678|  5.42k|    swap(other);
  679|  5.42k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4swapERSD_:
  692|  5.42k|  void swap(DenseMap& RHS) {
  693|  5.42k|    this->incrementEpoch();
  694|  5.42k|    RHS.incrementEpoch();
  695|  5.42k|    std::swap(Buckets, RHS.Buckets);
  696|  5.42k|    std::swap(NumEntries, RHS.NumEntries);
  697|  5.42k|    std::swap(NumTombstones, RHS.NumTombstones);
  698|  5.42k|    std::swap(NumBuckets, RHS.NumBuckets);
  699|  5.42k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2Ej:
  669|    388|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4initEj:
  726|    815|  void init(unsigned InitNumEntries) {
  727|    815|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    815|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 815]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    815|    } else {
  731|    815|      NumEntries = 0;
  732|    815|      NumTombstones = 0;
  733|    815|    }
  734|    815|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E31getMinBucketToReserveForEntriesEj:
  360|    815|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    815|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 815, False: 0]
  ------------------
  363|    815|      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|    815|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2EOSD_:
  676|    427|  DenseMap(DenseMap &&other) : BaseT() {
  677|    427|    init(0);
  678|    427|    swap(other);
  679|    427|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4swapERSD_:
  692|    427|  void swap(DenseMap& RHS) {
  693|    427|    this->incrementEpoch();
  694|    427|    RHS.incrementEpoch();
  695|    427|    std::swap(Buckets, RHS.Buckets);
  696|    427|    std::swap(NumEntries, RHS.NumEntries);
  697|    427|    std::swap(NumTombstones, RHS.NumTombstones);
  698|    427|    std::swap(NumBuckets, RHS.NumBuckets);
  699|    427|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11try_emplaceIJmEEENSt3__14pairINS_16DenseMapIteratorIS4_jS6_S9_Lb0EEEbEEOS4_DpOT_:
  214|   103k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|   103k|    BucketT *TheBucket;
  216|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 103k, False: 97]
  ------------------
  217|   103k|      return std::make_pair(
  218|   103k|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  219|   103k|               false); // Already in map.
  220|       |
  221|       |    // Otherwise, insert the new element.
  222|     97|    TheBucket =
  223|     97|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|     97|    return std::make_pair(
  225|     97|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|     97|             true);
  227|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|   103k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   103k|    const BucketT *ConstFoundBucket;
  634|   103k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   103k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   103k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   103k|    return Result;
  638|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|   103k|                       const BucketT *&FoundBucket) const {
  583|   103k|    const BucketT *BucketsPtr = getBuckets();
  584|   103k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 11, False: 103k]
  ------------------
  587|     11|      FoundBucket = nullptr;
  588|     11|      return false;
  589|     11|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   103k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   103k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 104]
  |  |  ------------------
  ------------------
  605|   103k|        FoundBucket = ThisBucket;
  606|   103k|        return true;
  607|   103k|      }
  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|    104|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    104|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 97, False: 7]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     97|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 97]
  ------------------
  615|     97|        return false;
  616|     97|      }
  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|      7|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 7]
  ------------------
  621|      7|          !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|      7|      BucketNo += ProbeAmt++;
  627|      7|      BucketNo &= (NumBuckets-1);
  628|      7|    }
  629|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  489|   103k|  const BucketT *getBuckets() const {
  490|   103k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueERKS4_:
  417|   103k|  static unsigned getHashValue(const KeyT &Val) {
  418|   103k|    return KeyInfoT::getHashValue(Val);
  419|   103k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes12UniqueStringEjE8getFirstEv:
   48|   103k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|   103k|                        bool NoAdvance=false) {
  440|   103k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 103k]
  ------------------
  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|   103k|    return iterator(P, E, Epoch, NoAdvance);
  445|   103k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1140|   103k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   103k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   103k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 103k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16InsertIntoBucketIS4_JmEEEPS9_SD_OT_DpOT0_:
  519|     97|                            ValueArgs &&... Values) {
  520|     97|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     97|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     97|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     97|    return TheBucket;
  525|     97|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|     97|                                BucketT *TheBucket) {
  540|     97|    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|     97|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     97|    unsigned NumBuckets = getNumBuckets();
  553|     97|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     97|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 11, False: 86]
  |  |  ------------------
  ------------------
  554|     11|      this->grow(NumBuckets * 2);
  555|     11|      LookupBucketFor(Lookup, TheBucket);
  556|     11|      NumBuckets = getNumBuckets();
  557|     86|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     86|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 86]
  |  |  ------------------
  ------------------
  558|     86|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     97|    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|     97|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     97|    const KeyT EmptyKey = getEmptyKey();
  570|     97|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 97]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     97|    return TheBucket;
  574|     97|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumEntriesEv:
  457|    194|  unsigned getNumEntries() const {
  458|    194|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    194|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumEntriesEv:
  771|    194|  unsigned getNumEntries() const {
  772|    194|    return NumEntries;
  773|    194|  }
_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|    207|  bool allocateBuckets(unsigned Num) {
  796|    207|    NumBuckets = Num;
  797|    207|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 11]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|     11|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     11|    return true;
  804|    207|  }
_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|     11|    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|    108|  void setNumEntries(unsigned Num) {
  462|    108|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    108|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13setNumEntriesEj:
  775|    108|  void setNumEntries(unsigned Num) {
  776|    108|    NumEntries = Num;
  777|    108|  }
_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|     86|  unsigned getNumTombstones() const {
  474|     86|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     86|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16getNumTombstonesEv:
  779|     86|  unsigned getNumTombstones() const {
  780|     86|    return NumTombstones;
  781|     86|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E19incrementNumEntriesEv:
  465|     97|  void incrementNumEntries() {
  466|     97|    setNumEntries(getNumEntries() + 1);
  467|     97|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEptEv:
 1166|   103k|  pointer operator->() const {
 1167|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 103k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   103k|    return Ptr;
 1171|   103k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  837|     13|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|     13|    init(NumInitBuckets);
  839|     13|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  959|     13|  void init(unsigned InitBuckets) {
  960|     13|    Small = true;
  961|     13|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 13]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|     13|    this->BaseT::initEmpty();
  966|     13|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE11getLargeRepEv:
 1079|     33|  LargeRep *getLargeRep() {
 1080|     33|    return const_cast<LargeRep *>(
 1081|     33|      const_cast<const SmallDenseMap *>(this)->getLargeRep());
 1082|     33|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE11getLargeRepEv:
 1073|  1.41k|  const LargeRep *getLargeRep() const {
 1074|  1.41k|    assert(!Small);
 1075|       |    // Note, same rule about aliasing as with getInlineBuckets.
 1076|  1.41k|    return reinterpret_cast<const LargeRep *>(storage.buffer);
 1077|  1.41k|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
 1105|     11|  LargeRep allocateBuckets(unsigned Num) {
 1106|     11|    assert(Num > InlineBuckets && "Must allocate more buckets than are inline");
 1107|     11|    LargeRep Rep = {
 1108|     11|      static_cast<BucketT*>(operator new(sizeof(BucketT) * Num)), Num
 1109|     11|    };
 1110|     11|    return Rep;
 1111|     11|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E9initEmptyEv:
  347|     24|  void initEmpty() {
  348|     24|    setNumEntries(0);
  349|     24|    setNumTombstones(0);
  350|       |
  351|     24|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     24|           "# initial buckets must be a power of two!");
  353|     24|    const KeyT EmptyKey = getEmptyKey();
  354|    936|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 912, False: 24]
  ------------------
  355|    912|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     24|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13setNumEntriesEj:
  461|    506|  void setNumEntries(unsigned Num) {
  462|    506|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    506|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13setNumEntriesEj:
 1046|    506|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|    506|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|    506|    NumEntries = Num;
 1050|    506|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16setNumTombstonesEj:
  477|     37|  void setNumTombstones(unsigned Num) {
  478|     37|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     37|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16setNumTombstonesEj:
 1056|     37|  void setNumTombstones(unsigned Num) {
 1057|     37|    NumTombstones = Num;
 1058|     37|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|  1.31k|  unsigned getNumBuckets() const {
  498|  1.31k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.31k|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
 1093|  1.31k|  unsigned getNumBuckets() const {
 1094|  1.31k|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 522, False: 796]
  ------------------
 1095|  1.31k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E11getEmptyKeyEv:
  426|    900|  static const KeyT getEmptyKey() {
  427|    900|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    900|                  "Must pass the derived type to this template!");
  429|    900|    return KeyInfoT::getEmptyKey();
  430|    900|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10getBucketsEv:
  493|    448|  BucketT *getBuckets() {
  494|    448|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    448|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE10getBucketsEv:
 1088|    459|  BucketT *getBuckets() {
 1089|    459|    return const_cast<BucketT *>(
 1090|    459|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|    459|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE10getBucketsEv:
 1084|    939|  const BucketT *getBuckets() const {
 1085|    939|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 358, False: 581]
  ------------------
 1086|    939|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16getInlineBucketsEv:
 1060|    358|  const BucketT *getInlineBuckets() const {
 1061|    358|    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|    358|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|    358|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getBucketsEndEv:
  501|    398|  BucketT *getBucketsEnd() {
  502|    398|    return getBuckets() + getNumBuckets();
  503|    398|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  857|     13|  ~SmallDenseMap() {
  858|     13|    this->destroyAll();
  859|     13|    deallocateBuckets();
  860|     13|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|     13|  void destroyAll() {
  335|     13|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 13]
  ------------------
  336|      0|      return;
  337|       |
  338|     13|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    749|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 736, False: 13]
  ------------------
  340|    736|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 174, False: 562]
  ------------------
  341|    736|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 174, False: 0]
  ------------------
  342|    174|        P->getSecond().~ValueT();
  343|    736|      P->getFirst().~KeyT();
  344|    736|    }
  345|     13|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15getTombstoneKeyEv:
  432|    528|  static const KeyT getTombstoneKey() {
  433|    528|    return KeyInfoT::getTombstoneKey();
  434|    528|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE17deallocateBucketsEv:
 1097|     13|  void deallocateBuckets() {
 1098|     13|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 2, False: 11]
  ------------------
 1099|      2|      return;
 1100|       |
 1101|     11|    operator delete(getLargeRep()->Buckets);
 1102|     11|    getLargeRep()->~LargeRep();
 1103|     11|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEED2Ev:
  687|     13|  ~DenseMap() {
  688|     13|    this->destroyAll();
  689|     13|    operator delete(Buckets);
  690|     13|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E11try_emplaceIJRS6_EEENSt3__14pairINS_16DenseMapIteratorIS4_S6_S8_SA_Lb0EEEbEERKS4_DpOT_:
  233|    348|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|    348|    BucketT *TheBucket;
  235|    348|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 348]
  ------------------
  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|    348|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|    348|    return std::make_pair(
  243|    348|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|    348|             true);
  245|    348|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15LookupBucketForIS4_EEbRKT_RPSA_:
  632|    480|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    480|    const BucketT *ConstFoundBucket;
  634|    480|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    480|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    480|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    480|    return Result;
  638|    480|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15LookupBucketForIS4_EEbRKT_RPKSA_:
  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: 0, False: 480]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    480|    const BucketT *FoundTombstone = nullptr;
  593|    480|    const KeyT EmptyKey = getEmptyKey();
  594|    480|    const KeyT TombstoneKey = getTombstoneKey();
  595|    480|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    480|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    480|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|    480|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    480|    unsigned ProbeAmt = 1;
  601|    630|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    630|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    630|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    630|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 630]
  |  |  ------------------
  ------------------
  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|    630|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    630|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 480, False: 150]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    480|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 480]
  ------------------
  615|    480|        return false;
  616|    480|      }
  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|    150|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 150]
  ------------------
  621|    150|          !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|    150|      BucketNo += ProbeAmt++;
  627|    150|      BucketNo &= (NumBuckets-1);
  628|    150|    }
  629|    480|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10getBucketsEv:
  489|    480|  const BucketT *getBuckets() const {
  490|    480|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    480|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E12getHashValueERKS4_:
  417|    480|  static unsigned getHashValue(const KeyT &Val) {
  418|    480|    return KeyInfoT::getHashValue(Val);
  419|    480|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|    348|                        bool NoAdvance=false) {
  440|    348|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 348]
  ------------------
  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|    348|    return iterator(P, E, Epoch, NoAdvance);
  445|    348|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1140|    348|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|    348|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|    348|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 348, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16InsertIntoBucketIRKS4_JRS6_EEEPSA_SH_OT_DpOT0_:
  519|    348|                            ValueArgs &&... Values) {
  520|    348|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    348|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    348|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    348|    return TheBucket;
  525|    348|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E20InsertIntoBucketImplIS4_EEPSA_RKS4_RKT_SE_:
  539|    348|                                BucketT *TheBucket) {
  540|    348|    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|    348|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    348|    unsigned NumBuckets = getNumBuckets();
  553|    348|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    348|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 11, False: 337]
  |  |  ------------------
  ------------------
  554|     11|      this->grow(NumBuckets * 2);
  555|     11|      LookupBucketFor(Lookup, TheBucket);
  556|     11|      NumBuckets = getNumBuckets();
  557|    337|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    337|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 337]
  |  |  ------------------
  ------------------
  558|    337|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    348|    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|    348|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    348|    const KeyT EmptyKey = getEmptyKey();
  570|    348|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 348]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    348|    return TheBucket;
  574|    348|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumEntriesEv:
  457|    843|  unsigned getNumEntries() const {
  458|    843|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    843|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumEntriesEv:
 1042|    843|  unsigned getNumEntries() const {
 1043|    843|    return NumEntries;
 1044|    843|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E4growEj:
  509|     11|  void grow(unsigned AtLeast) {
  510|     11|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     11|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4growEj:
  968|     11|  void grow(unsigned AtLeast) {
  969|     11|    if (AtLeast >= InlineBuckets)
  ------------------
  |  Branch (969:9): [True: 11, False: 0]
  ------------------
  970|     11|      AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast-1));
  971|       |
  972|     11|    if (Small) {
  ------------------
  |  Branch (972:9): [True: 11, False: 0]
  ------------------
  973|     11|      if (AtLeast < InlineBuckets)
  ------------------
  |  Branch (973:11): [True: 0, False: 11]
  ------------------
  974|      0|        return; // Nothing to do.
  975|       |
  976|       |      // First move the inline buckets into a temporary storage.
  977|     11|      AlignedCharArrayUnion<BucketT[InlineBuckets]> TmpStorage;
  978|     11|      BucketT *TmpBegin = reinterpret_cast<BucketT *>(TmpStorage.buffer);
  979|     11|      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|     11|      const KeyT EmptyKey = this->getEmptyKey();
  984|     11|      const KeyT TombstoneKey = this->getTombstoneKey();
  985|    187|      for (BucketT *P = getBuckets(), *E = P + InlineBuckets; P != E; ++P) {
  ------------------
  |  Branch (985:63): [True: 176, False: 11]
  ------------------
  986|    176|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (986:13): [True: 121, False: 55]
  ------------------
  987|    176|            !KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (987:13): [True: 121, False: 0]
  ------------------
  988|    121|          assert(size_t(TmpEnd - TmpBegin) < InlineBuckets &&
  989|    121|                 "Too many inline buckets!");
  990|    121|          ::new (&TmpEnd->getFirst()) KeyT(std::move(P->getFirst()));
  991|    121|          ::new (&TmpEnd->getSecond()) ValueT(std::move(P->getSecond()));
  992|    121|          ++TmpEnd;
  993|    121|          P->getSecond().~ValueT();
  994|    121|        }
  995|    176|        P->getFirst().~KeyT();
  996|    176|      }
  997|       |
  998|       |      // Now make this map use the large rep, and move all the entries back
  999|       |      // into it.
 1000|     11|      Small = false;
 1001|     11|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1002|     11|      this->moveFromOldBuckets(TmpBegin, TmpEnd);
 1003|     11|      return;
 1004|     11|    }
 1005|       |
 1006|      0|    LargeRep OldRep = std::move(*getLargeRep());
 1007|      0|    getLargeRep()->~LargeRep();
 1008|      0|    if (AtLeast <= InlineBuckets) {
  ------------------
  |  Branch (1008:9): [True: 0, False: 0]
  ------------------
 1009|      0|      Small = true;
 1010|      0|    } else {
 1011|      0|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1012|      0|    }
 1013|       |
 1014|      0|    this->moveFromOldBuckets(OldRep.Buckets, OldRep.Buckets+OldRep.NumBuckets);
 1015|       |
 1016|       |    // Free the old table.
 1017|      0|    operator delete(OldRep.Buckets);
 1018|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E18moveFromOldBucketsEPSA_SD_:
  369|     11|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     11|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     11|    const KeyT EmptyKey = getEmptyKey();
  374|     11|    const KeyT TombstoneKey = getTombstoneKey();
  375|    132|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 121, False: 11]
  ------------------
  376|    121|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 121, False: 0]
  ------------------
  377|    121|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 121, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|    121|        BucketT *DestBucket;
  380|    121|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|    121|        (void)FoundVal; // silence warning.
  382|    121|        assert(!FoundVal && "Key already in new map?");
  383|    121|        DestBucket->getFirst() = std::move(B->getFirst());
  384|    121|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|    121|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|    121|        B->getSecond().~ValueT();
  389|    121|      }
  390|    121|      B->getFirst().~KeyT();
  391|    121|    }
  392|     11|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16getNumTombstonesEv:
  473|    337|  unsigned getNumTombstones() const {
  474|    337|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    337|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16getNumTombstonesEv:
 1052|    337|  unsigned getNumTombstones() const {
 1053|    337|    return NumTombstones;
 1054|    337|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E19incrementNumEntriesEv:
  465|    469|  void incrementNumEntries() {
  466|    469|    setNumEntries(getNumEntries() + 1);
  467|    469|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E5clearEv:
  113|     13|  void clear() {
  114|     13|    incrementEpoch();
  115|     13|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 0, False: 13]
  |  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|     13|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 7, False: 6]
  |  Branch (119:50): [True: 0, False: 7]
  ------------------
  120|      0|      shrink_and_clear();
  121|      0|      return;
  122|      0|    }
  123|       |
  124|     13|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|     13|    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|    749|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P)
  ------------------
  |  Branch (127:61): [True: 736, False: 13]
  ------------------
  128|    736|        P->getFirst() = EmptyKey;
  129|     13|    } 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|     13|    setNumEntries(0);
  145|     13|    setNumTombstones(0);
  146|     13|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 196]
  ------------------
  336|      0|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  12.7k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 12.5k, False: 196]
  ------------------
  340|  12.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 7.25k, False: 5.29k]
  ------------------
  341|  12.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 7.25k, False: 0]
  ------------------
  342|  7.25k|        P->getSecond().~ValueT();
  343|  12.5k|      P->getFirst().~KeyT();
  344|  12.5k|    }
  345|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13getNumBucketsEv:
  497|  15.8k|  unsigned getNumBuckets() const {
  498|  15.8k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  15.8k|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE13getNumBucketsEv:
  791|  15.8k|  unsigned getNumBuckets() const {
  792|  15.8k|    return NumBuckets;
  793|  15.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E11getEmptyKeyEv:
  426|  14.8k|  static const KeyT getEmptyKey() {
  427|  14.8k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  14.8k|                  "Must pass the derived type to this template!");
  429|  14.8k|    return KeyInfoT::getEmptyKey();
  430|  14.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E15getTombstoneKeyEv:
  432|  7.44k|  static const KeyT getTombstoneKey() {
  433|  7.44k|    return KeyInfoT::getTombstoneKey();
  434|  7.44k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E10getBucketsEv:
  493|    784|  BucketT *getBuckets() {
  494|    784|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    784|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE10getBucketsEv:
  787|  8.23k|  BucketT *getBuckets() const {
  788|  8.23k|    return Buckets;
  789|  8.23k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13getBucketsEndEv:
  501|    392|  BucketT *getBucketsEnd() {
  502|    392|    return getBuckets() + getNumBuckets();
  503|    392|  }
_ZN4llvh6detail12DenseMapPairINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumEE8getFirstEv:
   47|  59.3k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumEE9getSecondEv:
   49|  14.5k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 196]
  ------------------
  336|      0|      return;
  337|       |
  338|    196|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  12.7k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 12.5k, False: 196]
  ------------------
  340|  12.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 1.17k, False: 11.3k]
  ------------------
  341|  12.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 1.17k, False: 0]
  ------------------
  342|  1.17k|        P->getSecond().~ValueT();
  343|  12.5k|      P->getFirst().~KeyT();
  344|  12.5k|    }
  345|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13getNumBucketsEv:
  497|  10.7k|  unsigned getNumBuckets() const {
  498|  10.7k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  10.7k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE13getNumBucketsEv:
  791|  10.7k|  unsigned getNumBuckets() const {
  792|  10.7k|    return NumBuckets;
  793|  10.7k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E11getEmptyKeyEv:
  426|  9.80k|  static const KeyT getEmptyKey() {
  427|  9.80k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  9.80k|                  "Must pass the derived type to this template!");
  429|  9.80k|    return KeyInfoT::getEmptyKey();
  430|  9.80k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E15getTombstoneKeyEv:
  432|  8.42k|  static const KeyT getTombstoneKey() {
  433|  8.42k|    return KeyInfoT::getTombstoneKey();
  434|  8.42k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E10getBucketsEv:
  493|    784|  BucketT *getBuckets() {
  494|    784|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    784|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE10getBucketsEv:
  787|  9.21k|  BucketT *getBuckets() const {
  788|  9.21k|    return Buckets;
  789|  9.21k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13getBucketsEndEv:
  501|    392|  BucketT *getBucketsEnd() {
  502|    392|    return getBuckets() + getNumBuckets();
  503|    392|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEiE8getFirstEv:
   47|  41.1k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEiE9getSecondEv:
   49|  2.35k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE15allocateBucketsEj:
  795|    392|  bool allocateBuckets(unsigned Num) {
  796|    392|    NumBuckets = Num;
  797|    392|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 196]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    196|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    196|    return true;
  804|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E9initEmptyEv:
  347|    196|  void initEmpty() {
  348|    196|    setNumEntries(0);
  349|    196|    setNumTombstones(0);
  350|       |
  351|    196|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    196|           "# initial buckets must be a power of two!");
  353|    196|    const KeyT EmptyKey = getEmptyKey();
  354|  12.7k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 12.5k, False: 196]
  ------------------
  355|  12.5k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13setNumEntriesEj:
  461|  1.37k|  void setNumEntries(unsigned Num) {
  462|  1.37k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.37k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE13setNumEntriesEj:
  775|  1.37k|  void setNumEntries(unsigned Num) {
  776|  1.37k|    NumEntries = Num;
  777|  1.37k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E16setNumTombstonesEj:
  477|    196|  void setNumTombstones(unsigned Num) {
  478|    196|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE16setNumTombstonesEj:
  783|    196|  void setNumTombstones(unsigned Num) {
  784|    196|    NumTombstones = Num;
  785|    196|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE15allocateBucketsEj:
  795|    392|  bool allocateBuckets(unsigned Num) {
  796|    392|    NumBuckets = Num;
  797|    392|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 196]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    196|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    196|    return true;
  804|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E9initEmptyEv:
  347|    196|  void initEmpty() {
  348|    196|    setNumEntries(0);
  349|    196|    setNumTombstones(0);
  350|       |
  351|    196|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    196|           "# initial buckets must be a power of two!");
  353|    196|    const KeyT EmptyKey = getEmptyKey();
  354|  12.7k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 12.5k, False: 196]
  ------------------
  355|  12.5k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13setNumEntriesEj:
  461|  7.44k|  void setNumEntries(unsigned Num) {
  462|  7.44k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  7.44k|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE13setNumEntriesEj:
  775|  7.44k|  void setNumEntries(unsigned Num) {
  776|  7.44k|    NumEntries = Num;
  777|  7.44k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E16setNumTombstonesEj:
  477|    196|  void setNumTombstones(unsigned Num) {
  478|    196|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    196|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE16setNumTombstonesEj:
  783|    196|  void setNumTombstones(unsigned Num) {
  784|    196|    NumTombstones = Num;
  785|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_EixEOS3_:
  315|  8.23k|  ValueT &operator[](KeyT &&Key) {
  316|  8.23k|    return FindAndConstruct(std::move(Key)).second;
  317|  8.23k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E16FindAndConstructEOS3_:
  307|  8.23k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|  8.23k|    BucketT *TheBucket;
  309|  8.23k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 7.05k, False: 1.17k]
  ------------------
  310|  7.05k|      return *TheBucket;
  311|       |
  312|  1.17k|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|  8.23k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E15LookupBucketForIS3_EEbRKT_RPS8_:
  632|  8.42k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  8.42k|    const BucketT *ConstFoundBucket;
  634|  8.42k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  8.42k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  8.42k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  8.42k|    return Result;
  638|  8.42k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  582|  8.42k|                       const BucketT *&FoundBucket) const {
  583|  8.42k|    const BucketT *BucketsPtr = getBuckets();
  584|  8.42k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  8.42k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 8.23k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  8.23k|    const BucketT *FoundTombstone = nullptr;
  593|  8.23k|    const KeyT EmptyKey = getEmptyKey();
  594|  8.23k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  8.23k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  8.23k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  8.23k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  8.23k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  8.23k|    unsigned ProbeAmt = 1;
  601|  8.23k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  8.23k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  8.23k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  8.23k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7.05k, False: 1.17k]
  |  |  ------------------
  ------------------
  605|  7.05k|        FoundBucket = ThisBucket;
  606|  7.05k|        return true;
  607|  7.05k|      }
  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.17k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  1.17k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.17k, 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|  1.17k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1.17k]
  ------------------
  615|  1.17k|        return false;
  616|  1.17k|      }
  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|  8.23k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E10getBucketsEv:
  489|  8.42k|  const BucketT *getBuckets() const {
  490|  8.42k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  8.42k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E12getHashValueERKS3_:
  417|  8.23k|  static unsigned getHashValue(const KeyT &Val) {
  418|  8.23k|    return KeyInfoT::getHashValue(Val);
  419|  8.23k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEiE8getFirstEv:
   48|  9.40k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E16InsertIntoBucketIS3_JEEEPS8_SC_OT_DpOT0_:
  519|  1.17k|                            ValueArgs &&... Values) {
  520|  1.17k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  1.17k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  1.17k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  1.17k|    return TheBucket;
  525|  1.17k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E20InsertIntoBucketImplIS3_EEPS8_RKS3_RKT_SC_:
  539|  1.17k|                                BucketT *TheBucket) {
  540|  1.17k|    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.17k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  1.17k|    unsigned NumBuckets = getNumBuckets();
  553|  1.17k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  1.17k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 196, False: 980]
  |  |  ------------------
  ------------------
  554|    196|      this->grow(NumBuckets * 2);
  555|    196|      LookupBucketFor(Lookup, TheBucket);
  556|    196|      NumBuckets = getNumBuckets();
  557|    980|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    980|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 980]
  |  |  ------------------
  ------------------
  558|    980|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  1.17k|    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|  1.17k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  1.17k|    const KeyT EmptyKey = getEmptyKey();
  570|  1.17k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 1.17k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  1.17k|    return TheBucket;
  574|  1.17k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13getNumEntriesEv:
  457|  2.35k|  unsigned getNumEntries() const {
  458|  2.35k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  2.35k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE13getNumEntriesEv:
  771|  2.35k|  unsigned getNumEntries() const {
  772|  2.35k|    return NumEntries;
  773|  2.35k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E4growEj:
  509|    196|  void grow(unsigned AtLeast) {
  510|    196|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE4growEj:
  736|    196|  void grow(unsigned AtLeast) {
  737|    196|    unsigned OldNumBuckets = NumBuckets;
  738|    196|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    196|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    196|    assert(Buckets);
  742|    196|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 0]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  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|    980|  unsigned getNumTombstones() const {
  474|    980|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    980|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE16getNumTombstonesEv:
  779|    980|  unsigned getNumTombstones() const {
  780|    980|    return NumTombstones;
  781|    980|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E19incrementNumEntriesEv:
  465|  1.17k|  void incrementNumEntries() {
  466|  1.17k|    setNumEntries(getNumEntries() + 1);
  467|  1.17k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_EixEOS6_:
  315|  7.25k|  ValueT &operator[](KeyT &&Key) {
  316|  7.25k|    return FindAndConstruct(std::move(Key)).second;
  317|  7.25k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E16FindAndConstructEOS6_:
  307|  7.25k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|  7.25k|    BucketT *TheBucket;
  309|  7.25k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 7.25k]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|  7.25k|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|  7.25k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E15LookupBucketForIS6_EEbRKT_RPSD_:
  632|  7.44k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  7.44k|    const BucketT *ConstFoundBucket;
  634|  7.44k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  7.44k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  7.44k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  7.44k|    return Result;
  638|  7.44k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E15LookupBucketForIS6_EEbRKT_RPKSD_:
  582|  7.44k|                       const BucketT *&FoundBucket) const {
  583|  7.44k|    const BucketT *BucketsPtr = getBuckets();
  584|  7.44k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  7.44k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 196, False: 7.25k]
  ------------------
  587|    196|      FoundBucket = nullptr;
  588|    196|      return false;
  589|    196|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  7.25k|    const BucketT *FoundTombstone = nullptr;
  593|  7.25k|    const KeyT EmptyKey = getEmptyKey();
  594|  7.25k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  7.25k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  7.25k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  7.25k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  7.25k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  7.25k|    unsigned ProbeAmt = 1;
  601|  10.8k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  10.8k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  10.8k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  10.8k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 10.8k]
  |  |  ------------------
  ------------------
  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|  10.8k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  10.8k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7.25k, False: 3.60k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  7.25k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 7.25k]
  ------------------
  615|  7.25k|        return false;
  616|  7.25k|      }
  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.60k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 3.60k]
  ------------------
  621|  3.60k|          !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.60k|      BucketNo += ProbeAmt++;
  627|  3.60k|      BucketNo &= (NumBuckets-1);
  628|  3.60k|    }
  629|  7.25k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E10getBucketsEv:
  489|  7.44k|  const BucketT *getBuckets() const {
  490|  7.44k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  7.44k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E12getHashValueERKS6_:
  417|  7.25k|  static unsigned getHashValue(const KeyT &Val) {
  418|  7.25k|    return KeyInfoT::getHashValue(Val);
  419|  7.25k|  }
_ZNK4llvh6detail12DenseMapPairINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumEE8getFirstEv:
   48|  25.3k|  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|  7.25k|                            ValueArgs &&... Values) {
  520|  7.25k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  7.25k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  7.25k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  7.25k|    return TheBucket;
  525|  7.25k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E20InsertIntoBucketImplIS6_EEPSD_RKS6_RKT_SH_:
  539|  7.25k|                                BucketT *TheBucket) {
  540|  7.25k|    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|  7.25k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  7.25k|    unsigned NumBuckets = getNumBuckets();
  553|  7.25k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  7.25k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 196, False: 7.05k]
  |  |  ------------------
  ------------------
  554|    196|      this->grow(NumBuckets * 2);
  555|    196|      LookupBucketFor(Lookup, TheBucket);
  556|    196|      NumBuckets = getNumBuckets();
  557|  7.05k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  7.05k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7.05k]
  |  |  ------------------
  ------------------
  558|  7.05k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  7.25k|    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|  7.25k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  7.25k|    const KeyT EmptyKey = getEmptyKey();
  570|  7.25k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 7.25k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  7.25k|    return TheBucket;
  574|  7.25k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13getNumEntriesEv:
  457|  14.5k|  unsigned getNumEntries() const {
  458|  14.5k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  14.5k|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE13getNumEntriesEv:
  771|  14.5k|  unsigned getNumEntries() const {
  772|  14.5k|    return NumEntries;
  773|  14.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E4growEj:
  509|    196|  void grow(unsigned AtLeast) {
  510|    196|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    196|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE4growEj:
  736|    196|  void grow(unsigned AtLeast) {
  737|    196|    unsigned OldNumBuckets = NumBuckets;
  738|    196|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    196|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    196|    assert(Buckets);
  742|    196|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 0]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  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|  7.05k|  unsigned getNumTombstones() const {
  474|  7.05k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  7.05k|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE16getNumTombstonesEv:
  779|  7.05k|  unsigned getNumTombstones() const {
  780|  7.05k|    return NumTombstones;
  781|  7.05k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E19incrementNumEntriesEv:
  465|  7.25k|  void incrementNumEntries() {
  466|  7.25k|    setNumEntries(getNumEntries() + 1);
  467|  7.25k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEC2Ej:
  669|   136k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4initEj:
  726|   136k|  void init(unsigned InitNumEntries) {
  727|   136k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   136k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 136k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   136k|    } else {
  731|   136k|      NumEntries = 0;
  732|   136k|      NumTombstones = 0;
  733|   136k|    }
  734|   136k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|   136k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   136k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 136k, False: 0]
  ------------------
  363|   136k|      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|   136k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE15allocateBucketsEj:
  795|   136k|  bool allocateBuckets(unsigned Num) {
  796|   136k|    NumBuckets = Num;
  797|   136k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 136k, False: 116]
  ------------------
  798|   136k|      Buckets = nullptr;
  799|   136k|      return false;
  800|   136k|    }
  801|       |
  802|    116|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    116|    return true;
  804|   136k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E9initEmptyEv:
  347|    116|  void initEmpty() {
  348|    116|    setNumEntries(0);
  349|    116|    setNumTombstones(0);
  350|       |
  351|    116|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    116|           "# initial buckets must be a power of two!");
  353|    116|    const KeyT EmptyKey = getEmptyKey();
  354|  31.2k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 31.1k, False: 116]
  ------------------
  355|  31.1k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    116|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13setNumEntriesEj:
  461|  19.0k|  void setNumEntries(unsigned Num) {
  462|  19.0k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  19.0k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13setNumEntriesEj:
  775|  19.0k|  void setNumEntries(unsigned Num) {
  776|  19.0k|    NumEntries = Num;
  777|  19.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16setNumTombstonesEj:
  477|    116|  void setNumTombstones(unsigned Num) {
  478|    116|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    116|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16setNumTombstonesEj:
  783|    116|  void setNumTombstones(unsigned Num) {
  784|    116|    NumTombstones = Num;
  785|    116|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumBucketsEv:
  497|  4.99M|  unsigned getNumBuckets() const {
  498|  4.99M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  4.99M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumBucketsEv:
  791|  4.99M|  unsigned getNumBuckets() const {
  792|  4.99M|    return NumBuckets;
  793|  4.99M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E11getEmptyKeyEv:
  426|   824k|  static const KeyT getEmptyKey() {
  427|   824k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   824k|                  "Must pass the derived type to this template!");
  429|   824k|    return KeyInfoT::getEmptyKey();
  430|   824k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  493|  3.86M|  BucketT *getBuckets() {
  494|  3.86M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  3.86M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
  787|  4.84M|  BucketT *getBuckets() const {
  788|  4.84M|    return Buckets;
  789|  4.84M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getBucketsEndEv:
  501|  3.86M|  BucketT *getBucketsEnd() {
  502|  3.86M|    return getBuckets() + getNumBuckets();
  503|  3.86M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueEPNS2_7MovInstEE8getFirstEv:
   47|   160k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEED2Ev:
  687|   136k|  ~DenseMap() {
  688|   136k|    this->destroyAll();
  689|   136k|    operator delete(Buckets);
  690|   136k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10destroyAllEv:
  334|   136k|  void destroyAll() {
  335|   136k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 136k, False: 62]
  ------------------
  336|   136k|      return;
  337|       |
  338|     62|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  17.5k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 17.5k, False: 62]
  ------------------
  340|  17.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 8.82k, False: 8.70k]
  ------------------
  341|  17.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 8.82k, False: 0]
  ------------------
  342|  8.82k|        P->getSecond().~ValueT();
  343|  17.5k|      P->getFirst().~KeyT();
  344|  17.5k|    }
  345|     62|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15getTombstoneKeyEv:
  432|   815k|  static const KeyT getTombstoneKey() {
  433|   815k|    return KeyInfoT::getTombstoneKey();
  434|   815k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueEPNS2_7MovInstEE9getSecondEv:
   49|  48.0k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_EixERKS4_:
  303|  8.82k|  ValueT &operator[](const KeyT &Key) {
  304|  8.82k|    return FindAndConstruct(Key).second;
  305|  8.82k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16FindAndConstructERKS4_:
  295|  8.82k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  8.82k|    BucketT *TheBucket;
  297|  8.82k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 8.82k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|  8.82k|    return *InsertIntoBucket(TheBucket, Key);
  301|  8.82k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPSB_:
  632|  19.0k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  19.0k|    const BucketT *ConstFoundBucket;
  634|  19.0k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  19.0k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  19.0k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  19.0k|    return Result;
  638|  19.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPKSB_:
  582|  19.0k|                       const BucketT *&FoundBucket) const {
  583|  19.0k|    const BucketT *BucketsPtr = getBuckets();
  584|  19.0k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  19.0k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 62, False: 19.0k]
  ------------------
  587|     62|      FoundBucket = nullptr;
  588|     62|      return false;
  589|     62|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  19.0k|    const BucketT *FoundTombstone = nullptr;
  593|  19.0k|    const KeyT EmptyKey = getEmptyKey();
  594|  19.0k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  19.0k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  19.0k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  19.0k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  19.0k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  19.0k|    unsigned ProbeAmt = 1;
  601|  35.1k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  35.1k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  35.1k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  35.1k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 35.1k]
  |  |  ------------------
  ------------------
  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|  35.1k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  35.1k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 19.0k, False: 16.1k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  19.0k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 19.0k]
  ------------------
  615|  19.0k|        return false;
  616|  19.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|  16.1k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 16.1k]
  ------------------
  621|  16.1k|          !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|  16.1k|      BucketNo += ProbeAmt++;
  627|  16.1k|      BucketNo &= (NumBuckets-1);
  628|  16.1k|    }
  629|  19.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  489|   984k|  const BucketT *getBuckets() const {
  490|   984k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   984k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueERKS4_:
  417|  19.0k|  static unsigned getHashValue(const KeyT &Val) {
  418|  19.0k|    return KeyInfoT::getHashValue(Val);
  419|  19.0k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes5ValueEPNS2_7MovInstEE8getFirstEv:
   48|  6.74M|  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|  8.82k|                            ValueArgs &&... Values) {
  520|  8.82k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  8.82k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  8.82k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  8.82k|    return TheBucket;
  525|  8.82k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E20InsertIntoBucketImplIS4_EEPSB_RKS4_RKT_SF_:
  539|  8.82k|                                BucketT *TheBucket) {
  540|  8.82k|    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|  8.82k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  8.82k|    unsigned NumBuckets = getNumBuckets();
  553|  8.82k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  8.82k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 116, False: 8.71k]
  |  |  ------------------
  ------------------
  554|    116|      this->grow(NumBuckets * 2);
  555|    116|      LookupBucketFor(Lookup, TheBucket);
  556|    116|      NumBuckets = getNumBuckets();
  557|  8.71k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  8.71k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 8.71k]
  |  |  ------------------
  ------------------
  558|  8.71k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  8.82k|    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|  8.82k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  8.82k|    const KeyT EmptyKey = getEmptyKey();
  570|  8.82k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 8.82k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  8.82k|    return TheBucket;
  574|  8.82k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumEntriesEv:
  457|  27.7k|  unsigned getNumEntries() const {
  458|  27.7k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  27.7k|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumEntriesEv:
  771|  27.7k|  unsigned getNumEntries() const {
  772|  27.7k|    return NumEntries;
  773|  27.7k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4growEj:
  509|    116|  void grow(unsigned AtLeast) {
  510|    116|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    116|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4growEj:
  736|    116|  void grow(unsigned AtLeast) {
  737|    116|    unsigned OldNumBuckets = NumBuckets;
  738|    116|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    116|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    116|    assert(Buckets);
  742|    116|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 62, False: 54]
  ------------------
  743|     62|      this->BaseT::initEmpty();
  744|     62|      return;
  745|     62|    }
  746|       |
  747|     54|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     54|    operator delete(OldBuckets);
  751|     54|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E18moveFromOldBucketsEPSB_SE_:
  369|     54|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     54|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     54|    const KeyT EmptyKey = getEmptyKey();
  374|     54|    const KeyT TombstoneKey = getTombstoneKey();
  375|  13.6k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 13.5k, False: 54]
  ------------------
  376|  13.5k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 10.1k, False: 3.44k]
  ------------------
  377|  13.5k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 10.1k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  10.1k|        BucketT *DestBucket;
  380|  10.1k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  10.1k|        (void)FoundVal; // silence warning.
  382|  10.1k|        assert(!FoundVal && "Key already in new map?");
  383|  10.1k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  10.1k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  10.1k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  10.1k|        B->getSecond().~ValueT();
  389|  10.1k|      }
  390|  13.5k|      B->getFirst().~KeyT();
  391|  13.5k|    }
  392|     54|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16getNumTombstonesEv:
  473|  8.71k|  unsigned getNumTombstones() const {
  474|  8.71k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  8.71k|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16getNumTombstonesEv:
  779|  8.71k|  unsigned getNumTombstones() const {
  780|  8.71k|    return NumTombstones;
  781|  8.71k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E19incrementNumEntriesEv:
  465|  18.9k|  void incrementNumEntries() {
  466|  18.9k|    setNumEntries(getNumEntries() + 1);
  467|  18.9k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4findEPKS3_:
  154|   965k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   965k|    BucketT *TheBucket;
  156|   965k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 965k]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   965k|    return end();
  159|   965k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPSB_:
  632|   965k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   965k|    const BucketT *ConstFoundBucket;
  634|   965k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   965k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   965k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   965k|    return Result;
  638|   965k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPKSB_:
  582|   965k|                       const BucketT *&FoundBucket) const {
  583|   965k|    const BucketT *BucketsPtr = getBuckets();
  584|   965k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   965k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 169k, False: 796k]
  ------------------
  587|   169k|      FoundBucket = nullptr;
  588|   169k|      return false;
  589|   169k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   796k|    const BucketT *FoundTombstone = nullptr;
  593|   796k|    const KeyT EmptyKey = getEmptyKey();
  594|   796k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   796k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   796k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   796k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   796k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   796k|    unsigned ProbeAmt = 1;
  601|  2.48M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  2.48M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  2.48M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  2.48M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 2.48M]
  |  |  ------------------
  ------------------
  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.48M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  2.48M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 796k, False: 1.68M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   796k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 796k]
  ------------------
  615|   796k|        return false;
  616|   796k|      }
  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.68M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.68M]
  ------------------
  621|  1.68M|          !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.68M|      BucketNo += ProbeAmt++;
  627|  1.68M|      BucketNo &= (NumBuckets-1);
  628|  1.68M|    }
  629|   796k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueIPKS3_EEjRKT_:
  422|   796k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   796k|    return KeyInfoT::getHashValue(Val);
  424|   796k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|  1.93M|                        bool NoAdvance=false) {
  440|  1.93M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 1.93M]
  ------------------
  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.93M|    return iterator(P, E, Epoch, NoAdvance);
  445|  1.93M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1140|  1.93M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  1.93M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  1.93M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 1.93M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E3endEv:
   85|  1.93M|  inline iterator end() {
   86|  1.93M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  1.93M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEneERKSB_:
 1190|   965k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   965k|    return !(*this == RHS);
 1192|   965k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEeqERKSB_:
 1180|   965k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   965k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   965k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   965k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   965k|           "comparing incomparable iterators!");
 1185|   965k|    return Ptr == RHS.Ptr;
 1186|   965k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5countEPKS3_:
  149|  3.02M|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  3.02M|    const BucketT *TheBucket;
  151|  3.02M|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 3.02M, False: 0]
  ------------------
  152|  3.02M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPKSB_:
  582|  3.02M|                       const BucketT *&FoundBucket) const {
  583|  3.02M|    const BucketT *BucketsPtr = getBuckets();
  584|  3.02M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  3.02M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 3.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|  3.02M|    const BucketT *FoundTombstone = nullptr;
  593|  3.02M|    const KeyT EmptyKey = getEmptyKey();
  594|  3.02M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  3.02M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  3.02M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  3.02M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  3.02M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  3.02M|    unsigned ProbeAmt = 1;
  601|  3.10M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  3.10M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  3.10M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  3.10M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.02M, False: 76.7k]
  |  |  ------------------
  ------------------
  605|  3.02M|        FoundBucket = ThisBucket;
  606|  3.02M|        return true;
  607|  3.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|  76.7k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  76.7k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 76.7k]
  |  |  ------------------
  ------------------
  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|  76.7k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 76.7k]
  ------------------
  621|  76.7k|          !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|  76.7k|      BucketNo += ProbeAmt++;
  627|  76.7k|      BucketNo &= (NumBuckets-1);
  628|  76.7k|    }
  629|  3.02M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  489|  3.32M|  const BucketT *getBuckets() const {
  490|  3.32M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  3.32M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueIPKS3_EEjRKT_:
  422|  3.02M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  3.02M|    return KeyInfoT::getHashValue(Val);
  424|  3.02M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoEE8getFirstEv:
   48|  4.23M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_EixERKS4_:
  303|   263k|  ValueT &operator[](const KeyT &Key) {
  304|   263k|    return FindAndConstruct(Key).second;
  305|   263k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16FindAndConstructERKS4_:
  295|   263k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   263k|    BucketT *TheBucket;
  297|   263k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 230k, False: 33.0k]
  ------------------
  298|   230k|      return *TheBucket;
  299|       |
  300|  33.0k|    return *InsertIntoBucket(TheBucket, Key);
  301|   263k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPSB_:
  632|   301k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   301k|    const BucketT *ConstFoundBucket;
  634|   301k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   301k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   301k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   301k|    return Result;
  638|   301k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPKSB_:
  582|   301k|                       const BucketT *&FoundBucket) const {
  583|   301k|    const BucketT *BucketsPtr = getBuckets();
  584|   301k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   301k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 350, False: 301k]
  ------------------
  587|    350|      FoundBucket = nullptr;
  588|    350|      return false;
  589|    350|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   301k|    const BucketT *FoundTombstone = nullptr;
  593|   301k|    const KeyT EmptyKey = getEmptyKey();
  594|   301k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   301k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   301k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   301k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   301k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   301k|    unsigned ProbeAmt = 1;
  601|   503k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   503k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   503k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   503k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 230k, False: 273k]
  |  |  ------------------
  ------------------
  605|   230k|        FoundBucket = ThisBucket;
  606|   230k|        return true;
  607|   230k|      }
  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|   273k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   273k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 71.1k, False: 202k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  71.1k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 71.1k]
  ------------------
  615|  71.1k|        return false;
  616|  71.1k|      }
  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|   202k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 202k]
  ------------------
  621|   202k|          !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|   202k|      BucketNo += ProbeAmt++;
  627|   202k|      BucketNo &= (NumBuckets-1);
  628|   202k|    }
  629|   301k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueERKS4_:
  417|   301k|  static unsigned getHashValue(const KeyT &Val) {
  418|   301k|    return KeyInfoT::getHashValue(Val);
  419|   301k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16InsertIntoBucketIRKS4_JEEEPSB_SH_OT_DpOT0_:
  519|  33.0k|                            ValueArgs &&... Values) {
  520|  33.0k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  33.0k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  33.0k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  33.0k|    return TheBucket;
  525|  33.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E20InsertIntoBucketImplIS4_EEPSB_RKS4_RKT_SF_:
  539|  33.0k|                                BucketT *TheBucket) {
  540|  33.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|  33.0k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  33.0k|    unsigned NumBuckets = getNumBuckets();
  553|  33.0k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  33.0k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 889, False: 32.1k]
  |  |  ------------------
  ------------------
  554|    889|      this->grow(NumBuckets * 2);
  555|    889|      LookupBucketFor(Lookup, TheBucket);
  556|    889|      NumBuckets = getNumBuckets();
  557|  32.1k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  32.1k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 32.1k]
  |  |  ------------------
  ------------------
  558|  32.1k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  33.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|  33.0k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  33.0k|    const KeyT EmptyKey = getEmptyKey();
  570|  33.0k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 33.0k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  33.0k|    return TheBucket;
  574|  33.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumEntriesEv:
  457|   105k|  unsigned getNumEntries() const {
  458|   105k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   105k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumEntriesEv:
  771|   105k|  unsigned getNumEntries() const {
  772|   105k|    return NumEntries;
  773|   105k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4growEj:
  509|    889|  void grow(unsigned AtLeast) {
  510|    889|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    889|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4growEj:
  736|    889|  void grow(unsigned AtLeast) {
  737|    889|    unsigned OldNumBuckets = NumBuckets;
  738|    889|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    889|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    889|    assert(Buckets);
  742|    889|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 350, False: 539]
  ------------------
  743|    350|      this->BaseT::initEmpty();
  744|    350|      return;
  745|    350|    }
  746|       |
  747|    539|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    539|    operator delete(OldBuckets);
  751|    539|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E18moveFromOldBucketsEPSB_SE_:
  369|    539|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    539|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    539|    const KeyT EmptyKey = getEmptyKey();
  374|    539|    const KeyT TombstoneKey = getTombstoneKey();
  375|  51.3k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 50.8k, False: 539]
  ------------------
  376|  50.8k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 37.5k, False: 13.2k]
  ------------------
  377|  50.8k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 37.5k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  37.5k|        BucketT *DestBucket;
  380|  37.5k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  37.5k|        (void)FoundVal; // silence warning.
  382|  37.5k|        assert(!FoundVal && "Key already in new map?");
  383|  37.5k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  37.5k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  37.5k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  37.5k|        B->getSecond().~ValueT();
  389|  37.5k|      }
  390|  50.8k|      B->getFirst().~KeyT();
  391|  50.8k|    }
  392|    539|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16getNumTombstonesEv:
  473|  32.1k|  unsigned getNumTombstones() const {
  474|  32.1k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  32.1k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16getNumTombstonesEv:
  779|  32.1k|  unsigned getNumTombstones() const {
  780|  32.1k|    return NumTombstones;
  781|  32.1k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E19incrementNumEntriesEv:
  465|  70.5k|  void incrementNumEntries() {
  466|  70.5k|    setNumEntries(getNumEntries() + 1);
  467|  70.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5beginEv:
   76|    700|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|    700|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 700]
  ------------------
   80|      0|      return end();
   81|    700|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 700]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|    700|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|    700|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5emptyEv:
   99|    700|  LLVM_NODISCARD bool empty() const {
  100|    700|    return getNumEntries() == 0;
  101|    700|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|  1.40k|                        bool NoAdvance=false) {
  440|  1.40k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 1.40k]
  ------------------
  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.40k|    return iterator(P, E, Epoch, NoAdvance);
  445|  1.40k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1140|  1.40k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  1.40k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  1.40k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 700, False: 700]
  ------------------
 1144|    700|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 700]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|    700|    AdvancePastEmptyBuckets();
 1149|    700|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|  66.7k|  void AdvancePastEmptyBuckets() {
 1212|  66.7k|    assert(Ptr <= End);
 1213|  66.7k|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|  66.7k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|   147k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 146k, False: 700]
  |  Branch (1216:27): [True: 80.3k, False: 66.0k]
  ------------------
 1217|   146k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 66.0k]
  ------------------
 1218|  80.3k|      ++Ptr;
 1219|  66.7k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E3endEv:
   85|    700|  inline iterator end() {
   86|    700|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|    700|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEneERKSB_:
 1190|  66.7k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  66.7k|    return !(*this == RHS);
 1192|  66.7k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEeqERKSB_:
 1180|  66.7k|  bool operator==(const NonConstIterator &RHS) const {
 1181|  66.7k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  66.7k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  66.7k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  66.7k|           "comparing incomparable iterators!");
 1185|  66.7k|    return Ptr == RHS.Ptr;
 1186|  66.7k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEppEv:
 1194|  66.0k|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|  66.0k|    assert(isHandleInSync() && "invalid iterator access!");
 1196|  66.0k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 66.0k]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|  66.0k|    ++Ptr;
 1202|  66.0k|    AdvancePastEmptyBuckets();
 1203|  66.0k|    return *this;
 1204|  66.0k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEdeEv:
 1160|  66.0k|  reference operator*() const {
 1161|  66.0k|    assert(isHandleInSync() && "invalid iterator access!");
 1162|  66.0k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 66.0k]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|  66.0k|    return *Ptr;
 1165|  66.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E5countEPKS3_:
  149|  2.89M|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  2.89M|    const BucketT *TheBucket;
  151|  2.89M|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 88, False: 2.89M]
  ------------------
  152|  2.89M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E15LookupBucketForIPKS3_EEbRKT_RPKS9_:
  582|  2.89M|                       const BucketT *&FoundBucket) const {
  583|  2.89M|    const BucketT *BucketsPtr = getBuckets();
  584|  2.89M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  2.89M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 2.86M, False: 33.4k]
  ------------------
  587|  2.86M|      FoundBucket = nullptr;
  588|  2.86M|      return false;
  589|  2.86M|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  33.4k|    const BucketT *FoundTombstone = nullptr;
  593|  33.4k|    const KeyT EmptyKey = getEmptyKey();
  594|  33.4k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  33.4k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  33.4k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  33.4k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  33.4k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  33.4k|    unsigned ProbeAmt = 1;
  601|  43.4k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  43.4k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  43.4k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  43.4k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 88, False: 43.3k]
  |  |  ------------------
  ------------------
  605|     88|        FoundBucket = ThisBucket;
  606|     88|        return true;
  607|     88|      }
  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|  43.3k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  43.3k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 33.3k, False: 9.93k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  33.3k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 33.3k]
  ------------------
  615|  33.3k|        return false;
  616|  33.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|  9.93k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 9.93k]
  ------------------
  621|  9.93k|          !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|  9.93k|      BucketNo += ProbeAmt++;
  627|  9.93k|      BucketNo &= (NumBuckets-1);
  628|  9.93k|    }
  629|  33.4k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E10getBucketsEv:
  489|  2.89M|  const BucketT *getBuckets() const {
  490|  2.89M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  2.89M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE10getBucketsEv:
  787|  2.89M|  BucketT *getBuckets() const {
  788|  2.89M|    return Buckets;
  789|  2.89M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E13getNumBucketsEv:
  497|  2.89M|  unsigned getNumBuckets() const {
  498|  2.89M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.89M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE13getNumBucketsEv:
  791|  2.89M|  unsigned getNumBuckets() const {
  792|  2.89M|    return NumBuckets;
  793|  2.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E11getEmptyKeyEv:
  426|  33.6k|  static const KeyT getEmptyKey() {
  427|  33.6k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  33.6k|                  "Must pass the derived type to this template!");
  429|  33.6k|    return KeyInfoT::getEmptyKey();
  430|  33.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E15getTombstoneKeyEv:
  432|  33.5k|  static const KeyT getTombstoneKey() {
  433|  33.5k|    return KeyInfoT::getTombstoneKey();
  434|  33.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E12getHashValueIPKS3_EEjRKT_:
  422|  33.4k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  33.4k|    return KeyInfoT::getHashValue(Val);
  424|  33.4k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes11InstructionES4_E8getFirstEv:
   48|  96.8k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_EixEOS4_:
  315|     32|  ValueT &operator[](KeyT &&Key) {
  316|     32|    return FindAndConstruct(std::move(Key)).second;
  317|     32|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E16FindAndConstructEOS4_:
  307|     32|  value_type& FindAndConstruct(KeyT &&Key) {
  308|     32|    BucketT *TheBucket;
  309|     32|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 32]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|     32|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|     32|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|     92|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|     92|    const BucketT *ConstFoundBucket;
  634|     92|    bool Result = const_cast<const DenseMapBase *>(this)
  635|     92|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|     92|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|     92|    return Result;
  638|     92|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|     92|                       const BucketT *&FoundBucket) const {
  583|     92|    const BucketT *BucketsPtr = getBuckets();
  584|     92|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|     92|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 4, False: 88]
  ------------------
  587|      4|      FoundBucket = nullptr;
  588|      4|      return false;
  589|      4|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|     88|    const BucketT *FoundTombstone = nullptr;
  593|     88|    const KeyT EmptyKey = getEmptyKey();
  594|     88|    const KeyT TombstoneKey = getTombstoneKey();
  595|     88|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|     88|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|     88|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|     88|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|     88|    unsigned ProbeAmt = 1;
  601|    101|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    101|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    101|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    101|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 32, False: 69]
  |  |  ------------------
  ------------------
  605|     32|        FoundBucket = ThisBucket;
  606|     32|        return true;
  607|     32|      }
  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|     69|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     69|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 56, False: 13]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     56|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 56]
  ------------------
  615|     56|        return false;
  616|     56|      }
  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|     13|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 13]
  ------------------
  621|     13|          !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|     13|      BucketNo += ProbeAmt++;
  627|     13|      BucketNo &= (NumBuckets-1);
  628|     13|    }
  629|     88|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E12getHashValueERKS4_:
  417|     88|  static unsigned getHashValue(const KeyT &Val) {
  418|     88|    return KeyInfoT::getHashValue(Val);
  419|     88|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E16InsertIntoBucketIS4_JEEEPS9_SD_OT_DpOT0_:
  519|     32|                            ValueArgs &&... Values) {
  520|     32|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     32|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     32|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     32|    return TheBucket;
  525|     32|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|     56|                                BucketT *TheBucket) {
  540|     56|    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|     56|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     56|    unsigned NumBuckets = getNumBuckets();
  553|     56|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     56|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 52]
  |  |  ------------------
  ------------------
  554|      4|      this->grow(NumBuckets * 2);
  555|      4|      LookupBucketFor(Lookup, TheBucket);
  556|      4|      NumBuckets = getNumBuckets();
  557|     52|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  558|     52|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     56|    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|     56|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     56|    const KeyT EmptyKey = getEmptyKey();
  570|     56|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 56]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     56|    return TheBucket;
  574|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E13getNumEntriesEv:
  457|    486|  unsigned getNumEntries() const {
  458|    486|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    486|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE13getNumEntriesEv:
  771|    486|  unsigned getNumEntries() const {
  772|    486|    return NumEntries;
  773|    486|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E4growEj:
  509|      4|  void grow(unsigned AtLeast) {
  510|      4|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      4|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_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: 4, False: 0]
  ------------------
  743|      4|      this->BaseT::initEmpty();
  744|      4|      return;
  745|      4|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE15allocateBucketsEj:
  795|    354|  bool allocateBuckets(unsigned Num) {
  796|    354|    NumBuckets = Num;
  797|    354|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 350, False: 4]
  ------------------
  798|    350|      Buckets = nullptr;
  799|    350|      return false;
  800|    350|    }
  801|       |
  802|      4|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      4|    return true;
  804|    354|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_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|      4|    const KeyT EmptyKey = getEmptyKey();
  354|    260|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 256, False: 4]
  ------------------
  355|    256|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E13setNumEntriesEj:
  461|     60|  void setNumEntries(unsigned Num) {
  462|     60|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     60|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE13setNumEntriesEj:
  775|     60|  void setNumEntries(unsigned Num) {
  776|     60|    NumEntries = Num;
  777|     60|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E16setNumTombstonesEj:
  477|      4|  void setNumTombstones(unsigned Num) {
  478|      4|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      4|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE16setNumTombstonesEj:
  783|      4|  void setNumTombstones(unsigned Num) {
  784|      4|    NumTombstones = Num;
  785|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E10getBucketsEv:
  493|  1.51k|  BucketT *getBuckets() {
  494|  1.51k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.51k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E13getBucketsEndEv:
  501|  1.47k|  BucketT *getBucketsEnd() {
  502|  1.47k|    return getBuckets() + getNumBuckets();
  503|  1.47k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E16getNumTombstonesEv:
  473|     52|  unsigned getNumTombstones() const {
  474|     52|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     52|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE16getNumTombstonesEv:
  779|     52|  unsigned getNumTombstones() const {
  780|     52|    return NumTombstones;
  781|     52|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E19incrementNumEntriesEv:
  465|     56|  void incrementNumEntries() {
  466|     56|    setNumEntries(getNumEntries() + 1);
  467|     56|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes11InstructionES4_E8getFirstEv:
   47|  3.03k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIPN6hermes11InstructionES4_E9getSecondEv:
   49|    112|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_EixERKS4_:
  303|     56|  ValueT &operator[](const KeyT &Key) {
  304|     56|    return FindAndConstruct(Key).second;
  305|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E16FindAndConstructERKS4_:
  295|     56|  value_type& FindAndConstruct(const KeyT &Key) {
  296|     56|    BucketT *TheBucket;
  297|     56|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 32, False: 24]
  ------------------
  298|     32|      return *TheBucket;
  299|       |
  300|     24|    return *InsertIntoBucket(TheBucket, Key);
  301|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E16InsertIntoBucketIRKS4_JEEEPS9_SF_OT_DpOT0_:
  519|     24|                            ValueArgs &&... Values) {
  520|     24|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     24|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     24|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     24|    return TheBucket;
  525|     24|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E5beginEv:
   76|    374|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|    374|    if (empty())
  ------------------
  |  Branch (79:9): [True: 346, False: 28]
  ------------------
   80|    346|      return end();
   81|     28|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 28]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|     28|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|     28|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E5emptyEv:
   99|    374|  LLVM_NODISCARD bool empty() const {
  100|    374|    return getNumEntries() == 0;
  101|    374|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|    748|                        bool NoAdvance=false) {
  440|    748|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 748]
  ------------------
  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|    748|    return iterator(P, E, Epoch, NoAdvance);
  445|    748|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1140|    748|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|    748|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|    748|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 720, False: 28]
  ------------------
 1144|     28|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 28]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|     28|    AdvancePastEmptyBuckets();
 1149|     28|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|    336|  void AdvancePastEmptyBuckets() {
 1212|    336|    assert(Ptr <= End);
 1213|    336|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|    336|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|  1.82k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 1.79k, False: 28]
  |  Branch (1216:27): [True: 1.48k, False: 308]
  ------------------
 1217|  1.79k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 308]
  ------------------
 1218|  1.48k|      ++Ptr;
 1219|    336|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E3endEv:
   85|    720|  inline iterator end() {
   86|    720|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|    720|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EEneERKS9_:
 1190|    682|  bool operator!=(const NonConstIterator &RHS) const {
 1191|    682|    return !(*this == RHS);
 1192|    682|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EEeqERKS9_:
 1180|    682|  bool operator==(const NonConstIterator &RHS) const {
 1181|    682|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|    682|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|    682|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|    682|           "comparing incomparable iterators!");
 1185|    682|    return Ptr == RHS.Ptr;
 1186|    682|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EEppEv:
 1194|    308|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|    308|    assert(isHandleInSync() && "invalid iterator access!");
 1196|    308|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 308]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|    308|    ++Ptr;
 1202|    308|    AdvancePastEmptyBuckets();
 1203|    308|    return *this;
 1204|    308|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EEdeEv:
 1160|    308|  reference operator*() const {
 1161|    308|    assert(isHandleInSync() && "invalid iterator access!");
 1162|    308|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 308]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|    308|    return *Ptr;
 1165|    308|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5clearEv:
  113|    350|  void clear() {
  114|    350|    incrementEpoch();
  115|    350|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 0, False: 350]
  |  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|    350|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 45, False: 305]
  |  Branch (119:50): [True: 0, False: 45]
  ------------------
  120|      0|      shrink_and_clear();
  121|      0|      return;
  122|      0|    }
  123|       |
  124|    350|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|    350|    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|    350|    } else {
  130|    350|      unsigned NumEntries = getNumEntries();
  131|  73.5k|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (131:61): [True: 73.2k, False: 350]
  ------------------
  132|  73.2k|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey)) {
  ------------------
  |  Branch (132:13): [True: 33.0k, False: 40.1k]
  ------------------
  133|  33.0k|          if (!KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (133:15): [True: 33.0k, False: 0]
  ------------------
  134|  33.0k|            P->getSecond().~ValueT();
  135|  33.0k|            --NumEntries;
  136|  33.0k|          }
  137|  33.0k|          P->getFirst() = EmptyKey;
  138|  33.0k|        }
  139|  73.2k|      }
  140|    350|      assert(NumEntries == 0 && "Node count imbalance!");
  141|       |      // Suppress -Wunused-but-set-variable warning with new compilers.
  142|    350|      (void)NumEntries;
  143|    350|    }
  144|    350|    setNumEntries(0);
  145|    350|    setNumTombstones(0);
  146|    350|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEEC2Ej:
  669|    350|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE4initEj:
  726|    350|  void init(unsigned InitNumEntries) {
  727|    350|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    350|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 350]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    350|    } else {
  731|    350|      NumEntries = 0;
  732|    350|      NumTombstones = 0;
  733|    350|    }
  734|    350|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    350|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    350|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 350, False: 0]
  ------------------
  363|    350|      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|    350|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEED2Ev:
  687|    350|  ~DenseMap() {
  688|    350|    this->destroyAll();
  689|    350|    operator delete(Buckets);
  690|    350|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E10destroyAllEv:
  334|    350|  void destroyAll() {
  335|    350|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 346, False: 4]
  ------------------
  336|    346|      return;
  337|       |
  338|      4|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    260|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 256, False: 4]
  ------------------
  340|    256|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 56, False: 200]
  ------------------
  341|    256|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 56, False: 0]
  ------------------
  342|     56|        P->getSecond().~ValueT();
  343|    256|      P->getFirst().~KeyT();
  344|    256|    }
  345|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_EixERKS4_:
  303|  52.6M|  ValueT &operator[](const KeyT &Key) {
  304|  52.6M|    return FindAndConstruct(Key).second;
  305|  52.6M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16FindAndConstructERKS4_:
  295|  52.6M|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  52.6M|    BucketT *TheBucket;
  297|  52.6M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 43.2M, False: 9.34M]
  ------------------
  298|  43.2M|      return *TheBucket;
  299|       |
  300|  9.34M|    return *InsertIntoBucket(TheBucket, Key);
  301|  52.6M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPSA_:
  632|  65.4M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  65.4M|    const BucketT *ConstFoundBucket;
  634|  65.4M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  65.4M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  65.4M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  65.4M|    return Result;
  638|  65.4M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPKSA_:
  582|  65.4M|                       const BucketT *&FoundBucket) const {
  583|  65.4M|    const BucketT *BucketsPtr = getBuckets();
  584|  65.4M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  65.4M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 103k, False: 65.3M]
  ------------------
  587|   103k|      FoundBucket = nullptr;
  588|   103k|      return false;
  589|   103k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  65.3M|    const BucketT *FoundTombstone = nullptr;
  593|  65.3M|    const KeyT EmptyKey = getEmptyKey();
  594|  65.3M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  65.3M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  65.3M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  65.3M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  65.3M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  65.3M|    unsigned ProbeAmt = 1;
  601|   128M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   128M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   128M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   128M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 43.2M, False: 85.3M]
  |  |  ------------------
  ------------------
  605|  43.2M|        FoundBucket = ThisBucket;
  606|  43.2M|        return true;
  607|  43.2M|      }
  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|  85.3M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  85.3M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 22.0M, False: 63.2M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  22.0M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 22.0M]
  ------------------
  615|  22.0M|        return false;
  616|  22.0M|      }
  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|  63.2M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 63.2M]
  ------------------
  621|  63.2M|          !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|  63.2M|      BucketNo += ProbeAmt++;
  627|  63.2M|      BucketNo &= (NumBuckets-1);
  628|  63.2M|    }
  629|  65.3M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  489|   128M|  const BucketT *getBuckets() const {
  490|   128M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   128M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12getHashValueERKS4_:
  417|  65.3M|  static unsigned getHashValue(const KeyT &Val) {
  418|  65.3M|    return KeyInfoT::getHashValue(Val);
  419|  65.3M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes5ValueENS2_8RegisterEE8getFirstEv:
   48|   536M|  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|  9.34M|                            ValueArgs &&... Values) {
  520|  9.34M|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  9.34M|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  9.34M|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  9.34M|    return TheBucket;
  525|  9.34M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E20InsertIntoBucketImplIS4_EEPSA_RKS4_RKT_SE_:
  539|  9.34M|                                BucketT *TheBucket) {
  540|  9.34M|    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|  9.34M|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  9.34M|    unsigned NumBuckets = getNumBuckets();
  553|  9.34M|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  9.34M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 105k, False: 9.23M]
  |  |  ------------------
  ------------------
  554|   105k|      this->grow(NumBuckets * 2);
  555|   105k|      LookupBucketFor(Lookup, TheBucket);
  556|   105k|      NumBuckets = getNumBuckets();
  557|  9.23M|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  9.23M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 9.23M]
  |  |  ------------------
  ------------------
  558|  9.23M|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  9.34M|    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|  9.34M|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  9.34M|    const KeyT EmptyKey = getEmptyKey();
  570|  9.34M|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 9.34M]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  9.34M|    return TheBucket;
  574|  9.34M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumEntriesEv:
  457|  31.4M|  unsigned getNumEntries() const {
  458|  31.4M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  31.4M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumEntriesEv:
  771|  31.4M|  unsigned getNumEntries() const {
  772|  31.4M|    return NumEntries;
  773|  31.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E4growEj:
  509|   105k|  void grow(unsigned AtLeast) {
  510|   105k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   105k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4growEj:
  736|   105k|  void grow(unsigned AtLeast) {
  737|   105k|    unsigned OldNumBuckets = NumBuckets;
  738|   105k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   105k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   105k|    assert(Buckets);
  742|   105k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 103k, False: 1.99k]
  ------------------
  743|   103k|      this->BaseT::initEmpty();
  744|   103k|      return;
  745|   103k|    }
  746|       |
  747|  1.99k|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|  1.99k|    operator delete(OldBuckets);
  751|  1.99k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E18moveFromOldBucketsEPSA_SD_:
  369|  1.99k|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|  1.99k|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|  1.99k|    const KeyT EmptyKey = getEmptyKey();
  374|  1.99k|    const KeyT TombstoneKey = getTombstoneKey();
  375|  16.9M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 16.9M, False: 1.99k]
  ------------------
  376|  16.9M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 12.7M, False: 4.24M]
  ------------------
  377|  16.9M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 12.7M, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  12.7M|        BucketT *DestBucket;
  380|  12.7M|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  12.7M|        (void)FoundVal; // silence warning.
  382|  12.7M|        assert(!FoundVal && "Key already in new map?");
  383|  12.7M|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  12.7M|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  12.7M|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  12.7M|        B->getSecond().~ValueT();
  389|  12.7M|      }
  390|  16.9M|      B->getFirst().~KeyT();
  391|  16.9M|    }
  392|  1.99k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16getNumTombstonesEv:
  473|  9.23M|  unsigned getNumTombstones() const {
  474|  9.23M|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  9.23M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16getNumTombstonesEv:
  779|  9.23M|  unsigned getNumTombstones() const {
  780|  9.23M|    return NumTombstones;
  781|  9.23M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E19incrementNumEntriesEv:
  465|  22.0M|  void incrementNumEntries() {
  466|  22.0M|    setNumEntries(getNumEntries() + 1);
  467|  22.0M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E5countEPKS3_:
  149|  63.4M|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  63.4M|    const BucketT *TheBucket;
  151|  63.4M|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 57.6M, False: 5.87M]
  ------------------
  152|  63.4M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIPKS3_EEbRKT_RPKSA_:
  582|  63.4M|                       const BucketT *&FoundBucket) const {
  583|  63.4M|    const BucketT *BucketsPtr = getBuckets();
  584|  63.4M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  63.4M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 63.4M]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  63.4M|    const BucketT *FoundTombstone = nullptr;
  593|  63.4M|    const KeyT EmptyKey = getEmptyKey();
  594|  63.4M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  63.4M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  63.4M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  63.4M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  63.4M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  63.4M|    unsigned ProbeAmt = 1;
  601|   126M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   126M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   126M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   126M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 57.6M, False: 69.2M]
  |  |  ------------------
  ------------------
  605|  57.6M|        FoundBucket = ThisBucket;
  606|  57.6M|        return true;
  607|  57.6M|      }
  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|  69.2M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  69.2M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5.87M, False: 63.3M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  5.87M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 5.87M]
  ------------------
  615|  5.87M|        return false;
  616|  5.87M|      }
  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|  63.3M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 63.3M]
  ------------------
  621|  63.3M|          !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|  63.3M|      BucketNo += ProbeAmt++;
  627|  63.3M|      BucketNo &= (NumBuckets-1);
  628|  63.3M|    }
  629|  63.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12getHashValueIPKS3_EEjRKT_:
  422|  63.4M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  63.4M|    return KeyInfoT::getHashValue(Val);
  424|  63.4M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E5countEPKS3_:
  149|  3.02M|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  3.02M|    const BucketT *TheBucket;
  151|  3.02M|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 3.02M, False: 0]
  ------------------
  152|  3.02M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPKS9_:
  582|  20.7M|                       const BucketT *&FoundBucket) const {
  583|  20.7M|    const BucketT *BucketsPtr = getBuckets();
  584|  20.7M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  20.7M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 350, False: 20.7M]
  ------------------
  587|    350|      FoundBucket = nullptr;
  588|    350|      return false;
  589|    350|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  20.7M|    const BucketT *FoundTombstone = nullptr;
  593|  20.7M|    const KeyT EmptyKey = getEmptyKey();
  594|  20.7M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  20.7M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  20.7M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  20.7M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  20.7M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  20.7M|    unsigned ProbeAmt = 1;
  601|  38.4M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  38.4M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  38.4M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  38.4M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 17.8M, False: 20.6M]
  |  |  ------------------
  ------------------
  605|  17.8M|        FoundBucket = ThisBucket;
  606|  17.8M|        return true;
  607|  17.8M|      }
  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|  20.6M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  20.6M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.89M, False: 17.7M]
  |  |  ------------------
  ------------------
  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.89M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 2.89M]
  ------------------
  615|  2.89M|        return false;
  616|  2.89M|      }
  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|  17.7M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 17.7M]
  ------------------
  621|  17.7M|          !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|  17.7M|      BucketNo += ProbeAmt++;
  627|  17.7M|      BucketNo &= (NumBuckets-1);
  628|  17.7M|    }
  629|  20.7M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  489|  27.9M|  const BucketT *getBuckets() const {
  490|  27.9M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  27.9M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueIPKS3_EEjRKT_:
  422|  20.7M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  20.7M|    return KeyInfoT::getHashValue(Val);
  424|  20.7M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes11InstructionEjE8getFirstEv:
   48|   113M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4findEPKS3_:
  154|  17.7M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  17.7M|    BucketT *TheBucket;
  156|  17.7M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 14.8M, False: 2.89M]
  ------------------
  157|  14.8M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|  2.89M|    return end();
  159|  17.7M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPS9_:
  632|  17.7M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  17.7M|    const BucketT *ConstFoundBucket;
  634|  17.7M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  17.7M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  17.7M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  17.7M|    return Result;
  638|  17.7M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|  35.4M|                        bool NoAdvance=false) {
  440|  35.4M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 35.4M]
  ------------------
  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|  35.4M|    return iterator(P, E, Epoch, NoAdvance);
  445|  35.4M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1140|  35.4M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  35.4M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  35.4M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 35.4M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E3endEv:
   85|  20.5M|  inline iterator end() {
   86|  20.5M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  20.5M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEneERKS9_:
 1190|  17.7M|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  17.7M|    return !(*this == RHS);
 1192|  17.7M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEeqERKS9_:
 1180|  17.7M|  bool operator==(const NonConstIterator &RHS) const {
 1181|  17.7M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  17.7M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  17.7M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  17.7M|           "comparing incomparable iterators!");
 1185|  17.7M|    return Ptr == RHS.Ptr;
 1186|  17.7M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEptEv:
 1166|  14.8M|  pointer operator->() const {
 1167|  14.8M|    assert(isHandleInSync() && "invalid iterator access!");
 1168|  14.8M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 14.8M]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|  14.8M|    return Ptr;
 1171|  14.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_EixERKS4_:
  303|  2.89M|  ValueT &operator[](const KeyT &Key) {
  304|  2.89M|    return FindAndConstruct(Key).second;
  305|  2.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16FindAndConstructERKS4_:
  295|  2.89M|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  2.89M|    BucketT *TheBucket;
  297|  2.89M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 2.89M]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|  2.89M|    return *InsertIntoBucket(TheBucket, Key);
  301|  2.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|  7.20M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  7.20M|    const BucketT *ConstFoundBucket;
  634|  7.20M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  7.20M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  7.20M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  7.20M|    return Result;
  638|  7.20M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|  7.20M|                       const BucketT *&FoundBucket) const {
  583|  7.20M|    const BucketT *BucketsPtr = getBuckets();
  584|  7.20M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  7.20M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 350, False: 7.20M]
  ------------------
  587|    350|      FoundBucket = nullptr;
  588|    350|      return false;
  589|    350|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  7.20M|    const BucketT *FoundTombstone = nullptr;
  593|  7.20M|    const KeyT EmptyKey = getEmptyKey();
  594|  7.20M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  7.20M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  7.20M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  7.20M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  7.20M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  7.20M|    unsigned ProbeAmt = 1;
  601|  14.6M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  14.6M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  14.6M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  14.6M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 14.6M]
  |  |  ------------------
  ------------------
  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|  14.6M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  14.6M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7.20M, False: 7.42M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  7.20M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 7.20M]
  ------------------
  615|  7.20M|        return false;
  616|  7.20M|      }
  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|  7.42M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 7.42M]
  ------------------
  621|  7.42M|          !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|  7.42M|      BucketNo += ProbeAmt++;
  627|  7.42M|      BucketNo &= (NumBuckets-1);
  628|  7.42M|    }
  629|  7.20M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueERKS4_:
  417|  7.20M|  static unsigned getHashValue(const KeyT &Val) {
  418|  7.20M|    return KeyInfoT::getHashValue(Val);
  419|  7.20M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16InsertIntoBucketIRKS4_JEEEPS9_SF_OT_DpOT0_:
  519|  2.89M|                            ValueArgs &&... Values) {
  520|  2.89M|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  2.89M|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  2.89M|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  2.89M|    return TheBucket;
  525|  2.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|  2.89M|                                BucketT *TheBucket) {
  540|  2.89M|    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.89M|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  2.89M|    unsigned NumBuckets = getNumBuckets();
  553|  2.89M|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  2.89M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2.01k, False: 2.89M]
  |  |  ------------------
  ------------------
  554|  2.01k|      this->grow(NumBuckets * 2);
  555|  2.01k|      LookupBucketFor(Lookup, TheBucket);
  556|  2.01k|      NumBuckets = getNumBuckets();
  557|  2.89M|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  2.89M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.89M]
  |  |  ------------------
  ------------------
  558|  2.89M|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  2.89M|    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|  2.89M|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  2.89M|    const KeyT EmptyKey = getEmptyKey();
  570|  2.89M|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 2.89M]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  2.89M|    return TheBucket;
  574|  2.89M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumEntriesEv:
  457|  10.0M|  unsigned getNumEntries() const {
  458|  10.0M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  10.0M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumEntriesEv:
  771|  10.0M|  unsigned getNumEntries() const {
  772|  10.0M|    return NumEntries;
  773|  10.0M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4growEj:
  509|  2.01k|  void grow(unsigned AtLeast) {
  510|  2.01k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|  2.01k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4growEj:
  736|  2.01k|  void grow(unsigned AtLeast) {
  737|  2.01k|    unsigned OldNumBuckets = NumBuckets;
  738|  2.01k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|  2.01k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|  2.01k|    assert(Buckets);
  742|  2.01k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 350, False: 1.66k]
  ------------------
  743|    350|      this->BaseT::initEmpty();
  744|    350|      return;
  745|    350|    }
  746|       |
  747|  1.66k|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|  1.66k|    operator delete(OldBuckets);
  751|  1.66k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E18moveFromOldBucketsEPS9_SC_:
  369|  1.66k|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|  1.66k|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|  1.66k|    const KeyT EmptyKey = getEmptyKey();
  374|  1.66k|    const KeyT TombstoneKey = getTombstoneKey();
  375|  5.74M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 5.74M, False: 1.66k]
  ------------------
  376|  5.74M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 4.30M, False: 1.43M]
  ------------------
  377|  5.74M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 4.30M, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  4.30M|        BucketT *DestBucket;
  380|  4.30M|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  4.30M|        (void)FoundVal; // silence warning.
  382|  4.30M|        assert(!FoundVal && "Key already in new map?");
  383|  4.30M|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  4.30M|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  4.30M|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  4.30M|        B->getSecond().~ValueT();
  389|  4.30M|      }
  390|  5.74M|      B->getFirst().~KeyT();
  391|  5.74M|    }
  392|  1.66k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16getNumTombstonesEv:
  473|  2.89M|  unsigned getNumTombstones() const {
  474|  2.89M|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  2.89M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16getNumTombstonesEv:
  779|  2.89M|  unsigned getNumTombstones() const {
  780|  2.89M|    return NumTombstones;
  781|  2.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E19incrementNumEntriesEv:
  465|  7.20M|  void incrementNumEntries() {
  466|  7.20M|    setNumEntries(getNumEntries() + 1);
  467|  7.20M|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE15allocateBucketsEj:
  795|   206k|  bool allocateBuckets(unsigned Num) {
  796|   206k|    NumBuckets = Num;
  797|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 103k]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|   103k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   103k|    return true;
  804|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E9initEmptyEv:
  347|   103k|  void initEmpty() {
  348|   103k|    setNumEntries(0);
  349|   103k|    setNumTombstones(0);
  350|       |
  351|   103k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   103k|           "# initial buckets must be a power of two!");
  353|   103k|    const KeyT EmptyKey = getEmptyKey();
  354|  6.71M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 6.61M, False: 103k]
  ------------------
  355|  6.61M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13setNumEntriesEj:
  461|   206k|  void setNumEntries(unsigned Num) {
  462|   206k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   206k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13setNumEntriesEj:
  775|   206k|  void setNumEntries(unsigned Num) {
  776|   206k|    NumEntries = Num;
  777|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16setNumTombstonesEj:
  477|   103k|  void setNumTombstones(unsigned Num) {
  478|   103k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   103k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16setNumTombstonesEj:
  783|   103k|  void setNumTombstones(unsigned Num) {
  784|   103k|    NumTombstones = Num;
  785|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_EixEOS4_:
  315|   103k|  ValueT &operator[](KeyT &&Key) {
  316|   103k|    return FindAndConstruct(std::move(Key)).second;
  317|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16FindAndConstructEOS4_:
  307|   103k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|   103k|    BucketT *TheBucket;
  309|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 103k]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|   103k|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPSB_:
  632|   206k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   206k|    const BucketT *ConstFoundBucket;
  634|   206k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   206k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   206k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   206k|    return Result;
  638|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPKSB_:
  582|   206k|                       const BucketT *&FoundBucket) const {
  583|   206k|    const BucketT *BucketsPtr = getBuckets();
  584|   206k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 103k, False: 103k]
  ------------------
  587|   103k|      FoundBucket = nullptr;
  588|   103k|      return false;
  589|   103k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   103k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   103k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  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|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, 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|   103k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 103k]
  ------------------
  615|   103k|        return false;
  616|   103k|      }
  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|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  489|  4.38M|  const BucketT *getBuckets() const {
  490|  4.38M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  4.38M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueERKS4_:
  417|   103k|  static unsigned getHashValue(const KeyT &Val) {
  418|   103k|    return KeyInfoT::getHashValue(Val);
  419|   103k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstEE8getFirstEv:
   48|  4.38M|  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|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E20InsertIntoBucketImplIS4_EEPSB_RKS4_RKT_SF_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 103k, False: 0]
  |  |  ------------------
  ------------------
  554|   103k|      this->grow(NumBuckets * 2);
  555|   103k|      LookupBucketFor(Lookup, TheBucket);
  556|   103k|      NumBuckets = getNumBuckets();
  557|   103k|    } 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|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumEntriesEv:
  457|   206k|  unsigned getNumEntries() const {
  458|   206k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   206k|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumEntriesEv:
  771|   206k|  unsigned getNumEntries() const {
  772|   206k|    return NumEntries;
  773|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4growEj:
  509|   103k|  void grow(unsigned AtLeast) {
  510|   103k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   103k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4growEj:
  736|   103k|  void grow(unsigned AtLeast) {
  737|   103k|    unsigned OldNumBuckets = NumBuckets;
  738|   103k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   103k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   103k|    assert(Buckets);
  742|   103k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 103k, False: 0]
  ------------------
  743|   103k|      this->BaseT::initEmpty();
  744|   103k|      return;
  745|   103k|    }
  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|   103k|  void incrementNumEntries() {
  466|   103k|    setNumEntries(getNumEntries() + 1);
  467|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4findEPKS3_:
  154|  4.18M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  4.18M|    BucketT *TheBucket;
  156|  4.18M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 4.18M, False: 0]
  ------------------
  157|  4.18M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|      0|    return end();
  159|  4.18M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPSB_:
  632|  4.18M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  4.18M|    const BucketT *ConstFoundBucket;
  634|  4.18M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  4.18M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  4.18M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  4.18M|    return Result;
  638|  4.18M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPKSB_:
  582|  4.18M|                       const BucketT *&FoundBucket) const {
  583|  4.18M|    const BucketT *BucketsPtr = getBuckets();
  584|  4.18M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  4.18M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 4.18M]
  ------------------
  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.18M|    const BucketT *FoundTombstone = nullptr;
  593|  4.18M|    const KeyT EmptyKey = getEmptyKey();
  594|  4.18M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  4.18M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  4.18M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  4.18M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  4.18M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  4.18M|    unsigned ProbeAmt = 1;
  601|  4.18M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  4.18M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  4.18M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  4.18M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.18M, False: 0]
  |  |  ------------------
  ------------------
  605|  4.18M|        FoundBucket = ThisBucket;
  606|  4.18M|        return true;
  607|  4.18M|      }
  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|  4.18M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueIPKS3_EEjRKT_:
  422|  4.18M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  4.18M|    return KeyInfoT::getHashValue(Val);
  424|  4.18M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|  8.36M|                        bool NoAdvance=false) {
  440|  8.36M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 8.36M]
  ------------------
  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.36M|    return iterator(P, E, Epoch, NoAdvance);
  445|  8.36M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1140|  8.36M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  8.36M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  8.36M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 8.36M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E3endEv:
   85|  4.18M|  inline iterator end() {
   86|  4.18M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  4.18M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEeqERKSB_:
 1180|  4.18M|  bool operator==(const NonConstIterator &RHS) const {
 1181|  4.18M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  4.18M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  4.18M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  4.18M|           "comparing incomparable iterators!");
 1185|  4.18M|    return Ptr == RHS.Ptr;
 1186|  4.18M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEptEv:
 1166|  4.18M|  pointer operator->() const {
 1167|  4.18M|    assert(isHandleInSync() && "invalid iterator access!");
 1168|  4.18M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 4.18M]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|  4.18M|    return Ptr;
 1171|  4.18M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEneERKSB_:
 1190|  4.18M|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  4.18M|    return !(*this == RHS);
 1192|  4.18M|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
  795|   103k|  bool allocateBuckets(unsigned Num) {
  796|   103k|    NumBuckets = Num;
  797|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 0]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|   103k|  unsigned getNumBuckets() const {
  498|   103k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   103k|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
  791|   103k|  unsigned getNumBuckets() const {
  792|   103k|    return NumBuckets;
  793|   103k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 103k, False: 0]
  ------------------
  336|   103k|      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|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEC2EPKSF_SI_RKNS_14DebugEpochBaseEb:
 1140|  2.16M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  2.16M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  2.16M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 2.16M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E5beginEv:
   76|     18|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|     18|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 18]
  ------------------
   80|      0|      return end();
   81|     18|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 18]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|     18|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|     36|                        bool NoAdvance=false) {
  440|     36|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 36]
  ------------------
  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|     36|    return iterator(P, E, Epoch, NoAdvance);
  445|     36|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1140|     36|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|     36|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|     36|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 18, False: 18]
  ------------------
 1144|     18|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 18]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|     18|    AdvancePastEmptyBuckets();
 1149|     18|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|  40.6k|  void AdvancePastEmptyBuckets() {
 1212|  40.6k|    assert(Ptr <= End);
 1213|  40.6k|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|  40.6k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|  72.0k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 72.0k, False: 18]
  |  Branch (1216:27): [True: 31.3k, False: 40.6k]
  ------------------
 1217|  72.0k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 40.6k]
  ------------------
 1218|  31.3k|      ++Ptr;
 1219|  40.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E3endEv:
   85|     18|  inline iterator end() {
   86|     18|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|     18|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEneERKSA_:
 1190|  40.6k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  40.6k|    return !(*this == RHS);
 1192|  40.6k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEeqERKSA_:
 1180|  40.6k|  bool operator==(const NonConstIterator &RHS) const {
 1181|  40.6k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  40.6k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  40.6k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  40.6k|           "comparing incomparable iterators!");
 1185|  40.6k|    return Ptr == RHS.Ptr;
 1186|  40.6k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEppEv:
 1194|  40.6k|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|  40.6k|    assert(isHandleInSync() && "invalid iterator access!");
 1196|  40.6k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 40.6k]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|  40.6k|    ++Ptr;
 1202|  40.6k|    AdvancePastEmptyBuckets();
 1203|  40.6k|    return *this;
 1204|  40.6k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEdeEv:
 1160|  40.6k|  reference operator*() const {
 1161|  40.6k|    assert(isHandleInSync() && "invalid iterator access!");
 1162|  40.6k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 40.6k]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|  40.6k|    return *Ptr;
 1165|  40.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4findEPKS3_:
  154|  10.7M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  10.7M|    BucketT *TheBucket;
  156|  10.7M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 10.7M, False: 0]
  ------------------
  157|  10.7M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|      0|    return end();
  159|  10.7M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPSC_:
  632|  10.7M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  10.7M|    const BucketT *ConstFoundBucket;
  634|  10.7M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  10.7M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  10.7M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  10.7M|    return Result;
  638|  10.7M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPKSC_:
  582|  10.7M|                       const BucketT *&FoundBucket) const {
  583|  10.7M|    const BucketT *BucketsPtr = getBuckets();
  584|  10.7M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  10.7M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 10.7M]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  10.7M|    const BucketT *FoundTombstone = nullptr;
  593|  10.7M|    const KeyT EmptyKey = getEmptyKey();
  594|  10.7M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  10.7M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  10.7M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  10.7M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  10.7M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  10.7M|    unsigned ProbeAmt = 1;
  601|  15.7M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  15.7M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  15.7M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  15.7M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 10.7M, False: 4.99M]
  |  |  ------------------
  ------------------
  605|  10.7M|        FoundBucket = ThisBucket;
  606|  10.7M|        return true;
  607|  10.7M|      }
  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.99M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  4.99M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 4.99M]
  |  |  ------------------
  ------------------
  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|  4.99M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 4.99M]
  ------------------
  621|  4.99M|          !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.99M|      BucketNo += ProbeAmt++;
  627|  4.99M|      BucketNo &= (NumBuckets-1);
  628|  4.99M|    }
  629|  10.7M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueIPKS3_EEjRKT_:
  422|  10.7M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  10.7M|    return KeyInfoT::getHashValue(Val);
  424|  10.7M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12makeIteratorEPSC_SF_RNS_14DebugEpochBaseEb:
  439|  21.4M|                        bool NoAdvance=false) {
  440|  21.4M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 21.4M]
  ------------------
  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|  21.4M|    return iterator(P, E, Epoch, NoAdvance);
  445|  21.4M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1140|  21.4M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  21.4M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  21.4M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 21.4M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E3endEv:
   85|  10.7M|  inline iterator end() {
   86|  10.7M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  10.7M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEneERKSC_:
 1190|  10.7M|  bool operator!=(const NonConstIterator &RHS) const {
 1191|  10.7M|    return !(*this == RHS);
 1192|  10.7M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEeqERKSC_:
 1180|  10.7M|  bool operator==(const NonConstIterator &RHS) const {
 1181|  10.7M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|  10.7M|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|  10.7M|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|  10.7M|           "comparing incomparable iterators!");
 1185|  10.7M|    return Ptr == RHS.Ptr;
 1186|  10.7M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEptEv:
 1166|  10.7M|  pointer operator->() const {
 1167|  10.7M|    assert(isHandleInSync() && "invalid iterator access!");
 1168|  10.7M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 10.7M]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|  10.7M|    return Ptr;
 1171|  10.7M|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS1_8FunctionENS1_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SC_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS2_8FunctionENS2_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SD_EEEES5_SD_SF_SI_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 196, False: 0]
  ------------------
  336|    196|      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_8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS2_8FunctionENS2_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SD_EEEES5_SD_SF_SI_E13getNumBucketsEv:
  497|    196|  unsigned getNumBuckets() const {
  498|    196|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    196|  }
_ZNK4llvh8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS1_8FunctionENS1_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SC_EEE13getNumBucketsEv:
  791|    196|  unsigned getNumBuckets() const {
  792|    196|    return NumBuckets;
  793|    196|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E4sizeEv:
  102|    196|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getNumEntriesEv:
  457|  53.8k|  unsigned getNumEntries() const {
  458|  53.8k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  53.8k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE13getNumEntriesEv:
  771|  53.8k|  unsigned getNumEntries() const {
  772|  53.8k|    return NumEntries;
  773|  53.8k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E10destroyAllEv:
  334|    196|  void destroyAll() {
  335|    196|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 81, False: 115]
  ------------------
  336|     81|      return;
  337|       |
  338|    115|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  19.6k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 19.5k, False: 115]
  ------------------
  340|  19.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 9.40k, False: 10.1k]
  ------------------
  341|  19.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 9.40k]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  19.5k|      P->getFirst().~KeyT();
  344|  19.5k|    }
  345|    115|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getNumBucketsEv:
  497|  2.74M|  unsigned getNumBuckets() const {
  498|  2.74M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.74M|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE13getNumBucketsEv:
  791|  2.74M|  unsigned getNumBuckets() const {
  792|  2.74M|    return NumBuckets;
  793|  2.74M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E11getEmptyKeyEv:
  426|   881k|  static const KeyT getEmptyKey() {
  427|   881k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   881k|                  "Must pass the derived type to this template!");
  429|   881k|    return KeyInfoT::getEmptyKey();
  430|   881k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E15getTombstoneKeyEv:
  432|   881k|  static const KeyT getTombstoneKey() {
  433|   881k|    return KeyInfoT::getTombstoneKey();
  434|   881k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E10getBucketsEv:
  493|    744|  BucketT *getBuckets() {
  494|    744|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    744|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE10getBucketsEv:
  787|  2.73M|  BucketT *getBuckets() const {
  788|  2.73M|    return Buckets;
  789|  2.73M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getBucketsEndEv:
  501|    372|  BucketT *getBucketsEnd() {
  502|    372|    return getBuckets() + getNumBuckets();
  503|    372|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEEE8getFirstEv:
   47|   185k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEEE9getSecondEv:
   49|  56.7k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh16DenseMapIteratorIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEC2EPS7_S9_RKNS_14DebugEpochBaseEb:
 1140|   103k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   103k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   103k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 103k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E4findERKS3_:
  160|   616k|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|   616k|    const BucketT *TheBucket;
  162|   616k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 604k, False: 12.2k]
  ------------------
  163|   604k|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|  12.2k|    return end();
  165|   616k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E15LookupBucketForIS3_EEbRKT_RPKSD_:
  582|   866k|                       const BucketT *&FoundBucket) const {
  583|   866k|    const BucketT *BucketsPtr = getBuckets();
  584|   866k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   866k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 231, False: 866k]
  ------------------
  587|    231|      FoundBucket = nullptr;
  588|    231|      return false;
  589|    231|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   866k|    const BucketT *FoundTombstone = nullptr;
  593|   866k|    const KeyT EmptyKey = getEmptyKey();
  594|   866k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   866k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   866k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   866k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   866k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   866k|    unsigned ProbeAmt = 1;
  601|  1.03M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  1.03M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  1.03M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  1.03M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 829k, False: 207k]
  |  |  ------------------
  ------------------
  605|   829k|        FoundBucket = ThisBucket;
  606|   829k|        return true;
  607|   829k|      }
  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|   207k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   207k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 36.3k, False: 171k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  36.3k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 5.52k, False: 30.8k]
  ------------------
  615|  36.3k|        return false;
  616|  36.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|   171k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 8.50k, False: 162k]
  ------------------
  621|   171k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 5.58k, False: 2.92k]
  ------------------
  622|  5.58k|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   171k|      BucketNo += ProbeAmt++;
  627|   171k|      BucketNo &= (NumBuckets-1);
  628|   171k|    }
  629|   866k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E10getBucketsEv:
  489|  2.72M|  const BucketT *getBuckets() const {
  490|  2.72M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  2.72M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E12getHashValueERKS3_:
  417|   866k|  static unsigned getHashValue(const KeyT &Val) {
  418|   866k|    return KeyInfoT::getHashValue(Val);
  419|   866k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEEE8getFirstEv:
   48|  1.41M|  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|  1.23M|                                   const bool NoAdvance=false) const {
  450|  1.23M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 1.23M]
  ------------------
  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|  1.23M|    return const_iterator(P, E, Epoch, NoAdvance);
  455|  1.23M|  }
_ZN4llvh16DenseMapIteratorIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EELb1EEC2EPKSC_SF_RKNS_14DebugEpochBaseEb:
 1140|  1.23M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  1.23M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  1.23M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 1.23M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getBucketsEndEv:
  505|  1.86M|  const BucketT *getBucketsEnd() const {
  506|  1.86M|    return getBuckets() + getNumBuckets();
  507|  1.86M|  }
_ZNK4llvh16DenseMapIteratorIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EELb1EEeqERKSD_:
 1173|   616k|  bool operator==(const ConstIterator &RHS) const {
 1174|   616k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|   616k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|   616k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|   616k|           "comparing incomparable iterators!");
 1178|   616k|    return Ptr == RHS.Ptr;
 1179|   616k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E3endEv:
   95|   629k|  inline const_iterator end() const {
   96|   629k|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|   629k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EELb1EEptEv:
 1166|   604k|  pointer operator->() const {
 1167|   604k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   604k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 604k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   604k|    return Ptr;
 1171|   604k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE15allocateBucketsEj:
  795|    453|  bool allocateBuckets(unsigned Num) {
  796|    453|    NumBuckets = Num;
  797|    453|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 257]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|    257|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    257|    return true;
  804|    453|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E9initEmptyEv:
  347|    257|  void initEmpty() {
  348|    257|    setNumEntries(0);
  349|    257|    setNumTombstones(0);
  350|       |
  351|    257|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    257|           "# initial buckets must be a power of two!");
  353|    257|    const KeyT EmptyKey = getEmptyKey();
  354|  31.9k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 31.6k, False: 257]
  ------------------
  355|  31.6k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    257|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13setNumEntriesEj:
  461|  39.0k|  void setNumEntries(unsigned Num) {
  462|  39.0k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  39.0k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE13setNumEntriesEj:
  775|  39.0k|  void setNumEntries(unsigned Num) {
  776|  39.0k|    NumEntries = Num;
  777|  39.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16setNumTombstonesEj:
  477|  20.6k|  void setNumTombstones(unsigned Num) {
  478|  20.6k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  20.6k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE16setNumTombstonesEj:
  783|  20.6k|  void setNumTombstones(unsigned Num) {
  784|  20.6k|    NumTombstones = Num;
  785|  20.6k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS1_8FunctionENS1_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SC_EEEC2Ej:
  669|    196|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS1_8FunctionENS1_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SC_EEE4initEj:
  726|    196|  void init(unsigned InitNumEntries) {
  727|    196|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    196|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 196]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    196|    } else {
  731|    196|      NumEntries = 0;
  732|    196|      NumTombstones = 0;
  733|    196|    }
  734|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS2_8FunctionENS2_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SD_EEEES5_SD_SF_SI_E31getMinBucketToReserveForEntriesEj:
  360|    196|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    196|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 196, False: 0]
  ------------------
  363|    196|      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|    196|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree23FunctionDeclarationNodeENSt3__14pairIPNS1_8FunctionENS1_5irgen11ESTreeIRGen14AlreadyEmittedEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SC_EEE15allocateBucketsEj:
  795|    196|  bool allocateBuckets(unsigned Num) {
  796|    196|    NumBuckets = Num;
  797|    196|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 196, False: 0]
  ------------------
  798|    196|      Buckets = nullptr;
  799|    196|      return false;
  800|    196|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_EixERKS3_:
  303|   225k|  ValueT &operator[](const KeyT &Key) {
  304|   225k|    return FindAndConstruct(Key).second;
  305|   225k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16FindAndConstructERKS3_:
  295|   225k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   225k|    BucketT *TheBucket;
  297|   225k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 210k, False: 14.8k]
  ------------------
  298|   210k|      return *TheBucket;
  299|       |
  300|  14.8k|    return *InsertIntoBucket(TheBucket, Key);
  301|   225k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E15LookupBucketForIS3_EEbRKT_RPSD_:
  632|   249k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   249k|    const BucketT *ConstFoundBucket;
  634|   249k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   249k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   249k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   249k|    return Result;
  638|   249k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16InsertIntoBucketIRKS3_JEEEPSD_SJ_OT_DpOT0_:
  519|  14.8k|                            ValueArgs &&... Values) {
  520|  14.8k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  14.8k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  14.8k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  14.8k|    return TheBucket;
  525|  14.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E20InsertIntoBucketImplIS3_EEPSD_RKS3_RKT_SH_:
  539|  14.8k|                                BucketT *TheBucket) {
  540|  14.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|  14.8k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  14.8k|    unsigned NumBuckets = getNumBuckets();
  553|  14.8k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  14.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 257, False: 14.6k]
  |  |  ------------------
  ------------------
  554|    257|      this->grow(NumBuckets * 2);
  555|    257|      LookupBucketFor(Lookup, TheBucket);
  556|    257|      NumBuckets = getNumBuckets();
  557|  14.6k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  14.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14.6k]
  |  |  ------------------
  ------------------
  558|  14.6k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  14.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|  14.8k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  14.8k|    const KeyT EmptyKey = getEmptyKey();
  570|  14.8k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 5.47k, False: 9.41k]
  ------------------
  571|  5.47k|      decrementNumTombstones();
  572|       |
  573|  14.8k|    return TheBucket;
  574|  14.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E4growEj:
  509|    257|  void grow(unsigned AtLeast) {
  510|    257|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    257|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE4growEj:
  736|    257|  void grow(unsigned AtLeast) {
  737|    257|    unsigned OldNumBuckets = NumBuckets;
  738|    257|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    257|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    257|    assert(Buckets);
  742|    257|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 115, False: 142]
  ------------------
  743|    115|      this->BaseT::initEmpty();
  744|    115|      return;
  745|    115|    }
  746|       |
  747|    142|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    142|    operator delete(OldBuckets);
  751|    142|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E18moveFromOldBucketsEPSD_SG_:
  369|    142|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    142|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    142|    const KeyT EmptyKey = getEmptyKey();
  374|    142|    const KeyT TombstoneKey = getTombstoneKey();
  375|  12.3k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 12.1k, False: 142]
  ------------------
  376|  12.1k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 8.98k, False: 3.17k]
  ------------------
  377|  12.1k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 8.97k, False: 11]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  8.97k|        BucketT *DestBucket;
  380|  8.97k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  8.97k|        (void)FoundVal; // silence warning.
  382|  8.97k|        assert(!FoundVal && "Key already in new map?");
  383|  8.97k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  8.97k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  8.97k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  8.97k|        B->getSecond().~ValueT();
  389|  8.97k|      }
  390|  12.1k|      B->getFirst().~KeyT();
  391|  12.1k|    }
  392|    142|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16getNumTombstonesEv:
  473|  35.0k|  unsigned getNumTombstones() const {
  474|  35.0k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  35.0k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE16getNumTombstonesEv:
  779|  35.0k|  unsigned getNumTombstones() const {
  780|  35.0k|    return NumTombstones;
  781|  35.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E19incrementNumEntriesEv:
  465|  23.8k|  void incrementNumEntries() {
  466|  23.8k|    setNumEntries(getNumEntries() + 1);
  467|  23.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E22decrementNumTombstonesEv:
  485|  5.47k|  void decrementNumTombstones() {
  486|  5.47k|    setNumTombstones(getNumTombstones() - 1);
  487|  5.47k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E5countERKS3_:
  149|    174|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|    174|    const BucketT *TheBucket;
  151|    174|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 0, False: 174]
  ------------------
  152|    174|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E5eraseERKS3_:
  276|  14.8k|  bool erase(const KeyT &Val) {
  277|  14.8k|    BucketT *TheBucket;
  278|  14.8k|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 0, False: 14.8k]
  ------------------
  279|      0|      return false; // not in map.
  280|       |
  281|  14.8k|    TheBucket->getSecond().~ValueT();
  282|  14.8k|    TheBucket->getFirst() = getTombstoneKey();
  283|  14.8k|    decrementNumEntries();
  284|  14.8k|    incrementNumTombstones();
  285|  14.8k|    return true;
  286|  14.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E19decrementNumEntriesEv:
  469|  14.8k|  void decrementNumEntries() {
  470|  14.8k|    setNumEntries(getNumEntries() - 1);
  471|  14.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E22incrementNumTombstonesEv:
  481|  14.8k|  void incrementNumTombstones() {
  482|  14.8k|    setNumTombstones(getNumTombstones() + 1);
  483|  14.8k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E4findEPKS4_:
  160|   103k|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|   103k|    const BucketT *TheBucket;
  162|   103k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 103k, False: 0]
  ------------------
  163|   103k|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|      0|    return end();
  165|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIPKS4_EEbRKT_RPKSJ_:
  582|   206k|                       const BucketT *&FoundBucket) const {
  583|   206k|    const BucketT *BucketsPtr = getBuckets();
  584|   206k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 206k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   206k|    const BucketT *FoundTombstone = nullptr;
  593|   206k|    const KeyT EmptyKey = getEmptyKey();
  594|   206k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   206k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   206k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   206k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   206k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   206k|    unsigned ProbeAmt = 1;
  601|   206k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   206k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   206k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   206k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 206k, False: 0]
  |  |  ------------------
  ------------------
  605|   206k|        FoundBucket = ThisBucket;
  606|   206k|        return true;
  607|   206k|      }
  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|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10getBucketsEv:
  489|   724k|  const BucketT *getBuckets() const {
  490|   724k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   724k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E12getHashValueIPKS4_EEjRKT_:
  422|   206k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   206k|    return KeyInfoT::getHashValue(Val);
  424|   206k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEEE8getFirstEv:
   48|   413k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E17makeConstIteratorEPKSJ_SN_RKNS_14DebugEpochBaseEb:
  449|   207k|                                   const bool NoAdvance=false) const {
  450|   207k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 207k]
  ------------------
  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|   207k|    return const_iterator(P, E, Epoch, NoAdvance);
  455|   207k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb1EEC2EPKSI_SL_RKNS_14DebugEpochBaseEb:
 1140|   207k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   207k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   207k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 207k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getBucketsEndEv:
  505|   310k|  const BucketT *getBucketsEnd() const {
  506|   310k|    return getBuckets() + getNumBuckets();
  507|   310k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E3endEv:
   95|   103k|  inline const_iterator end() const {
   96|   103k|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|   103k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb1EEeqERKSJ_:
 1173|   103k|  bool operator==(const ConstIterator &RHS) const {
 1174|   103k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|   103k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|   103k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|   103k|           "comparing incomparable iterators!");
 1178|   103k|    return Ptr == RHS.Ptr;
 1179|   103k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb1EEptEv:
 1166|   103k|  pointer operator->() const {
 1167|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 103k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   103k|    return Ptr;
 1171|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E4findEPKS4_:
  154|   103k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   103k|    BucketT *TheBucket;
  156|   103k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 103k, False: 0]
  ------------------
  157|   103k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|      0|    return end();
  159|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIPKS4_EEbRKT_RPSJ_:
  632|   103k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   103k|    const BucketT *ConstFoundBucket;
  634|   103k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   103k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   103k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   103k|    return Result;
  638|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E12makeIteratorEPSJ_SM_RNS_14DebugEpochBaseEb:
  439|   413k|                        bool NoAdvance=false) {
  440|   413k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 413k]
  ------------------
  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|   413k|    return iterator(P, E, Epoch, NoAdvance);
  445|   413k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEC2EPSI_SK_RKNS_14DebugEpochBaseEb:
 1140|   413k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   413k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   413k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 310k, False: 103k]
  ------------------
 1144|   103k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 103k]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|   103k|    AdvancePastEmptyBuckets();
 1149|   103k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EE23AdvancePastEmptyBucketsEv:
 1211|   206k|  void AdvancePastEmptyBuckets() {
 1212|   206k|    assert(Ptr <= End);
 1213|   206k|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1214|   206k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1215|       |
 1216|  6.72M|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1216:12): [True: 6.61M, False: 103k]
  |  Branch (1216:27): [True: 6.51M, False: 103k]
  ------------------
 1217|  6.61M|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1217:27): [True: 0, False: 103k]
  ------------------
 1218|  6.51M|      ++Ptr;
 1219|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E3endEv:
   85|   206k|  inline iterator end() {
   86|   206k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   206k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEneERKSJ_:
 1190|   310k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   310k|    return !(*this == RHS);
 1192|   310k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEeqERKSJ_:
 1180|   310k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   310k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   310k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   310k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   310k|           "comparing incomparable iterators!");
 1185|   310k|    return Ptr == RHS.Ptr;
 1186|   310k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEptEv:
 1166|   103k|  pointer operator->() const {
 1167|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 103k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   103k|    return Ptr;
 1171|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E4findEPKS4_:
  154|   103k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   103k|    BucketT *TheBucket;
  156|   103k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 103k, False: 0]
  ------------------
  157|   103k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|      0|    return end();
  159|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E15LookupBucketForIPKS4_EEbRKT_RPSK_:
  632|   103k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   103k|    const BucketT *ConstFoundBucket;
  634|   103k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   103k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   103k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   103k|    return Result;
  638|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E15LookupBucketForIPKS4_EEbRKT_RPKSK_:
  582|   103k|                       const BucketT *&FoundBucket) const {
  583|   103k|    const BucketT *BucketsPtr = getBuckets();
  584|   103k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 103k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   103k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   103k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 0]
  |  |  ------------------
  ------------------
  605|   103k|        FoundBucket = ThisBucket;
  606|   103k|        return true;
  607|   103k|      }
  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|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E10getBucketsEv:
  489|   310k|  const BucketT *getBuckets() const {
  490|   310k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   310k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E12getHashValueIPKS4_EEjRKT_:
  422|   103k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   103k|    return KeyInfoT::getHashValue(Val);
  424|   103k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEEE8getFirstEv:
   48|   310k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E12makeIteratorEPSK_SN_RNS_14DebugEpochBaseEb:
  439|   206k|                        bool NoAdvance=false) {
  440|   206k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 206k]
  ------------------
  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|   206k|    return iterator(P, E, Epoch, NoAdvance);
  445|   206k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EELb0EEC2EPSJ_SL_RKNS_14DebugEpochBaseEb:
 1140|   206k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   206k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   206k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 206k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E3endEv:
   85|   103k|  inline iterator end() {
   86|   103k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   103k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EELb0EEneERKSK_:
 1190|   103k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   103k|    return !(*this == RHS);
 1192|   103k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EELb0EEeqERKSK_:
 1180|   103k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   103k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   103k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   103k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   103k|           "comparing incomparable iterators!");
 1185|   103k|    return Ptr == RHS.Ptr;
 1186|   103k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EELb0EEptEv:
 1166|   103k|  pointer operator->() const {
 1167|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 103k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   103k|    return Ptr;
 1171|   103k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEED2Ev:
  687|    392|  ~DenseMap() {
  688|    392|    this->destroyAll();
  689|    392|    operator delete(Buckets);
  690|    392|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEED2Ev:
  687|    196|  ~DenseMap() {
  688|    196|    this->destroyAll();
  689|    196|    operator delete(Buckets);
  690|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E5clearEv:
  113|    196|  void clear() {
  114|    196|    incrementEpoch();
  115|    196|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 81, False: 115]
  |  Branch (115:33): [True: 81, False: 0]
  ------------------
  116|       |
  117|       |    // If the capacity of the array is huge, and the # elements used is small,
  118|       |    // shrink the array.
  119|    115|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 1, False: 114]
  |  Branch (119:50): [True: 0, False: 1]
  ------------------
  120|      0|      shrink_and_clear();
  121|      0|      return;
  122|      0|    }
  123|       |
  124|    115|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|    115|    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|  19.6k|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P)
  ------------------
  |  Branch (127:61): [True: 19.5k, False: 115]
  ------------------
  128|  19.5k|        P->getFirst() = EmptyKey;
  129|    115|    } 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|    115|    setNumEntries(0);
  145|    115|    setNumTombstones(0);
  146|    115|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13getNumEntriesEv:
  457|  28.0k|  unsigned getNumEntries() const {
  458|  28.0k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  28.0k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE13getNumEntriesEv:
  771|  28.0k|  unsigned getNumEntries() const {
  772|  28.0k|    return NumEntries;
  773|  28.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16getNumTombstonesEv:
  473|  9.20k|  unsigned getNumTombstones() const {
  474|  9.20k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  9.20k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE16getNumTombstonesEv:
  779|  9.20k|  unsigned getNumTombstones() const {
  780|  9.20k|    return NumTombstones;
  781|  9.20k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E15LookupBucketForIS3_EEbRKT_RPSA_:
  632|  18.6k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  18.6k|    const BucketT *ConstFoundBucket;
  634|  18.6k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  18.6k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  18.6k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  18.6k|    return Result;
  638|  18.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E15LookupBucketForIS3_EEbRKT_RPKSA_:
  582|  18.6k|                       const BucketT *&FoundBucket) const {
  583|  18.6k|    const BucketT *BucketsPtr = getBuckets();
  584|  18.6k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  18.6k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 115, False: 18.5k]
  ------------------
  587|    115|      FoundBucket = nullptr;
  588|    115|      return false;
  589|    115|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  18.5k|    const BucketT *FoundTombstone = nullptr;
  593|  18.5k|    const KeyT EmptyKey = getEmptyKey();
  594|  18.5k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  18.5k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  18.5k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  18.5k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  18.5k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  18.5k|    unsigned ProbeAmt = 1;
  601|  26.5k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  26.5k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  26.5k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  26.5k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 26.5k]
  |  |  ------------------
  ------------------
  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|  26.5k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  26.5k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 18.5k, False: 8.09k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  18.5k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 18.5k]
  ------------------
  615|  18.5k|        return false;
  616|  18.5k|      }
  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|  8.09k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 8.09k]
  ------------------
  621|  8.09k|          !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|  8.09k|      BucketNo += ProbeAmt++;
  627|  8.09k|      BucketNo &= (NumBuckets-1);
  628|  8.09k|    }
  629|  18.5k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E10getBucketsEv:
  489|  18.6k|  const BucketT *getBuckets() const {
  490|  18.6k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  18.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E12getHashValueERKS3_:
  417|  18.5k|  static unsigned getHashValue(const KeyT &Val) {
  418|  18.5k|    return KeyInfoT::getHashValue(Val);
  419|  18.5k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyEE8getFirstEv:
   48|  61.2k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_EixERKS3_:
  303|  9.38k|  ValueT &operator[](const KeyT &Key) {
  304|  9.38k|    return FindAndConstruct(Key).second;
  305|  9.38k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16FindAndConstructERKS3_:
  295|  9.38k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  9.38k|    BucketT *TheBucket;
  297|  9.38k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 9.38k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|  9.38k|    return *InsertIntoBucket(TheBucket, Key);
  301|  9.38k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16InsertIntoBucketIRKS3_JEEEPSA_SG_OT_DpOT0_:
  519|  9.38k|                            ValueArgs &&... Values) {
  520|  9.38k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  9.38k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  9.38k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  9.38k|    return TheBucket;
  525|  9.38k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E20InsertIntoBucketImplIS3_EEPSA_RKS3_RKT_SE_:
  539|  9.38k|                                BucketT *TheBucket) {
  540|  9.38k|    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|  9.38k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  9.38k|    unsigned NumBuckets = getNumBuckets();
  553|  9.38k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  9.38k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 257, False: 9.12k]
  |  |  ------------------
  ------------------
  554|    257|      this->grow(NumBuckets * 2);
  555|    257|      LookupBucketFor(Lookup, TheBucket);
  556|    257|      NumBuckets = getNumBuckets();
  557|  9.12k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  9.12k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 9.12k]
  |  |  ------------------
  ------------------
  558|  9.12k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  9.38k|    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|  9.38k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  9.38k|    const KeyT EmptyKey = getEmptyKey();
  570|  9.38k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 9.38k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  9.38k|    return TheBucket;
  574|  9.38k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E4growEj:
  509|    257|  void grow(unsigned AtLeast) {
  510|    257|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    257|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE4growEj:
  736|    257|  void grow(unsigned AtLeast) {
  737|    257|    unsigned OldNumBuckets = NumBuckets;
  738|    257|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    257|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    257|    assert(Buckets);
  742|    257|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 115, False: 142]
  ------------------
  743|    115|      this->BaseT::initEmpty();
  744|    115|      return;
  745|    115|    }
  746|       |
  747|    142|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    142|    operator delete(OldBuckets);
  751|    142|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E18moveFromOldBucketsEPSA_SD_:
  369|    142|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    142|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    142|    const KeyT EmptyKey = getEmptyKey();
  374|    142|    const KeyT TombstoneKey = getTombstoneKey();
  375|  12.3k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 12.1k, False: 142]
  ------------------
  376|  12.1k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 8.97k, False: 3.18k]
  ------------------
  377|  12.1k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 8.97k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  8.97k|        BucketT *DestBucket;
  380|  8.97k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  8.97k|        (void)FoundVal; // silence warning.
  382|  8.97k|        assert(!FoundVal && "Key already in new map?");
  383|  8.97k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  8.97k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  8.97k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  8.97k|        B->getSecond().~ValueT();
  389|  8.97k|      }
  390|  12.1k|      B->getFirst().~KeyT();
  391|  12.1k|    }
  392|    142|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E19incrementNumEntriesEv:
  465|  18.3k|  void incrementNumEntries() {
  466|  18.3k|    setNumEntries(getNumEntries() + 1);
  467|  18.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E11try_emplaceIJiEEENSt3__14pairINS_16DenseMapIteratorIS3_jS5_S8_Lb0EEEbEERKS3_DpOT_:
  233|   103k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|   103k|    BucketT *TheBucket;
  235|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 103k, False: 290]
  ------------------
  236|   103k|      return std::make_pair(
  237|   103k|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  238|   103k|               false); // Already in map.
  239|       |
  240|       |    // Otherwise, insert the new element.
  241|    290|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|    290|    return std::make_pair(
  243|    290|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|    290|             true);
  245|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16InsertIntoBucketIRKS3_JiEEEPS8_SE_OT_DpOT0_:
  519|    290|                            ValueArgs &&... Values) {
  520|    290|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    290|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    290|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    290|    return TheBucket;
  525|    290|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEEC2Ej:
  669|     13|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEEC2Ej:
  669|     13|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE4initEj:
  726|     13|  void init(unsigned InitNumEntries) {
  727|     13|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     13|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 13]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     13|    } else {
  731|     13|      NumEntries = 0;
  732|     13|      NumTombstones = 0;
  733|     13|    }
  734|     13|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E31getMinBucketToReserveForEntriesEj:
  360|     13|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     13|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 13, False: 0]
  ------------------
  363|     13|      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|     13|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE15allocateBucketsEj:
  795|    159|  bool allocateBuckets(unsigned Num) {
  796|    159|    NumBuckets = Num;
  797|    159|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 13, False: 146]
  ------------------
  798|     13|      Buckets = nullptr;
  799|     13|      return false;
  800|     13|    }
  801|       |
  802|    146|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    146|    return true;
  804|    159|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E9initEmptyEv:
  347|    146|  void initEmpty() {
  348|    146|    setNumEntries(0);
  349|    146|    setNumTombstones(0);
  350|       |
  351|    146|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    146|           "# initial buckets must be a power of two!");
  353|    146|    const KeyT EmptyKey = getEmptyKey();
  354|  2.16M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.16M, False: 146]
  ------------------
  355|  2.16M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    146|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13setNumEntriesEj:
  461|  1.30M|  void setNumEntries(unsigned Num) {
  462|  1.30M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.30M|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE13setNumEntriesEj:
  775|  1.30M|  void setNumEntries(unsigned Num) {
  776|  1.30M|    NumEntries = Num;
  777|  1.30M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16setNumTombstonesEj:
  477|    146|  void setNumTombstones(unsigned Num) {
  478|    146|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    146|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE16setNumTombstonesEj:
  783|    146|  void setNumTombstones(unsigned Num) {
  784|    146|    NumTombstones = Num;
  785|    146|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getNumBucketsEv:
  497|  11.9M|  unsigned getNumBuckets() const {
  498|  11.9M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  11.9M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE13getNumBucketsEv:
  791|  11.9M|  unsigned getNumBuckets() const {
  792|  11.9M|    return NumBuckets;
  793|  11.9M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E11getEmptyKeyEv:
  426|  8.18M|  static const KeyT getEmptyKey() {
  427|  8.18M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  8.18M|                  "Must pass the derived type to this template!");
  429|  8.18M|    return KeyInfoT::getEmptyKey();
  430|  8.18M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E10getBucketsEv:
  493|  2.25M|  BucketT *getBuckets() {
  494|  2.25M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  2.25M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE10getBucketsEv:
  787|  11.4M|  BucketT *getBuckets() const {
  788|  11.4M|    return Buckets;
  789|  11.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getBucketsEndEv:
  501|  2.25M|  BucketT *getBucketsEnd() {
  502|  2.25M|    return getBuckets() + getNumBuckets();
  503|  2.25M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecEE8getFirstEv:
   47|  11.2M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E5countEPKS3_:
  149|   588k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|   588k|    const BucketT *TheBucket;
  151|   588k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 588k, False: 13]
  ------------------
  152|   588k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIPKS3_EEbRKT_RPKSF_:
  582|  1.67M|                       const BucketT *&FoundBucket) const {
  583|  1.67M|    const BucketT *BucketsPtr = getBuckets();
  584|  1.67M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.67M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 13, False: 1.67M]
  ------------------
  587|     13|      FoundBucket = nullptr;
  588|     13|      return false;
  589|     13|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.67M|    const BucketT *FoundTombstone = nullptr;
  593|  1.67M|    const KeyT EmptyKey = getEmptyKey();
  594|  1.67M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.67M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.67M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.67M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  1.67M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.67M|    unsigned ProbeAmt = 1;
  601|  3.02M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  3.02M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  3.02M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  3.02M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.17M, False: 1.85M]
  |  |  ------------------
  ------------------
  605|  1.17M|        FoundBucket = ThisBucket;
  606|  1.17M|        return true;
  607|  1.17M|      }
  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.85M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  1.85M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 492k, False: 1.35M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   492k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 492k]
  ------------------
  615|   492k|        return false;
  616|   492k|      }
  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.35M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.35M]
  ------------------
  621|  1.35M|          !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.35M|      BucketNo += ProbeAmt++;
  627|  1.35M|      BucketNo &= (NumBuckets-1);
  628|  1.35M|    }
  629|  1.67M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E10getBucketsEv:
  489|  9.16M|  const BucketT *getBuckets() const {
  490|  9.16M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  9.16M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15getTombstoneKeyEv:
  432|  7.68M|  static const KeyT getTombstoneKey() {
  433|  7.68M|    return KeyInfoT::getTombstoneKey();
  434|  7.68M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E12getHashValueIPKS3_EEjRKT_:
  422|  1.67M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  1.67M|    return KeyInfoT::getHashValue(Val);
  424|  1.67M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecEE8getFirstEv:
   48|  24.0M|  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|  4.61M|  ValueT &operator[](const KeyT &Key) {
  304|  4.61M|    return FindAndConstruct(Key).second;
  305|  4.61M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16FindAndConstructERKS4_:
  295|  4.61M|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  4.61M|    BucketT *TheBucket;
  297|  4.61M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 4.12M, False: 492k]
  ------------------
  298|  4.12M|      return *TheBucket;
  299|       |
  300|   492k|    return *InsertIntoBucket(TheBucket, Key);
  301|  4.61M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIS4_EEbRKT_RPSF_:
  632|  6.01M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  6.01M|    const BucketT *ConstFoundBucket;
  634|  6.01M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  6.01M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  6.01M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  6.01M|    return Result;
  638|  6.01M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIS4_EEbRKT_RPKSF_:
  582|  6.01M|                       const BucketT *&FoundBucket) const {
  583|  6.01M|    const BucketT *BucketsPtr = getBuckets();
  584|  6.01M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  6.01M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 13, False: 6.01M]
  ------------------
  587|     13|      FoundBucket = nullptr;
  588|     13|      return false;
  589|     13|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  6.01M|    const BucketT *FoundTombstone = nullptr;
  593|  6.01M|    const KeyT EmptyKey = getEmptyKey();
  594|  6.01M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  6.01M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  6.01M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  6.01M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  6.01M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  6.01M|    unsigned ProbeAmt = 1;
  601|  9.52M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  9.52M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  9.52M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  9.52M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.71M, False: 4.80M]
  |  |  ------------------
  ------------------
  605|  4.71M|        FoundBucket = ThisBucket;
  606|  4.71M|        return true;
  607|  4.71M|      }
  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.80M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  4.80M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.30M, False: 3.50M]
  |  |  ------------------
  ------------------
  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|  3.50M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 3.50M]
  ------------------
  621|  3.50M|          !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.50M|      BucketNo += ProbeAmt++;
  627|  3.50M|      BucketNo &= (NumBuckets-1);
  628|  3.50M|    }
  629|  6.01M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E12getHashValueERKS4_:
  417|  6.01M|  static unsigned getHashValue(const KeyT &Val) {
  418|  6.01M|    return KeyInfoT::getHashValue(Val);
  419|  6.01M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16InsertIntoBucketIRKS4_JEEEPSF_SL_OT_DpOT0_:
  519|   492k|                            ValueArgs &&... Values) {
  520|   492k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   492k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   492k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   492k|    return TheBucket;
  525|   492k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E20InsertIntoBucketImplIS4_EEPSF_RKS4_RKT_SJ_:
  539|   492k|                                BucketT *TheBucket) {
  540|   492k|    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|   492k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   492k|    unsigned NumBuckets = getNumBuckets();
  553|   492k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   492k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 146, False: 492k]
  |  |  ------------------
  ------------------
  554|    146|      this->grow(NumBuckets * 2);
  555|    146|      LookupBucketFor(Lookup, TheBucket);
  556|    146|      NumBuckets = getNumBuckets();
  557|   492k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   492k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 492k]
  |  |  ------------------
  ------------------
  558|   492k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   492k|    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|   492k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   492k|    const KeyT EmptyKey = getEmptyKey();
  570|   492k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 492k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   492k|    return TheBucket;
  574|   492k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getNumEntriesEv:
  457|  1.79M|  unsigned getNumEntries() const {
  458|  1.79M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.79M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE13getNumEntriesEv:
  771|  1.79M|  unsigned getNumEntries() const {
  772|  1.79M|    return NumEntries;
  773|  1.79M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E4growEj:
  509|    146|  void grow(unsigned AtLeast) {
  510|    146|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    146|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE4growEj:
  736|    146|  void grow(unsigned AtLeast) {
  737|    146|    unsigned OldNumBuckets = NumBuckets;
  738|    146|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    146|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    146|    assert(Buckets);
  742|    146|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 13, False: 133]
  ------------------
  743|     13|      this->BaseT::initEmpty();
  744|     13|      return;
  745|     13|    }
  746|       |
  747|    133|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    133|    operator delete(OldBuckets);
  751|    133|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E18moveFromOldBucketsEPSF_SI_:
  369|    133|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    133|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    133|    const KeyT EmptyKey = getEmptyKey();
  374|    133|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.08M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.08M, False: 133]
  ------------------
  376|  1.08M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 810k, False: 270k]
  ------------------
  377|  1.08M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 810k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   810k|        BucketT *DestBucket;
  380|   810k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   810k|        (void)FoundVal; // silence warning.
  382|   810k|        assert(!FoundVal && "Key already in new map?");
  383|   810k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   810k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   810k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   810k|        B->getSecond().~ValueT();
  389|   810k|      }
  390|  1.08M|      B->getFirst().~KeyT();
  391|  1.08M|    }
  392|    133|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16getNumTombstonesEv:
  473|   492k|  unsigned getNumTombstones() const {
  474|   492k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   492k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE16getNumTombstonesEv:
  779|   492k|  unsigned getNumTombstones() const {
  780|   492k|    return NumTombstones;
  781|   492k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E19incrementNumEntriesEv:
  465|  1.30M|  void incrementNumEntries() {
  466|  1.30M|    setNumEntries(getNumEntries() + 1);
  467|  1.30M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecEE9getSecondEv:
   49|  3.41M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E4findEPKS3_:
  154|   588k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   588k|    BucketT *TheBucket;
  156|   588k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 95.6k, False: 492k]
  ------------------
  157|  95.6k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   492k|    return end();
  159|   588k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIPKS3_EEbRKT_RPSF_:
  632|   588k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   588k|    const BucketT *ConstFoundBucket;
  634|   588k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   588k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   588k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   588k|    return Result;
  638|   588k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E12makeIteratorEPSF_SI_RNS_14DebugEpochBaseEb:
  439|  1.17M|                        bool NoAdvance=false) {
  440|  1.17M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 1.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|  1.17M|    return iterator(P, E, Epoch, NoAdvance);
  445|  1.17M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb0EEC2EPSE_SG_RKNS_14DebugEpochBaseEb:
 1140|  1.17M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|  1.17M|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|  1.17M|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 1.17M, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb0EEneERKSF_:
 1190|   588k|  bool operator!=(const NonConstIterator &RHS) const {
 1191|   588k|    return !(*this == RHS);
 1192|   588k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb0EEeqERKSF_:
 1180|   588k|  bool operator==(const NonConstIterator &RHS) const {
 1181|   588k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|   588k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|   588k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|   588k|           "comparing incomparable iterators!");
 1185|   588k|    return Ptr == RHS.Ptr;
 1186|   588k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E3endEv:
   85|  1.08M|  inline iterator end() {
   86|  1.08M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  1.08M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb0EEptEv:
 1166|   191k|  pointer operator->() const {
 1167|   191k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   191k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 191k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   191k|    return Ptr;
 1171|   191k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_EixEOS4_:
  315|   588k|  ValueT &operator[](KeyT &&Key) {
  316|   588k|    return FindAndConstruct(std::move(Key)).second;
  317|   588k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16FindAndConstructEOS4_:
  307|   588k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|   588k|    BucketT *TheBucket;
  309|   588k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 588k, False: 0]
  ------------------
  310|   588k|      return *TheBucket;
  311|       |
  312|      0|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|   588k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E4findEPKS3_:
  160|   492k|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|   492k|    const BucketT *TheBucket;
  162|   492k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 492k, False: 0]
  ------------------
  163|   492k|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|      0|    return end();
  165|   492k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E17makeConstIteratorEPKSF_SJ_RKNS_14DebugEpochBaseEb:
  449|   985k|                                   const bool NoAdvance=false) const {
  450|   985k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 985k]
  ------------------
  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|   985k|    return const_iterator(P, E, Epoch, NoAdvance);
  455|   985k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb1EEC2EPKSE_SH_RKNS_14DebugEpochBaseEb:
 1140|   985k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   985k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   985k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 985k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getBucketsEndEv:
  505|  1.47M|  const BucketT *getBucketsEnd() const {
  506|  1.47M|    return getBuckets() + getNumBuckets();
  507|  1.47M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb1EEeqERKSF_:
 1173|   492k|  bool operator==(const ConstIterator &RHS) const {
 1174|   492k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1175|   492k|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1176|   492k|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1177|   492k|           "comparing incomparable iterators!");
 1178|   492k|    return Ptr == RHS.Ptr;
 1179|   492k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E3endEv:
   95|   492k|  inline const_iterator end() const {
   96|   492k|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|   492k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb1EEptEv:
 1166|   492k|  pointer operator->() const {
 1167|   492k|    assert(isHandleInSync() && "invalid iterator access!");
 1168|   492k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1168:9): [True: 0, False: 492k]
  ------------------
 1169|      0|      return &(Ptr[-1]);
 1170|   492k|    return Ptr;
 1171|   492k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPSG_:
  632|  1.79M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  1.79M|    const BucketT *ConstFoundBucket;
  634|  1.79M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  1.79M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  1.79M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  1.79M|    return Result;
  638|  1.79M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPKSG_:
  582|  1.79M|                       const BucketT *&FoundBucket) const {
  583|  1.79M|    const BucketT *BucketsPtr = getBuckets();
  584|  1.79M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.79M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 13, False: 1.79M]
  ------------------
  587|     13|      FoundBucket = nullptr;
  588|     13|      return false;
  589|     13|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.79M|    const BucketT *FoundTombstone = nullptr;
  593|  1.79M|    const KeyT EmptyKey = getEmptyKey();
  594|  1.79M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.79M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.79M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.79M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|  1.79M|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.79M|    unsigned ProbeAmt = 1;
  601|  3.62M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  3.62M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  3.62M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  3.62M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 492k, False: 3.13M]
  |  |  ------------------
  ------------------
  605|   492k|        FoundBucket = ThisBucket;
  606|   492k|        return true;
  607|   492k|      }
  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.13M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  3.13M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.30M, False: 1.82M]
  |  |  ------------------
  ------------------
  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|  1.82M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.82M]
  ------------------
  621|  1.82M|          !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.82M|      BucketNo += ProbeAmt++;
  627|  1.82M|      BucketNo &= (NumBuckets-1);
  628|  1.82M|    }
  629|  1.79M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueERKS4_:
  417|  1.79M|  static unsigned getHashValue(const KeyT &Val) {
  418|  1.79M|    return KeyInfoT::getHashValue(Val);
  419|  1.79M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E20InsertIntoBucketImplIS4_EEPSG_RKS4_RKT_SK_:
  539|   492k|                                BucketT *TheBucket) {
  540|   492k|    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|   492k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   492k|    unsigned NumBuckets = getNumBuckets();
  553|   492k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   492k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 146, False: 492k]
  |  |  ------------------
  ------------------
  554|    146|      this->grow(NumBuckets * 2);
  555|    146|      LookupBucketFor(Lookup, TheBucket);
  556|    146|      NumBuckets = getNumBuckets();
  557|   492k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   492k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 492k]
  |  |  ------------------
  ------------------
  558|   492k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   492k|    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|   492k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   492k|    const KeyT EmptyKey = getEmptyKey();
  570|   492k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 492k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   492k|    return TheBucket;
  574|   492k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4growEj:
  509|    146|  void grow(unsigned AtLeast) {
  510|    146|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    146|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4growEj:
  736|    146|  void grow(unsigned AtLeast) {
  737|    146|    unsigned OldNumBuckets = NumBuckets;
  738|    146|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    146|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    146|    assert(Buckets);
  742|    146|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 13, False: 133]
  ------------------
  743|     13|      this->BaseT::initEmpty();
  744|     13|      return;
  745|     13|    }
  746|       |
  747|    133|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    133|    operator delete(OldBuckets);
  751|    133|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E18moveFromOldBucketsEPSG_SJ_:
  369|    133|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    133|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    133|    const KeyT EmptyKey = getEmptyKey();
  374|    133|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.08M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.08M, False: 133]
  ------------------
  376|  1.08M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 810k, False: 270k]
  ------------------
  377|  1.08M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 810k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   810k|        BucketT *DestBucket;
  380|   810k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   810k|        (void)FoundVal; // silence warning.
  382|   810k|        assert(!FoundVal && "Key already in new map?");
  383|   810k|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   810k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   810k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   810k|        B->getSecond().~ValueT();
  389|   810k|      }
  390|  1.08M|      B->getFirst().~KeyT();
  391|  1.08M|    }
  392|    133|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E19incrementNumEntriesEv:
  465|  1.30M|  void incrementNumEntries() {
  466|  1.30M|    setNumEntries(getNumEntries() + 1);
  467|  1.30M|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEED2Ev:
  687|     13|  ~DenseMap() {
  688|     13|    this->destroyAll();
  689|     13|    operator delete(Buckets);
  690|     13|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E10destroyAllEv:
  334|     13|  void destroyAll() {
  335|     13|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 13]
  ------------------
  336|      0|      return;
  337|       |
  338|     13|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.08M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.08M, False: 13]
  ------------------
  340|  1.08M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 492k, False: 588k]
  ------------------
  341|  1.08M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 492k, False: 0]
  ------------------
  342|   492k|        P->getSecond().~ValueT();
  343|  1.08M|      P->getFirst().~KeyT();
  344|  1.08M|    }
  345|     13|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_EixERKS4_:
  303|   985k|  ValueT &operator[](const KeyT &Key) {
  304|   985k|    return FindAndConstruct(Key).second;
  305|   985k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16FindAndConstructERKS4_:
  295|   985k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   985k|    BucketT *TheBucket;
  297|   985k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 492k, False: 492k]
  ------------------
  298|   492k|      return *TheBucket;
  299|       |
  300|   492k|    return *InsertIntoBucket(TheBucket, Key);
  301|   985k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16InsertIntoBucketIRKS4_JEEEPSG_SM_OT_DpOT0_:
  519|   492k|                            ValueArgs &&... Values) {
  520|   492k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   492k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   492k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   492k|    return TheBucket;
  525|   492k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E5countERKS2_:
  149|   625k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|   625k|    const BucketT *TheBucket;
  151|   625k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 0, False: 625k]
  ------------------
  152|   625k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E15LookupBucketForIS2_EEbRKT_RPKS8_:
  582|   625k|                       const BucketT *&FoundBucket) const {
  583|   625k|    const BucketT *BucketsPtr = getBuckets();
  584|   625k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   625k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 625k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   625k|    const BucketT *FoundTombstone = nullptr;
  593|   625k|    const KeyT EmptyKey = getEmptyKey();
  594|   625k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   625k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   625k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   625k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   625k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   625k|    unsigned ProbeAmt = 1;
  601|   625k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   625k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   625k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   625k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 625k]
  |  |  ------------------
  ------------------
  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|   625k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   625k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 625k, 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|   625k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 625k]
  ------------------
  615|   625k|        return false;
  616|   625k|      }
  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|   625k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E12getHashValueERKS2_:
  417|   625k|  static unsigned getHashValue(const KeyT &Val) {
  418|   625k|    return KeyInfoT::getHashValue(Val);
  419|   625k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E4findES5_:
  154|    392|  iterator find(const_arg_type_t<KeyT> Val) {
  155|    392|    BucketT *TheBucket;
  156|    392|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 392]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|    392|    return end();
  159|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E15LookupBucketForIS5_EEbRKT_RPSC_:
  632|    980|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    980|    const BucketT *ConstFoundBucket;
  634|    980|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    980|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    980|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    980|    return Result;
  638|    980|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E15LookupBucketForIS5_EEbRKT_RPKSC_:
  582|    980|                       const BucketT *&FoundBucket) const {
  583|    980|    const BucketT *BucketsPtr = getBuckets();
  584|    980|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    980|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 588, False: 392]
  ------------------
  587|    588|      FoundBucket = nullptr;
  588|    588|      return false;
  589|    588|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    392|    const BucketT *FoundTombstone = nullptr;
  593|    392|    const KeyT EmptyKey = getEmptyKey();
  594|    392|    const KeyT TombstoneKey = getTombstoneKey();
  595|    392|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    392|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    392|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|    392|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    392|    unsigned ProbeAmt = 1;
  601|    392|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    392|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    392|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    392|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 392]
  |  |  ------------------
  ------------------
  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|    392|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    392|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 392, 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|    392|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 392]
  ------------------
  615|    392|        return false;
  616|    392|      }
  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|    392|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E10getBucketsEv:
  489|    980|  const BucketT *getBuckets() const {
  490|    980|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    980|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E12getHashValueERKS5_:
  417|    392|  static unsigned getHashValue(const KeyT &Val) {
  418|    392|    return KeyInfoT::getHashValue(Val);
  419|    392|  }
_ZNK4llvh6detail12DenseMapPairIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataEE8getFirstEv:
   48|    784|  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|    784|                        bool NoAdvance=false) {
  440|    784|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 784]
  ------------------
  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|    784|    return iterator(P, E, Epoch, NoAdvance);
  445|    784|  }
_ZN4llvh16DenseMapIteratorIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1140|    784|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|    784|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|    784|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 784, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E3endEv:
   85|    784|  inline iterator end() {
   86|    784|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|    784|  }
_ZNK4llvh16DenseMapIteratorIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EELb0EEneERKSC_:
 1190|    392|  bool operator!=(const NonConstIterator &RHS) const {
 1191|    392|    return !(*this == RHS);
 1192|    392|  }
_ZNK4llvh16DenseMapIteratorIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EELb0EEeqERKSC_:
 1180|    392|  bool operator==(const NonConstIterator &RHS) const {
 1181|    392|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1182|    392|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1183|    392|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1184|    392|           "comparing incomparable iterators!");
 1185|    392|    return Ptr == RHS.Ptr;
 1186|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_EixERKS5_:
  303|    392|  ValueT &operator[](const KeyT &Key) {
  304|    392|    return FindAndConstruct(Key).second;
  305|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16FindAndConstructERKS5_:
  295|    392|  value_type& FindAndConstruct(const KeyT &Key) {
  296|    392|    BucketT *TheBucket;
  297|    392|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 392]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|    392|    return *InsertIntoBucket(TheBucket, Key);
  301|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16InsertIntoBucketIRKS5_JEEEPSC_SI_OT_DpOT0_:
  519|    392|                            ValueArgs &&... Values) {
  520|    392|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    392|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    392|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    392|    return TheBucket;
  525|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E20InsertIntoBucketImplIS5_EEPSC_RKS5_RKT_SG_:
  539|    392|                                BucketT *TheBucket) {
  540|    392|    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|    392|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    392|    unsigned NumBuckets = getNumBuckets();
  553|    392|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    392|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 196, False: 196]
  |  |  ------------------
  ------------------
  554|    196|      this->grow(NumBuckets * 2);
  555|    196|      LookupBucketFor(Lookup, TheBucket);
  556|    196|      NumBuckets = getNumBuckets();
  557|    196|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    196|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 196]
  |  |  ------------------
  ------------------
  558|    196|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    392|    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|    392|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    392|    const KeyT EmptyKey = getEmptyKey();
  570|    392|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 392]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    392|    return TheBucket;
  574|    392|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13getNumEntriesEv:
  457|    784|  unsigned getNumEntries() const {
  458|    784|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    784|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE13getNumEntriesEv:
  771|    784|  unsigned getNumEntries() const {
  772|    784|    return NumEntries;
  773|    784|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E4growEj:
  509|    196|  void grow(unsigned AtLeast) {
  510|    196|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    196|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE4growEj:
  736|    196|  void grow(unsigned AtLeast) {
  737|    196|    unsigned OldNumBuckets = NumBuckets;
  738|    196|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    196|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    196|    assert(Buckets);
  742|    196|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 196, False: 0]
  ------------------
  743|    196|      this->BaseT::initEmpty();
  744|    196|      return;
  745|    196|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16getNumTombstonesEv:
  473|    196|  unsigned getNumTombstones() const {
  474|    196|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    196|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE16getNumTombstonesEv:
  779|    196|  unsigned getNumTombstones() const {
  780|    196|    return NumTombstones;
  781|    196|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E19incrementNumEntriesEv:
  465|    392|  void incrementNumEntries() {
  466|    392|    setNumEntries(getNumEntries() + 1);
  467|    392|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEEC2Ej:
  669|    247|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E5countERKS2_:
  149|     81|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|     81|    const BucketT *TheBucket;
  151|     81|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 81, False: 0]
  ------------------
  152|     81|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E15LookupBucketForIS2_EEbRKT_RPKS9_:
  582|    324|                       const BucketT *&FoundBucket) const {
  583|    324|    const BucketT *BucketsPtr = getBuckets();
  584|    324|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    324|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 81, False: 243]
  ------------------
  587|     81|      FoundBucket = nullptr;
  588|     81|      return false;
  589|     81|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    243|    const BucketT *FoundTombstone = nullptr;
  593|    243|    const KeyT EmptyKey = getEmptyKey();
  594|    243|    const KeyT TombstoneKey = getTombstoneKey();
  595|    243|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    243|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    243|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|    243|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    243|    unsigned ProbeAmt = 1;
  601|    243|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    243|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    243|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    243|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 162, False: 81]
  |  |  ------------------
  ------------------
  605|    162|        FoundBucket = ThisBucket;
  606|    162|        return true;
  607|    162|      }
  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|     81|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     81|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 81, 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|     81|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 81]
  ------------------
  615|     81|        return false;
  616|     81|      }
  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|    243|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E10getBucketsEv:
  489|    324|  const BucketT *getBuckets() const {
  490|    324|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    324|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E12getHashValueERKS2_:
  417|    243|  static unsigned getHashValue(const KeyT &Val) {
  418|    243|    return KeyInfoT::getHashValue(Val);
  419|    243|  }
_ZNK4llvh6detail12DenseMapPairINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoEE8getFirstEv:
   48|    324|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_EixERKS2_:
  303|     81|  ValueT &operator[](const KeyT &Key) {
  304|     81|    return FindAndConstruct(Key).second;
  305|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16FindAndConstructERKS2_:
  295|     81|  value_type& FindAndConstruct(const KeyT &Key) {
  296|     81|    BucketT *TheBucket;
  297|     81|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 81, False: 0]
  ------------------
  298|     81|      return *TheBucket;
  299|       |
  300|      0|    return *InsertIntoBucket(TheBucket, Key);
  301|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E15LookupBucketForIS2_EEbRKT_RPS9_:
  632|    243|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    243|    const BucketT *ConstFoundBucket;
  634|    243|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    243|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    243|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    243|    return Result;
  638|    243|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E20InsertIntoBucketImplIS2_EEPS9_RKS2_RKT_SD_:
  539|     81|                                BucketT *TheBucket) {
  540|     81|    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|     81|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     81|    unsigned NumBuckets = getNumBuckets();
  553|     81|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     81|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 81, False: 0]
  |  |  ------------------
  ------------------
  554|     81|      this->grow(NumBuckets * 2);
  555|     81|      LookupBucketFor(Lookup, TheBucket);
  556|     81|      NumBuckets = getNumBuckets();
  557|     81|    } 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|     81|    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|     81|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     81|    const KeyT EmptyKey = getEmptyKey();
  570|     81|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 81]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     81|    return TheBucket;
  574|     81|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13getNumEntriesEv:
  457|    162|  unsigned getNumEntries() const {
  458|    162|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    162|  }
_ZNK4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE13getNumEntriesEv:
  771|    162|  unsigned getNumEntries() const {
  772|    162|    return NumEntries;
  773|    162|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E4growEj:
  509|     81|  void grow(unsigned AtLeast) {
  510|     81|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     81|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE4growEj:
  736|     81|  void grow(unsigned AtLeast) {
  737|     81|    unsigned OldNumBuckets = NumBuckets;
  738|     81|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     81|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     81|    assert(Buckets);
  742|     81|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 81, False: 0]
  ------------------
  743|     81|      this->BaseT::initEmpty();
  744|     81|      return;
  745|     81|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E19incrementNumEntriesEv:
  465|     81|  void incrementNumEntries() {
  466|     81|    setNumEntries(getNumEntries() + 1);
  467|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_EixEOS2_:
  315|     81|  ValueT &operator[](KeyT &&Key) {
  316|     81|    return FindAndConstruct(std::move(Key)).second;
  317|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16FindAndConstructEOS2_:
  307|     81|  value_type& FindAndConstruct(KeyT &&Key) {
  308|     81|    BucketT *TheBucket;
  309|     81|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 81]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|     81|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16InsertIntoBucketIS2_JEEEPS9_SD_OT_DpOT0_:
  519|     81|                            ValueArgs &&... Values) {
  520|     81|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     81|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     81|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     81|    return TheBucket;
  525|     81|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE15allocateBucketsEj:
  795|   103k|  bool allocateBuckets(unsigned Num) {
  796|   103k|    NumBuckets = Num;
  797|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 0]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13getNumBucketsEv:
  497|   103k|  unsigned getNumBuckets() const {
  498|   103k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   103k|  }
_ZNK4llvh8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE13getNumBucketsEv:
  791|   103k|  unsigned getNumBuckets() const {
  792|   103k|    return NumBuckets;
  793|   103k|  }
_ZN4llvh8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes12UniqueStringEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 103k, False: 0]
  ------------------
  336|   103k|      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_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E6insertEONSt3__14pairIS4_S7_EE:
  206|   245k|  std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
  207|   245k|    return try_emplace(std::move(KV.first), std::move(KV.second));
  208|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11try_emplaceIJS7_EEENSt3__14pairINS_16DenseMapIteratorIS4_S7_S9_SC_Lb0EEEbEEOS4_DpOT_:
  214|   245k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|   245k|    BucketT *TheBucket;
  216|   245k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 0, False: 245k]
  ------------------
  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|   245k|    TheBucket =
  223|   245k|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|   245k|    return std::make_pair(
  225|   245k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|   245k|             true);
  227|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPSC_:
  632|   492k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   492k|    const BucketT *ConstFoundBucket;
  634|   492k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   492k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   492k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   492k|    return Result;
  638|   492k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPKSC_:
  582|   492k|                       const BucketT *&FoundBucket) const {
  583|   492k|    const BucketT *BucketsPtr = getBuckets();
  584|   492k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   492k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 35, False: 491k]
  ------------------
  587|     35|      FoundBucket = nullptr;
  588|     35|      return false;
  589|     35|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   491k|    const BucketT *FoundTombstone = nullptr;
  593|   491k|    const KeyT EmptyKey = getEmptyKey();
  594|   491k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   491k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   491k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   491k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   491k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   491k|    unsigned ProbeAmt = 1;
  601|   938k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   938k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   938k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   938k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 245k, False: 692k]
  |  |  ------------------
  ------------------
  605|   245k|        FoundBucket = ThisBucket;
  606|   245k|        return true;
  607|   245k|      }
  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|   692k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   692k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 245k, False: 446k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   245k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 245k, False: 326]
  ------------------
  615|   245k|        return false;
  616|   245k|      }
  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|   446k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 446k, False: 477]
  ------------------
  621|   446k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 245k, False: 200k]
  ------------------
  622|   245k|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   446k|      BucketNo += ProbeAmt++;
  627|   446k|      BucketNo &= (NumBuckets-1);
  628|   446k|    }
  629|   491k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|   492k|  const BucketT *getBuckets() const {
  490|   492k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   492k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|   738k|  BucketT *getBuckets() const {
  788|   738k|    return Buckets;
  789|   738k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|  1.08M|  unsigned getNumBuckets() const {
  498|  1.08M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.08M|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|  1.08M|  unsigned getNumBuckets() const {
  792|  1.08M|    return NumBuckets;
  793|  1.08M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11getEmptyKeyEv:
  426|   738k|  static const KeyT getEmptyKey() {
  427|   738k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   738k|                  "Must pass the derived type to this template!");
  429|   738k|    return KeyInfoT::getEmptyKey();
  430|   738k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15getTombstoneKeyEv:
  432|   738k|  static const KeyT getTombstoneKey() {
  433|   738k|    return KeyInfoT::getTombstoneKey();
  434|   738k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueERKS4_:
  417|   491k|  static unsigned getHashValue(const KeyT &Val) {
  418|   491k|    return KeyInfoT::getHashValue(Val);
  419|   491k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelEE8getFirstEv:
   48|  2.07M|  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|   245k|                        bool NoAdvance=false) {
  440|   245k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 245k]
  ------------------
  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|   245k|    return iterator(P, E, Epoch, NoAdvance);
  445|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  493|   246k|  BucketT *getBuckets() {
  494|   246k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   246k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1140|   245k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1141|   245k|    assert(isHandleInSync() && "invalid construction!");
 1142|       |
 1143|   245k|    if (NoAdvance) return;
  ------------------
  |  Branch (1143:9): [True: 245k, False: 0]
  ------------------
 1144|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1144:9): [True: 0, False: 0]
  ------------------
 1145|      0|      RetreatPastEmptyBuckets();
 1146|      0|      return;
 1147|      0|    }
 1148|      0|    AdvancePastEmptyBuckets();
 1149|      0|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelEE8getFirstEv:
   47|   745k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  501|   246k|  BucketT *getBucketsEnd() {
  502|   246k|    return getBuckets() + getNumBuckets();
  503|   246k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16InsertIntoBucketIS4_JS7_EEEPSC_SG_OT_DpOT0_:
  519|   245k|                            ValueArgs &&... Values) {
  520|   245k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   245k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   245k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   245k|    return TheBucket;
  525|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E20InsertIntoBucketImplIS4_EEPSC_RKS4_RKT_SG_:
  539|   245k|                                BucketT *TheBucket) {
  540|   245k|    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|   245k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   245k|    unsigned NumBuckets = getNumBuckets();
  553|   245k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   245k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 35, False: 245k]
  |  |  ------------------
  ------------------
  554|     35|      this->grow(NumBuckets * 2);
  555|     35|      LookupBucketFor(Lookup, TheBucket);
  556|     35|      NumBuckets = getNumBuckets();
  557|   245k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   245k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 245k]
  |  |  ------------------
  ------------------
  558|   245k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   245k|    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|   245k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   245k|    const KeyT EmptyKey = getEmptyKey();
  570|   245k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 245k, False: 326]
  ------------------
  571|   245k|      decrementNumTombstones();
  572|       |
  573|   245k|    return TheBucket;
  574|   245k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|   737k|  unsigned getNumEntries() const {
  458|   737k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   737k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|   737k|  unsigned getNumEntries() const {
  772|   737k|    return NumEntries;
  773|   737k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4growEj:
  509|     35|  void grow(unsigned AtLeast) {
  510|     35|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     35|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4growEj:
  736|     35|  void grow(unsigned AtLeast) {
  737|     35|    unsigned OldNumBuckets = NumBuckets;
  738|     35|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     35|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     35|    assert(Buckets);
  742|     35|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 35, False: 0]
  ------------------
  743|     35|      this->BaseT::initEmpty();
  744|     35|      return;
  745|     35|    }
  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|   103k|  bool allocateBuckets(unsigned Num) {
  796|   103k|    NumBuckets = Num;
  797|   103k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 103k, False: 35]
  ------------------
  798|   103k|      Buckets = nullptr;
  799|   103k|      return false;
  800|   103k|    }
  801|       |
  802|     35|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     35|    return true;
  804|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E9initEmptyEv:
  347|     35|  void initEmpty() {
  348|     35|    setNumEntries(0);
  349|     35|    setNumTombstones(0);
  350|       |
  351|     35|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     35|           "# initial buckets must be a power of two!");
  353|     35|    const KeyT EmptyKey = getEmptyKey();
  354|  2.27k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.24k, False: 35]
  ------------------
  355|  2.24k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     35|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13setNumEntriesEj:
  461|   492k|  void setNumEntries(unsigned Num) {
  462|   492k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   492k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13setNumEntriesEj:
  775|   492k|  void setNumEntries(unsigned Num) {
  776|   492k|    NumEntries = Num;
  777|   492k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16setNumTombstonesEj:
  477|   491k|  void setNumTombstones(unsigned Num) {
  478|   491k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   491k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16setNumTombstonesEj:
  783|   491k|  void setNumTombstones(unsigned Num) {
  784|   491k|    NumTombstones = Num;
  785|   491k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16getNumTombstonesEv:
  473|   737k|  unsigned getNumTombstones() const {
  474|   737k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   737k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16getNumTombstonesEv:
  779|   737k|  unsigned getNumTombstones() const {
  780|   737k|    return NumTombstones;
  781|   737k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19incrementNumEntriesEv:
  465|   245k|  void incrementNumEntries() {
  466|   245k|    setNumEntries(getNumEntries() + 1);
  467|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E22decrementNumTombstonesEv:
  485|   245k|  void decrementNumTombstones() {
  486|   245k|    setNumTombstones(getNumTombstones() - 1);
  487|   245k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelEE9getSecondEv:
   49|   491k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5eraseERKS4_:
  276|   245k|  bool erase(const KeyT &Val) {
  277|   245k|    BucketT *TheBucket;
  278|   245k|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 0, False: 245k]
  ------------------
  279|      0|      return false; // not in map.
  280|       |
  281|   245k|    TheBucket->getSecond().~ValueT();
  282|   245k|    TheBucket->getFirst() = getTombstoneKey();
  283|   245k|    decrementNumEntries();
  284|   245k|    incrementNumTombstones();
  285|   245k|    return true;
  286|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19decrementNumEntriesEv:
  469|   245k|  void decrementNumEntries() {
  470|   245k|    setNumEntries(getNumEntries() - 1);
  471|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E22incrementNumTombstonesEv:
  481|   245k|  void incrementNumTombstones() {
  482|   245k|    setNumTombstones(getNumTombstones() + 1);
  483|   245k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_EixERKS5_:
  303|   103k|  ValueT &operator[](const KeyT &Key) {
  304|   103k|    return FindAndConstruct(Key).second;
  305|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E16FindAndConstructERKS5_:
  295|   103k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   103k|    BucketT *TheBucket;
  297|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 103k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   103k|    return *InsertIntoBucket(TheBucket, Key);
  301|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E15LookupBucketForIS5_EEbRKT_RPSK_:
  632|   206k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   206k|    const BucketT *ConstFoundBucket;
  634|   206k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   206k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   206k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   206k|    return Result;
  638|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E15LookupBucketForIS5_EEbRKT_RPKSK_:
  582|   206k|                       const BucketT *&FoundBucket) const {
  583|   206k|    const BucketT *BucketsPtr = getBuckets();
  584|   206k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 103k, False: 103k]
  ------------------
  587|   103k|      FoundBucket = nullptr;
  588|   103k|      return false;
  589|   103k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   103k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   103k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  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|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, 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|   103k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 103k]
  ------------------
  615|   103k|        return false;
  616|   103k|      }
  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|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E12getHashValueERKS5_:
  417|   103k|  static unsigned getHashValue(const KeyT &Val) {
  418|   103k|    return KeyInfoT::getHashValue(Val);
  419|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E16InsertIntoBucketIRKS5_JEEEPSK_SQ_OT_DpOT0_:
  519|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E20InsertIntoBucketImplIS5_EEPSK_RKS5_RKT_SO_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 103k, False: 0]
  |  |  ------------------
  ------------------
  554|   103k|      this->grow(NumBuckets * 2);
  555|   103k|      LookupBucketFor(Lookup, TheBucket);
  556|   103k|      NumBuckets = getNumBuckets();
  557|   103k|    } 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|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E13getNumEntriesEv:
  457|   206k|  unsigned getNumEntries() const {
  458|   206k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   206k|  }
_ZNK4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE13getNumEntriesEv:
  771|   206k|  unsigned getNumEntries() const {
  772|   206k|    return NumEntries;
  773|   206k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E4growEj:
  509|   103k|  void grow(unsigned AtLeast) {
  510|   103k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   103k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS1_3sem12FunctionInfo7VarDeclELj4EEENS5_14default_deleteISB_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SE_EEE4growEj:
  736|   103k|  void grow(unsigned AtLeast) {
  737|   103k|    unsigned OldNumBuckets = NumBuckets;
  738|   103k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   103k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   103k|    assert(Buckets);
  742|   103k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 103k, False: 0]
  ------------------
  743|   103k|      this->BaseT::initEmpty();
  744|   103k|      return;
  745|   103k|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorINS2_3sem12FunctionInfo7VarDeclELj4EEENS6_14default_deleteISC_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SF_EEEES5_SF_SH_SK_E19incrementNumEntriesEv:
  465|   103k|  void incrementNumEntries() {
  466|   103k|    setNumEntries(getNumEntries() + 1);
  467|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_EixERKS5_:
  303|   103k|  ValueT &operator[](const KeyT &Key) {
  304|   103k|    return FindAndConstruct(Key).second;
  305|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16FindAndConstructERKS5_:
  295|   103k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   103k|    BucketT *TheBucket;
  297|   103k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 103k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   103k|    return *InsertIntoBucket(TheBucket, Key);
  301|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIS5_EEbRKT_RPSJ_:
  632|   206k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   206k|    const BucketT *ConstFoundBucket;
  634|   206k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   206k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   206k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   206k|    return Result;
  638|   206k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIS5_EEbRKT_RPKSJ_:
  582|   206k|                       const BucketT *&FoundBucket) const {
  583|   206k|    const BucketT *BucketsPtr = getBuckets();
  584|   206k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   206k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 103k, False: 103k]
  ------------------
  587|   103k|      FoundBucket = nullptr;
  588|   103k|      return false;
  589|   103k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   103k|    const BucketT *FoundTombstone = nullptr;
  593|   103k|    const KeyT EmptyKey = getEmptyKey();
  594|   103k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   103k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   103k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   103k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|   103k|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   103k|    unsigned ProbeAmt = 1;
  601|   103k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   103k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  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|   103k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, 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|   103k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 103k]
  ------------------
  615|   103k|        return false;
  616|   103k|      }
  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|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E12getHashValueERKS5_:
  417|   103k|  static unsigned getHashValue(const KeyT &Val) {
  418|   103k|    return KeyInfoT::getHashValue(Val);
  419|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16InsertIntoBucketIRKS5_JEEEPSJ_SP_OT_DpOT0_:
  519|   103k|                            ValueArgs &&... Values) {
  520|   103k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   103k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   103k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   103k|    return TheBucket;
  525|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E20InsertIntoBucketImplIS5_EEPSJ_RKS5_RKT_SN_:
  539|   103k|                                BucketT *TheBucket) {
  540|   103k|    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|   103k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   103k|    unsigned NumBuckets = getNumBuckets();
  553|   103k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 103k, False: 0]
  |  |  ------------------
  ------------------
  554|   103k|      this->grow(NumBuckets * 2);
  555|   103k|      LookupBucketFor(Lookup, TheBucket);
  556|   103k|      NumBuckets = getNumBuckets();
  557|   103k|    } 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|   103k|    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|   103k|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   103k|    const KeyT EmptyKey = getEmptyKey();
  570|   103k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 103k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   103k|    return TheBucket;
  574|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getNumEntriesEv:
  457|   413k|  unsigned getNumEntries() const {
  458|   413k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   413k|  }
_ZNK4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13getNumEntriesEv:
  771|   413k|  unsigned getNumEntries() const {
  772|   413k|    return NumEntries;
  773|   413k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E4growEj:
  509|   103k|  void grow(unsigned AtLeast) {
  510|   103k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   103k|  }
_ZN4llvh8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE4growEj:
  736|   103k|  void grow(unsigned AtLeast) {
  737|   103k|    unsigned OldNumBuckets = NumBuckets;
  738|   103k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   103k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   103k|    assert(Buckets);
  742|   103k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 103k, False: 0]
  ------------------
  743|   103k|      this->BaseT::initEmpty();
  744|   103k|      return;
  745|   103k|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E19incrementNumEntriesEv:
  465|   103k|  void incrementNumEntries() {
  466|   103k|    setNumEntries(getNumEntries() + 1);
  467|   103k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|   103k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|   103k|  void init(unsigned InitNumEntries) {
  727|   103k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   103k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 103k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   103k|    } else {
  731|   103k|      NumEntries = 0;
  732|   103k|      NumTombstones = 0;
  733|   103k|    }
  734|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|   103k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   103k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 103k, False: 0]
  ------------------
  363|   103k|      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|   103k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|   103k|  ~DenseMap() {
  688|   103k|    this->destroyAll();
  689|   103k|    operator delete(Buckets);
  690|   103k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|   103k|  void destroyAll() {
  335|   103k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 103k, False: 35]
  ------------------
  336|   103k|      return;
  337|       |
  338|     35|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  2.27k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 2.24k, False: 35]
  ------------------
  340|  2.24k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 326, False: 1.91k]
  ------------------
  341|  2.24k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 326]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  2.24k|      P->getFirst().~KeyT();
  344|  2.24k|    }
  345|     35|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E4sizeEv:
  102|   103k|  unsigned size() const { return getNumEntries(); }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5beginEv:
   76|   103k|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|   103k|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 103k]
  ------------------
   80|      0|      return end();
   81|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 103k]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|   103k|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|   103k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS3_23FunctionDeclarationNodeELj2EEENS6_14default_deleteISB_EEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5emptyEv:
   99|   103k|  LLVM_NODISCARD bool empty() const {
  100|   103k|    return getNumEntries() == 0;
  101|   103k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEppEv:
 1194|   103k|  inline DenseMapIterator& operator++() {  // Preincrement
 1195|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1196|   103k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1196:9): [True: 0, False: 103k]
  ------------------
 1197|      0|      --Ptr;
 1198|      0|      RetreatPastEmptyBuckets();
 1199|      0|      return *this;
 1200|      0|    }
 1201|   103k|    ++Ptr;
 1202|   103k|    AdvancePastEmptyBuckets();
 1203|   103k|    return *this;
 1204|   103k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes6ESTree4NodeENSt3__110unique_ptrINS_11SmallVectorIPNS2_23FunctionDeclarationNodeELj2EEENS5_14default_deleteISA_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEdeEv:
 1160|   103k|  reference operator*() const {
 1161|   103k|    assert(isHandleInSync() && "invalid iterator access!");
 1162|   103k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1162:9): [True: 0, False: 103k]
  ------------------
 1163|      0|      return Ptr[-1];
 1164|   103k|    return *Ptr;
 1165|   103k|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2EOS8_:
  676|    405|  DenseMap(DenseMap &&other) : BaseT() {
  677|    405|    init(0);
  678|    405|    swap(other);
  679|    405|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4swapERS8_:
  692|    405|  void swap(DenseMap& RHS) {
  693|    405|    this->incrementEpoch();
  694|    405|    RHS.incrementEpoch();
  695|    405|    std::swap(Buckets, RHS.Buckets);
  696|    405|    std::swap(NumEntries, RHS.NumEntries);
  697|    405|    std::swap(NumTombstones, RHS.NumTombstones);
  698|    405|    std::swap(NumBuckets, RHS.NumBuckets);
  699|    405|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEEC2Ej:
  669|    494|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE4initEj:
  726|    494|  void init(unsigned InitNumEntries) {
  727|    494|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    494|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 494]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    494|    } else {
  731|    494|      NumEntries = 0;
  732|    494|      NumTombstones = 0;
  733|    494|    }
  734|    494|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|    494|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    494|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 494, False: 0]
  ------------------
  363|    494|      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|    494|  }

_ZN4llvh12DenseMapInfoIjE11getEmptyKeyEv:
   89|  5.92M|  static inline unsigned getEmptyKey() { return ~0U; }
_ZN4llvh12DenseMapInfoIjE15getTombstoneKeyEv:
   90|  5.72M|  static inline unsigned getTombstoneKey() { return ~0U - 1; }
_ZN4llvh12DenseMapInfoIjE7isEqualERKjS3_:
   93|  21.3M|  static bool isEqual(const unsigned& LHS, const unsigned& RHS) {
   94|  21.3M|    return LHS == RHS;
   95|  21.3M|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE11getEmptyKeyEv:
  217|  95.4M|  static inline StringRef getEmptyKey() {
  218|  95.4M|    return StringRef(reinterpret_cast<const char *>(~static_cast<uintptr_t>(0)),
  219|  95.4M|                     0);
  220|  95.4M|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE15getTombstoneKeyEv:
  222|  69.8M|  static inline StringRef getTombstoneKey() {
  223|  69.8M|    return StringRef(reinterpret_cast<const char *>(~static_cast<uintptr_t>(1)),
  224|  69.8M|                     0);
  225|  69.8M|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE7isEqualES1_S1_:
  234|  52.5M|  static bool isEqual(StringRef LHS, StringRef RHS) {
  235|  52.5M|    if (RHS.data() == getEmptyKey().data())
  ------------------
  |  Branch (235:9): [True: 21.1M, False: 31.4M]
  ------------------
  236|  21.1M|      return LHS.data() == getEmptyKey().data();
  237|  31.4M|    if (RHS.data() == getTombstoneKey().data())
  ------------------
  |  Branch (237:9): [True: 16.9M, False: 14.5M]
  ------------------
  238|  16.9M|      return LHS.data() == getTombstoneKey().data();
  239|  14.5M|    return LHS == RHS;
  240|  31.4M|  }
_ZN4llvh12DenseMapInfoIjE12getHashValueERKj:
   91|  5.67M|  static unsigned getHashValue(const unsigned& Val) { return Val * 37U; }
_ZN4llvh12DenseMapInfoIiE11getEmptyKeyEv:
  137|  14.8k|  static inline int getEmptyKey() { return 0x7fffffff; }
_ZN4llvh12DenseMapInfoIiE15getTombstoneKeyEv:
  138|  7.44k|  static inline int getTombstoneKey() { return -0x7fffffff - 1; }
_ZN4llvh12DenseMapInfoIiE12getHashValueERKi:
  139|  7.25k|  static unsigned getHashValue(const int& Val) { return (unsigned)(Val * 37U); }
_ZN4llvh12DenseMapInfoIiE7isEqualERKiS3_:
  141|  66.8k|  static bool isEqual(const int& LHS, const int& RHS) {
  142|  66.8k|    return LHS == RHS;
  143|  66.8k|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE12getHashValueES1_:
  227|  10.6M|  static unsigned getHashValue(StringRef Val) {
  228|  10.6M|    assert(Val.data() != getEmptyKey().data() && "Cannot hash the empty key!");
  229|  10.6M|    assert(Val.data() != getTombstoneKey().data() &&
  230|  10.6M|           "Cannot hash the tombstone key!");
  231|  10.6M|    return (unsigned)(hash_value(Val));
  232|  10.6M|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE11getEmptyKeyEv:
  185|    233|  static inline Pair getEmptyKey() {
  186|    233|    return std::make_pair(FirstInfo::getEmptyKey(),
  187|    233|                          SecondInfo::getEmptyKey());
  188|    233|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE15getTombstoneKeyEv:
  190|    167|  static inline Pair getTombstoneKey() {
  191|    167|    return std::make_pair(FirstInfo::getTombstoneKey(),
  192|    167|                          SecondInfo::getTombstoneKey());
  193|    167|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE7isEqualERKS4_S7_:
  209|  1.77k|  static bool isEqual(const Pair &LHS, const Pair &RHS) {
  210|  1.77k|    return FirstInfo::isEqual(LHS.first, RHS.first) &&
  ------------------
  |  Branch (210:12): [True: 1.30k, False: 472]
  ------------------
  211|  1.77k|           SecondInfo::isEqual(LHS.second, RHS.second);
  ------------------
  |  Branch (211:12): [True: 1.30k, False: 0]
  ------------------
  212|  1.77k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE12getHashValueERKS4_:
  195|    149|  static unsigned getHashValue(const Pair& PairVal) {
  196|    149|    uint64_t key = (uint64_t)FirstInfo::getHashValue(PairVal.first) << 32
  197|    149|          | (uint64_t)SecondInfo::getHashValue(PairVal.second);
  198|    149|    key += ~(key << 32);
  199|    149|    key ^= (key >> 22);
  200|    149|    key += ~(key << 13);
  201|    149|    key ^= (key >> 8);
  202|    149|    key += (key << 3);
  203|    149|    key ^= (key >> 15);
  204|    149|    key += ~(key << 27);
  205|    149|    key ^= (key >> 31);
  206|    149|    return (unsigned)key;
  207|    149|  }
_ZN4llvh12DenseMapInfoINS_8ArrayRefIhEEE11getEmptyKeyEv:
  245|    715|  static inline ArrayRef<T> getEmptyKey() {
  246|    715|    return ArrayRef<T>(reinterpret_cast<const T *>(~static_cast<uintptr_t>(0)),
  247|    715|                       size_t(0));
  248|    715|  }
_ZN4llvh12DenseMapInfoINS_8ArrayRefIhEEE15getTombstoneKeyEv:
  250|     35|  static inline ArrayRef<T> getTombstoneKey() {
  251|     35|    return ArrayRef<T>(reinterpret_cast<const T *>(~static_cast<uintptr_t>(1)),
  252|     35|                       size_t(0));
  253|     35|  }
_ZN4llvh12DenseMapInfoINS_8ArrayRefIhEEE7isEqualES2_S2_:
  262|    350|  static bool isEqual(ArrayRef<T> LHS, ArrayRef<T> RHS) {
  263|    350|    if (RHS.data() == getEmptyKey().data())
  ------------------
  |  Branch (263:9): [True: 340, False: 10]
  ------------------
  264|    340|      return LHS.data() == getEmptyKey().data();
  265|     10|    if (RHS.data() == getTombstoneKey().data())
  ------------------
  |  Branch (265:9): [True: 10, False: 0]
  ------------------
  266|     10|      return LHS.data() == getTombstoneKey().data();
  267|      0|    return LHS == RHS;
  268|     10|  }
_ZN4llvh12DenseMapInfoINS_8ArrayRefIhEEE12getHashValueES2_:
  255|      5|  static unsigned getHashValue(ArrayRef<T> Val) {
  256|      5|    assert(Val.data() != getEmptyKey().data() && "Cannot hash the empty key!");
  257|      5|    assert(Val.data() != getTombstoneKey().data() &&
  258|      5|           "Cannot hash the tombstone key!");
  259|      5|    return (unsigned)(hash_value(Val));
  260|      5|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE11getEmptyKeyEv:
   45|  1.88M|  static inline T* getEmptyKey() {
   46|  1.88M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.88M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.88M|    return reinterpret_cast<T*>(Val);
   49|  1.88M|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE15getTombstoneKeyEv:
   51|  1.86M|  static inline T* getTombstoneKey() {
   52|  1.86M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  1.86M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  1.86M|    return reinterpret_cast<T*>(Val);
   55|  1.86M|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE12getHashValueEPKS2_:
   57|  1.59M|  static unsigned getHashValue(const T *PtrVal) {
   58|  1.59M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  1.59M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  1.59M|  }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE11getEmptyKeyEv:
   45|  1.12M|  static inline T* getEmptyKey() {
   46|  1.12M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.12M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.12M|    return reinterpret_cast<T*>(Val);
   49|  1.12M|  }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE15getTombstoneKeyEv:
   51|   915k|  static inline T* getTombstoneKey() {
   52|   915k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   915k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   915k|    return reinterpret_cast<T*>(Val);
   55|   915k|  }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE7isEqualEPKS2_S6_:
   62|  7.45M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE12getHashValueEPKS2_:
   57|   915k|  static unsigned getHashValue(const T *PtrVal) {
   58|   915k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   915k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   915k|  }
_ZN4llvh12DenseMapInfoIPN6hermes6ESTree4NodeEE11getEmptyKeyEv:
   45|  1.34M|  static inline T* getEmptyKey() {
   46|  1.34M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.34M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.34M|    return reinterpret_cast<T*>(Val);
   49|  1.34M|  }
_ZN4llvh12DenseMapInfoIPN6hermes6ESTree4NodeEE15getTombstoneKeyEv:
   51|   930k|  static inline T* getTombstoneKey() {
   52|   930k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   930k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   930k|    return reinterpret_cast<T*>(Val);
   55|   930k|  }
_ZN4llvh12DenseMapInfoIPN6hermes6ESTree4NodeEE7isEqualEPKS3_S7_:
   62|  22.1M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPvE12getHashValueEPKv:
   57|  8.92M|  static unsigned getHashValue(const T *PtrVal) {
   58|  8.92M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  8.92M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  8.92M|  }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE11getEmptyKeyEv:
   45|  1.12k|  static inline T* getEmptyKey() {
   46|  1.12k|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.12k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.12k|    return reinterpret_cast<T*>(Val);
   49|  1.12k|  }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE15getTombstoneKeyEv:
   51|    960|  static inline T* getTombstoneKey() {
   52|    960|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|    960|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|    960|    return reinterpret_cast<T*>(Val);
   55|    960|  }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE7isEqualEPKS3_S7_:
   62|  22.0k|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE12getHashValueEPKS3_:
   57|    320|  static unsigned getHashValue(const T *PtrVal) {
   58|    320|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|    320|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|    320|  }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE11getEmptyKeyEv:
   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|  }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE11getEmptyKeyEv:
   45|    360|  static inline T* getEmptyKey() {
   46|    360|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|    360|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|    360|    return reinterpret_cast<T*>(Val);
   49|    360|  }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE15getTombstoneKeyEv:
   51|    230|  static inline T* getTombstoneKey() {
   52|    230|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|    230|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|    230|    return reinterpret_cast<T*>(Val);
   55|    230|  }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE7isEqualES4_S4_:
   62|  2.87k|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE12getHashValueES4_:
   57|    201|  static unsigned getHashValue(const T *PtrVal) {
   58|    201|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|    201|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|    201|  }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE11getEmptyKeyEv:
   45|  1.17k|  static inline T* getEmptyKey() {
   46|  1.17k|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.17k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.17k|    return reinterpret_cast<T*>(Val);
   49|  1.17k|  }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE11getEmptyKeyEv:
   45|   154M|  static inline T* getEmptyKey() {
   46|   154M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|   154M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|   154M|    return reinterpret_cast<T*>(Val);
   49|   154M|  }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE11getEmptyKeyEv:
   45|  30.8M|  static inline T* getEmptyKey() {
   46|  30.8M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  30.8M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  30.8M|    return reinterpret_cast<T*>(Val);
   49|  30.8M|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE11getEmptyKeyEv:
   45|   139M|  static inline T* getEmptyKey() {
   46|   139M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|   139M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|   139M|    return reinterpret_cast<T*>(Val);
   49|   139M|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE15getTombstoneKeyEv:
   51|   129M|  static inline T* getTombstoneKey() {
   52|   129M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   129M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   129M|    return reinterpret_cast<T*>(Val);
   55|   129M|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE7isEqualEPKS2_S6_:
   62|   874M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE15getTombstoneKeyEv:
   51|  27.9M|  static inline T* getTombstoneKey() {
   52|  27.9M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  27.9M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  27.9M|    return reinterpret_cast<T*>(Val);
   55|  27.9M|  }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE7isEqualEPKS2_S6_:
   62|   191M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE15getTombstoneKeyEv:
   51|   151M|  static inline T* getTombstoneKey() {
   52|   151M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   151M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   151M|    return reinterpret_cast<T*>(Val);
   55|   151M|  }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE7isEqualEPKS2_S6_:
   62|   695M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE11getEmptyKeyEv:
   45|  4.59M|  static inline T* getEmptyKey() {
   46|  4.59M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  4.59M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  4.59M|    return reinterpret_cast<T*>(Val);
   49|  4.59M|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE11getEmptyKeyEv:
   45|  19.4M|  static inline T* getEmptyKey() {
   46|  19.4M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  19.4M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  19.4M|    return reinterpret_cast<T*>(Val);
   49|  19.4M|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE15getTombstoneKeyEv:
   51|  19.3M|  static inline T* getTombstoneKey() {
   52|  19.3M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  19.3M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  19.3M|    return reinterpret_cast<T*>(Val);
   55|  19.3M|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE7isEqualEPKS2_S6_:
   62|  91.4M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE15getTombstoneKeyEv:
   51|  3.54M|  static inline T* getTombstoneKey() {
   52|  3.54M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  3.54M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  3.54M|    return reinterpret_cast<T*>(Val);
   55|  3.54M|  }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE7isEqualES4_S4_:
   62|  34.1M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE15getTombstoneKeyEv:
   51|  14.2M|  static inline T* getTombstoneKey() {
   52|  14.2M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  14.2M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  14.2M|    return reinterpret_cast<T*>(Val);
   55|  14.2M|  }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE7isEqualEPKS2_S6_:
   62|  70.9M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE15getTombstoneKeyEv:
   51|    588|  static inline T* getTombstoneKey() {
   52|    588|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|    588|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|    588|    return reinterpret_cast<T*>(Val);
   55|    588|  }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE7isEqualES4_S4_:
   62|  14.8k|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE12getHashValueEPKS2_:
   57|   151M|  static unsigned getHashValue(const T *PtrVal) {
   58|   151M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   151M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   151M|  }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE12getHashValueES4_:
   57|  3.33M|  static unsigned getHashValue(const T *PtrVal) {
   58|  3.33M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  3.33M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  3.33M|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE12getHashValueEPKS2_:
   57|  19.3M|  static unsigned getHashValue(const T *PtrVal) {
   58|  19.3M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  19.3M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  19.3M|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE7isEqualEPKS2_S6_:
   62|  3.62M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE12getHashValueEPKS2_:
   57|  14.0M|  static unsigned getHashValue(const T *PtrVal) {
   58|  14.0M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  14.0M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  14.0M|  }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE12getHashValueEPKS2_:
   57|  27.9M|  static unsigned getHashValue(const T *PtrVal) {
   58|  27.9M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  27.9M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  27.9M|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE11getEmptyKeyEv:
  185|  14.8k|  static inline Pair getEmptyKey() {
  186|  14.8k|    return std::make_pair(FirstInfo::getEmptyKey(),
  187|  14.8k|                          SecondInfo::getEmptyKey());
  188|  14.8k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE15getTombstoneKeyEv:
  190|  7.44k|  static inline Pair getTombstoneKey() {
  191|  7.44k|    return std::make_pair(FirstInfo::getTombstoneKey(),
  192|  7.44k|                          SecondInfo::getTombstoneKey());
  193|  7.44k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE7isEqualERKS5_S8_:
  209|  66.8k|  static bool isEqual(const Pair &LHS, const Pair &RHS) {
  210|  66.8k|    return FirstInfo::isEqual(LHS.first, RHS.first) &&
  ------------------
  |  Branch (210:12): [True: 21.0k, False: 45.8k]
  ------------------
  211|  66.8k|           SecondInfo::isEqual(LHS.second, RHS.second);
  ------------------
  |  Branch (211:12): [True: 19.7k, False: 1.22k]
  ------------------
  212|  66.8k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE12getHashValueERKS5_:
  195|  7.25k|  static unsigned getHashValue(const Pair& PairVal) {
  196|  7.25k|    uint64_t key = (uint64_t)FirstInfo::getHashValue(PairVal.first) << 32
  197|  7.25k|          | (uint64_t)SecondInfo::getHashValue(PairVal.second);
  198|  7.25k|    key += ~(key << 32);
  199|  7.25k|    key ^= (key >> 22);
  200|  7.25k|    key += ~(key << 13);
  201|  7.25k|    key ^= (key >> 8);
  202|  7.25k|    key += (key << 3);
  203|  7.25k|    key ^= (key >> 15);
  204|  7.25k|    key += ~(key << 27);
  205|  7.25k|    key ^= (key >> 31);
  206|  7.25k|    return (unsigned)key;
  207|  7.25k|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE12getHashValueEPKS2_:
   57|   129M|  static unsigned getHashValue(const T *PtrVal) {
   58|   129M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   129M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   129M|  }
_ZN4llvh12DenseMapInfoIPN6hermes6ESTree4NodeEE12getHashValueEPKS3_:
   57|   517k|  static unsigned getHashValue(const T *PtrVal) {
   58|   517k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   517k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   517k|  }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE12getHashValueES4_:
   57|    392|  static unsigned getHashValue(const T *PtrVal) {
   58|    392|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|    392|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|    392|  }

_ZN4llvh6detail12DenseSetPairINS_9StringRefEE8getFirstEv:
   38|  84.2k|  KeyT &getFirst() { return key; }
_ZN4llvh6detail12DenseSetImplIN6hermes2vm8SymbolIDENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|    160|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_EC2Ej:
   67|    160|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E5beginEv:
  159|    339|  iterator begin() { return Iterator(TheMap.begin()); }
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorC2ERKNS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEE:
  118|    678|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E3endEv:
  160|    339|  iterator end() { return Iterator(TheMap.end()); }
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E13ConstIteratorC2ERKNSD_8IteratorE:
  144|    339|    ConstIterator(const Iterator &B) : I(B.I) {}
_ZNK4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorneERKNSD_13ConstIteratorE:
  128|    339|    bool operator!=(const ConstIterator& X) const { return I != X.I; }
_ZN4llvh6detail12DenseSetImplIPN6hermes9ScopeDescENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|    196|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetPairIPN6hermes9ScopeDescEE8getFirstEv:
   38|  42.1M|  KeyT &getFirst() { return key; }
_ZN4llvh6detail12DenseSetImplIPN6hermes8FunctionENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|    196|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_EC2Ej:
   67|   206k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetPairIPKN6hermes10BasicBlockEE8getFirstEv:
   38|  39.3M|  KeyT &getFirst() { return key; }
_ZN4llvh6detail12DenseSetPairIPKN6hermes10BasicBlockEE9getSecondEv:
   40|  4.69M|  DenseSetEmpty &getSecond() { return *this; }
_ZN4llvh6detail12DenseSetPairIPN6hermes9ScopeDescEE9getSecondEv:
   40|   752k|  DenseSetEmpty &getSecond() { return *this; }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_EC2Ej:
   67|   103k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E6insertERKS5_:
  187|   740k|  std::pair<iterator, bool> insert(const ValueT &V) {
  188|   740k|    detail::DenseSetEmpty Empty;
  189|   740k|    return TheMap.try_emplace(V, Empty);
  190|   740k|  }
_ZNK4llvh6detail12DenseSetPairIPKN6hermes10BasicBlockEE8getFirstEv:
   39|  13.8M|  const KeyT &getFirst() const { return key; }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorC2ERKNS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEE:
  118|   740k|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZNK4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E5countES5_:
   91|   749k|  size_type count(const_arg_type_t<ValueT> V) const {
   92|   749k|    return TheMap.count(V);
   93|   749k|  }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E6insertERKS5_:
  187|   103k|  std::pair<iterator, bool> insert(const ValueT &V) {
  188|   103k|    detail::DenseSetEmpty Empty;
  189|   103k|    return TheMap.try_emplace(V, Empty);
  190|   103k|  }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorC2ERKNS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEE:
  118|   103k|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZNK4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E5countES5_:
   91|   740k|  size_type count(const_arg_type_t<ValueT> V) const {
   92|   740k|    return TheMap.count(V);
   93|   740k|  }
_ZN4llvh6detail12DenseSetImplIPN6hermes9ScopeDescENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E6insertERKS4_:
  187|  4.69M|  std::pair<iterator, bool> insert(const ValueT &V) {
  188|  4.69M|    detail::DenseSetEmpty Empty;
  189|  4.69M|    return TheMap.try_emplace(V, Empty);
  190|  4.69M|  }
_ZNK4llvh6detail12DenseSetPairIPN6hermes9ScopeDescEE8getFirstEv:
   39|  7.92M|  const KeyT &getFirst() const { return key; }
_ZN4llvh6detail12DenseSetImplIPN6hermes9ScopeDescENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E8IteratorC2ERKNS_16DenseMapIteratorIS4_S6_S8_SA_Lb0EEE:
  118|  4.69M|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes9ScopeDescENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E5clearEv:
   86|   103k|  void clear() {
   87|   103k|    TheMap.clear();
   88|   103k|  }
_ZN4llvh6detail12DenseSetImplINS_9StringRefENS_13SmallDenseMapIS2_NS0_13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS0_12DenseSetPairIS2_EEEES6_EC2Ej:
   67|  1.23k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZNK4llvh6detail12DenseSetPairINS_9StringRefEE8getFirstEv:
   39|  1.25M|  const KeyT &getFirst() const { return key; }
ConsecutiveStringStorage.cpp:_ZN4llvh6detail12DenseSetImplIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_8DenseMapIS7_NS0_13DenseSetEmptyENS_12DenseMapInfoIS7_EENS0_12DenseSetPairIS7_EEEESB_EC2Ej:
   67|  4.91k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
ConsecutiveStringStorage.cpp:_ZN4llvh6detail12DenseSetImplIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_8DenseMapIS7_NS0_13DenseSetEmptyENS_12DenseMapInfoIS7_EENS0_12DenseSetPairIS7_EEEESB_EC2Ej:
   67|    388|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|     13|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetPairIPN6hermes11InstructionEE8getFirstEv:
   38|  5.43k|  KeyT &getFirst() { return key; }
_ZN4llvh6detail12DenseSetPairIPN6hermes11InstructionEE9getSecondEv:
   40|  1.24k|  DenseSetEmpty &getSecond() { return *this; }
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E6insertERKS4_:
  187|    348|  std::pair<iterator, bool> insert(const ValueT &V) {
  188|    348|    detail::DenseSetEmpty Empty;
  189|    348|    return TheMap.try_emplace(V, Empty);
  190|    348|  }
_ZNK4llvh6detail12DenseSetPairIPN6hermes11InstructionEE8getFirstEv:
   39|  1.41k|  const KeyT &getFirst() const { return key; }
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E8IteratorC2ERKNS_16DenseMapIteratorIS4_S6_S8_SA_Lb0EEE:
  118|    348|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E5clearEv:
   86|     13|  void clear() {
   87|     13|    TheMap.clear();
   88|     13|  }
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|   103k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZNK4llvh6detail12DenseSetImplINS_9StringRefENS_13SmallDenseMapIS2_NS0_13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS0_12DenseSetPairIS2_EEEES6_E5countERKS2_:
   91|   625k|  size_type count(const_arg_type_t<ValueT> V) const {
   92|   625k|    return TheMap.count(V);
   93|   625k|  }

_ZN4llvh14DebugEpochBase14incrementEpochEv:
   84|  20.7M|  void incrementEpoch() {}
_ZN4llvh14DebugEpochBase10HandleBaseC2EPKS0_:
   89|   124M|    explicit HandleBase(const DebugEpochBase *) {}
_ZNK4llvh14DebugEpochBase10HandleBase14isHandleInSyncEv:
   90|   284M|    bool isHandleInSync() const { return true; }
_ZNK4llvh14DebugEpochBase10HandleBase15getEpochAddressEv:
   91|   114M|    const void *getEpochAddress() const { return nullptr; }

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

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

_ZN4llvh9hash_codeC2Em:
   86|  15.3M|  hash_code(size_t value) : value(value) {}
_ZNK4llvh9hash_codecvmEv:
   89|  15.3M|  /*explicit*/ operator size_t() const { return value; }
_ZN4llvh7hashing6detail10hash_state6createEPKcm:
  271|  16.5k|  static hash_state create(const char *s, uint64_t seed) {
  272|  16.5k|    hash_state state = {
  273|  16.5k|      0, seed, hash_16_bytes(seed, k1), rotate(seed ^ k1, 49),
  274|  16.5k|      seed * k1, shift_mix(seed), 0 };
  275|  16.5k|    state.h6 = hash_16_bytes(state.h4, state.h5);
  276|  16.5k|    state.mix(s);
  277|  16.5k|    return state;
  278|  16.5k|  }
_ZN4llvh7hashing6detail10hash_state12mix_32_bytesEPKcRmS5_:
  282|  6.16M|  static void mix_32_bytes(const char *s, uint64_t &a, uint64_t &b) {
  283|  6.16M|    a += fetch64(s);
  284|  6.16M|    uint64_t c = fetch64(s + 24);
  285|  6.16M|    b = rotate(b + a + c, 21);
  286|  6.16M|    uint64_t d = a;
  287|  6.16M|    a += fetch64(s + 8) + fetch64(s + 16);
  288|  6.16M|    b += rotate(a, 44) + d;
  289|  6.16M|    a += c;
  290|  6.16M|  }
_ZN4llvh7hashing6detail10hash_state3mixEPKc:
  295|  3.08M|  void mix(const char *s) {
  296|  3.08M|    h0 = rotate(h0 + h1 + h3 + fetch64(s + 8), 37) * k1;
  297|  3.08M|    h1 = rotate(h1 + h4 + fetch64(s + 48), 42) * k1;
  298|  3.08M|    h0 ^= h6;
  299|  3.08M|    h1 += h3 + fetch64(s + 40);
  300|  3.08M|    h2 = rotate(h2 + h5, 33) * k1;
  301|  3.08M|    h3 = h4 * k1;
  302|  3.08M|    h4 = h0 + h5;
  303|  3.08M|    mix_32_bytes(s, h3, h4);
  304|  3.08M|    h5 = h2 + h6;
  305|  3.08M|    h6 = h1 + fetch64(s + 16);
  306|  3.08M|    mix_32_bytes(s + 32, h5, h6);
  307|  3.08M|    std::swap(h2, h0);
  308|  3.08M|  }
_ZN4llvh7hashing6detail10hash_state8finalizeEm:
  312|  16.5k|  uint64_t finalize(size_t length) {
  313|  16.5k|    return hash_16_bytes(hash_16_bytes(h3, h5) + shift_mix(h1) * k1 + h2,
  314|  16.5k|                         hash_16_bytes(h4, h6) + shift_mix(length) * k1 + h0);
  315|  16.5k|  }
_ZN4llvh7hashing6detail7fetch64EPKc:
  150|  40.9M|inline uint64_t fetch64(const char *p) {
  151|  40.9M|  uint64_t result;
  152|  40.9M|  memcpy(&result, p, sizeof(result));
  153|  40.9M|  if (sys::IsBigEndianHost)
  ------------------
  |  Branch (153:7): [Folded - Ignored]
  ------------------
  154|      0|    sys::swapByteOrder(result);
  155|  40.9M|  return result;
  156|  40.9M|}
_ZN4llvh7hashing6detail7fetch32EPKc:
  158|  11.6M|inline uint32_t fetch32(const char *p) {
  159|  11.6M|  uint32_t result;
  160|  11.6M|  memcpy(&result, p, sizeof(result));
  161|  11.6M|  if (sys::IsBigEndianHost)
  ------------------
  |  Branch (161:7): [Folded - Ignored]
  ------------------
  162|      0|    sys::swapByteOrder(result);
  163|  11.6M|  return result;
  164|  11.6M|}
_ZN4llvh7hashing6detail6rotateEmm:
  175|  23.9M|inline uint64_t rotate(uint64_t val, size_t shift) {
  176|       |  // Avoid shifting by 64: doing so yields an undefined result.
  177|  23.9M|  return shift == 0 ? val : ((val >> shift) | (val << (64 - shift)));
  ------------------
  |  Branch (177:10): [True: 0, False: 23.9M]
  ------------------
  178|  23.9M|}
_ZN4llvh7hashing6detail9shift_mixEm:
  180|  5.30M|inline uint64_t shift_mix(uint64_t val) {
  181|  5.30M|  return val ^ (val >> 47);
  182|  5.30M|}
_ZN4llvh7hashing6detail13hash_16_bytesEmm:
  184|  7.54M|inline uint64_t hash_16_bytes(uint64_t low, uint64_t high) {
  185|       |  // Murmur-inspired hashing.
  186|  7.54M|  const uint64_t kMul = 0x9ddfea08eb382d69ULL;
  187|  7.54M|  uint64_t a = (low ^ high) * kMul;
  188|  7.54M|  a ^= (a >> 47);
  189|  7.54M|  uint64_t b = (high ^ a) * kMul;
  190|  7.54M|  b ^= (b >> 47);
  191|  7.54M|  b *= kMul;
  192|  7.54M|  return b;
  193|  7.54M|}
_ZN4llvh7hashing6detail15hash_1to3_bytesEPKcmm:
  195|  5.22M|inline uint64_t hash_1to3_bytes(const char *s, size_t len, uint64_t seed) {
  196|  5.22M|  uint8_t a = s[0];
  197|  5.22M|  uint8_t b = s[len >> 1];
  198|  5.22M|  uint8_t c = s[len - 1];
  199|  5.22M|  uint32_t y = static_cast<uint32_t>(a) + (static_cast<uint32_t>(b) << 8);
  200|  5.22M|  uint32_t z = len + (static_cast<uint32_t>(c) << 2);
  201|  5.22M|  return shift_mix(y * k2 ^ z * k3 ^ seed) * k2;
  202|  5.22M|}
_ZN4llvh7hashing6detail15hash_4to8_bytesEPKcmm:
  204|  5.83M|inline uint64_t hash_4to8_bytes(const char *s, size_t len, uint64_t seed) {
  205|  5.83M|  uint64_t a = fetch32(s);
  206|  5.83M|  return hash_16_bytes(len + (a << 3), seed ^ fetch32(s + len - 4));
  207|  5.83M|}
_ZN4llvh7hashing6detail16hash_9to16_bytesEPKcmm:
  209|  1.34M|inline uint64_t hash_9to16_bytes(const char *s, size_t len, uint64_t seed) {
  210|  1.34M|  uint64_t a = fetch64(s);
  211|  1.34M|  uint64_t b = fetch64(s + len - 8);
  212|  1.34M|  return hash_16_bytes(seed ^ a, rotate(b + len, len)) ^ b;
  213|  1.34M|}
_ZN4llvh7hashing6detail17hash_17to32_bytesEPKcmm:
  215|   285k|inline uint64_t hash_17to32_bytes(const char *s, size_t len, uint64_t seed) {
  216|   285k|  uint64_t a = fetch64(s) * k1;
  217|   285k|  uint64_t b = fetch64(s + 8);
  218|   285k|  uint64_t c = fetch64(s + len - 8) * k2;
  219|   285k|  uint64_t d = fetch64(s + len - 16) * k0;
  220|   285k|  return hash_16_bytes(rotate(a - b, 43) + rotate(c ^ seed, 30) + d,
  221|   285k|                       a + rotate(b ^ k3, 20) - c + len + seed);
  222|   285k|}
_ZN4llvh7hashing6detail17hash_33to64_bytesEPKcmm:
  224|  11.8k|inline uint64_t hash_33to64_bytes(const char *s, size_t len, uint64_t seed) {
  225|  11.8k|  uint64_t z = fetch64(s + 24);
  226|  11.8k|  uint64_t a = fetch64(s) + (len + fetch64(s + len - 16)) * k0;
  227|  11.8k|  uint64_t b = rotate(a + z, 52);
  228|  11.8k|  uint64_t c = rotate(a, 37);
  229|  11.8k|  a += fetch64(s + 8);
  230|  11.8k|  c += rotate(a, 7);
  231|  11.8k|  a += fetch64(s + 16);
  232|  11.8k|  uint64_t vf = a + z;
  233|  11.8k|  uint64_t vs = b + rotate(a, 31) + c;
  234|  11.8k|  a = fetch64(s + 16) + fetch64(s + len - 32);
  235|  11.8k|  z = fetch64(s + len - 8);
  236|  11.8k|  b = rotate(a + z, 52);
  237|  11.8k|  c = rotate(a, 37);
  238|  11.8k|  a += fetch64(s + len - 24);
  239|  11.8k|  c += rotate(a, 7);
  240|  11.8k|  a += fetch64(s + len - 16);
  241|  11.8k|  uint64_t wf = a + z;
  242|  11.8k|  uint64_t ws = b + rotate(a, 31) + c;
  243|  11.8k|  uint64_t r = shift_mix((vf + ws) * k2 + (wf + vs) * k0);
  244|  11.8k|  return shift_mix((seed ^ (r * k0)) + vs) * k2;
  245|  11.8k|}
_ZN4llvh7hashing6detail10hash_shortEPKcmm:
  247|  15.3M|inline uint64_t hash_short(const char *s, size_t length, uint64_t seed) {
  248|  15.3M|  if (length >= 4 && length <= 8)
  ------------------
  |  Branch (248:7): [True: 7.47M, False: 7.89M]
  |  Branch (248:22): [True: 5.83M, False: 1.64M]
  ------------------
  249|  5.83M|    return hash_4to8_bytes(s, length, seed);
  250|  9.53M|  if (length > 8 && length <= 16)
  ------------------
  |  Branch (250:7): [True: 1.64M, False: 7.89M]
  |  Branch (250:21): [True: 1.34M, False: 297k]
  ------------------
  251|  1.34M|    return hash_9to16_bytes(s, length, seed);
  252|  8.18M|  if (length > 16 && length <= 32)
  ------------------
  |  Branch (252:7): [True: 297k, False: 7.89M]
  |  Branch (252:22): [True: 285k, False: 11.8k]
  ------------------
  253|   285k|    return hash_17to32_bytes(s, length, seed);
  254|  7.90M|  if (length > 32)
  ------------------
  |  Branch (254:7): [True: 11.8k, False: 7.89M]
  ------------------
  255|  11.8k|    return hash_33to64_bytes(s, length, seed);
  256|  7.89M|  if (length != 0)
  ------------------
  |  Branch (256:7): [True: 5.22M, False: 2.66M]
  ------------------
  257|  5.22M|    return hash_1to3_bytes(s, length, seed);
  258|       |
  259|  2.66M|  return k2 ^ seed;
  260|  7.89M|}
_ZN4llvh7hashing6detail18get_execution_seedEv:
  326|  15.3M|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|  15.3M|  const uint64_t seed_prime = 0xff51afd7ed558ccdULL;
  334|  15.3M|  static uint64_t seed = fixed_seed_override ? fixed_seed_override : seed_prime;
  ------------------
  |  Branch (334:26): [True: 0, False: 15.3M]
  ------------------
  335|  15.3M|  return seed;
  336|  15.3M|}
_ZN4llvh18hash_combine_rangeIPKhEENS_9hash_codeET_S4_:
  484|      5|hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) {
  485|      5|  return ::llvh::hashing::detail::hash_combine_range_impl(first, last);
  486|      5|}
_ZN4llvh7hashing6detail23hash_combine_range_implIKhEENSt3__19enable_ifIXsr16is_hashable_dataIT_EE5valueENS_9hash_codeEE4typeEPS6_SA_:
  452|      5|hash_combine_range_impl(ValueT *first, ValueT *last) {
  453|      5|  const uint64_t seed = get_execution_seed();
  454|      5|  const char *s_begin = reinterpret_cast<const char *>(first);
  455|      5|  const char *s_end = reinterpret_cast<const char *>(last);
  456|      5|  const size_t length = std::distance(s_begin, s_end);
  457|      5|  if (length <= 64)
  ------------------
  |  Branch (457:7): [True: 5, False: 0]
  ------------------
  458|      5|    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|      5|}
_ZN4llvh18hash_combine_rangeINSt3__111__wrap_iterIPKPN6hermes13LiteralStringEEEEENS_9hash_codeET_SA_:
  484|  2.82k|hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) {
  485|  2.82k|  return ::llvh::hashing::detail::hash_combine_range_impl(first, last);
  486|  2.82k|}
_ZN4llvh7hashing6detail23hash_combine_range_implINSt3__111__wrap_iterIPKPN6hermes13LiteralStringEEEEENS_9hash_codeET_SC_:
  408|  2.82k|hash_code hash_combine_range_impl(InputIteratorT first, InputIteratorT last) {
  409|  2.82k|  const uint64_t seed = get_execution_seed();
  410|  2.82k|  char buffer[64], *buffer_ptr = buffer;
  411|  2.82k|  char *const buffer_end = std::end(buffer);
  412|  5.77k|  while (first != last && store_and_advance(buffer_ptr, buffer_end,
  ------------------
  |  Branch (412:10): [True: 2.97k, False: 2.80k]
  |  Branch (412:10): [True: 2.95k, False: 2.82k]
  |  Branch (412:27): [True: 2.95k, False: 19]
  ------------------
  413|  2.97k|                                            get_hashable_data(*first)))
  414|  2.95k|    ++first;
  415|  2.82k|  if (first == last)
  ------------------
  |  Branch (415:7): [True: 2.80k, False: 19]
  ------------------
  416|  2.80k|    return hash_short(buffer, buffer_ptr - buffer, seed);
  417|     19|  assert(buffer_ptr == buffer_end);
  418|       |
  419|     19|  hash_state state = state.create(buffer, seed);
  420|     19|  size_t length = 64;
  421|  43.9k|  while (first != last) {
  ------------------
  |  Branch (421:10): [True: 43.9k, False: 19]
  ------------------
  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|  43.9k|    buffer_ptr = buffer;
  425|   395k|    while (first != last && store_and_advance(buffer_ptr, buffer_end,
  ------------------
  |  Branch (425:12): [True: 395k, False: 19]
  |  Branch (425:12): [True: 351k, False: 43.9k]
  |  Branch (425:29): [True: 351k, False: 43.9k]
  ------------------
  426|   395k|                                              get_hashable_data(*first)))
  427|   351k|      ++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|  43.9k|    std::rotate(buffer, buffer_ptr, buffer_end);
  433|       |
  434|       |    // Mix this chunk into the current state.
  435|  43.9k|    state.mix(buffer);
  436|  43.9k|    length += buffer_ptr - buffer;
  437|  43.9k|  };
  438|       |
  439|     19|  return state.finalize(length);
  440|     19|}
_ZN4llvh7hashing6detail17get_hashable_dataIPN6hermes13LiteralStringEEENSt3__19enable_ifIXsr16is_hashable_dataIT_EE5valueES8_E4typeERKS8_:
  370|   398k|get_hashable_data(const T &value) {
  371|   398k|  return value;
  372|   398k|}
_ZN4llvh7hashing6detail17store_and_advanceIPN6hermes13LiteralStringEEEbRPcS6_RKT_m:
  392|   398k|                       size_t offset = 0) {
  393|   398k|  size_t store_size = sizeof(value) - offset;
  394|   398k|  if (buffer_ptr + store_size > buffer_end)
  ------------------
  |  Branch (394:7): [True: 43.9k, False: 354k]
  ------------------
  395|  43.9k|    return false;
  396|   354k|  const char *value_data = reinterpret_cast<const char *>(&value);
  397|   354k|  memcpy(buffer_ptr, value_data + offset, store_size);
  398|   354k|  buffer_ptr += store_size;
  399|   354k|  return true;
  400|   398k|}
_ZN4llvh18hash_combine_rangeIPKjEENS_9hash_codeET_S4_:
  484|  4.68M|hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) {
  485|  4.68M|  return ::llvh::hashing::detail::hash_combine_range_impl(first, last);
  486|  4.68M|}
_ZN4llvh7hashing6detail23hash_combine_range_implIKjEENSt3__19enable_ifIXsr16is_hashable_dataIT_EE5valueENS_9hash_codeEE4typeEPS6_SA_:
  452|  4.68M|hash_combine_range_impl(ValueT *first, ValueT *last) {
  453|  4.68M|  const uint64_t seed = get_execution_seed();
  454|  4.68M|  const char *s_begin = reinterpret_cast<const char *>(first);
  455|  4.68M|  const char *s_end = reinterpret_cast<const char *>(last);
  456|  4.68M|  const size_t length = std::distance(s_begin, s_end);
  457|  4.68M|  if (length <= 64)
  ------------------
  |  Branch (457:7): [True: 4.68M, False: 0]
  ------------------
  458|  4.68M|    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|  4.68M|}
_ZN4llvh18hash_combine_rangeIPKcEENS_9hash_codeET_S4_:
  484|  10.6M|hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) {
  485|  10.6M|  return ::llvh::hashing::detail::hash_combine_range_impl(first, last);
  486|  10.6M|}
_ZN4llvh7hashing6detail23hash_combine_range_implIKcEENSt3__19enable_ifIXsr16is_hashable_dataIT_EE5valueENS_9hash_codeEE4typeEPS6_SA_:
  452|  10.6M|hash_combine_range_impl(ValueT *first, ValueT *last) {
  453|  10.6M|  const uint64_t seed = get_execution_seed();
  454|  10.6M|  const char *s_begin = reinterpret_cast<const char *>(first);
  455|  10.6M|  const char *s_end = reinterpret_cast<const char *>(last);
  456|  10.6M|  const size_t length = std::distance(s_begin, s_end);
  457|  10.6M|  if (length <= 64)
  ------------------
  |  Branch (457:7): [True: 10.6M, False: 16.5k]
  ------------------
  458|  10.6M|    return hash_short(s_begin, length, seed);
  459|       |
  460|  16.5k|  const char *s_aligned_end = s_begin + (length & ~63);
  461|  16.5k|  hash_state state = state.create(s_begin, seed);
  462|  16.5k|  s_begin += 64;
  463|  3.02M|  while (s_begin != s_aligned_end) {
  ------------------
  |  Branch (463:10): [True: 3.00M, False: 16.5k]
  ------------------
  464|  3.00M|    state.mix(s_begin);
  465|  3.00M|    s_begin += 64;
  466|  3.00M|  }
  467|  16.5k|  if (length & 63)
  ------------------
  |  Branch (467:7): [True: 16.4k, False: 43]
  ------------------
  468|  16.4k|    state.mix(s_end - 64);
  469|       |
  470|  16.5k|  return state.finalize(length);
  471|  10.6M|}

_ZNK4llvh9MapVectorImN6hermes2vm8Debugger10BreakpointENS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEENSt3__16vectorINSC_4pairImS4_EENSC_9allocatorISF_EEEEE4sizeEv:
   66|    597|  size_type size() const { return Vector.size(); }
_ZN4llvh9MapVectorIPKN6hermes12UniqueStringENS_11SmallVectorIPNS1_6ESTree23FunctionDeclarationNodeELj4EEENS_8DenseMapIS4_jNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEENSt3__16vectorINSH_4pairIS4_S9_EENSH_9allocatorISK_EEEEE3endEv:
   77|   103k|  iterator end() { return Vector.end(); }
_ZNK4llvh9MapVectorIPKN6hermes12UniqueStringENS_11SmallVectorIPNS1_6ESTree23FunctionDeclarationNodeELj4EEENS_8DenseMapIS4_jNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEENSt3__16vectorINSH_4pairIS4_S9_EENSH_9allocatorISK_EEEEE4sizeEv:
   66|   103k|  size_type size() const { return Vector.size(); }
_ZN4llvh9MapVectorIPKN6hermes12UniqueStringENS_11SmallVectorIPNS1_6ESTree23FunctionDeclarationNodeELj4EEENS_8DenseMapIS4_jNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEENSt3__16vectorINSH_4pairIS4_S9_EENSH_9allocatorISK_EEEEE5beginEv:
   75|   103k|  iterator begin() { return Vector.begin(); }

_ZN4llvh15optional_detail15OptionalStorageINSt3__16threadELb0EED2Ev:
   92|    320|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageINSt3__16threadELb0EE5resetEv:
   94|    320|  void reset() {
   95|    320|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 0, False: 320]
  ------------------
   96|      0|      (*getPointer()).~T();
   97|      0|      hasVal = false;
   98|      0|    }
   99|    320|  }
_ZNK4llvh8OptionalIjE8hasValueEv:
  183|      2|  bool hasValue() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIjE8getValueEv:
  180|   103k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIjE10getPointerEv:
  175|   103k|  T *getPointer() {
  176|   103k|    assert(Storage.hasVal);
  177|   103k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   103k|  }
_ZNK4llvh8OptionalIPKN6hermes4inst4InstEE8hasValueEv:
  183|  34.3M|  bool hasValue() const { return Storage.hasVal; }
_ZNKR4llvh8OptionalIPKN6hermes4inst4InstEEdeEv:
  186|  34.3M|  const T &operator*() const LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIPKN6hermes4inst4InstEE10getPointerEv:
  171|  34.3M|  const T *getPointer() const {
  172|  34.3M|    assert(Storage.hasVal);
  173|  34.3M|    return reinterpret_cast<const T *>(Storage.storage.buffer);
  174|  34.3M|  }
_ZN4llvh8OptionalIN6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitiveEEC2EOS4_:
  143|   390k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitiveELb1EEC2ERKS5_:
  119|   390k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIN6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitiveEEcvbEv:
  182|  1.17M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitiveEEdeEv:
  187|   781k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitiveEE10getPointerEv:
  175|   781k|  T *getPointer() {
  176|   781k|    assert(Storage.hasVal);
  177|   781k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   781k|  }
_ZN4llvh8OptionalIbEC2Ev:
  137|    247|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIbLb1EEC2Ev:
  117|    282|  OptionalStorage() = default;
_ZNK4llvh8OptionalIPKcEcvbEv:
  182|  6.85k|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIhE8hasValueEv:
  183|   549k|  bool hasValue() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIiE8hasValueEv:
  183|   894k|  bool hasValue() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIhEcvbEv:
  182|   482k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIhE8getValueEv:
  180|   482k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIhE10getPointerEv:
  175|   482k|  T *getPointer() {
  176|   482k|    assert(Storage.hasVal);
  177|   482k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   482k|  }
_ZNK4llvh8OptionalIiEcvbEv:
  182|   871k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIiE8getValueEv:
  180|   459k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIiE10getPointerEv:
  175|   459k|  T *getPointer() {
  176|   459k|    assert(Storage.hasVal);
  177|   459k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   459k|  }
_ZNK4llvh8OptionalIjEcvbEv:
  182|  1.04M|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIPKN6hermes4inst4InstEEaSERKS5_:
  163|  12.3M|  Optional &operator=(const T &y) {
  164|  12.3M|    Storage = y;
  165|  12.3M|    return *this;
  166|  12.3M|  }
_ZN4llvh15optional_detail15OptionalStorageIPKN6hermes4inst4InstELb1EEaSERKS6_:
  120|  12.3M|  OptionalStorage &operator=(const T &y) {
  121|  12.3M|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|  12.3M|    hasVal = true;
  123|  12.3M|    return *this;
  124|  12.3M|  }
_ZN4llvh8OptionalIPKN6hermes4inst4InstEE5resetEv:
  169|  12.3M|  void reset() { Storage.reset(); }
_ZN4llvh15optional_detail15OptionalStorageIPKN6hermes4inst4InstELb1EE5resetEv:
  126|  12.3M|  void reset() { hasVal = false; }
_ZN4llvheqIPKN6hermes4inst4InstEEEbRKT_RKNS_8OptionalIS6_EE:
  300|   785k|template <typename T> bool operator==(const T &X, const Optional<T> &Y) {
  301|   785k|  return Y && X == *Y;
  ------------------
  |  Branch (301:10): [True: 785k, False: 0]
  |  Branch (301:15): [True: 785k, False: 0]
  ------------------
  302|   785k|}
_ZNK4llvh8OptionalIPKN6hermes4inst4InstEEcvbEv:
  182|   785k|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEEcvbEv:
  182|  2.71M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEEdeEv:
  187|  1.83M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEE10getPointerEv:
  175|  1.83M|  T *getPointer() {
  176|  1.83M|    assert(Storage.hasVal);
  177|  1.83M|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  1.83M|  }
_ZN4llvh15optional_detail15OptionalStorageIjLb1EEC2Ev:
  117|   942k|  OptionalStorage() = default;
_ZN4llvh8OptionalIjEC2ENS_8NoneTypeE:
  138|   942k|  constexpr Optional(NoneType) {}
_ZN4llvh8OptionalIjEC2EOj:
  143|   103k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIjLb1EEC2ERKj:
  119|   103k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEEC2EOS8_:
  143|  1.15M|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EEC2EOS9_:
   43|  1.15M|  OptionalStorage(T &&y) : hasVal(true) {
   44|  1.15M|    new (storage.buffer) T(std::forward<T>(y));
   45|  1.15M|  }
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EE5resetEv:
   94|  1.15M|  void reset() {
   95|  1.15M|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 1.15M, False: 0]
  ------------------
   96|  1.15M|      (*getPointer()).~T();
   97|  1.15M|      hasVal = false;
   98|  1.15M|    }
   99|  1.15M|  }
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EE10getPointerEv:
  101|  1.15M|  T *getPointer() {
  102|  1.15M|    assert(hasVal);
  103|  1.15M|    return reinterpret_cast<T *>(storage.buffer);
  104|  1.15M|  }
_ZNK4llvh8OptionalIN6hermes2vm8SymbolIDEEcvbEv:
  182|  1.83M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes2vm8SymbolIDEEdeEv:
  187|  1.83M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes2vm8SymbolIDEE10getPointerEv:
  175|  1.83M|  T *getPointer() {
  176|  1.83M|    assert(Storage.hasVal);
  177|  1.83M|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  1.83M|  }
_ZN4llvh8OptionalIN6hermes2vm8SymbolIDEEC2EOS3_:
  143|  1.83M|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm8SymbolIDELb1EEC2ERKS4_:
  119|  1.83M|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EE5resetEv:
   94|   781k|  void reset() {
   95|   781k|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 781k, False: 0]
  ------------------
   96|   781k|      (*getPointer()).~T();
   97|   781k|      hasVal = false;
   98|   781k|    }
   99|   781k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EE10getPointerEv:
  101|   781k|  T *getPointer() {
  102|   781k|    assert(hasVal);
  103|   781k|    return reinterpret_cast<T *>(storage.buffer);
  104|   781k|  }
_ZNK4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEEcvbEv:
  182|  3.45M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEEdeEv:
  187|  2.30M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEE10getPointerEv:
  175|  2.30M|  T *getPointer() {
  176|  2.30M|    assert(Storage.hasVal);
  177|  2.30M|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  2.30M|  }
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EED2Ev:
   92|  1.15M|  ~OptionalStorage() { reset(); }
_ZN4llvh8OptionalIN6hermes2vm13StringBuilderEEC2EOS3_:
  143|   781k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EEC2EOS4_:
   43|   781k|  OptionalStorage(T &&y) : hasVal(true) {
   44|   781k|    new (storage.buffer) T(std::forward<T>(y));
   45|   781k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EED2Ev:
   92|   781k|  ~OptionalStorage() { reset(); }
_ZNK4llvh8OptionalIN6hermes2vm13StringBuilderEEcvbEv:
  182|  3.44M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes2vm13StringBuilderEEdeEv:
  187|  2.65M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes2vm13StringBuilderEE10getPointerEv:
  175|  2.65M|  T *getPointer() {
  176|  2.65M|    assert(Storage.hasVal);
  177|  2.65M|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  2.65M|  }
_ZN4llvh8OptionalIN6hermes2vm6HandleINS2_7JSArrayEEEEC2Ev:
  137|     45|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_7JSArrayEEELb0EEC2Ev:
   36|     45|  OptionalStorage() = default;
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_7JSArrayEEELb0EED2Ev:
   92|     45|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_7JSArrayEEELb0EE5resetEv:
   94|     45|  void reset() {
   95|     45|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 0, False: 45]
  ------------------
   96|      0|      (*getPointer()).~T();
   97|      0|      hasVal = false;
   98|      0|    }
   99|     45|  }
_ZNK4llvh8OptionalIN6hermes2vm6HandleINS2_7JSArrayEEEEcvbEv:
  182|     45|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEEcvbEv:
  182|  6.07k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEEdeEv:
  187|  4.79k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEE10getPointerEv:
  175|  4.79k|  T *getPointer() {
  176|  4.79k|    assert(Storage.hasVal);
  177|  4.79k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  4.79k|  }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEEC2EOS8_:
  143|  1.27k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS5_13PropertyFlagsEEELb1EEC2ERKS9_:
  119|  1.27k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIN6hermes5regex11SyntaxFlagsEEC2EOS3_:
  143|    122|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5regex11SyntaxFlagsELb1EEC2ERKS4_:
  119|    122|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIN6hermes5regex11SyntaxFlagsEEcvbEv:
  182|    122|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes5regex11SyntaxFlagsEE10getPointerEv:
  175|    122|  T *getPointer() {
  176|    122|    assert(Storage.hasVal);
  177|    122|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    122|  }
_ZNR4llvh8OptionalIN6hermes5regex11SyntaxFlagsEEdeEv:
  187|    122|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPKN6hermes4inst4InstEEC2EOS5_:
  143|    160|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPKN6hermes4inst4InstELb1EEC2ERKS6_:
  119|    160|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEEC2EOS7_:
  143|   877k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEELb1EEC2ERKS8_:
  119|   877k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIiEC2EOi:
  143|  1.74M|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIiLb1EEC2ERKi:
  119|  1.74M|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalINS_9StringRefEEcvbEv:
  182|   206k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIhEC2ENS_8NoneTypeE:
  138|  66.9k|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIhLb1EEC2Ev:
  117|  66.9k|  OptionalStorage() = default;
_ZN4llvh8OptionalIhEC2EOh:
  143|   965k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIhLb1EEC2ERKh:
  119|   965k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIiEC2ENS_8NoneTypeE:
  138|  22.2k|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIiLb1EEC2Ev:
  117|  22.2k|  OptionalStorage() = default;
_ZN4llvh8OptionalINSt3__16threadEEC2Ev:
  137|    320|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__16threadELb0EEC2Ev:
   36|    320|  OptionalStorage() = default;
_ZNK4llvh8OptionalINSt3__16threadEEcvbEv:
  182|    320|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIbE8hasValueEv:
  183|    247|  bool hasValue() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEcvbEv:
  182|  1.18k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEE8getValueEv:
  180|  1.11k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEE10getPointerEv:
  175|  1.32k|  T *getPointer() {
  176|  1.32k|    assert(Storage.hasVal);
  177|  1.32k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  1.32k|  }
_ZNR4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEdeEv:
  187|    204|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIbEcvbEv:
  182|  6.33k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EED2Ev:
   92|  40.6k|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EE5resetEv:
   94|  40.6k|  void reset() {
   95|  40.6k|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 40.6k, False: 0]
  ------------------
   96|  40.6k|      (*getPointer()).~T();
   97|  40.6k|      hasVal = false;
   98|  40.6k|    }
   99|  40.6k|  }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EE10getPointerEv:
  101|  40.6k|  T *getPointer() {
  102|  40.6k|    assert(hasVal);
  103|  40.6k|    return reinterpret_cast<T *>(storage.buffer);
  104|  40.6k|  }
_ZNK4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEEcvbEv:
  182|  40.6k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEEdeEv:
  187|  40.6k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEE10getPointerEv:
  175|  40.6k|  T *getPointer() {
  176|  40.6k|    assert(Storage.hasVal);
  177|  40.6k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  40.6k|  }
_ZN4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEEC2EOS5_:
  143|  40.6k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EEC2EOS6_:
   43|  40.6k|  OptionalStorage(T &&y) : hasVal(true) {
   44|  40.6k|    new (storage.buffer) T(std::forward<T>(y));
   45|  40.6k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree4NodeEEcvbEv:
  182|  67.0M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree4NodeEEdeEv:
  187|  15.4M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEE10getPointerEv:
  175|  74.8M|  T *getPointer() {
  176|  74.8M|    assert(Storage.hasVal);
  177|  74.8M|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  74.8M|  }
_ZNR4llvh8OptionalIPN6hermes6ESTree4NodeEE8getValueEv:
  180|  59.4M|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes5irgen15FunctionContextEEC2Ev:
  137|    196|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen15FunctionContextELb0EEC2Ev:
   36|    196|  OptionalStorage() = default;
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen15FunctionContextELb0EED2Ev:
   92|    196|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen15FunctionContextELb0EE5resetEv:
   94|    196|  void reset() {
   95|    196|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 0, False: 196]
  ------------------
   96|      0|      (*getPointer()).~T();
   97|      0|      hasVal = false;
   98|      0|    }
   99|    196|  }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEEC2Ev:
  137|  22.3k|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen10LReferenceELb1EEC2Ev:
  117|  22.3k|  OptionalStorage() = default;
_ZNK4llvh8OptionalIN6hermes5irgen15FunctionContextEE8hasValueEv:
  183|    196|  bool hasValue() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEEptEv:
  185|  60.9k|  T *operator->() { return getPointer(); }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEE10getPointerEv:
  175|  60.9k|  T *getPointer() {
  176|  60.9k|    assert(Storage.hasVal);
  177|  60.9k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  60.9k|  }
_ZNK4llvh8OptionalIN6hermes5irgen10LReferenceEEcvbEv:
  182|  63.0k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEE5resetEv:
  169|  20.3k|  void reset() { Storage.reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen10LReferenceELb1EE5resetEv:
  126|  20.3k|  void reset() { hasVal = false; }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEEaSEOS3_:
  146|  20.3k|  Optional &operator=(T &&y) {
  147|  20.3k|    Storage = std::move(y);
  148|  20.3k|    return *this;
  149|  20.3k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen10LReferenceELb1EEaSERKS4_:
  120|  20.3k|  OptionalStorage &operator=(const T &y) {
  121|  20.3k|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|  20.3k|    hasVal = true;
  123|  20.3k|    return *this;
  124|  20.3k|  }
_ZN4llvh8OptionalINS_9StringRefEEC2ENS_8NoneTypeE:
  138|   206k|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageINS_9StringRefELb1EEC2Ev:
  117|   206k|  OptionalStorage() = default;
_ZNR4llvh8OptionalIiEdeEv:
  187|    392|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvheqIiEEbRKNS_8OptionalIT_EERKS2_:
  296|    196|template <typename T> bool operator==(const Optional<T> &X, const T &Y) {
  297|    196|  return X && *X == Y;
  ------------------
  |  Branch (297:10): [True: 196, False: 0]
  |  Branch (297:15): [True: 196, False: 0]
  ------------------
  298|    196|}
_ZNKR4llvh8OptionalIiEdeEv:
  186|    196|  const T &operator*() const LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIiE10getPointerEv:
  171|    196|  const T *getPointer() const {
  172|    196|    assert(Storage.hasVal);
  173|    196|    return reinterpret_cast<const T *>(Storage.storage.buffer);
  174|    196|  }
_ZN4llvh8OptionalImEC2ENS_8NoneTypeE:
  138|      6|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageImLb1EEC2Ev:
  117|      6|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEC2ENS_8NoneTypeE:
  138|     72|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree11ProgramNodeELb1EEC2Ev:
  117|     72|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEC2ENS_8NoneTypeE:
  138|      5|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree16FunctionLikeNodeELb1EEC2Ev:
  117|      5|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEC2ENS_8NoneTypeE:
  138|  6.65M|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree4NodeELb1EEC2Ev:
  117|  6.65M|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEC2ENS_8NoneTypeE:
  138|     10|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18BlockStatementNodeELb1EEC2Ev:
  117|     10|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEEC2ENS_8NoneTypeE:
  138|    168|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree14IdentifierNodeELb1EEC2Ev:
  117|    168|  OptionalStorage() = default;
_ZN4llvh8OptionalIPKcEC2ENS_8NoneTypeE:
  138|    876|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPKcLb1EEC2Ev:
  117|    876|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEC2Ev:
  137|     31|  constexpr Optional() {}
_ZN4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEEC2ENS_8NoneTypeE:
  138|     12|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree19ArrayExpressionNodeELb1EEC2Ev:
  117|     12|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree22FunctionExpressionNodeEEC2ENS_8NoneTypeE:
  138|      5|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree22FunctionExpressionNodeELb1EEC2Ev:
  117|      5|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEC2ERKS4_:
  140|    567|  Optional(const T &y) : Storage(y) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree11ProgramNodeELb1EEC2ERKS5_:
  119|  1.14k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIbEC2ENS_8NoneTypeE:
  138|     35|  constexpr Optional(NoneType) {}
_ZN4llvh8OptionalIbEC2EOb:
  143|  6.10k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIbLb1EEC2ERKb:
  119|  6.10k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEC2EOS4_:
  143|    581|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZNK4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEcvbEv:
  182|  5.60k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEdeEv:
  187|  5.60k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEE10getPointerEv:
  175|  5.60k|  T *getPointer() {
  176|  5.60k|    assert(Storage.hasVal);
  177|  5.60k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  5.60k|  }
_ZN4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEEC2EOS4_:
  143|  5.44k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree23FunctionDeclarationNodeELb1EEC2ERKS5_:
  119|  5.44k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEEcvbEv:
  182|  14.9k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEEdeEv:
  187|  9.33k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEE10getPointerEv:
  175|  9.33k|  T *getPointer() {
  176|  9.33k|    assert(Storage.hasVal);
  177|  9.33k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  9.33k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEcvbEv:
  182|  11.1k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEE8getValueEv:
  180|  5.60k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEE10getPointerEv:
  175|  5.76k|  T *getPointer() {
  176|  5.76k|    assert(Storage.hasVal);
  177|  5.76k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  5.76k|  }
_ZN4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEC2EOS4_:
  143|  5.60k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree16FunctionLikeNodeELb1EEC2ERKS5_:
  119|  5.60k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEC2EOS4_:
  143|  41.6M|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree4NodeELb1EEC2ERKS5_:
  119|  67.0M|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEEcvbEv:
  182|  3.89k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEE8getValueEv:
  180|  3.84k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEE10getPointerEv:
  175|  3.89k|  T *getPointer() {
  176|  3.89k|    assert(Storage.hasVal);
  177|  3.89k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  3.89k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEEcvbEv:
  182|  10.6k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEE8getValueEv:
  180|  10.6k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEE10getPointerEv:
  175|  10.6k|  T *getPointer() {
  176|  10.6k|    assert(Storage.hasVal);
  177|  10.6k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  10.6k|  }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEC2ERKS4_:
  140|  25.4M|  Optional(const T &y) : Storage(y) {}
_ZNK4llvh8OptionalIPN6hermes6ESTree18BreakStatementNodeEEcvbEv:
  182|      1|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree18BreakStatementNodeEE8getValueEv:
  180|      1|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree18BreakStatementNodeEE10getPointerEv:
  175|      1|  T *getPointer() {
  176|      1|    assert(Storage.hasVal);
  177|      1|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|      1|  }
_ZN4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEC2EOS4_:
  143|  5.60k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18BlockStatementNodeELb1EEC2ERKS5_:
  119|  5.60k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNR4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEdeEv:
  187|    162|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEEcvbEv:
  182|  5.44k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEEdeEv:
  187|  5.44k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEE10getPointerEv:
  175|  5.44k|  T *getPointer() {
  176|  5.44k|    assert(Storage.hasVal);
  177|  5.44k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  5.44k|  }
_ZNR4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEEdeEv:
  187|     50|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEEC2EOS4_:
  143|  9.33k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree14IdentifierNodeELb1EEC2ERKS5_:
  119|  9.33k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEEC2EOS4_:
  143|  3.89k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree23VariableDeclarationNodeELb1EEC2ERKS5_:
  119|  3.89k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEEcvbEv:
  182|  3.89k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEE8getValueEv:
  180|  3.89k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEE10getPointerEv:
  175|  3.89k|  T *getPointer() {
  176|  3.89k|    assert(Storage.hasVal);
  177|  3.89k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  3.89k|  }
_ZN4llvh8OptionalIPKcEC2EOS2_:
  143|  5.97k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPKcLb1EEC2ERKS3_:
  119|  5.97k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEEC2EOS4_:
  143|  3.89k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree22VariableDeclaratorNodeELb1EEC2ERKS5_:
  119|  3.89k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEEC2EOS4_:
  143|  10.6k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18EmptyStatementNodeELb1EEC2ERKS5_:
  119|  10.6k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree18BreakStatementNodeEEC2EOS4_:
  143|      1|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18BreakStatementNodeELb1EEC2ERKS5_:
  119|      1|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree22FunctionExpressionNodeEEcvbEv:
  182|    168|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree22FunctionExpressionNodeEE8getValueEv:
  180|    163|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree22FunctionExpressionNodeEE10getPointerEv:
  175|    163|  T *getPointer() {
  176|    163|    assert(Storage.hasVal);
  177|    163|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    163|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEEcvbEv:
  182|  45.0k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEE8getValueEv:
  180|  45.0k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEE10getPointerEv:
  175|  45.0k|  T *getPointer() {
  176|  45.0k|    assert(Storage.hasVal);
  177|  45.0k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  45.0k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEEcvbEv:
  182|      4|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEE8getValueEv:
  180|      4|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEE10getPointerEv:
  175|      4|  T *getPointer() {
  176|      4|    assert(Storage.hasVal);
  177|      4|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|      4|  }
_ZN4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEEC2EOS4_:
  143|  45.0k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree19ArrayExpressionNodeELb1EEC2ERKS5_:
  119|  45.0k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEEC2EOS4_:
  143|      4|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree20ObjectExpressionNodeELb1EEC2ERKS5_:
  119|      4|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree22FunctionExpressionNodeEEC2EOS4_:
  143|    163|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree22FunctionExpressionNodeELb1EEC2ERKS5_:
  119|    163|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEaSEOS4_:
  146|  9.27k|  Optional &operator=(T &&y) {
  147|  9.27k|    Storage = std::move(y);
  148|  9.27k|    return *this;
  149|  9.27k|  }
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree4NodeELb1EEaSERKS5_:
  120|  9.27k|  OptionalStorage &operator=(const T &y) {
  121|  9.27k|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|  9.27k|    hasVal = true;
  123|  9.27k|    return *this;
  124|  9.27k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEE8hasValueEv:
  183|    244|  bool hasValue() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes6parser9TokenKindEEC2Ev:
  137|  3.49M|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes6parser9TokenKindELb1EEC2Ev:
  117|  3.49M|  OptionalStorage() = default;
_ZNK4llvh8OptionalIN6hermes6parser9TokenKindEEcvbEv:
  182|   157M|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes6parser9TokenKindEEaSEOS3_:
  146|  62.2k|  Optional &operator=(T &&y) {
  147|  62.2k|    Storage = std::move(y);
  148|  62.2k|    return *this;
  149|  62.2k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes6parser9TokenKindELb1EEaSERKS4_:
  120|  62.2k|  OptionalStorage &operator=(const T &y) {
  121|  62.2k|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|  62.2k|    hasVal = true;
  123|  62.2k|    return *this;
  124|  62.2k|  }
_ZNR4llvh8OptionalIN6hermes6parser9TokenKindEEdeEv:
  187|  62.2k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes6parser9TokenKindEE10getPointerEv:
  175|  62.2k|  T *getPointer() {
  176|  62.2k|    assert(Storage.hasVal);
  177|  62.2k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  62.2k|  }
_ZNR4llvh8OptionalIjEdeEv:
  187|    137|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIjEC2ERKj:
  140|    101|  Optional(const T &y) : Storage(y) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EED2Ev:
   92|    120|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EE5resetEv:
   94|    120|  void reset() {
   95|    120|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 119, False: 1]
  ------------------
   96|    119|      (*getPointer()).~T();
   97|    119|      hasVal = false;
   98|    119|    }
   99|    120|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EE10getPointerEv:
  101|    119|  T *getPointer() {
  102|    119|    assert(hasVal);
  103|    119|    return reinterpret_cast<T *>(storage.buffer);
  104|    119|  }
_ZNK4llvh8OptionalIN6hermes14CompiledRegExpEEcvbEv:
  182|    120|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes14CompiledRegExpEEdeEv:
  187|    119|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes14CompiledRegExpEE10getPointerEv:
  175|    119|  T *getPointer() {
  176|    119|    assert(Storage.hasVal);
  177|    119|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    119|  }
_ZN4llvh8OptionalIDsEC2EODs:
  143|    228|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIDsLb1EEC2ERKDs:
  119|    228|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIDsEC2ENS_8NoneTypeE:
  138|   311k|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIDsLb1EEC2Ev:
  117|   311k|  OptionalStorage() = default;
_ZNK4llvh8OptionalIDsEcvbEv:
  182|   156k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIDsEdeEv:
  187|    228|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIDsE10getPointerEv:
  175|    228|  T *getPointer() {
  176|    228|    assert(Storage.hasVal);
  177|    228|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    228|  }
_ZNO4llvh8OptionalIjEdeEv:
  196|     64|  T &&operator*() && { return std::move(*getPointer()); }
_ZN4llvh8OptionalIN6hermes5regex29CharacterClassCodepointRangesEEC2Ev:
  137|  1.57k|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5regex29CharacterClassCodepointRangesELb1EEC2Ev:
  117|  1.57k|  OptionalStorage() = default;
_ZN4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEEC2EOSA_:
  143|  1.57k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5regex6ParserINS3_5RegexINS3_16UTF16RegexTraitsEEEPKDsE9ClassAtomELb1EEC2ERKSB_:
  119|  1.57k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIN6hermes5regex14CharacterClassEEC2Ev:
  137|  1.57k|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5regex14CharacterClassELb1EEC2Ev:
  117|  1.57k|  OptionalStorage() = default;
_ZNK4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEEcvbEv:
  182|  1.57k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEEdeEv:
  187|  1.57k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEE10getPointerEv:
  175|  1.57k|  T *getPointer() {
  176|  1.57k|    assert(Storage.hasVal);
  177|  1.57k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  1.57k|  }
_ZNK4llvh8OptionalIN6hermes5regex29CharacterClassCodepointRangesEEcvbEv:
  182|  1.57k|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIN6hermes5regex14CharacterClassEEcvbEv:
  182|  1.57k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes14CompiledRegExpEEC2ENS_8NoneTypeE:
  138|      1|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EEC2Ev:
   36|      1|  OptionalStorage() = default;
_ZN4llvh8OptionalIN6hermes14CompiledRegExpEEC2EOS2_:
  143|    119|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EEC2EOS3_:
   43|    119|  OptionalStorage(T &&y) : hasVal(true) {
   44|    119|    new (storage.buffer) T(std::forward<T>(y));
   45|    119|  }
_ZN4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEEC2EOS3_:
  143|  50.8k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes18SourceErrorManager9LineCoordELb1EEC2ERKS4_:
  119|  50.8k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEEcvbEv:
  182|  50.8k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEEptEv:
  185|   203k|  T *operator->() { return getPointer(); }
_ZN4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEE10getPointerEv:
  175|   203k|  T *getPointer() {
  176|   203k|    assert(Storage.hasVal);
  177|   203k|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   203k|  }
_ZNKR4llvh8OptionalImE10getValueOrIjEEmOT_:
  190|      6|  constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION {
  191|      6|    return hasValue() ? getValue() : std::forward<U>(value);
  ------------------
  |  Branch (191:12): [True: 0, False: 6]
  ------------------
  192|      6|  }
_ZNK4llvh8OptionalImE8hasValueEv:
  183|      6|  bool hasValue() const { return Storage.hasVal; }

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

_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEC2Ev:
  368|    407|  PointerUnion4() = default;
_ZN4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEEC2Ev:
  104|    407|  PointerUnion() = default;
_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEaSEDn:
  411|    814|  const PointerUnion4 &operator=(std::nullptr_t) {
  412|    814|    Val = nullptr;
  413|    814|    return *this;
  414|    814|  }
_ZN4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEEaSEDn:
  166|    814|  const PointerUnion &operator=(std::nullptr_t) {
  167|    814|    Val.initWithPointer(nullptr);
  168|    814|    return *this;
  169|    814|  }
_ZN4llvh22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS2_9allocatorIhEEEEPNS3_ItNS4_ItEEEEEENS1_IPNS3_IjNS4_IjEEEEPNS3_ImNS4_ImEEEEEEE16getAsVoidPointerEPv:
   61|  1.06k|  static inline void *getAsVoidPointer(void *P) { return P; }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE6isNullEv:
  376|   242k|  bool isNull() const { return Val.isNull(); }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE6isNullEv:
  114|   242k|  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|   242k|    return !PointerLikeTypeTraits<PT1>::getFromVoidPointer(Val.getPointer());
  118|   242k|  }
_ZN4llvh21PointerLikeTypeTraitsINS_12PointerUnionIPNSt3__16vectorIhNS2_9allocatorIhEEEEPNS3_ItNS4_ItEEEEEEE18getFromVoidPointerEPv:
  216|   242k|  static inline PointerUnion<PT1, PT2> getFromVoidPointer(void *P) {
  217|   242k|    return PointerUnion<PT1, PT2>::getFromOpaqueValue(P);
  218|   242k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE18getFromOpaqueValueEPv:
  186|   242k|  static inline PointerUnion getFromOpaqueValue(void *VP) {
  187|   242k|    PointerUnion V;
  188|   242k|    V.Val = ValTy::getFromOpaqueValue(VP);
  189|   242k|    return V;
  190|   242k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEC2Ev:
  104|   242k|  PointerUnion() = default;
_ZN4llvh22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS2_9allocatorIhEEEEPNS3_ItNS4_ItEEEEEENS1_IPNS3_IjNS4_IjEEEEPNS3_ImNS4_ImEEEEEEE18getFromVoidPointerEPv:
   62|   726k|  static inline void *getFromVoidPointer(void *P) { return P; }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEcvbEv:
  120|   242k|  explicit operator bool() const { return !isNull(); }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE6isNullEv:
  114|   242k|  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|   242k|    return !PointerLikeTypeTraits<PT1>::getFromVoidPointer(Val.getPointer());
  118|   242k|  }
_ZN4llvh22PointerUnionUIntTraitsIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE18getFromVoidPointerEPv:
   62|   242k|  static inline void *getFromVoidPointer(void *P) { return P; }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE2isIS6_EEiv:
  380|    255|  template <typename T> int is() const {
  381|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  382|    255|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  383|    255|        PT1, T, InnerUnion1,
  384|    255|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  385|    255|                                         InnerUnion2>>::Return;
  386|    255|    return Val.template is<Ty>() && Val.template get<Ty>().template is<T>();
  ------------------
  |  Branch (386:12): [True: 11, False: 244]
  |  Branch (386:37): [True: 9, False: 2]
  ------------------
  387|    255|  }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE2isISA_EEiv:
  123|    528|  template <typename T> int is() const {
  124|    528|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|    528|        PT1, T, IsPT1,
  126|    528|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|    528|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|    528|    int TyNo = Ty::Num;
  129|    528|    return static_cast<int>(Val.getInt()) == TyNo;
  130|    528|  }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE3getISA_EET_v:
  135|     25|  template <typename T> T get() const {
  136|     25|    assert(is<T>() && "Invalid accessor called");
  137|     25|    return PointerLikeTypeTraits<T>::getFromVoidPointer(Val.getPointer());
  138|     25|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE2isIS6_EEiv:
  123|     19|  template <typename T> int is() const {
  124|     19|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|     19|        PT1, T, IsPT1,
  126|     19|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|     19|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|     19|    int TyNo = Ty::Num;
  129|     19|    return static_cast<int>(Val.getInt()) == TyNo;
  130|     19|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE3getIS6_EET_v:
  392|      8|  template <typename T> T get() const {
  393|      8|    assert(is<T>() && "Invalid accessor called");
  394|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  395|      8|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  396|      8|        PT1, T, InnerUnion1,
  397|      8|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  398|      8|                                         InnerUnion2>>::Return;
  399|      8|    return Val.template get<Ty>().template get<T>();
  400|      8|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE3getIS6_EET_v:
  135|      8|  template <typename T> T get() const {
  136|      8|    assert(is<T>() && "Invalid accessor called");
  137|      8|    return PointerLikeTypeTraits<T>::getFromVoidPointer(Val.getPointer());
  138|      8|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE2isIS9_EEiv:
  380|    248|  template <typename T> int is() const {
  381|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  382|    248|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  383|    248|        PT1, T, InnerUnion1,
  384|    248|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  385|    248|                                         InnerUnion2>>::Return;
  386|    248|    return Val.template is<Ty>() && Val.template get<Ty>().template is<T>();
  ------------------
  |  Branch (386:12): [True: 4, False: 244]
  |  Branch (386:37): [True: 4, False: 0]
  ------------------
  387|    248|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE2isIS9_EEiv:
  123|      6|  template <typename T> int is() const {
  124|      6|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|      6|        PT1, T, IsPT1,
  126|      6|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|      6|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|      6|    int TyNo = Ty::Num;
  129|      6|    return static_cast<int>(Val.getInt()) == TyNo;
  130|      6|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE3getIS9_EET_v:
  392|      2|  template <typename T> T get() const {
  393|      2|    assert(is<T>() && "Invalid accessor called");
  394|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  395|      2|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  396|      2|        PT1, T, InnerUnion1,
  397|      2|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  398|      2|                                         InnerUnion2>>::Return;
  399|      2|    return Val.template get<Ty>().template get<T>();
  400|      2|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE3getIS9_EET_v:
  135|      2|  template <typename T> T get() const {
  136|      2|    assert(is<T>() && "Invalid accessor called");
  137|      2|    return PointerLikeTypeTraits<T>::getFromVoidPointer(Val.getPointer());
  138|      2|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE2isISC_EEiv:
  380|   241k|  template <typename T> int is() const {
  381|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  382|   241k|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  383|   241k|        PT1, T, InnerUnion1,
  384|   241k|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  385|   241k|                                         InnerUnion2>>::Return;
  386|   241k|    return Val.template is<Ty>() && Val.template get<Ty>().template is<T>();
  ------------------
  |  Branch (386:12): [True: 241k, False: 0]
  |  Branch (386:37): [True: 241k, False: 0]
  ------------------
  387|   241k|  }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE2isISH_EEiv:
  123|   725k|  template <typename T> int is() const {
  124|   725k|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|   725k|        PT1, T, IsPT1,
  126|   725k|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|   725k|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|   725k|    int TyNo = Ty::Num;
  129|   725k|    return static_cast<int>(Val.getInt()) == TyNo;
  130|   725k|  }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE3getISH_EET_v:
  135|   483k|  template <typename T> T get() const {
  136|   483k|    assert(is<T>() && "Invalid accessor called");
  137|   483k|    return PointerLikeTypeTraits<T>::getFromVoidPointer(Val.getPointer());
  138|   483k|  }
_ZN4llvh21PointerLikeTypeTraitsINS_12PointerUnionIPNSt3__16vectorIjNS2_9allocatorIjEEEEPNS3_ImNS4_ImEEEEEEE18getFromVoidPointerEPv:
  216|   483k|  static inline PointerUnion<PT1, PT2> getFromVoidPointer(void *P) {
  217|   483k|    return PointerUnion<PT1, PT2>::getFromOpaqueValue(P);
  218|   483k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE18getFromOpaqueValueEPv:
  186|   483k|  static inline PointerUnion getFromOpaqueValue(void *VP) {
  187|   483k|    PointerUnion V;
  188|   483k|    V.Val = ValTy::getFromOpaqueValue(VP);
  189|   483k|    return V;
  190|   483k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEEC2Ev:
  104|   483k|  PointerUnion() = default;
_ZNK4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE2isIS6_EEiv:
  123|   483k|  template <typename T> int is() const {
  124|   483k|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|   483k|        PT1, T, IsPT1,
  126|   483k|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|   483k|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|   483k|    int TyNo = Ty::Num;
  129|   483k|    return static_cast<int>(Val.getInt()) == TyNo;
  130|   483k|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE3getISC_EET_v:
  392|   241k|  template <typename T> T get() const {
  393|   241k|    assert(is<T>() && "Invalid accessor called");
  394|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  395|   241k|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  396|   241k|        PT1, T, InnerUnion1,
  397|   241k|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  398|   241k|                                         InnerUnion2>>::Return;
  399|   241k|    return Val.template get<Ty>().template get<T>();
  400|   241k|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE3getIS6_EET_v:
  135|   241k|  template <typename T> T get() const {
  136|   241k|    assert(is<T>() && "Invalid accessor called");
  137|   241k|    return PointerLikeTypeTraits<T>::getFromVoidPointer(Val.getPointer());
  138|   241k|  }
_ZN4llvh22PointerUnionUIntTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE18getFromVoidPointerEPv:
   62|   241k|  static inline void *getFromVoidPointer(void *P) { return P; }
_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEaSERKS6_:
  418|      1|  const PointerUnion4 &operator=(const PT1 &RHS) {
  419|      1|    Val = InnerUnion1(RHS);
  420|      1|    return *this;
  421|      1|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEC2ES6_:
  106|      1|      : Val(const_cast<void *>(
  107|      1|            PointerLikeTypeTraits<PT1>::getAsVoidPointer(V))) {}
_ZN4llvh22PointerUnionUIntTraitsIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE16getAsVoidPointerEPv:
   61|      3|  static inline void *getAsVoidPointer(void *P) { return P; }
_ZN4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEEaSERKSA_:
  173|      3|  const PointerUnion &operator=(const PT1 &RHS) {
  174|      3|    Val.initWithPointer(
  175|      3|        const_cast<void *>(PointerLikeTypeTraits<PT1>::getAsVoidPointer(RHS)));
  176|      3|    return *this;
  177|      3|  }
_ZN4llvh21PointerLikeTypeTraitsINS_12PointerUnionIPNSt3__16vectorIhNS2_9allocatorIhEEEEPNS3_ItNS4_ItEEEEEEE16getAsVoidPointerERKSB_:
  212|      3|  static inline void *getAsVoidPointer(const PointerUnion<PT1, PT2> &P) {
  213|      3|    return P.getOpaqueValue();
  214|      3|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE14getOpaqueValueEv:
  185|      3|  void *getOpaqueValue() const { return Val.getOpaqueValue(); }
_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEaSERKS9_:
  422|      2|  const PointerUnion4 &operator=(const PT2 &RHS) {
  423|      2|    Val = InnerUnion1(RHS);
  424|      2|    return *this;
  425|      2|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEC2ES9_:
  109|      2|      : Val(const_cast<void *>(PointerLikeTypeTraits<PT2>::getAsVoidPointer(V)),
  110|      2|            1) {}
_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEaSERKSC_:
  426|    244|  const PointerUnion4 &operator=(const PT3 &RHS) {
  427|    244|    Val = InnerUnion2(RHS);
  428|    244|    return *this;
  429|    244|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEEC2ES6_:
  106|    244|      : Val(const_cast<void *>(
  107|    244|            PointerLikeTypeTraits<PT1>::getAsVoidPointer(V))) {}
_ZN4llvh22PointerUnionUIntTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE16getAsVoidPointerEPv:
   61|    244|  static inline void *getAsVoidPointer(void *P) { return P; }
_ZN4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEEaSERKSH_:
  178|    244|  const PointerUnion &operator=(const PT2 &RHS) {
  179|    244|    Val.setPointerAndInt(
  180|    244|        const_cast<void *>(PointerLikeTypeTraits<PT2>::getAsVoidPointer(RHS)),
  181|    244|        1);
  182|    244|    return *this;
  183|    244|  }
_ZN4llvh21PointerLikeTypeTraitsINS_12PointerUnionIPNSt3__16vectorIjNS2_9allocatorIjEEEEPNS3_ImNS4_ImEEEEEEE16getAsVoidPointerERKSB_:
  212|    244|  static inline void *getAsVoidPointer(const PointerUnion<PT1, PT2> &P) {
  213|    244|    return P.getOpaqueValue();
  214|    244|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE14getOpaqueValueEv:
  185|    244|  void *getOpaqueValue() const { return Val.getOpaqueValue(); }

_ZN4llvh11find_if_notIRKNS_8ArrayRefIjEEPFbjEEEDTcl9adl_beginfp_EEOT_T0_:
 1075|  93.4k|auto find_if_not(R &&Range, UnaryPredicate P) -> decltype(adl_begin(Range)) {
 1076|  93.4k|  return std::find_if_not(adl_begin(Range), adl_end(Range), P);
 1077|  93.4k|}
_ZN4llvh9adl_beginIRKNS_8ArrayRefIjEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOS5_:
  182|   186k|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|   186k|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|   186k|}
_ZN4llvh10adl_detail9adl_beginIRKNS_8ArrayRefIjEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOS6_:
  158|   186k|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|   186k|  return begin(std::forward<ContainerTy>(container));
  160|   186k|}
_ZN4llvh7adl_endIRKNS_8ArrayRefIjEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOS5_:
  188|   186k|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|   186k|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|   186k|}
_ZN4llvh10adl_detail7adl_endIRKNS_8ArrayRefIjEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOS6_:
  166|   186k|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|   186k|  return end(std::forward<ContainerTy>(container));
  168|   186k|}
_ZN4llvh7find_ifIRKNS_8ArrayRefIjEEPFbjEEEDTcl9adl_beginfp_EEOT_T0_:
 1070|  93.4k|auto find_if(R &&Range, UnaryPredicate P) -> decltype(adl_begin(Range)) {
 1071|  93.4k|  return std::find_if(adl_begin(Range), adl_end(Range), P);
 1072|  93.4k|}
_ZN4llvh4findIRNSt3__16vectorIPN6hermes2vm8JSObjectENS1_9allocatorIS6_EEEES6_EEDTcl9adl_beginfp_EEOT_RKT0_:
 1063|   781k|auto find(R &&Range, const T &Val) -> decltype(adl_begin(Range)) {
 1064|   781k|  return std::find(adl_begin(Range), adl_end(Range), Val);
 1065|   781k|}
_ZN4llvh9adl_beginIRNSt3__16vectorIPN6hermes2vm8JSObjectENS1_9allocatorIS6_EEEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOSB_:
  182|   781k|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|   781k|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|   781k|}
_ZN4llvh10adl_detail9adl_beginIRNSt3__16vectorIPN6hermes2vm8JSObjectENS2_9allocatorIS7_EEEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOSC_:
  158|   781k|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|   781k|  return begin(std::forward<ContainerTy>(container));
  160|   781k|}
_ZN4llvh7adl_endIRNSt3__16vectorIPN6hermes2vm8JSObjectENS1_9allocatorIS6_EEEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOSB_:
  188|   781k|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|   781k|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|   781k|}
_ZN4llvh10adl_detail7adl_endIRNSt3__16vectorIPN6hermes2vm8JSObjectENS2_9allocatorIS7_EEEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOSC_:
  166|   781k|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|   781k|  return end(std::forward<ContainerTy>(container));
  168|   781k|}
_ZN4llvh7reverseIRNS_8ArrayRefIPN6hermes10BasicBlockEEEEEDTcl10make_rangecldtfp_6rbeginEcldtfp_4rendEEEOT_PNSt3__19enable_ifIXsr10has_rbeginIS8_EE5valueEvE4typeE:
  253|   102k|                 nullptr) -> decltype(make_range(C.rbegin(), C.rend())) {
  254|   102k|  return make_range(C.rbegin(), C.rend());
  255|   102k|}
_ZN4llvh7reverseIRN6hermes10BasicBlockEEEDTcl10make_rangecldtfp_6rbeginEcldtfp_4rendEEEOT_PNSt3__19enable_ifIXsr10has_rbeginIS5_EE5valueEvE4typeE:
  253|   707k|                 nullptr) -> decltype(make_range(C.rbegin(), C.rend())) {
  254|   707k|  return make_range(C.rbegin(), C.rend());
  255|   707k|}
_ZN4llvh7reverseINS_14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS3_10BasicBlockEEEEEEEDTcl10make_rangeclsr4llvhE21make_reverse_iteratorclsr3stdE3endfp_EEclsr4llvhE21make_reverse_iteratorclsr3stdE5beginfp_EEEEOT_PNSt3__19enable_ifIXntsr10has_rbeginIS9_EE5valueEvE4typeE:
  271|   492k|                           llvh::make_reverse_iterator(std::begin(C)))) {
  272|   492k|  return make_range(llvh::make_reverse_iterator(std::end(C)),
  273|   492k|                    llvh::make_reverse_iterator(std::begin(C)));
  274|   492k|}
_ZN4llvh21make_reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEEENSt3__116reverse_iteratorIT_EES8_:
  259|   985k|std::reverse_iterator<IteratorTy> make_reverse_iterator(IteratorTy It) {
  260|   985k|  return std::reverse_iterator<IteratorTy>(It);
  261|   985k|}
_ZN4llvh11make_uniqueINS_15DomTreeNodeBaseIN6hermes10BasicBlockEEEJRPS3_RPS4_EEENSt3__19enable_ifIXntsr3std8is_arrayIT_EE5valueENS9_10unique_ptrISB_NS9_14default_deleteISB_EEEEE4typeEDpOT0_:
 1205|   492k|make_unique(Args &&... args) {
 1206|   492k|  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
 1207|   492k|}
_ZN4llvh11make_uniqueINS_15DomTreeNodeBaseIN6hermes10BasicBlockEEEJRPS3_DnEEENSt3__19enable_ifIXntsr3std8is_arrayIT_EE5valueENS7_10unique_ptrIS9_NS7_14default_deleteIS9_EEEEE4typeEDpOT0_:
 1205|     13|make_unique(Args &&... args) {
 1206|     13|  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
 1207|     13|}
_ZN4llvh14array_lengthofIcLm128EEEmRAT0__T_:
  900|      6|constexpr inline size_t array_lengthof(T (&)[N]) {
  901|      6|  return N;
  902|      6|}
_ZN4llvh4sortIRNS_11SmallVectorINS_7SMFixItELj4EEEEEvOT_:
  980|    772|template <typename Container> inline void sort(Container &&C) {
  981|    772|  llvh::sort(adl_begin(C), adl_end(C));
  982|    772|}
_ZN4llvh4sortIPNS_7SMFixItEEEvT_S3_:
  972|    772|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|    772|  std::sort(Start, End);
  978|    772|}
_ZN4llvh9adl_beginIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOS5_:
  182|    772|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|    772|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|    772|}
_ZN4llvh10adl_detail9adl_beginIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOS6_:
  158|    772|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|    772|  return begin(std::forward<ContainerTy>(container));
  160|    772|}
_ZN4llvh7adl_endIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOS5_:
  188|    772|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|    772|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|    772|}
_ZN4llvh10adl_detail7adl_endIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOS6_:
  166|    772|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|    772|  return end(std::forward<ContainerTy>(container));
  168|    772|}
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$_0EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSC_:
   59|   781k|make_scope_exit(Callable &&F) {
   60|   781k|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|   781k|      std::forward<Callable>(F));
   62|   781k|}
Array.cpp:_ZN4llvh6detail10scope_exitIZN6hermes2vm18arrayPrototypeJoinEPvRNS3_7RuntimeENS3_10NativeArgsEE3$_0EC2IS8_EEOT_:
   32|   781k|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
Array.cpp:_ZN4llvh6detail10scope_exitIZN6hermes2vm18arrayPrototypeJoinEPvRNS3_7RuntimeENS3_10NativeArgsEE3$_0ED2Ev:
   44|   781k|  ~scope_exit() {
   45|   781k|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 781k, False: 0]
  ------------------
   46|   781k|      ExitFunction();
   47|   781k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh15make_scope_exitIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE3$_0EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSC_:
   59|      1|make_scope_exit(Callable &&F) {
   60|      1|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|      1|      std::forward<Callable>(F));
   62|      1|}
ESTreeIRGen-expr.cpp:_ZN4llvh6detail10scope_exitIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE3$_0EC2IS8_EEOT_:
   32|      1|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
ESTreeIRGen-expr.cpp:_ZN4llvh6detail10scope_exitIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE3$_0ED2Ev:
   44|      1|  ~scope_exit() {
   45|      1|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 1, False: 0]
  ------------------
   46|      1|      ExitFunction();
   47|      1|  }
_ZN4llvh15make_scope_exitIZN6hermes6parser7JSLexer10lookahead1ILb1EEENS1_8OptValueINS2_9TokenKindEEES7_EUlvE_EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSD_:
   59|    500|make_scope_exit(Callable &&F) {
   60|    500|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|    500|      std::forward<Callable>(F));
   62|    500|}
_ZN4llvh6detail10scope_exitIZN6hermes6parser7JSLexer10lookahead1ILb1EEENS2_8OptValueINS3_9TokenKindEEES8_EUlvE_EC2IS9_EEOT_:
   32|    500|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
_ZN4llvh6detail10scope_exitIZN6hermes6parser7JSLexer10lookahead1ILb1EEENS2_8OptValueINS3_9TokenKindEEES8_EUlvE_ED2Ev:
   44|    500|  ~scope_exit() {
   45|    500|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 500, False: 0]
  ------------------
   46|    500|      ExitFunction();
   47|    500|  }
_ZN4llvh15make_scope_exitIZN6hermes6parser7JSLexer10lookahead1ILb0EEENS1_8OptValueINS2_9TokenKindEEES7_EUlvE_EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSD_:
   59|    100|make_scope_exit(Callable &&F) {
   60|    100|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|    100|      std::forward<Callable>(F));
   62|    100|}
_ZN4llvh6detail10scope_exitIZN6hermes6parser7JSLexer10lookahead1ILb0EEENS2_8OptValueINS3_9TokenKindEEES8_EUlvE_EC2IS9_EEOT_:
   32|    100|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
_ZN4llvh6detail10scope_exitIZN6hermes6parser7JSLexer10lookahead1ILb0EEENS2_8OptValueINS3_9TokenKindEEES8_EUlvE_ED2Ev:
   44|    100|  ~scope_exit() {
   45|    100|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 100, False: 0]
  ------------------
   46|    100|      ExitFunction();
   47|    100|  }
SemanticValidator.cpp:_ZN4llvh15make_scope_exitIZN6hermes3sem17SemanticValidator5visitEPNS1_6ESTree20LabeledStatementNodeEE3$_0EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSC_:
   59|   245k|make_scope_exit(Callable &&F) {
   60|   245k|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|   245k|      std::forward<Callable>(F));
   62|   245k|}
SemanticValidator.cpp:_ZN4llvh6detail10scope_exitIZN6hermes3sem17SemanticValidator5visitEPNS2_6ESTree20LabeledStatementNodeEE3$_0EC2IS8_EEOT_:
   32|   245k|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
SemanticValidator.cpp:_ZN4llvh6detail10scope_exitIZN6hermes3sem17SemanticValidator5visitEPNS2_6ESTree20LabeledStatementNodeEE3$_0ED2Ev:
   44|   245k|  ~scope_exit() {
   45|   245k|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 245k, False: 0]
  ------------------
   46|   245k|      ExitFunction();
   47|   245k|  }

_ZN4llvh9SetVectorIPN6hermes9ScopeDescENSt3__16vectorIS3_NS4_9allocatorIS3_EEEENS_8DenseSetIS3_NS_12DenseMapInfoIS3_EEEEEC2Ev:
   56|    196|  SetVector() = default;
_ZN4llvh9SetVectorIPN6hermes9ScopeDescENSt3__16vectorIS3_NS4_9allocatorIS3_EEEENS_8DenseSetIS3_NS_12DenseMapInfoIS3_EEEEE6insertERKS3_:
  142|  4.69M|  bool insert(const value_type &X) {
  143|  4.69M|    bool result = set_.insert(X).second;
  144|  4.69M|    if (result)
  ------------------
  |  Branch (144:9): [True: 206k, False: 4.48M]
  ------------------
  145|   206k|      vector_.push_back(X);
  146|  4.69M|    return result;
  147|  4.69M|  }
_ZNK4llvh9SetVectorIPN6hermes9ScopeDescENSt3__16vectorIS3_NS4_9allocatorIS3_EEEENS_8DenseSetIS3_NS_12DenseMapInfoIS3_EEEEE4sizeEv:
   78|   103k|  size_type size() const {
   79|   103k|    return vector_.size();
   80|   103k|  }
_ZNK4llvh9SetVectorIPN6hermes9ScopeDescENSt3__16vectorIS3_NS4_9allocatorIS3_EEEENS_8DenseSetIS3_NS_12DenseMapInfoIS3_EEEEEixEm:
  135|   206k|  const_reference operator[](size_type n) const {
  136|   206k|    assert(n < vector_.size() && "SetVector access out of range!");
  137|   206k|    return vector_[n];
  138|   206k|  }
_ZN4llvh9SetVectorIPN6hermes9ScopeDescENSt3__16vectorIS3_NS4_9allocatorIS3_EEEENS_8DenseSetIS3_NS_12DenseMapInfoIS3_EEEEE5clearEv:
  216|   103k|  void clear() {
  217|   103k|    set_.clear();
  218|   103k|    vector_.clear();
  219|   103k|  }
_ZN4llvh14SmallSetVectorIPN6hermes11InstructionELj16EEC2Ev:
  301|     13|  SmallSetVector() = default;
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEEC2Ev:
   56|     13|  SetVector() = default;
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE6insertIPKS3_EEvT_SE_:
  151|     26|  void insert(It Start, It End) {
  152|    374|    for (; Start != End; ++Start)
  ------------------
  |  Branch (152:12): [True: 348, False: 26]
  ------------------
  153|    348|      if (set_.insert(*Start).second)
  ------------------
  |  Branch (153:11): [True: 348, False: 0]
  ------------------
  154|    348|        vector_.push_back(*Start);
  155|     26|  }
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE5beginEv:
   83|     26|  iterator begin() {
   84|     26|    return vector_.begin();
   85|     26|  }
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE3endEv:
   93|     26|  iterator end() {
   94|     26|    return vector_.end();
   95|     26|  }
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE5clearEv:
  216|     13|  void clear() {
  217|     13|    set_.clear();
  218|     13|    vector_.clear();
  219|     13|  }

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

_ZN4llvh19SmallPtrSetImplBaseC2EPPKvj:
   76|   549k|      : SmallArray(SmallStorage), CurArray(SmallStorage),
   77|   549k|        CurArraySize(SmallSize), NumNonEmpty(0), NumTombstones(0) {
   78|   549k|    assert(SmallSize && (SmallSize & (SmallSize-1)) == 0 &&
   79|   549k|           "Initial size must be a power of two!");
   80|   549k|  }
_ZN4llvh19SmallPtrSetImplBaseD2Ev:
   82|   590k|  ~SmallPtrSetImplBase() {
   83|   590k|    if (!isSmall())
  ------------------
  |  Branch (83:9): [True: 1.02k, False: 589k]
  ------------------
   84|  1.02k|      free(CurArray);
   85|   590k|  }
_ZNK4llvh19SmallPtrSetImplBase5emptyEv:
   92|     30|  LLVM_NODISCARD bool empty() const { return size() == 0; }
_ZNK4llvh19SmallPtrSetImplBase4sizeEv:
   93|  3.52M|  size_type size() const { return NumNonEmpty - NumTombstones; }
_ZN4llvh19SmallPtrSetImplBase18getTombstoneMarkerEv:
  111|  22.1M|  static void *getTombstoneMarker() { return reinterpret_cast<void*>(-2); }
_ZN4llvh19SmallPtrSetImplBase14getEmptyMarkerEv:
  113|  27.4M|  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|  27.4M|    return reinterpret_cast<void*>(-1);
  117|  27.4M|  }
_ZNK4llvh19SmallPtrSetImplBase10EndPointerEv:
  119|  6.16M|  const void **EndPointer() const {
  120|  6.16M|    return isSmall() ? CurArray + NumNonEmpty : CurArray + CurArraySize;
  ------------------
  |  Branch (120:12): [True: 509k, False: 5.65M]
  ------------------
  121|  6.16M|  }
_ZN4llvh19SmallPtrSetImplBase10insert_impEPKv:
  126|  3.90M|  std::pair<const void *const *, bool> insert_imp(const void *Ptr) {
  127|  3.90M|    if (isSmall()) {
  ------------------
  |  Branch (127:9): [True: 386k, False: 3.51M]
  ------------------
  128|       |      // Check to see if it is already in the set.
  129|   386k|      const void **LastTombstone = nullptr;
  130|   386k|      for (const void **APtr = SmallArray, **E = SmallArray + NumNonEmpty;
  131|  1.04M|           APtr != E; ++APtr) {
  ------------------
  |  Branch (131:12): [True: 757k, False: 284k]
  ------------------
  132|   757k|        const void *Value = *APtr;
  133|   757k|        if (Value == Ptr)
  ------------------
  |  Branch (133:13): [True: 102k, False: 655k]
  ------------------
  134|   102k|          return std::make_pair(APtr, false);
  135|   655k|        if (Value == getTombstoneMarker())
  ------------------
  |  Branch (135:13): [True: 0, False: 655k]
  ------------------
  136|      0|          LastTombstone = APtr;
  137|   655k|      }
  138|       |
  139|       |      // Did we find any tombstone marker?
  140|   284k|      if (LastTombstone != nullptr) {
  ------------------
  |  Branch (140:11): [True: 0, False: 284k]
  ------------------
  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|   284k|      if (NumNonEmpty < CurArraySize) {
  ------------------
  |  Branch (148:11): [True: 283k, False: 1.02k]
  ------------------
  149|   283k|        SmallArray[NumNonEmpty++] = Ptr;
  150|   283k|        incrementEpoch();
  151|   283k|        return std::make_pair(SmallArray + (NumNonEmpty - 1), true);
  152|   283k|      }
  153|       |      // Otherwise, hit the big set case, which will call grow.
  154|   284k|    }
  155|  3.52M|    return insert_imp_big(Ptr);
  156|  3.90M|  }
_ZNK4llvh19SmallPtrSetImplBase8find_impEPKv:
  177|   685k|  const void *const * find_imp(const void * Ptr) const {
  178|   685k|    if (isSmall()) {
  ------------------
  |  Branch (178:9): [True: 480, False: 684k]
  ------------------
  179|       |      // Linear search for the item.
  180|    480|      for (const void *const *APtr = SmallArray,
  181|  7.85k|                      *const *E = SmallArray + NumNonEmpty; APtr != E; ++APtr)
  ------------------
  |  Branch (181:61): [True: 7.85k, False: 0]
  ------------------
  182|  7.85k|        if (*APtr == Ptr)
  ------------------
  |  Branch (182:13): [True: 480, False: 7.37k]
  ------------------
  183|    480|          return APtr;
  184|      0|      return EndPointer();
  185|    480|    }
  186|       |
  187|       |    // Big set case.
  188|   684k|    auto *Bucket = FindBucketFor(Ptr);
  189|   684k|    if (*Bucket == Ptr)
  ------------------
  |  Branch (189:9): [True: 603k, False: 81.2k]
  ------------------
  190|   603k|      return Bucket;
  191|  81.2k|    return EndPointer();
  192|   684k|  }
_ZNK4llvh19SmallPtrSetImplBase7isSmallEv:
  195|  11.3M|  bool isSmall() const { return CurArray == SmallArray; }
_ZN4llvh23SmallPtrSetIteratorImplC2EPKPKvS4_:
  229|  5.35M|    : Bucket(BP), End(E) {
  230|  5.35M|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (230:9): [True: 0, False: 5.35M]
  ------------------
  231|      0|      RetreatIfNotValid();
  232|      0|      return;
  233|      0|    }
  234|  5.35M|    AdvanceIfNotValid();
  235|  5.35M|  }
_ZNK4llvh23SmallPtrSetIteratorImplneERKS0_:
  240|   766k|  bool operator!=(const SmallPtrSetIteratorImpl &RHS) const {
  241|   766k|    return Bucket != RHS.Bucket;
  242|   766k|  }
_ZN4llvh23SmallPtrSetIteratorImpl17AdvanceIfNotValidEv:
  248|  5.39M|  void AdvanceIfNotValid() {
  249|  5.39M|    assert(Bucket <= End);
  250|  5.39M|    while (Bucket != End &&
  ------------------
  |  Branch (250:12): [True: 4.55M, False: 847k]
  ------------------
  251|  5.39M|           (*Bucket == SmallPtrSetImplBase::getEmptyMarker() ||
  ------------------
  |  Branch (251:13): [True: 0, False: 4.55M]
  ------------------
  252|  4.55M|            *Bucket == SmallPtrSetImplBase::getTombstoneMarker()))
  ------------------
  |  Branch (252:13): [True: 0, False: 4.55M]
  ------------------
  253|      0|      ++Bucket;
  254|  5.39M|  }
_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|     38|    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|  40.6k|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEEC2EPPKvj:
  357|   446k|      : SmallPtrSetImplBase(SmallStorage, SmallSize) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE6insertES3_:
  371|  3.80M|  std::pair<iterator, bool> insert(PtrType Ptr) {
  372|  3.80M|    auto p = insert_imp(PtrTraits::getAsVoidPointer(Ptr));
  373|  3.80M|    return std::make_pair(makeIterator(p.first), p.second);
  374|  3.80M|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE12makeIteratorEPKPKv:
  406|  5.25M|  iterator makeIterator(const void *const *P) const {
  407|  5.25M|    if (shouldReverseIterate())
  ------------------
  |  Branch (407:9): [True: 0, False: 5.25M]
  ------------------
  408|      0|      return iterator(P == EndPointer() ? CurArray : P + 1, CurArray, *this);
  ------------------
  |  Branch (408:23): [True: 0, False: 0]
  ------------------
  409|  5.25M|    return iterator(P, EndPointer(), *this);
  410|  5.25M|  }
_ZN4llvh19SmallPtrSetIteratorIPN6hermes10BasicBlockEEC2EPKPKvS8_RKNS_14DebugEpochBaseE:
  280|  5.25M|      : SmallPtrSetIteratorImpl(BP, E), DebugEpochBase::HandleBase(&Epoch) {}
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE5countEPKS2_:
  382|   685k|  size_type count(ConstPtrType Ptr) const { return find(Ptr) != end() ? 1 : 0; }
  ------------------
  |  Branch (382:52): [True: 604k, False: 81.2k]
  ------------------
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE4findEPKS2_:
  383|   685k|  iterator find(ConstPtrType Ptr) const {
  384|   685k|    return makeIterator(find_imp(ConstPtrTraits::getAsVoidPointer(Ptr)));
  385|   685k|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE5beginEv:
  397|  40.6k|  iterator begin() const {
  398|  40.6k|    if (shouldReverseIterate())
  ------------------
  |  Branch (398:9): [True: 0, False: 40.6k]
  ------------------
  399|      0|      return makeIterator(EndPointer() - 1);
  400|  40.6k|    return makeIterator(CurArray);
  401|  40.6k|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE3endEv:
  402|   726k|  iterator end() const { return makeIterator(EndPointer()); }
_ZN4llvh19SmallPtrSetIteratorIPN6hermes10BasicBlockEEppEv:
  294|  40.6k|  inline SmallPtrSetIterator& operator++() {          // Preincrement
  295|  40.6k|    assert(isHandleInSync() && "invalid iterator access!");
  296|  40.6k|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (296:9): [True: 0, False: 40.6k]
  ------------------
  297|      0|      --Bucket;
  298|      0|      RetreatIfNotValid();
  299|      0|      return *this;
  300|      0|    }
  301|  40.6k|    ++Bucket;
  302|  40.6k|    AdvanceIfNotValid();
  303|  40.6k|    return *this;
  304|  40.6k|  }
_ZNK4llvh19SmallPtrSetIteratorIPN6hermes10BasicBlockEEdeEv:
  284|  40.6k|  const PtrTy operator*() const {
  285|  40.6k|    assert(isHandleInSync() && "invalid iterator access!");
  286|  40.6k|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (286:9): [True: 0, False: 40.6k]
  ------------------
  287|      0|      assert(Bucket > End);
  288|      0|      return PtrTraits::getFromVoidPointer(const_cast<void *>(Bucket[-1]));
  289|      0|    }
  290|  40.6k|    assert(Bucket < End);
  291|  40.6k|    return PtrTraits::getFromVoidPointer(const_cast<void*>(*Bucket));
  292|  40.6k|  }
_ZN4llvh11SmallPtrSetIPN6hermes10BasicBlockELj4EEC2EOS4_:
  435|  40.6k|      : BaseT(SmallStorage, SmallSizePowTwo, std::move(that)) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEEC2EPPKvjOS4_:
  355|  40.6k|      : SmallPtrSetImplBase(SmallStorage, SmallSize, std::move(that)) {}
_ZN4llvh11SmallPtrSetIPN6hermes10BasicBlockELj32EEC2Ev:
  432|  95.6k|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh11SmallPtrSetIPN6hermes10BasicBlockELj16EEC2Ev:
  432|   310k|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh11SmallPtrSetIPN6hermes12UniqueStringELj8EEC2Ev:
  432|   103k|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes12UniqueStringEEC2EPPKvj:
  357|   103k|      : SmallPtrSetImplBase(SmallStorage, SmallSize) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes12UniqueStringEE6insertES3_:
  371|   103k|  std::pair<iterator, bool> insert(PtrType Ptr) {
  372|   103k|    auto p = insert_imp(PtrTraits::getAsVoidPointer(Ptr));
  373|   103k|    return std::make_pair(makeIterator(p.first), p.second);
  374|   103k|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes12UniqueStringEE12makeIteratorEPKPKv:
  406|   103k|  iterator makeIterator(const void *const *P) const {
  407|   103k|    if (shouldReverseIterate())
  ------------------
  |  Branch (407:9): [True: 0, False: 103k]
  ------------------
  408|      0|      return iterator(P == EndPointer() ? CurArray : P + 1, CurArray, *this);
  ------------------
  |  Branch (408:23): [True: 0, False: 0]
  ------------------
  409|   103k|    return iterator(P, EndPointer(), *this);
  410|   103k|  }
_ZN4llvh19SmallPtrSetIteratorIPN6hermes12UniqueStringEEC2EPKPKvS8_RKNS_14DebugEpochBaseE:
  280|   103k|      : 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|      2|    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) {}

_ZN4llvh8SmallSetIjLj16ENSt3__14lessIjEEEC2Ev:
  154|     45|  SmallSet() = default;
_ZN4llvh8SmallSetIjLj4ENSt3__14lessIjEEEC2Ev:
  154|     15|  SmallSet() = default;
_ZN4llvh8SmallSetIdLj4ENSt3__14lessIdEEEC2Ev:
  154|     15|  SmallSet() = default;
_ZN4llvh8SmallSetIdLj4ENSt3__14lessIdEEE6insertERKd:
  181|   840k|  std::pair<NoneType, bool> insert(const T &V) {
  182|   840k|    if (!isSmall())
  ------------------
  |  Branch (182:9): [True: 840k, False: 75]
  ------------------
  183|   840k|      return std::make_pair(None, Set.insert(V).second);
  184|       |
  185|     75|    VIterator I = vfind(V);
  186|     75|    if (I != Vector.end())    // Don't reinsert if it already exists.
  ------------------
  |  Branch (186:9): [True: 0, False: 75]
  ------------------
  187|      0|      return std::make_pair(None, false);
  188|     75|    if (Vector.size() < N) {
  ------------------
  |  Branch (188:9): [True: 60, False: 15]
  ------------------
  189|     60|      Vector.push_back(V);
  190|     60|      return std::make_pair(None, true);
  191|     60|    }
  192|       |
  193|       |    // Otherwise, grow from vector to set.
  194|     75|    while (!Vector.empty()) {
  ------------------
  |  Branch (194:12): [True: 60, False: 15]
  ------------------
  195|     60|      Set.insert(Vector.back());
  196|     60|      Vector.pop_back();
  197|     60|    }
  198|     15|    Set.insert(V);
  199|     15|    return std::make_pair(None, true);
  200|     75|  }
_ZNK4llvh8SmallSetIdLj4ENSt3__14lessIdEEE7isSmallEv:
  237|   840k|  bool isSmall() const { return Set.empty(); }
_ZNK4llvh8SmallSetIdLj4ENSt3__14lessIdEEE5vfindERKd:
  239|     75|  VIterator vfind(const T &V) const {
  240|    225|    for (VIterator I = Vector.begin(), E = Vector.end(); I != E; ++I)
  ------------------
  |  Branch (240:58): [True: 150, False: 75]
  ------------------
  241|    150|      if (*I == V)
  ------------------
  |  Branch (241:11): [True: 0, False: 150]
  ------------------
  242|      0|        return I;
  243|     75|    return Vector.end();
  244|     75|  }

_ZN4llvh11SmallStringILj256EE6appendIPKcEEvT_S5_:
   75|  14.1k|  void append(in_iter S, in_iter E) {
   76|  14.1k|    SmallVectorImpl<char>::append(S, E);
   77|  14.1k|  }
_ZN4llvh11SmallStringILj32EEC2Ev:
   29|   146k|  SmallString() = default;
_ZNK4llvh11SmallStringILj32EEcvNS_9StringRefEEv:
  277|   103k|  operator StringRef() const { return str(); }
_ZNK4llvh11SmallStringILj32EE3strEv:
  267|   103k|  StringRef str() const { return StringRef(this->begin(), this->size()); }
_ZN4llvh11SmallStringILj32EEC2ENS_9StringRefE:
   32|  7.20k|  SmallString(StringRef S) : SmallVector<char, InternalLen>(S.begin(), S.end()) {}
_ZN4llvh11SmallStringILj32EE6appendENS_9StringRefE:
   84|   412k|  void append(StringRef RHS) {
   85|   412k|    SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
   86|   412k|  }
_ZN4llvh11SmallStringILj7EEC2Ev:
   29|      2|  SmallString() = default;
_ZN4llvh11SmallStringILj16EEC2Ev:
   29|   136k|  SmallString() = default;
_ZN4llvh11SmallStringILj4EEC2Ev:
   29|     11|  SmallString() = default;
_ZN4llvh11SmallStringILj256EEC2Ev:
   29|  2.29k|  SmallString() = default;
_ZN4llvh11SmallStringILj256EE6appendENS_9StringRefE:
   84|    207|  void append(StringRef RHS) {
   85|    207|    SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
   86|    207|  }
_ZNK4llvh11SmallStringILj256EE3strEv:
  267|  2.22M|  StringRef str() const { return StringRef(this->begin(), this->size()); }
_ZNK4llvh11SmallStringILj256EEcvNS_9StringRefEEv:
  277|    110|  operator StringRef() const { return str(); }
_ZN4llvh11SmallStringILj32EE6appendIPKcEEvT_S5_:
   75|  43.4k|  void append(in_iter S, in_iter E) {
   76|  43.4k|    SmallVectorImpl<char>::append(S, E);
   77|  43.4k|  }

_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EED2Ev:
  861|    588|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    588|    this->destroy_range(this->begin(), this->end());
  864|    588|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE13destroy_rangeEPS3_S5_:
  282|    980|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE5beginEv:
  135|   106k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE3endEv:
  139|   104k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEED2Ev:
  349|    588|  ~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|    588|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 588]
  ------------------
  353|      0|      free(this->begin());
  354|    588|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE7isSmallEv:
  110|    980|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE10getFirstElEv:
   93|  1.56k|  void *getFirstEl() const {
   94|  1.56k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  1.56k|        reinterpret_cast<const char *>(this) +
   96|  1.56k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  1.56k|  }
_ZN4llvh11SmallVectorIPN6hermes2vm17PinnedHermesValueELj4EEC2ESt16initializer_listIS4_E:
  885|  3.99M|  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  886|  3.99M|    this->assign(IL);
  887|  3.99M|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEEC2Ej:
  344|  3.99M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EEC2Em:
  279|  3.99M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvEC2Em:
  102|  3.99M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE10getFirstElEv:
   93|  7.98M|  void *getFirstEl() const {
   94|  7.98M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  7.98M|        reinterpret_cast<const char *>(this) +
   96|  7.98M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  7.98M|  }
_ZN4llvh15SmallVectorBaseC2EPvm:
   52|  93.2M|      : BeginX(FirstEl), Capacity(Capacity) {}
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE6assignESt16initializer_listIS4_E:
  450|  3.99M|  void assign(std::initializer_list<T> IL) {
  451|  3.99M|    clear();
  452|  3.99M|    append(IL);
  453|  3.99M|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE5clearEv:
  356|  3.99M|  void clear() {
  357|  3.99M|    this->destroy_range(this->begin(), this->end());
  358|  3.99M|    this->Size = 0;
  359|  3.99M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE13destroy_rangeEPS4_S6_:
  282|  7.98M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE5beginEv:
  135|  79.2M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE3endEv:
  139|  15.9M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE6appendESt16initializer_listIS4_E:
  426|  3.99M|  void append(std::initializer_list<T> IL) {
  427|  3.99M|    append(IL.begin(), IL.end());
  428|  3.99M|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE6appendIPKS4_vEEvT_S9_:
  404|  3.99M|  void append(in_iter in_start, in_iter in_end) {
  405|  3.99M|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  3.99M|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 3.99M]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  3.99M|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  3.99M|    this->set_size(this->size() + NumInputs);
  413|  3.99M|  }
_ZNK4llvh15SmallVectorBase8capacityEv:
   60|   451M|  size_t capacity() const { return Capacity; }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE4growEm:
  317|    320|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE8grow_podEmm:
  104|    320|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    320|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    320|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE18uninitialized_copyIKS4_S4_EEvPT_S9_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSC_12remove_constIS8_E4typeESA_EE5valueEvE4typeE:
  306|  3.99M|                                           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|  3.99M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 3.99M, False: 0]
  ------------------
  312|  3.99M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  3.99M|  }
_ZN4llvh15SmallVectorBase8set_sizeEm:
   73|   239M|  void set_size(size_t Size) {
   74|   239M|    assert(Size <= capacity());
   75|   239M|    this->Size = Size;
   76|   239M|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEED2Ev:
  349|  3.99M|  ~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.99M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 160, False: 3.99M]
  ------------------
  353|    160|      free(this->begin());
  354|  3.99M|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE7isSmallEv:
  110|  3.99M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EEC2Ev:
  859|    247|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINS_7SMFixItEEC2Ej:
  344|  1.01k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINS_7SMFixItELb0EEC2Em:
  194|  1.01k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINS_7SMFixItEvEC2Em:
  102|  1.01k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE10getFirstElEv:
   93|  2.03k|  void *getFirstEl() const {
   94|  2.03k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  2.03k|        reinterpret_cast<const char *>(this) +
   96|  2.03k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  2.03k|  }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EED2Ev:
  861|  1.01k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  1.01k|    this->destroy_range(this->begin(), this->end());
  864|  1.01k|  }
_ZN4llvh23SmallVectorTemplateBaseINS_7SMFixItELb0EE13destroy_rangeEPS1_S3_:
  196|  1.07k|  static void destroy_range(T *S, T *E) {
  197|  1.07k|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 0, False: 1.07k]
  ------------------
  198|      0|      --E;
  199|      0|      E->~T();
  200|      0|    }
  201|  1.07k|  }
_ZN4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE5beginEv:
  135|  4.45k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE3endEv:
  139|  2.61k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINS_7SMFixItEED2Ev:
  349|  1.01k|  ~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.01k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 1.01k]
  ------------------
  353|      0|      free(this->begin());
  354|  1.01k|  }
_ZNK4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE7isSmallEv:
  110|  1.01k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh15SmallVectorBase5emptyEv:
   62|   118M|  LLVM_NODISCARD bool empty() const { return !Size; }
_ZNK4llvh15SmallVectorBase4sizeEv:
   59|  2.70G|  size_t size() const { return Size; }
_ZNK4llvh25SmallVectorTemplateCommonIcvE4dataEv:
  157|  7.20k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIcvE5beginEv:
  137|  2.33M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIcvE4dataEv:
  155|   180k|  pointer data() { return pointer(begin()); }
_ZN4llvh25SmallVectorTemplateCommonIcvE5beginEv:
  135|   128M|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIcvE10getFirstElEv:
   93|  42.3M|  void *getFirstEl() const {
   94|  42.3M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  42.3M|        reinterpret_cast<const char *>(this) +
   96|  42.3M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  42.3M|  }
_ZNK4llvh25SmallVectorTemplateCommonIcvE7isSmallEv:
  110|  21.1M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE13destroy_rangeEPcS2_:
  282|  23.7M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIcvE3endEv:
  139|  82.3M|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE10getFirstElEv:
   93|  1.70k|  void *getFirstEl() const {
   94|  1.70k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  1.70k|        reinterpret_cast<const char *>(this) +
   96|  1.70k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  1.70k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE7isSmallEv:
  110|    883|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE5beginEv:
  135|  2.01k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE13destroy_rangeEPS6_S8_:
  196|    883|  static void destroy_range(T *S, T *E) {
  197|    947|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 64, False: 883]
  ------------------
  198|     64|      --E;
  199|     64|      E->~T();
  200|     64|    }
  201|    883|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE3endEv:
  139|  1.00k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE9push_backEOS6_:
  231|     64|  void push_back(T &&Elt) {
  232|     64|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     64|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 62, False: 2]
  |  |  ------------------
  ------------------
  233|     62|      this->grow();
  234|     64|    ::new ((void*) this->end()) T(::std::move(Elt));
  235|     64|    this->set_size(this->size() + 1);
  236|     64|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE4growEm:
  246|     62|void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
  247|       |  // Always grow, even from zero.
  248|     62|  constexpr size_t MinGrowth = 2;
  249|     62|  size_t NewCapacity = size_t(NextPowerOf2(this->capacity() + MinGrowth));
  250|     62|  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|     62|  if (NewCapacity <= this->capacity() ||
  ------------------
  |  Branch (253:7): [True: 0, False: 62]
  ------------------
  254|     62|      NewCapacity < MinSize ||
  ------------------
  |  Branch (254:7): [True: 0, False: 62]
  ------------------
  255|     62|      NewCapacity > size_t(-1) / sizeof(T))
  ------------------
  |  Branch (255:7): [True: 0, False: 62]
  ------------------
  256|      0|    report_bad_alloc_error("SmallVector capacity overflow during allocation");
  257|     62|  T *NewElts = static_cast<T*>(llvh::safe_malloc(NewCapacity*sizeof(T)));
  258|       |
  259|       |  // Move the elements over.
  260|     62|  this->uninitialized_move(this->begin(), this->end(), NewElts);
  261|       |
  262|       |  // Destroy the original elements.
  263|     62|  destroy_range(this->begin(), this->end());
  264|       |
  265|       |  // If this wasn't grown from the inline copy, deallocate the old space.
  266|     62|  if (!this->isSmall())
  ------------------
  |  Branch (266:7): [True: 0, False: 62]
  ------------------
  267|      0|    free(this->begin());
  268|       |
  269|     62|  this->BeginX = NewElts;
  270|     62|  this->Capacity = NewCapacity;
  271|     62|}
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE18uninitialized_moveIPS6_S9_EEvT_SA_T0_:
  206|     62|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  207|     62|    std::uninitialized_copy(std::make_move_iterator(I),
  208|     62|                            std::make_move_iterator(E), Dest);
  209|     62|  }
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEEaSEOS4_:
  775|    392|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|    392|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 392]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|    392|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 392]
  ------------------
  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|    392|  size_t RHSSize = RHS.size();
  793|    392|  size_t CurSize = this->size();
  794|    392|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 392]
  ------------------
  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|    392|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 392]
  ------------------
  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|    392|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 392]
  ------------------
  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|    392|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|    392|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|    392|  this->set_size(RHSSize);
  831|       |
  832|    392|  RHS.clear();
  833|    392|  return *this;
  834|    392|}
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEE5clearEv:
  356|    392|  void clear() {
  357|    392|    this->destroy_range(this->begin(), this->end());
  358|    392|    this->Size = 0;
  359|    392|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE18uninitialized_moveIPS3_S6_EEvT_S7_T0_:
  287|    392|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|    392|    uninitialized_copy(I, E, Dest);
  290|    392|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE18uninitialized_copyIS3_S3_EEvPT_S7_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSA_12remove_constIS6_E4typeES8_EE5valueEvE4typeE:
  306|    392|                                           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|    392|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 392, False: 0]
  ------------------
  312|    392|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    392|  }
_ZN4llvh15SmallVectorImplIcE5clearEv:
  356|  2.55M|  void clear() {
  357|  2.55M|    this->destroy_range(this->begin(), this->end());
  358|  2.55M|    this->Size = 0;
  359|  2.55M|  }
_ZN4llvh15SmallVectorImplIcE6appendIPKcvEEvT_S5_:
  404|  22.8M|  void append(in_iter in_start, in_iter in_end) {
  405|  22.8M|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  22.8M|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 74.6k, False: 22.7M]
  ------------------
  408|  74.6k|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  22.8M|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  22.8M|    this->set_size(this->size() + NumInputs);
  413|  22.8M|  }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE4growEm:
  317|  76.3k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIcvE8grow_podEmm:
  104|  76.3k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  76.3k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  76.3k|  }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE18uninitialized_copyIKccEEvPT_S5_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS8_12remove_constIS4_E4typeES6_EE5valueEvE4typeE:
  306|  22.8M|                                           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|  22.8M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 22.7M, False: 100k]
  ------------------
  312|  22.7M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  22.8M|  }
_ZN4llvh15SmallVectorImplIcE6appendIPcvEEvT_S4_:
  404|  25.1k|  void append(in_iter in_start, in_iter in_end) {
  405|  25.1k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  25.1k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 1, False: 25.1k]
  ------------------
  408|      1|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  25.1k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  25.1k|    this->set_size(this->size() + NumInputs);
  413|  25.1k|  }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE18uninitialized_copyIccEEvPT_S4_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS7_12remove_constIS3_E4typeES5_EE5valueEvE4typeE:
  306|  25.1k|                                           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|  25.1k|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 25.1k, False: 0]
  ------------------
  312|  25.1k|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  25.1k|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE10getFirstElEv:
   93|  21.7M|  void *getFirstEl() const {
   94|  21.7M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  21.7M|        reinterpret_cast<const char *>(this) +
   96|  21.7M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  21.7M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE7isSmallEv:
  110|  11.8M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIjvE5beginEv:
  135|  88.2M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplIjE6appendIPKjvEEvT_S5_:
  404|  1.87M|  void append(in_iter in_start, in_iter in_end) {
  405|  1.87M|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  1.87M|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 13.2k, False: 1.86M]
  ------------------
  408|  13.2k|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  1.87M|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  1.87M|    this->set_size(this->size() + NumInputs);
  413|  1.87M|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE4growEm:
  317|  15.6k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIjvE8grow_podEmm:
  104|  15.6k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  15.6k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  15.6k|  }
_ZN4llvh25SmallVectorTemplateCommonIjvE3endEv:
  139|  56.4M|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE18uninitialized_copyIKjjEEvPT_S5_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS8_12remove_constIS4_E4typeES6_EE5valueEvE4typeE:
  306|  1.87M|                                           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.87M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 1.87M, False: 0]
  ------------------
  312|  1.87M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  1.87M|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE13destroy_rangeEPjS2_:
  282|  16.2M|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIjE5clearEv:
  356|  6.37M|  void clear() {
  357|  6.37M|    this->destroy_range(this->begin(), this->end());
  358|  6.37M|    this->Size = 0;
  359|  6.37M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE5beginEv:
  137|  25.8M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIjvE3endEv:
  141|  1.32M|  const_iterator end() const { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE10getFirstElEv:
   93|  5.87M|  void *getFirstEl() const {
   94|  5.87M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  5.87M|        reinterpret_cast<const char *>(this) +
   96|  5.87M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  5.87M|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE7isSmallEv:
  110|  3.29M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE5beginEv:
  135|  27.6M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE13destroy_rangeEPS3_S5_:
  282|  3.35M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE3endEv:
  139|  19.9M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEE6resizeEm:
  361|    247|  void resize(size_type N) {
  362|    247|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 0, False: 247]
  ------------------
  363|      0|      this->destroy_range(this->begin()+N, this->end());
  364|      0|      this->set_size(N);
  365|    247|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 247, False: 0]
  ------------------
  366|    247|      if (this->capacity() < N)
  ------------------
  |  Branch (366:11): [True: 0, False: 247]
  ------------------
  367|      0|        this->grow(N);
  368|    901|      for (auto I = this->end(), E = this->begin() + N; I != E; ++I)
  ------------------
  |  Branch (368:57): [True: 654, False: 247]
  ------------------
  369|    654|        new (&*I) T();
  370|    247|      this->set_size(N);
  371|    247|    }
  372|    247|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELb0EE13destroy_rangeEPS8_SA_:
  196|    247|  static void destroy_range(T *S, T *E) {
  197|    901|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 654, False: 247]
  ------------------
  198|    654|      --E;
  199|    654|      E->~T();
  200|    654|    }
  201|    247|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE5beginEv:
  135|  2.13k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE3endEv:
  139|    494|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE7isSmallEv:
  110|    247|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE10getFirstElEv:
   93|    494|  void *getFirstEl() const {
   94|    494|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    494|        reinterpret_cast<const char *>(this) +
   96|    494|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    494|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvEixEm:
  160|  1.14k|  reference operator[](size_type idx) {
  161|  1.14k|    assert(idx < size());
  162|  1.14k|    return begin()[idx];
  163|  1.14k|  }
_ZN4llvh23SmallVectorTemplateBaseINS_11SmallStringILj24EEELb0EE13destroy_rangeEPS2_S4_:
  196|    405|  static void destroy_range(T *S, T *E) {
  197|    405|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 0, False: 405]
  ------------------
  198|      0|      --E;
  199|      0|      E->~T();
  200|      0|    }
  201|    405|  }
_ZN4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE5beginEv:
  135|    972|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE3endEv:
  139|    486|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE7isSmallEv:
  110|    324|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE10getFirstElEv:
   93|    567|  void *getFirstEl() const {
   94|    567|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    567|        reinterpret_cast<const char *>(this) +
   96|    567|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    567|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE10getFirstElEv:
   93|  31.3M|  void *getFirstEl() const {
   94|  31.3M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  31.3M|        reinterpret_cast<const char *>(this) +
   96|  31.3M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  31.3M|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE7isSmallEv:
  110|  15.4M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE13destroy_rangeEPS3_S5_:
  282|  15.4M|  static void destroy_range(T *, T *) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE5beginEv:
  137|  9.08k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE3endEv:
  141|  4.54k|  const_iterator end() const { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE5beginEv:
  135|   106M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE3endEv:
  139|  60.3M|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE10getFirstElEv:
   93|   207k|  void *getFirstEl() const {
   94|   207k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   207k|        reinterpret_cast<const char *>(this) +
   96|   207k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   207k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE5beginEv:
  135|   621k|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE10getFirstElEv:
   93|   413k|  void *getFirstEl() const {
   94|   413k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   413k|        reinterpret_cast<const char *>(this) +
   96|   413k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   413k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE7isSmallEv:
  110|   206k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE5beginEv:
  135|   930k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ScopeDescELb1EE13destroy_rangeEPS3_S5_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE3endEv:
  139|   414k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8VariableELb1EE13destroy_rangeEPS3_S5_:
  282|   206k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE3endEv:
  139|   517k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes9ScopeDescEE12emplace_backIJRS3_EEEvDpOT_:
  662|   103k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|   103k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 40, False: 103k]
  |  |  ------------------
  ------------------
  664|     40|      this->grow();
  665|   103k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|   103k|    this->set_size(this->size() + 1);
  667|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ScopeDescELb1EE4growEm:
  317|     87|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE8grow_podEmm:
  104|     87|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     87|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     87|  }
_ZN4llvh15SmallVectorImplIPN6hermes8VariableEE12emplace_backIJRS3_EEEvDpOT_:
  662|   103k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|   103k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|   103k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|   103k|    this->set_size(this->size() + 1);
  667|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE10getFirstElEv:
   93|  21.9M|  void *getFirstEl() const {
   94|  21.9M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  21.9M|        reinterpret_cast<const char *>(this) +
   96|  21.9M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  21.9M|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE7isSmallEv:
  110|  10.3M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE5beginEv:
  135|   117M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE13destroy_rangeEPS6_S8_:
  282|  10.3M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE3endEv:
  139|  26.4M|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE5beginEv:
  135|   723k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE3endEv:
  139|   413k|  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|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE5beginEv:
  135|  1.77M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE3endEv:
  139|  1.57M|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE9push_backERKS3_:
  320|  29.9M|  void push_back(const T &Elt) {
  321|  29.9M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  29.9M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 350k, False: 29.6M]
  |  |  ------------------
  ------------------
  322|   350k|      this->grow();
  323|  29.9M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  29.9M|    this->set_size(this->size() + 1);
  325|  29.9M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE4growEm:
  317|   350k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE8grow_podEmm:
  104|   350k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|   350k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|   350k|  }
_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EEaSEOS4_:
  909|    196|  const SmallVector &operator=(SmallVector &&RHS) {
  910|    196|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|    196|    return *this;
  912|    196|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvEixEm:
  160|  51.3M|  reference operator[](size_type idx) {
  161|  51.3M|    assert(idx < size());
  162|  51.3M|    return begin()[idx];
  163|  51.3M|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE9push_backERKDs:
  320|  15.8M|  void push_back(const T &Elt) {
  321|  15.8M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  15.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 578, False: 15.8M]
  |  |  ------------------
  ------------------
  322|    578|      this->grow();
  323|  15.8M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  15.8M|    this->set_size(this->size() + 1);
  325|  15.8M|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE4growEm:
  317|    701|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIDsvE8grow_podEmm:
  104|    701|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    701|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    701|  }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE10getFirstElEv:
   93|  2.15M|  void *getFirstEl() const {
   94|  2.15M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  2.15M|        reinterpret_cast<const char *>(this) +
   96|  2.15M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  2.15M|  }
_ZN4llvh25SmallVectorTemplateCommonIDsvE3endEv:
  139|  17.6M|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIDsvE5beginEv:
  135|  19.0M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh11SmallVectorIDsLj32EED2Ev:
  861|  1.07M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  1.07M|    this->destroy_range(this->begin(), this->end());
  864|  1.07M|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE13destroy_rangeEPDsS2_:
  282|  1.07M|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIDsED2Ev:
  349|  1.07M|  ~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.07M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 205, False: 1.07M]
  ------------------
  353|    205|      free(this->begin());
  354|  1.07M|  }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE7isSmallEv:
  110|  1.07M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIDsLj32EEC2IPKhvEET_S5_:
  875|    160|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|    160|    this->append(S, E);
  877|    160|  }
_ZN4llvh15SmallVectorImplIDsEC2Ej:
  344|  1.07M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EEC2Em:
  279|  1.07M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIDsvEC2Em:
  102|  1.07M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIDsE6appendIPKhvEEvT_S5_:
  404|  86.6k|  void append(in_iter in_start, in_iter in_end) {
  405|  86.6k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  86.6k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 15, False: 86.6k]
  ------------------
  408|     15|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  86.6k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  86.6k|    this->set_size(this->size() + NumInputs);
  413|  86.6k|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIPKhPDsEEvT_S6_T0_:
  295|  86.6k|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|  86.6k|    std::uninitialized_copy(I, E, Dest);
  298|  86.6k|  }
_ZN4llvh15SmallVectorImplIDsE6appendIN6hermes2vm10StringView14const_iteratorEvEEvT_S7_:
  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|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIN6hermes2vm10StringView14const_iteratorEPDsEEvT_S8_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|  }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE4dataEv:
  157|   749k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE5beginEv:
  137|   749k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE5beginEv:
  135|  18.3k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE3endEv:
  139|  11.7k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEE6insertEPS2_RKS2_:
  518|  1.03k|  iterator insert(iterator I, const T &Elt) {
  519|  1.03k|    if (I == this->end()) {  // Important special case for empty vector.
  ------------------
  |  Branch (519:9): [True: 511, False: 519]
  ------------------
  520|    511|      this->push_back(Elt);
  521|    511|      return this->end()-1;
  522|    511|    }
  523|       |
  524|    519|    assert(I >= this->begin() && "Insertion iterator is out of bounds.");
  525|    519|    assert(I <= this->end() && "Inserting past the end of the vector.");
  526|       |
  527|    519|    if (this->size() >= this->capacity()) {
  ------------------
  |  Branch (527:9): [True: 96, False: 423]
  ------------------
  528|     96|      size_t EltNo = I-this->begin();
  529|     96|      this->grow();
  530|     96|      I = this->begin()+EltNo;
  531|     96|    }
  532|    519|    ::new ((void*) this->end()) T(std::move(this->back()));
  533|       |    // Push everything else over.
  534|    519|    std::move_backward(I, this->end()-1, this->end());
  535|    519|    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|    519|    const T *EltPtr = &Elt;
  540|    519|    if (I <= EltPtr && EltPtr < this->end())
  ------------------
  |  Branch (540:9): [True: 519, False: 0]
  |  Branch (540:24): [True: 0, False: 519]
  ------------------
  541|      0|      ++EltPtr;
  542|       |
  543|    519|    *I = *EltPtr;
  544|    519|    return I;
  545|    519|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE9push_backERKS2_:
  320|    511|  void push_back(const T &Elt) {
  321|    511|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|    511|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 509]
  |  |  ------------------
  ------------------
  322|      2|      this->grow();
  323|    511|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|    511|    this->set_size(this->size() + 1);
  325|    511|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE4growEm:
  317|    168|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE8grow_podEmm:
  104|    168|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    168|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    168|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE10getFirstElEv:
   93|  3.69k|  void *getFirstEl() const {
   94|  3.69k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  3.69k|        reinterpret_cast<const char *>(this) +
   96|  3.69k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  3.69k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE4backEv:
  179|    519|  reference back() {
  180|    519|    assert(!empty());
  181|    519|    return end()[-1];
  182|    519|  }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEE5eraseEPKS2_S5_:
  470|    920|  iterator erase(const_iterator CS, const_iterator CE) {
  471|       |    // Just cast away constness because this is a non-const member function.
  472|    920|    iterator S = const_cast<iterator>(CS);
  473|    920|    iterator E = const_cast<iterator>(CE);
  474|       |
  475|    920|    assert(S >= this->begin() && "Range to erase is out of bounds.");
  476|    920|    assert(S <= E && "Trying to erase invalid range.");
  477|    920|    assert(E <= this->end() && "Trying to erase past the end.");
  478|       |
  479|    920|    iterator N = S;
  480|       |    // Shift all elts down.
  481|    920|    iterator I = std::move(E, this->end(), S);
  482|       |    // Drop the last elts.
  483|    920|    this->destroy_range(I, this->end());
  484|    920|    this->set_size(I - this->begin());
  485|    920|    return(N);
  486|    920|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE13destroy_rangeEPS2_S4_:
  282|  2.75k|  static void destroy_range(T *, T *) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE4dataEv:
  157|  3.51k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE5beginEv:
  137|  3.98k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE3endEv:
  141|    231|  const_iterator end() const { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE9push_backERKc:
  320|  35.3M|  void push_back(const T &Elt) {
  321|  35.3M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  35.3M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.21k, False: 35.3M]
  |  |  ------------------
  ------------------
  322|  1.21k|      this->grow();
  323|  35.3M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  35.3M|    this->set_size(this->size() + 1);
  325|  35.3M|  }
_ZNK4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE10getFirstElEv:
   93|   190k|  void *getFirstEl() const {
   94|   190k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   190k|        reinterpret_cast<const char *>(this) +
   96|   190k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   190k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE7isSmallEv:
  110|  95.4k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEE6assignESt16initializer_listISA_E:
  450|    264|  void assign(std::initializer_list<T> IL) {
  451|    264|    clear();
  452|    264|    append(IL);
  453|    264|  }
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEE5clearEv:
  356|    264|  void clear() {
  357|    264|    this->destroy_range(this->begin(), this->end());
  358|    264|    this->Size = 0;
  359|    264|  }
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EE13destroy_rangeEPSA_SC_:
  282|  95.7k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEE6appendESt16initializer_listISA_E:
  426|    264|  void append(std::initializer_list<T> IL) {
  427|    264|    append(IL.begin(), IL.end());
  428|    264|  }
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEE6appendIPKSA_vEEvT_SF_:
  404|    264|  void append(in_iter in_start, in_iter in_end) {
  405|    264|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    264|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 264]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    264|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    264|    this->set_size(this->size() + NumInputs);
  413|    264|  }
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EE4growEm:
  317|      4|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE8grow_podEmm:
  104|      4|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|      4|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|      4|  }
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EE18uninitialized_copyIKSA_SA_EEvPT_SF_PT0_PNS1_9enable_ifIXsr3std7is_sameINS1_12remove_constISE_E4typeESG_EE5valueEvE4typeE:
  306|    264|                                           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|    264|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 264, False: 0]
  ------------------
  312|    264|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    264|  }
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEE7reserveEm:
  386|      4|  void reserve(size_type N) {
  387|      4|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 4, False: 0]
  ------------------
  388|      4|      this->grow(N);
  389|      4|  }
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EE9push_backERKSA_:
  320|  61.4k|  void push_back(const T &Elt) {
  321|  61.4k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  61.4k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 61.4k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|  61.4k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  61.4k|    this->set_size(this->size() + 1);
  325|  61.4k|  }
_ZN4llvh15SmallVectorImplIjEaSEOS1_:
  775|  1.95M|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|  1.95M|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 1.95M]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|  1.95M|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 18.8k, False: 1.93M]
  ------------------
  781|  18.8k|    this->destroy_range(this->begin(), this->end());
  782|  18.8k|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 18.8k]
  ------------------
  783|  18.8k|    this->BeginX = RHS.BeginX;
  784|  18.8k|    this->Size = RHS.Size;
  785|  18.8k|    this->Capacity = RHS.Capacity;
  786|  18.8k|    RHS.resetToSmall();
  787|  18.8k|    return *this;
  788|  18.8k|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|  1.93M|  size_t RHSSize = RHS.size();
  793|  1.93M|  size_t CurSize = this->size();
  794|  1.93M|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 1.93M]
  ------------------
  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.93M|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 1.93M]
  ------------------
  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.93M|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 1.93M]
  ------------------
  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.93M|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|  1.93M|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|  1.93M|  this->set_size(RHSSize);
  831|       |
  832|  1.93M|  RHS.clear();
  833|  1.93M|  return *this;
  834|  1.93M|}
_ZN4llvh25SmallVectorTemplateCommonIjvE12resetToSmallEv:
  113|  18.8k|  void resetToSmall() {
  114|  18.8k|    BeginX = getFirstEl();
  115|  18.8k|    Size = Capacity = 0; // FIXME: Setting Capacity to 0 is suspect.
  116|  18.8k|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE18uninitialized_moveIPjS3_EEvT_S4_T0_:
  287|  1.93M|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|  1.93M|    uninitialized_copy(I, E, Dest);
  290|  1.93M|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE18uninitialized_copyIjjEEvPT_S4_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS7_12remove_constIS3_E4typeES5_EE5valueEvE4typeE:
  306|  1.93M|                                           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.93M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 1.93M, False: 0]
  ------------------
  312|  1.93M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  1.93M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE5frontEv:
  174|  8.69M|  const_reference front() const {
  175|  8.69M|    assert(!empty());
  176|  8.69M|    return begin()[0];
  177|  8.69M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE4dataEv:
  157|  14.4M|  const_pointer data() const { return const_pointer(begin()); }
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE5beginEv:
  135|   444k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE3endEv:
  139|   252k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj2EEC2Ev:
  859|  12.7M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes11InstructionEEC2Ej:
  344|  15.4M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EEC2Em:
  279|  15.4M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvEC2Em:
  102|  15.4M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes9ScopeDescELj8EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes9ScopeDescEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ScopeDescELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes8VariableELj8EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes8VariableEEC2Ej:
  344|   206k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8VariableELb1EEC2Em:
  279|   206k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvEC2Em:
  102|   206k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIjED2Ev:
  349|  9.86M|  ~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.86M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 10.1k, False: 9.85M]
  ------------------
  353|  10.1k|      free(this->begin());
  354|  9.86M|  }
_ZN4llvh15SmallVectorImplIjEC2Ej:
  344|  9.86M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIjLb1EEC2Em:
  279|  9.86M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIjvEC2Em:
  102|  9.86M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes2vm17PinnedHermesValueELj4EED2Ev:
  861|  3.99M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  3.99M|    this->destroy_range(this->begin(), this->end());
  864|  3.99M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE9push_backERKS4_:
  320|  3.08k|  void push_back(const T &Elt) {
  321|  3.08k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  3.08k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 320, False: 2.76k]
  |  |  ------------------
  ------------------
  322|    320|      this->grow();
  323|  3.08k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  3.08k|    this->set_size(this->size() + 1);
  325|  3.08k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE4backEv:
  179|  3.08k|  reference back() {
  180|  3.08k|    assert(!empty());
  181|  3.08k|    return end()[-1];
  182|  3.08k|  }
_ZN4llvh11SmallVectorIDsLj16EEC2Ev:
  859|    121|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj16EED2Ev:
  861|    121|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    121|    this->destroy_range(this->begin(), this->end());
  864|    121|  }
_ZN4llvh11SmallVectorINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELj4EEC2Ev:
  859|   192k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEEC2Ej:
  344|   192k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELb1EEC2Em:
  279|   192k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvEC2Em:
  102|   192k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE10getFirstElEv:
   93|   391k|  void *getFirstEl() const {
   94|   391k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   391k|        reinterpret_cast<const char *>(this) +
   96|   391k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   391k|  }
_ZN4llvh11SmallVectorINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELj4EED2Ev:
  861|   192k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   192k|    this->destroy_range(this->begin(), this->end());
  864|   192k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELb1EE13destroy_rangeEPS7_S9_:
  282|   192k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE5beginEv:
  135|   857k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE3endEv:
  139|   466k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEED2Ev:
  349|   192k|  ~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|   192k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 5.68k, False: 187k]
  ------------------
  353|  5.68k|      free(this->begin());
  354|   192k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE7isSmallEv:
  110|   192k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEE7reserveEm:
  386|   192k|  void reserve(size_type N) {
  387|   192k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 5.68k, False: 187k]
  ------------------
  388|  5.68k|      this->grow(N);
  389|   192k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELb1EE4growEm:
  317|  5.68k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE8grow_podEmm:
  104|  5.68k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  5.68k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  5.68k|  }
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEE12emplace_backIJRKNS4_10GCSymbolIDERS6_EEEvDpOT_:
  662|  80.7k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|  80.7k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  80.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 80.7k]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|  80.7k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|  80.7k|    this->set_size(this->size() + 1);
  667|  80.7k|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE6rbeginEv:
  144|   192k|  reverse_iterator rbegin()            { return reverse_iterator(end()); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE4rendEv:
  146|   192k|  reverse_iterator rend()              { return reverse_iterator(begin()); }
_ZN4llvh11SmallVectorIDsLj32EEC2Ev:
  859|  1.07M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZNK4llvh25SmallVectorTemplateCommonIDsvE3endEv:
  141|      2|  const_iterator end() const { return begin() + size(); }
_ZN4llvh15SmallVectorImplIDsE6appendIPKDsvEEvT_S5_:
  404|    366|  void append(in_iter in_start, in_iter in_end) {
  405|    366|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    366|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 74, False: 292]
  ------------------
  408|     74|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    366|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    366|    this->set_size(this->size() + NumInputs);
  413|    366|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIKDsDsEEvPT_S5_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS8_12remove_constIS4_E4typeES6_EE5valueEvE4typeE:
  306|    366|                                           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|    366|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 366, False: 0]
  ------------------
  312|    366|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    366|  }
_ZN4llvh11SmallVectorIjLj16EEC2Ev:
  859|     45|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIjLj16EED2Ev:
  861|     45|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     45|    this->destroy_range(this->begin(), this->end());
  864|     45|  }
_ZN4llvh11SmallVectorIjLj4EEC2Ev:
  859|     31|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIdLj4EEC2Ev:
  859|     15|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIdEC2Ej:
  344|     15|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIdLb1EEC2Em:
  279|     15|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIdvEC2Em:
  102|     15|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIdvE10getFirstElEv:
   93|     30|  void *getFirstEl() const {
   94|     30|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|     30|        reinterpret_cast<const char *>(this) +
   96|     30|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|     30|  }
_ZNK4llvh25SmallVectorTemplateCommonIdvE5beginEv:
  137|    225|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIdvE3endEv:
  141|    150|  const_iterator end() const { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIdvE3endEv:
  139|    210|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIdvE5beginEv:
  135|    225|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIdLb1EE9push_backERKd:
  320|     60|  void push_back(const T &Elt) {
  321|     60|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     60|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 60]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|     60|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|     60|    this->set_size(this->size() + 1);
  325|     60|  }
_ZN4llvh25SmallVectorTemplateCommonIdvE4backEv:
  179|     60|  reference back() {
  180|     60|    assert(!empty());
  181|     60|    return end()[-1];
  182|     60|  }
_ZN4llvh23SmallVectorTemplateBaseIdLb1EE8pop_backEv:
  327|     60|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE8pop_backEv:
  327|  5.79M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIdLj4EED2Ev:
  861|     15|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     15|    this->destroy_range(this->begin(), this->end());
  864|     15|  }
_ZN4llvh23SmallVectorTemplateBaseIdLb1EE13destroy_rangeEPdS2_:
  282|     15|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIdED2Ev:
  349|     15|  ~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|     15|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 15]
  ------------------
  353|      0|      free(this->begin());
  354|     15|  }
_ZNK4llvh25SmallVectorTemplateCommonIdvE7isSmallEv:
  110|     15|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIjLj4EED2Ev:
  861|     31|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     31|    this->destroy_range(this->begin(), this->end());
  864|     31|  }
_ZN4llvh11SmallVectorIjLj8EEC2Ev:
  859|     45|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIjLj8EED2Ev:
  861|     45|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     45|    this->destroy_range(this->begin(), this->end());
  864|     45|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE9push_backERKj:
  320|  24.8M|  void push_back(const T &Elt) {
  321|  24.8M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  24.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2.43k, False: 24.8M]
  |  |  ------------------
  ------------------
  322|  2.43k|      this->grow();
  323|  24.8M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  24.8M|    this->set_size(this->size() + 1);
  325|  24.8M|  }
_ZN4llvh11SmallVectorIDsLj5EED2Ev:
  861|      9|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      9|    this->destroy_range(this->begin(), this->end());
  864|      9|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE7isSmallEv:
  110|    160|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE10getFirstElEv:
   93|    320|  void *getFirstEl() const {
   94|    320|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    320|        reinterpret_cast<const char *>(this) +
   96|    320|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    320|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EE13destroy_rangeEPS5_S7_:
  282|    160|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE5beginEv:
  135|    320|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE3endEv:
  139|    160|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEEC2Ej:
  344|    160|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EEC2Em:
  279|    160|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvEC2Em:
  102|    160|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIDsEaSEOS1_:
  775|      6|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|      6|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 6]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|      6|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 6]
  ------------------
  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|      6|  size_t RHSSize = RHS.size();
  793|      6|  size_t CurSize = this->size();
  794|      6|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 6]
  ------------------
  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|      6|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 6]
  ------------------
  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|      6|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 6]
  ------------------
  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|      6|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|      6|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|      6|  this->set_size(RHSSize);
  831|       |
  832|      6|  RHS.clear();
  833|      6|  return *this;
  834|      6|}
_ZN4llvh15SmallVectorImplIDsE5clearEv:
  356|      6|  void clear() {
  357|      6|    this->destroy_range(this->begin(), this->end());
  358|      6|    this->Size = 0;
  359|      6|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_moveIPDsS3_EEvT_S4_T0_:
  287|      6|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|      6|    uninitialized_copy(I, E, Dest);
  290|      6|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIDsDsEEvPT_S4_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS7_12remove_constIS3_E4typeES5_EE5valueEvE4typeE:
  306|      6|                                           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|      6|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 6, False: 0]
  ------------------
  312|      6|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|      6|  }
_ZN4llvh11SmallVectorIDsLj6EEC2Ev:
  859|    121|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj6EED2Ev:
  861|    121|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    121|    this->destroy_range(this->begin(), this->end());
  864|    121|  }
_ZN4llvh11SmallVectorIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELj1EEC2Ev:
  859|  95.1k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEEC2Ej:
  344|  95.4k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EEC2Em:
  279|  95.4k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvEC2Em:
  102|  95.4k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIjLj5EEC2Ev:
  859|  95.4k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIjLj5EEC2EOS1_:
  899|  1.95M|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|  1.95M|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 1.95M, False: 0]
  ------------------
  901|  1.95M|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|  1.95M|  }
_ZN4llvh11SmallVectorIjLj5EED2Ev:
  861|  2.99M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.99M|    this->destroy_range(this->begin(), this->end());
  864|  2.99M|  }
_ZN4llvh11SmallVectorIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELj1EED2Ev:
  861|  95.4k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  95.4k|    this->destroy_range(this->begin(), this->end());
  864|  95.4k|  }
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEED2Ev:
  349|  95.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|  95.4k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 4, False: 95.4k]
  ------------------
  353|      4|      free(this->begin());
  354|  95.4k|  }
_ZN4llvh11SmallVectorIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELj4EEC2Ev:
  859|    160|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELj4EED2Ev:
  861|    160|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    160|    this->destroy_range(this->begin(), this->end());
  864|    160|  }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEED2Ev:
  349|    160|  ~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|    160|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 160]
  ------------------
  353|      0|      free(this->begin());
  354|    160|  }
_ZN4llvh15SmallVectorImplIDsE7reserveEm:
  386|   390k|  void reserve(size_type N) {
  387|   390k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 34, False: 390k]
  ------------------
  388|     34|      this->grow(N);
  389|   390k|  }
_ZN4llvh11SmallVectorIcLj32EEC2EmRKc:
  867|   355k|    : SmallVectorImpl<T>(N) {
  868|   355k|    this->assign(Size, Value);
  869|   355k|  }
_ZN4llvh15SmallVectorImplIcEC2Ej:
  344|  21.1M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIcLb1EEC2Em:
  279|  21.1M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIcvEC2Em:
  102|  21.1M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIcE6assignEmRKc:
  433|   355k|  void assign(size_type NumElts, const T &Elt) {
  434|   355k|    clear();
  435|   355k|    if (this->capacity() < NumElts)
  ------------------
  |  Branch (435:9): [True: 83, False: 355k]
  ------------------
  436|     83|      this->grow(NumElts);
  437|   355k|    this->set_size(NumElts);
  438|   355k|    std::uninitialized_fill(this->begin(), this->end(), Elt);
  439|   355k|  }
_ZN4llvh25SmallVectorTemplateCommonIcvEixEm:
  160|  21.8M|  reference operator[](size_type idx) {
  161|  21.8M|    assert(idx < size());
  162|  21.8M|    return begin()[idx];
  163|  21.8M|  }
_ZN4llvh11SmallVectorIcLj32EED2Ev:
  861|   509k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   509k|    this->destroy_range(this->begin(), this->end());
  864|   509k|  }
_ZN4llvh15SmallVectorImplIcED2Ev:
  349|  21.1M|  ~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|  21.1M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 75.2k, False: 21.0M]
  ------------------
  353|  75.2k|      free(this->begin());
  354|  21.1M|  }
_ZN4llvh11SmallVectorIcLj32EEC2Ev:
  859|   146k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh25SmallVectorTemplateCommonIcvE4backEv:
  179|  43.4k|  reference back() {
  180|  43.4k|    assert(!empty());
  181|  43.4k|    return end()[-1];
  182|  43.4k|  }
_ZN4llvh11SmallVectorIDsLj64EEC2Ev:
  859|    138|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj64EED2Ev:
  861|    138|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    138|    this->destroy_range(this->begin(), this->end());
  864|    138|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE10getFirstElEv:
   93|   620k|  void *getFirstEl() const {
   94|   620k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   620k|        reinterpret_cast<const char *>(this) +
   96|   620k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   620k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE7isSmallEv:
  110|   310k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE5beginEv:
  135|  1.55M|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE10getFirstElEv:
   93|   206k|  void *getFirstEl() const {
   94|   206k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   206k|        reinterpret_cast<const char *>(this) +
   96|   206k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   206k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE5beginEv:
  135|   413k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3sem12FunctionInfo7VarDeclELb1EE13destroy_rangeEPS4_S6_:
  282|   310k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE3endEv:
  139|   826k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EE13destroy_rangeEPS4_S6_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE5beginEv:
  135|   625k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE3endEv:
  139|   314k|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE10getFirstElEv:
   93|   207k|  void *getFirstEl() const {
   94|   207k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   207k|        reinterpret_cast<const char *>(this) +
   96|   207k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   207k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree21ImportDeclarationNodeELb1EE13destroy_rangeEPS4_S6_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE3endEv:
  139|   206k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPvLj0EEC2Ev:
  859|    160|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPvEC2Ej:
  344|    160|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EEC2Em:
  279|    160|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPvvEC2Em:
  102|    160|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPvvE10getFirstElEv:
   93|    640|  void *getFirstEl() const {
   94|    640|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    640|        reinterpret_cast<const char *>(this) +
   96|    640|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    640|  }
_ZN4llvh11SmallVectorIPvLj0EED2Ev:
  861|    160|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    160|    this->destroy_range(this->begin(), this->end());
  864|    160|  }
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EE13destroy_rangeEPS1_S3_:
  282|    160|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPvvE5beginEv:
  135|    960|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPvvE3endEv:
  139|    640|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPvED2Ev:
  349|    160|  ~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|    160|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 160, False: 0]
  ------------------
  353|    160|      free(this->begin());
  354|    160|  }
_ZNK4llvh25SmallVectorTemplateCommonIPvvE7isSmallEv:
  110|    160|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EE9push_backERKS1_:
  320|    480|  void push_back(const T &Elt) {
  321|    480|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|    480|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 320, False: 160]
  |  |  ------------------
  ------------------
  322|    320|      this->grow();
  323|    480|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|    480|    this->set_size(this->size() + 1);
  325|    480|  }
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EE4growEm:
  317|    320|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPvvE8grow_podEmm:
  104|    320|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    320|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    320|  }
_ZN4llvh15SmallVectorImplIDsE6appendIPKcvEEvT_S5_:
  404|   684k|  void append(in_iter in_start, in_iter in_end) {
  405|   684k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|   684k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 684k]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|   684k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|   684k|    this->set_size(this->size() + NumInputs);
  413|   684k|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIPKcPDsEEvT_S6_T0_:
  295|   684k|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|   684k|    std::uninitialized_copy(I, E, Dest);
  298|   684k|  }
_ZN4llvh25SmallVectorTemplateCommonIDsvE4dataEv:
  155|   325k|  pointer data() { return pointer(begin()); }
_ZN4llvh11SmallVectorIcLj32EEC2IPKcvEET_S5_:
  875|  7.20k|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|  7.20k|    this->append(S, E);
  877|  7.20k|  }
_ZN4llvh15SmallVectorImplIcE7reserveEm:
  386|  43.4k|  void reserve(size_type N) {
  387|  43.4k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 372, False: 43.0k]
  ------------------
  388|    372|      this->grow(N);
  389|  43.4k|  }
_ZN4llvh11SmallVectorIcLj7EEC2Ev:
  859|      2|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj7EED2Ev:
  861|      2|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      2|    this->destroy_range(this->begin(), this->end());
  864|      2|  }
_ZN4llvh11SmallVectorIcLj16EEC2Ev:
  859|  20.6M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj16EED2Ev:
  861|  20.6M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  20.6M|    this->destroy_range(this->begin(), this->end());
  864|  20.6M|  }
_ZN4llvh11SmallVectorIDsLj4EED2Ev:
  861|     87|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     87|    this->destroy_range(this->begin(), this->end());
  864|     87|  }
_ZN4llvh11SmallVectorIDsLj4EEC2Ev:
  859|     87|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE5beginEv:
  137|    104|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorIPN6hermes8FunctionELj8EEC2Ev:
  859|    196|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes8FunctionEEC2Ej:
  344|    196|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EEC2Em:
  279|    196|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvEC2Em:
  102|    196|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE10getFirstElEv:
   93|    439|  void *getFirstEl() const {
   94|    439|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    439|        reinterpret_cast<const char *>(this) +
   96|    439|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    439|  }
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj8EEC2Ev:
  859|    101|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes7LiteralEEC2Ej:
  344|    297|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EEC2Em:
  279|    297|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvEC2Em:
  102|    297|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE10getFirstElEv:
   93|  1.09k|  void *getFirstEl() const {
   94|  1.09k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  1.09k|        reinterpret_cast<const char *>(this) +
   96|  1.09k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  1.09k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EE9push_backERKS3_:
  320|  1.25M|  void push_back(const T &Elt) {
  321|  1.25M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.25M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 502, False: 1.25M]
  |  |  ------------------
  ------------------
  322|    502|      this->grow();
  323|  1.25M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  1.25M|    this->set_size(this->size() + 1);
  325|  1.25M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EE4growEm:
  317|    502|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE8grow_podEmm:
  104|    502|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    502|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    502|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE3endEv:
  139|  1.25M|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE5beginEv:
  135|  1.25M|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE4dataEv:
  157|    101|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE5beginEv:
  137|    101|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj8EED2Ev:
  861|    101|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    101|    this->destroy_range(this->begin(), this->end());
  864|    101|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EE13destroy_rangeEPS3_S5_:
  282|    297|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes7LiteralEED2Ev:
  349|    297|  ~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|    297|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 128, False: 169]
  ------------------
  353|    128|      free(this->begin());
  354|    297|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE7isSmallEv:
  110|    297|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj32EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIN6hermes8IntervalELj32EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes8IntervalEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EEC2Em:
  194|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE10getFirstElEv:
   93|   208k|  void *getFirstEl() const {
   94|   208k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   208k|        reinterpret_cast<const char *>(this) +
   96|   208k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   208k|  }
_ZN4llvh11SmallVectorIN6hermes8IntervalELj32EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE13destroy_rangeEPS2_S4_:
  196|   105k|  static void destroy_range(T *S, T *E) {
  197|  7.29M|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 7.19M, False: 105k]
  ------------------
  198|  7.19M|      --E;
  199|  7.19M|      E->~T();
  200|  7.19M|    }
  201|   105k|  }
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EED2Ev:
  861|  12.9M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  12.9M|    this->destroy_range(this->begin(), this->end());
  864|  12.9M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE13destroy_rangeEPS2_S4_:
  282|  15.8M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE5beginEv:
  135|  57.0M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE3endEv:
  139|  28.5M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEED2Ev:
  349|  12.9M|  ~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|  12.9M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 16, False: 12.9M]
  ------------------
  353|     16|      free(this->begin());
  354|  12.9M|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE7isSmallEv:
  110|  15.8M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE10getFirstElEv:
   93|  28.8M|  void *getFirstEl() const {
   94|  28.8M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  28.8M|        reinterpret_cast<const char *>(this) +
   96|  28.8M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  28.8M|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE5beginEv:
  135|   208M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE3endEv:
  139|  3.00M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes8IntervalEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 350, False: 102k]
  ------------------
  353|    350|      free(this->begin());
  354|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE7isSmallEv:
  110|   105k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj32EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh15SmallVectorImplIPN6hermes11InstructionEED2Ev:
  349|  15.4M|  ~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|  15.4M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 313k, False: 15.1M]
  ------------------
  353|   313k|      free(this->begin());
  354|  15.4M|  }
_ZN4llvh11SmallVectorIN6hermes3hbc7HBCISel10RelocationELj8EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes3hbc7HBCISel10RelocationEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE10getFirstElEv:
   93|   209k|  void *getFirstEl() const {
   94|   209k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   209k|        reinterpret_cast<const char *>(this) +
   96|   209k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   209k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EED2Ev:
  861|   697k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   697k|    this->destroy_range(this->begin(), this->end());
  864|   697k|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEED2Ev:
  349|  2.44M|  ~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.44M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 37.4k, False: 2.40M]
  ------------------
  353|  37.4k|      free(this->begin());
  354|  2.44M|  }
_ZN4llvh11SmallVectorIN6hermes3hbc7HBCISel10RelocationELj8EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EE13destroy_rangeEPS4_S6_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE5beginEv:
  135|  5.91M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE3endEv:
  139|  5.49M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes3hbc7HBCISel10RelocationEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 414, False: 102k]
  ------------------
  353|    414|      free(this->begin());
  354|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes9ScopeDescELj8EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh15SmallVectorImplIPN6hermes9ScopeDescEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 12, False: 103k]
  ------------------
  353|     12|      free(this->begin());
  354|   103k|  }
_ZN4llvh11SmallVectorIPN6hermes8FunctionELj8EED2Ev:
  861|    196|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    196|    this->destroy_range(this->begin(), this->end());
  864|    196|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EE13destroy_rangeEPS3_S5_:
  282|    196|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE5beginEv:
  135|   103k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE3endEv:
  139|   103k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes8FunctionEED2Ev:
  349|    196|  ~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|    196|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 8, False: 188]
  ------------------
  353|      8|      free(this->begin());
  354|    196|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE7isSmallEv:
  110|    196|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj16EEC2INSt3__116reverse_iteratorINS6_11__wrap_iterIPS3_EEEEvEET_SC_:
  875|   310k|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|   310k|    this->append(S, E);
  877|   310k|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEEC2Ej:
  344|  2.44M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EEC2Em:
  279|  2.44M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvEC2Em:
  102|  2.44M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendINSt3__116reverse_iteratorINS6_11__wrap_iterIPS3_EEEEvEEvT_SC_:
  404|   310k|  void append(in_iter in_start, in_iter in_end) {
  405|   310k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|   310k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 1.00k, False: 309k]
  ------------------
  408|  1.00k|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|   310k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|   310k|    this->set_size(this->size() + NumInputs);
  413|   310k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE4growEm:
  317|   130k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE8grow_podEmm:
  104|   130k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|   130k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|   130k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyINSt3__116reverse_iteratorINS6_11__wrap_iterIPS3_EEEES9_EEvT_SC_T0_:
  295|   310k|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|   310k|    std::uninitialized_copy(I, E, Dest);
  298|   310k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj16EED2Ev:
  861|   310k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   310k|    this->destroy_range(this->begin(), this->end());
  864|   310k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE4dataEv:
  157|   206k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE5beginEv:
  137|   296k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE5clearEv:
  356|   850k|  void clear() {
  357|   850k|    this->destroy_range(this->begin(), this->end());
  358|   850k|    this->Size = 0;
  359|   850k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE5beginEv:
  137|  1.16G|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE3endEv:
  141|   387M|  const_iterator end() const { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE9push_backERKS2_:
  320|  2.89M|  void push_back(const T &Elt) {
  321|  2.89M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.89M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 16, False: 2.89M]
  |  |  ------------------
  ------------------
  322|     16|      this->grow();
  323|  2.89M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  2.89M|    this->set_size(this->size() + 1);
  325|  2.89M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE4growEm:
  317|     16|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE8grow_podEmm:
  104|     16|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     16|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     16|  }
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEEaSEOS3_:
  775|  2.89M|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|  2.89M|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 2.89M]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|  2.89M|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 2.89M]
  ------------------
  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.89M|  size_t RHSSize = RHS.size();
  793|  2.89M|  size_t CurSize = this->size();
  794|  2.89M|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 2.89M]
  ------------------
  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.89M|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 2.89M]
  ------------------
  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.89M|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 2.89M]
  ------------------
  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.89M|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|  2.89M|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|  2.89M|  this->set_size(RHSSize);
  831|       |
  832|  2.89M|  RHS.clear();
  833|  2.89M|  return *this;
  834|  2.89M|}
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEE5clearEv:
  356|  2.89M|  void clear() {
  357|  2.89M|    this->destroy_range(this->begin(), this->end());
  358|  2.89M|    this->Size = 0;
  359|  2.89M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE18uninitialized_moveIPS2_S5_EEvT_S6_T0_:
  287|  2.89M|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|  2.89M|    uninitialized_copy(I, E, Dest);
  290|  2.89M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE18uninitialized_copyIS2_S2_EEvPT_S6_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS9_12remove_constIS5_E4typeES7_EE5valueEvE4typeE:
  306|  2.89M|                                           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.89M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 2.89M, False: 0]
  ------------------
  312|  2.89M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  2.89M|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvEixEm:
  165|   387M|  const_reference operator[](size_type idx) const {
  166|   387M|    assert(idx < size());
  167|   387M|    return begin()[idx];
  168|   387M|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEC2Ev:
  859|   110k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEaSEOS4_:
  909|  40.6k|  const SmallVector &operator=(SmallVector &&RHS) {
  910|  40.6k|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|  40.6k|    return *this;
  912|  40.6k|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEEaSEOS4_:
  775|   850k|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|   850k|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 850k]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|   850k|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 850k]
  ------------------
  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|   850k|  size_t RHSSize = RHS.size();
  793|   850k|  size_t CurSize = this->size();
  794|   850k|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 40.6k, False: 810k]
  ------------------
  795|       |    // Assign common elements.
  796|  40.6k|    iterator NewEnd = this->begin();
  797|  40.6k|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 40.6k]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|  40.6k|    this->destroy_range(NewEnd, this->end());
  802|  40.6k|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|  40.6k|    RHS.clear();
  806|       |
  807|  40.6k|    return *this;
  808|  40.6k|  }
  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|   810k|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 810k]
  ------------------
  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|   810k|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 810k]
  ------------------
  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|   810k|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|   810k|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|   810k|  this->set_size(RHSSize);
  831|       |
  832|   810k|  RHS.clear();
  833|   810k|  return *this;
  834|   850k|}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_moveIPS3_S6_EEvT_S7_T0_:
  287|   810k|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|   810k|    uninitialized_copy(I, E, Dest);
  290|   810k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyIS3_S3_EEvPT_S7_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSA_12remove_constIS6_E4typeES8_EE5valueEvE4typeE:
  306|   810k|                                           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|   810k|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 810k, False: 0]
  ------------------
  312|   810k|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|   810k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EE9push_backERKS4_:
  320|  5.07M|  void push_back(const T &Elt) {
  321|  5.07M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  5.07M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2.68k, False: 5.07M]
  |  |  ------------------
  ------------------
  322|  2.68k|      this->grow();
  323|  5.07M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  5.07M|    this->set_size(this->size() + 1);
  325|  5.07M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EE4growEm:
  317|  2.68k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE8grow_podEmm:
  104|  2.68k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  2.68k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  2.68k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEC2EOS4_:
  899|  53.0k|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|  53.0k|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 0, False: 53.0k]
  ------------------
  901|      0|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|  53.0k|  }
_ZN4llvh11SmallVectorIN6hermes20ExceptionHandlerInfoELj4EED2Ev:
  861|     18|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     18|    this->destroy_range(this->begin(), this->end());
  864|     18|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EE13destroy_rangeEPS2_S4_:
  282|     18|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIN6hermes20ExceptionHandlerInfoEED2Ev:
  349|     18|  ~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|     18|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 14, False: 4]
  ------------------
  353|     14|      free(this->begin());
  354|     18|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE7isSmallEv:
  110|     18|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE10getFirstElEv:
   93|    161|  void *getFirstEl() const {
   94|    161|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    161|        reinterpret_cast<const char *>(this) +
   96|    161|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    161|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE5beginEv:
  135|  38.6k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE3endEv:
  139|  38.5k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE5frontEv:
  170|   103k|  reference front() {
  171|   103k|    assert(!empty());
  172|   103k|    return begin()[0];
  173|   103k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvEixEm:
  160|  1.37M|  reference operator[](size_type idx) {
  161|  1.37M|    assert(idx < size());
  162|  1.37M|    return begin()[idx];
  163|  1.37M|  }
_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EEC2Ev:
  859|    392|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEEC2Ej:
  344|    588|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EEC2Em:
  279|    588|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvEC2Em:
  102|    588|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EE9push_backERKS3_:
  320|   103k|  void push_back(const T &Elt) {
  321|   103k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 47, False: 103k]
  |  |  ------------------
  ------------------
  322|     47|      this->grow();
  323|   103k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   103k|    this->set_size(this->size() + 1);
  325|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EE4growEm:
  317|     47|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE8grow_podEmm:
  104|     47|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     47|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     47|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ScopeDescELb1EE9push_backERKS3_:
  320|   103k|  void push_back(const T &Elt) {
  321|   103k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 47, False: 103k]
  |  |  ------------------
  ------------------
  322|     47|      this->grow();
  323|   103k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   103k|    this->set_size(this->size() + 1);
  325|   103k|  }
_ZN4llvh11SmallVectorIN6hermes10IdentifierELj4EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes10IdentifierEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes10IdentifierELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes10IdentifierEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes10IdentifierEvE10getFirstElEv:
   93|   206k|  void *getFirstEl() const {
   94|   206k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   206k|        reinterpret_cast<const char *>(this) +
   96|   206k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   206k|  }
_ZN4llvh11SmallVectorIN6hermes10IdentifierELj4EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes10IdentifierELb1EE13destroy_rangeEPS2_S4_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes10IdentifierEvE5beginEv:
  135|   309k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes10IdentifierEvE3endEv:
  139|   206k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes10IdentifierEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 103k]
  ------------------
  353|      0|      free(this->begin());
  354|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes10IdentifierEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE5beginEv:
  137|   415k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE3endEv:
  141|   207k|  const_iterator end() const { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes10IdentifierELb1EE9push_backERKS2_:
  320|   103k|  void push_back(const T &Elt) {
  321|   103k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|   103k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   103k|    this->set_size(this->size() + 1);
  325|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes10IdentifierEvE4dataEv:
  157|   103k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes10IdentifierEvE5beginEv:
  137|   103k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE4dataEv:
  157|    392|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE5beginEv:
  137|    392|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EEC2EOS4_:
  899|    196|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|    196|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 196, False: 0]
  ------------------
  901|    196|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|    196|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE9push_backERKS3_:
  320|    196|  void push_back(const T &Elt) {
  321|    196|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|    196|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 196]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|    196|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|    196|    this->set_size(this->size() + 1);
  325|    196|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree21ImportDeclarationNodeELj2EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree21ImportDeclarationNodeEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 103k]
  ------------------
  353|      0|      free(this->begin());
  354|   103k|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj2EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree23FunctionDeclarationNodeEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 114, False: 103k]
  ------------------
  353|    114|      free(this->begin());
  354|   103k|  }
_ZN4llvh11SmallVectorIN6hermes3sem12FunctionInfo7VarDeclELj4EED2Ev:
  861|   310k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   310k|    this->destroy_range(this->begin(), this->end());
  864|   310k|  }
_ZN4llvh15SmallVectorImplIN6hermes3sem12FunctionInfo7VarDeclEED2Ev:
  349|   310k|  ~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|   310k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 310k]
  ------------------
  353|      0|      free(this->begin());
  354|   310k|  }
_ZN4llvh11SmallVectorINSt3__110unique_ptrIvPDoFvPvEEELj0EEC2Ev:
  859|    821|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIvPDoFvPvEEEEC2Ej:
  344|    821|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EEC2Em:
  194|    821|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvEC2Em:
  102|    821|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELj4EED2Ev:
  861|    247|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    247|    this->destroy_range(this->begin(), this->end());
  864|    247|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EED2Ev:
  861|    243|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    243|    this->destroy_range(this->begin(), this->end());
  864|    243|  }
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEED2Ev:
  349|    243|  ~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|    243|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 243]
  ------------------
  353|      0|      free(this->begin());
  354|    243|  }
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEED2Ev:
  349|    247|  ~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|    247|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 247]
  ------------------
  353|      0|      free(this->begin());
  354|    247|  }
_ZN4llvh11SmallVectorINSt3__110unique_ptrIvPDoFvPvEEELj0EED2Ev:
  861|    821|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    821|    this->destroy_range(this->begin(), this->end());
  864|    821|  }
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIvPDoFvPvEEEED2Ev:
  349|    821|  ~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|    821|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 62, False: 759]
  ------------------
  353|     62|      free(this->begin());
  354|    821|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvEixEm:
  165|    104|  const_reference operator[](size_type idx) const {
  166|    104|    assert(idx < size());
  167|    104|    return begin()[idx];
  168|    104|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE4backEv:
  179|   103k|  reference back() {
  180|   103k|    assert(!empty());
  181|   103k|    return end()[-1];
  182|   103k|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj16EEC2Ev:
  859|     13|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj16EED2Ev:
  861|     13|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     13|    this->destroy_range(this->begin(), this->end());
  864|     13|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj8EEC2Ev:
  859|  1.05M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj8EED2Ev:
  861|  1.05M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  1.05M|    this->destroy_range(this->begin(), this->end());
  864|  1.05M|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj1EED2Ev:
  861|     26|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     26|    this->destroy_range(this->begin(), this->end());
  864|     26|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj4EEC2Ev:
  859|  1.61M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj4EED2Ev:
  861|  1.61M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  1.61M|    this->destroy_range(this->begin(), this->end());
  864|  1.61M|  }
_ZN4llvh15SmallVectorImplIPN6hermes11InstructionEE5clearEv:
  356|     13|  void clear() {
  357|     13|    this->destroy_range(this->begin(), this->end());
  358|     13|    this->Size = 0;
  359|     13|  }
_ZN4llvh11SmallVectorIPN6hermes21HBCReifyArgumentsInstELj4EEC2Ev:
  859|     13|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes21HBCReifyArgumentsInstEEC2Ej:
  344|     13|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes21HBCReifyArgumentsInstELb1EEC2Em:
  279|     13|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvEC2Em:
  102|     13|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE10getFirstElEv:
   93|     26|  void *getFirstEl() const {
   94|     26|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|     26|        reinterpret_cast<const char *>(this) +
   96|     26|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|     26|  }
_ZN4llvh11SmallVectorIPN6hermes21HBCReifyArgumentsInstELj4EED2Ev:
  861|     13|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     13|    this->destroy_range(this->begin(), this->end());
  864|     13|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes21HBCReifyArgumentsInstELb1EE13destroy_rangeEPS3_S5_:
  282|     13|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes21HBCReifyArgumentsInstEED2Ev:
  349|     13|  ~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|     13|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 13]
  ------------------
  353|      0|      free(this->begin());
  354|     13|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE7isSmallEv:
  110|     13|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE5beginEv:
  135|    387|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE3endEv:
  139|    200|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes21HBCReifyArgumentsInstELb1EE9push_backERKS3_:
  320|     13|  void push_back(const T &Elt) {
  321|     13|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     13|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|     13|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|     13|    this->set_size(this->size() + 1);
  325|     13|  }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj8EEC2Ev:
  859|  54.6k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes5ValueEEC2Ej:
  344|   188k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EEC2Em:
  279|   188k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvEC2Em:
  102|   188k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE10getFirstElEv:
   93|   381k|  void *getFirstEl() const {
   94|   381k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   381k|        reinterpret_cast<const char *>(this) +
   96|   381k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   381k|  }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj8EED2Ev:
  861|  54.6k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  54.6k|    this->destroy_range(this->begin(), this->end());
  864|  54.6k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE13destroy_rangeEPS3_S5_:
  282|   189k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes5ValueEED2Ev:
  349|   188k|  ~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|   188k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 2.88k, False: 186k]
  ------------------
  353|  2.88k|      free(this->begin());
  354|   188k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE7isSmallEv:
  110|   188k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE9push_backERKS3_:
  320|  1.38M|  void push_back(const T &Elt) {
  321|  1.38M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.38M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 3.47k, False: 1.38M]
  |  |  ------------------
  ------------------
  322|  3.47k|      this->grow();
  323|  1.38M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  1.38M|    this->set_size(this->size() + 1);
  325|  1.38M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE4growEm:
  317|  3.50k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE8grow_podEmm:
  104|  3.50k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  3.50k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  3.50k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE4dataEv:
  157|   159k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE5beginEv:
  137|   167k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELj2EEC2Ev:
  859|     32|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEEC2Ej:
  344|     32|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELb1EEC2Em:
  279|     32|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvEC2Em:
  102|     32|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE10getFirstElEv:
   93|     64|  void *getFirstEl() const {
   94|     64|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|     64|        reinterpret_cast<const char *>(this) +
   96|     64|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|     64|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELj2EED2Ev:
  861|     32|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     32|    this->destroy_range(this->begin(), this->end());
  864|     32|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELb1EE13destroy_rangeEPS7_S9_:
  282|  5.22M|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEED2Ev:
  349|     32|  ~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|     32|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 32]
  ------------------
  353|      0|      free(this->begin());
  354|     32|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE7isSmallEv:
  110|     32|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEE5clearEv:
  356|  5.22M|  void clear() {
  357|  5.22M|    this->destroy_range(this->begin(), this->end());
  358|  5.22M|    this->Size = 0;
  359|  5.22M|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELb1EE9push_backERKS7_:
  320|  1.66M|  void push_back(const T &Elt) {
  321|  1.66M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.66M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.66M]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|  1.66M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  1.66M|    this->set_size(this->size() + 1);
  325|  1.66M|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE5beginEv:
  135|  15.3M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE3endEv:
  139|  8.50M|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes10SwitchInstELj4EEC2Ev:
  859|   206k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes10SwitchInstEEC2Ej:
  344|   206k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10SwitchInstELb1EEC2Em:
  279|   206k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvEC2Em:
  102|   206k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE10getFirstElEv:
   93|   413k|  void *getFirstEl() const {
   94|   413k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   413k|        reinterpret_cast<const char *>(this) +
   96|   413k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   413k|  }
_ZN4llvh11SmallVectorIPN6hermes10SwitchInstELj4EED2Ev:
  861|   206k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   206k|    this->destroy_range(this->begin(), this->end());
  864|   206k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10SwitchInstELb1EE13destroy_rangeEPS3_S5_:
  282|   206k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes10SwitchInstEED2Ev:
  349|   206k|  ~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|   206k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 206k]
  ------------------
  353|      0|      free(this->begin());
  354|   206k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE7isSmallEv:
  110|   206k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE5beginEv:
  135|   826k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE3endEv:
  139|   413k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE9push_backERKS3_:
  320|  12.5M|  void push_back(const T &Elt) {
  321|  12.5M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  12.5M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 111k, False: 12.4M]
  |  |  ------------------
  ------------------
  322|   111k|      this->grow();
  323|  12.5M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  12.5M|    this->set_size(this->size() + 1);
  325|  12.5M|  }
_ZN4llvh11SmallVectorIjLj32EED2Ev:
  861|  6.86M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  6.86M|    this->destroy_range(this->begin(), this->end());
  864|  6.86M|  }
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EEC2Ev:
  859|  5.79M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEEC2Ej:
  344|  12.9M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EEC2Em:
  279|  12.9M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvEC2Em:
  102|  12.9M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EEaSEOS3_:
  909|  2.89M|  const SmallVector &operator=(SmallVector &&RHS) {
  910|  2.89M|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|  2.89M|    return *this;
  912|  2.89M|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj2EED2Ev:
  861|  12.7M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  12.7M|    this->destroy_range(this->begin(), this->end());
  864|  12.7M|  }
_ZN4llvh11SmallVectorIPN6hermes7PhiInstELj8EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes7PhiInstEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE10getFirstElEv:
   93|   206k|  void *getFirstEl() const {
   94|   206k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   206k|        reinterpret_cast<const char *>(this) +
   96|   206k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   206k|  }
_ZN4llvh11SmallVectorIPN6hermes7PhiInstELj8EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EE13destroy_rangeEPS3_S5_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes7PhiInstEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 18, False: 103k]
  ------------------
  353|     18|      free(this->begin());
  354|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EE9push_backERKS3_:
  320|  4.39k|  void push_back(const T &Elt) {
  321|  4.39k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  4.39k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 81, False: 4.31k]
  |  |  ------------------
  ------------------
  322|     81|      this->grow();
  323|  4.39k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  4.39k|    this->set_size(this->size() + 1);
  325|  4.39k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EE4growEm:
  317|     81|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE8grow_podEmm:
  104|     81|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     81|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     81|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE5beginEv:
  135|   624k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE3endEv:
  139|   314k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj2EEC2ERKS4_:
  889|     82|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|     82|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 82, False: 0]
  ------------------
  891|     82|      SmallVectorImpl<T>::operator=(RHS);
  892|     82|  }
_ZN4llvh15SmallVectorImplIPN6hermes11InstructionEEaSERKS4_:
  727|     82|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|     82|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 82]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|     82|  size_t RHSSize = RHS.size();
  734|     82|  size_t CurSize = this->size();
  735|     82|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 82]
  ------------------
  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|     82|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 0, False: 82]
  ------------------
  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|     82|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 82]
  ------------------
  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|     82|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|     82|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|     82|  this->set_size(RHSSize);
  771|     82|  return *this;
  772|     82|}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE18uninitialized_copyIKS3_S3_EEvPT_S8_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSB_12remove_constIS7_E4typeES9_EE5valueEvE4typeE:
  306|     82|                                           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|     82|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 82, False: 0]
  ------------------
  312|     82|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|     82|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvEixEm:
  160|   205M|  reference operator[](size_type idx) {
  161|   205M|    assert(idx < size());
  162|   205M|    return begin()[idx];
  163|   205M|  }
_ZN4llvh11SmallVectorIN6hermes8RegisterELj8EEC2Ev:
  859|   102k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes8RegisterEEC2Ej:
  344|   102k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EEC2Em:
  279|   102k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvEC2Em:
  102|   102k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE10getFirstElEv:
   93|   205k|  void *getFirstEl() const {
   94|   205k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   205k|        reinterpret_cast<const char *>(this) +
   96|   205k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   205k|  }
_ZN4llvh11SmallVectorIN6hermes8RegisterELj8EED2Ev:
  861|   102k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   102k|    this->destroy_range(this->begin(), this->end());
  864|   102k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EE13destroy_rangeEPS2_S4_:
  282|   102k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE5beginEv:
  135|  3.01M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE3endEv:
  139|  2.91M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes8RegisterEED2Ev:
  349|   102k|  ~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|   102k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 1, False: 102k]
  ------------------
  353|      1|      free(this->begin());
  354|   102k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE7isSmallEv:
  110|   102k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EE9push_backERKS2_:
  320|  1.45M|  void push_back(const T &Elt) {
  321|  1.45M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.45M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 1.45M]
  |  |  ------------------
  ------------------
  322|      1|      this->grow();
  323|  1.45M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  1.45M|    this->set_size(this->size() + 1);
  325|  1.45M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EE4growEm:
  317|      1|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE8grow_podEmm:
  104|      1|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|      1|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|      1|  }
_ZN4llvh15SmallVectorImplIN6hermes8RegisterEE12pop_back_valEv:
  391|  1.35M|  LLVM_NODISCARD T pop_back_val() {
  392|  1.35M|    T Result = ::std::move(this->back());
  393|  1.35M|    this->pop_back();
  394|  1.35M|    return Result;
  395|  1.35M|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE4backEv:
  179|  1.35M|  reference back() {
  180|  1.35M|    assert(!empty());
  181|  1.35M|    return end()[-1];
  182|  1.35M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EE8pop_backEv:
  327|  1.35M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIjLj32EEC2Ev:
  859|  6.86M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvEixEm:
  160|  27.4M|  reference operator[](size_type idx) {
  161|  27.4M|    assert(idx < size());
  162|  27.4M|    return begin()[idx];
  163|  27.4M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE9push_backEOS2_:
  231|  2.89M|  void push_back(T &&Elt) {
  232|  2.89M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.89M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.93k, False: 2.89M]
  |  |  ------------------
  ------------------
  233|  1.93k|      this->grow();
  234|  2.89M|    ::new ((void*) this->end()) T(::std::move(Elt));
  235|  2.89M|    this->set_size(this->size() + 1);
  236|  2.89M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE4growEm:
  246|  1.93k|void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
  247|       |  // Always grow, even from zero.
  248|  1.93k|  constexpr size_t MinGrowth = 2;
  249|  1.93k|  size_t NewCapacity = size_t(NextPowerOf2(this->capacity() + MinGrowth));
  250|  1.93k|  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|  1.93k|  if (NewCapacity <= this->capacity() ||
  ------------------
  |  Branch (253:7): [True: 0, False: 1.93k]
  ------------------
  254|  1.93k|      NewCapacity < MinSize ||
  ------------------
  |  Branch (254:7): [True: 0, False: 1.93k]
  ------------------
  255|  1.93k|      NewCapacity > size_t(-1) / sizeof(T))
  ------------------
  |  Branch (255:7): [True: 0, False: 1.93k]
  ------------------
  256|      0|    report_bad_alloc_error("SmallVector capacity overflow during allocation");
  257|  1.93k|  T *NewElts = static_cast<T*>(llvh::safe_malloc(NewCapacity*sizeof(T)));
  258|       |
  259|       |  // Move the elements over.
  260|  1.93k|  this->uninitialized_move(this->begin(), this->end(), NewElts);
  261|       |
  262|       |  // Destroy the original elements.
  263|  1.93k|  destroy_range(this->begin(), this->end());
  264|       |
  265|       |  // If this wasn't grown from the inline copy, deallocate the old space.
  266|  1.93k|  if (!this->isSmall())
  ------------------
  |  Branch (266:7): [True: 1.58k, False: 350]
  ------------------
  267|  1.58k|    free(this->begin());
  268|       |
  269|  1.93k|  this->BeginX = NewElts;
  270|  1.93k|  this->Capacity = NewCapacity;
  271|  1.93k|}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE18uninitialized_moveIPS2_S5_EEvT_S6_T0_:
  206|  1.93k|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  207|  1.93k|    std::uninitialized_copy(std::make_move_iterator(I),
  208|  1.93k|                            std::make_move_iterator(E), Dest);
  209|  1.93k|  }
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EEC2EOS3_:
  899|  7.19M|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|  7.19M|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 0, False: 7.19M]
  ------------------
  901|      0|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|  7.19M|  }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj4EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes5ValueELj4EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj4EEC2Ev:
  859|  40.6k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE4backEv:
  179|  1.32M|  reference back() {
  180|  1.32M|    assert(!empty());
  181|  1.32M|    return end()[-1];
  182|  1.32M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE8pop_backEv:
  327|  1.21M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj4EED2Ev:
  861|  40.6k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  40.6k|    this->destroy_range(this->begin(), this->end());
  864|  40.6k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEC2ERKS4_:
  889|  40.6k|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|  40.6k|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 40.6k, False: 0]
  ------------------
  891|  40.6k|      SmallVectorImpl<T>::operator=(RHS);
  892|  40.6k|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEEaSERKS4_:
  727|  40.6k|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|  40.6k|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 40.6k]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|  40.6k|  size_t RHSSize = RHS.size();
  734|  40.6k|  size_t CurSize = this->size();
  735|  40.6k|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 40.6k]
  ------------------
  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.6k|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 18.2k, False: 22.3k]
  ------------------
  755|       |    // Destroy current elements.
  756|  18.2k|    this->destroy_range(this->begin(), this->end());
  757|  18.2k|    this->set_size(0);
  758|  18.2k|    CurSize = 0;
  759|  18.2k|    this->grow(RHSSize);
  760|  22.3k|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 22.3k]
  ------------------
  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.6k|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|  40.6k|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|  40.6k|  this->set_size(RHSSize);
  771|  40.6k|  return *this;
  772|  40.6k|}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyIKS3_S3_EEvPT_S8_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSB_12remove_constIS7_E4typeES9_EE5valueEvE4typeE:
  306|  40.6k|                                           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.6k|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 40.6k, False: 0]
  ------------------
  312|  40.6k|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  40.6k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE3endEv:
  141|  40.6k|  const_iterator end() const { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE12pop_back_valEv:
  391|  1.09M|  LLVM_NODISCARD T pop_back_val() {
  392|  1.09M|    T Result = ::std::move(this->back());
  393|  1.09M|    this->pop_back();
  394|  1.09M|    return Result;
  395|  1.09M|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE5beginEv:
  135|  1.24M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE3endEv:
  139|   644k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EE9push_backERKS3_:
  320|  40.6k|  void push_back(const T &Elt) {
  321|  40.6k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  40.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 52, False: 40.5k]
  |  |  ------------------
  ------------------
  322|     52|      this->grow();
  323|  40.6k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  40.6k|    this->set_size(this->size() + 1);
  325|  40.6k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EE4growEm:
  317|     52|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE8grow_podEmm:
  104|     52|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     52|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     52|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE10getFirstElEv:
   93|     88|  void *getFirstEl() const {
   94|     88|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|     88|        reinterpret_cast<const char *>(this) +
   96|     88|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|     88|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EE8pop_backEv:
  327|  40.6k|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIPN6hermes9CatchInstELj4EEC2Ev:
  859|     18|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes9CatchInstEEC2Ej:
  344|     18|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EEC2Em:
  279|     18|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvEC2Em:
  102|     18|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes9CatchInstELj4EED2Ev:
  861|     18|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     18|    this->destroy_range(this->begin(), this->end());
  864|     18|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EE13destroy_rangeEPS3_S5_:
  282|     18|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes9CatchInstEED2Ev:
  349|     18|  ~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|     18|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 13, False: 5]
  ------------------
  353|     13|      free(this->begin());
  354|     18|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE7isSmallEv:
  110|     18|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes20ExceptionHandlerInfoELj4EEC2Ev:
  859|     18|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes20ExceptionHandlerInfoEEC2Ej:
  344|     18|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EEC2Em:
  279|     18|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvEC2Em:
  102|     18|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorINSt3__14pairIjjEELj4EEC2Ev:
  859|  41.3k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIjjEEEC2Ej:
  344|  41.3k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIjjEELb1EEC2Em:
  279|  41.3k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvEC2Em:
  102|  41.3k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE10getFirstElEv:
   93|   200k|  void *getFirstEl() const {
   94|   200k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   200k|        reinterpret_cast<const char *>(this) +
   96|   200k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   200k|  }
_ZN4llvh11SmallVectorINSt3__14pairIjjEELj4EED2Ev:
  861|  41.3k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  41.3k|    this->destroy_range(this->begin(), this->end());
  864|  41.3k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIjjEELb1EE13destroy_rangeEPS3_S5_:
  282|  61.6k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIjjEEED2Ev:
  349|  41.3k|  ~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|  41.3k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 18.2k, False: 23.1k]
  ------------------
  353|  18.2k|      free(this->begin());
  354|  41.3k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE7isSmallEv:
  110|  41.3k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIjjEELb1EE9push_backERKS3_:
  320|  7.35M|  void push_back(const T &Elt) {
  321|  7.35M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  7.35M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 117k, False: 7.23M]
  |  |  ------------------
  ------------------
  322|   117k|      this->grow();
  323|  7.35M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  7.35M|    this->set_size(this->size() + 1);
  325|  7.35M|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIjjEELb1EE4growEm:
  317|   117k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE8grow_podEmm:
  104|   117k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|   117k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|   117k|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE5beginEv:
  135|  22.4M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE3endEv:
  139|  7.53M|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvEixEm:
  160|  14.6M|  reference operator[](size_type idx) {
  161|  14.6M|    assert(idx < size());
  162|  14.6M|    return begin()[idx];
  163|  14.6M|  }
_ZN4llvh15SmallVectorImplINSt3__14pairIjjEEE6resizeEm:
  361|  40.6k|  void resize(size_type N) {
  362|  40.6k|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 20.3k, False: 20.3k]
  ------------------
  363|  20.3k|      this->destroy_range(this->begin()+N, this->end());
  364|  20.3k|      this->set_size(N);
  365|  20.3k|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 0, False: 20.3k]
  ------------------
  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|  40.6k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EE9push_backERKS2_:
  320|  38.5k|  void push_back(const T &Elt) {
  321|  38.5k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  38.5k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 125, False: 38.3k]
  |  |  ------------------
  ------------------
  322|    125|      this->grow();
  323|  38.5k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  38.5k|    this->set_size(this->size() + 1);
  325|  38.5k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EE4growEm:
  317|    125|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE8grow_podEmm:
  104|    125|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    125|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    125|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvEixEm:
  160|   246k|  reference operator[](size_type idx) {
  161|   246k|    assert(idx < size());
  162|   246k|    return begin()[idx];
  163|   246k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE5beginEv:
  135|   452k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh11SmallVectorIPN6hermes6ESTree22VariableDeclaratorNodeELj8EEC2Ev:
  859|    114|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree22VariableDeclaratorNodeEEC2Ej:
  344|    114|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EEC2Em:
  279|    114|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvEC2Em:
  102|    114|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE10getFirstElEv:
   93|    456|  void *getFirstEl() const {
   94|    456|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    456|        reinterpret_cast<const char *>(this) +
   96|    456|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    456|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj8EEC2Ev:
  859|    114|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree23FunctionDeclarationNodeEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj8EED2Ev:
  861|    114|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    114|    this->destroy_range(this->begin(), this->end());
  864|    114|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree22VariableDeclaratorNodeELj8EED2Ev:
  861|    114|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    114|    this->destroy_range(this->begin(), this->end());
  864|    114|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EE13destroy_rangeEPS4_S6_:
  282|    114|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree22VariableDeclaratorNodeEED2Ev:
  349|    114|  ~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|    114|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 114, False: 0]
  ------------------
  353|    114|      free(this->begin());
  354|    114|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE7isSmallEv:
  110|    114|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EE9push_backERKS4_:
  320|  2.73k|  void push_back(const T &Elt) {
  321|  2.73k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.73k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 228, False: 2.50k]
  |  |  ------------------
  ------------------
  322|    228|      this->grow();
  323|  2.73k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  2.73k|    this->set_size(this->size() + 1);
  325|  2.73k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EE4growEm:
  317|    228|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE8grow_podEmm:
  104|    228|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    228|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    228|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EE9push_backERKS4_:
  320|  3.87k|  void push_back(const T &Elt) {
  321|  3.87k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  3.87k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 228, False: 3.64k]
  |  |  ------------------
  ------------------
  322|    228|      this->grow();
  323|  3.87k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  3.87k|    this->set_size(this->size() + 1);
  325|  3.87k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EE4growEm:
  317|    228|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE8grow_podEmm:
  104|    228|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    228|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    228|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE5beginEv:
  135|  3.30k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE3endEv:
  139|  2.96k|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE3endEv:
  141|     28|  const_iterator end() const { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE18uninitialized_copyIKS3_S3_EEvPT_S8_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSB_12remove_constIS7_E4typeES9_EE5valueEvE4typeE:
  306|     28|                                           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|     28|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 28, False: 0]
  ------------------
  312|     28|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|     28|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6assignESt16initializer_listIS3_E:
  450|     13|  void assign(std::initializer_list<T> IL) {
  451|     13|    clear();
  452|     13|    append(IL);
  453|     13|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendESt16initializer_listIS3_E:
  426|     13|  void append(std::initializer_list<T> IL) {
  427|     13|    append(IL.begin(), IL.end());
  428|     13|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendIPKS3_vEEvT_S8_:
  404|     13|  void append(in_iter in_start, in_iter in_end) {
  405|     13|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|     13|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 13]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|     13|    this->uninitialized_copy(in_start, in_end, this->end());
  412|     13|    this->set_size(this->size() + NumInputs);
  413|     13|  }
_ZN4llvh11SmallVectorIN6hermes15SerializedScope11DeclarationELj16EEC2Ev:
  859|     81|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes15SerializedScope11DeclarationEEC2Ej:
  344|     81|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes15SerializedScope11DeclarationELb1EEC2Em:
  279|     81|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvEC2Em:
  102|     81|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE10getFirstElEv:
   93|    162|  void *getFirstEl() const {
   94|    162|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    162|        reinterpret_cast<const char *>(this) +
   96|    162|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    162|  }
_ZN4llvh11SmallVectorIN6hermes15SerializedScope11DeclarationELj16EED2Ev:
  861|     81|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     81|    this->destroy_range(this->begin(), this->end());
  864|     81|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes15SerializedScope11DeclarationELb1EE13destroy_rangeEPS3_S5_:
  282|     81|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE5beginEv:
  135|    162|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE3endEv:
  139|     81|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes15SerializedScope11DeclarationEED2Ev:
  349|     81|  ~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|     81|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 81]
  ------------------
  353|      0|      free(this->begin());
  354|     81|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE7isSmallEv:
  110|     81|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIcLj256EEC2Ev:
  859|  2.31k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj256EED2Ev:
  861|  2.31k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.31k|    this->destroy_range(this->begin(), this->end());
  864|  2.31k|  }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj4EEC2ERKS4_:
  889|    202|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|    202|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 28, False: 174]
  ------------------
  891|     28|      SmallVectorImpl<T>::operator=(RHS);
  892|    202|  }
_ZN4llvh15SmallVectorImplIPN6hermes5ValueEEaSERKS4_:
  727|     28|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|     28|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 28]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|     28|  size_t RHSSize = RHS.size();
  734|     28|  size_t CurSize = this->size();
  735|     28|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 28]
  ------------------
  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|     28|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 28, False: 0]
  ------------------
  755|       |    // Destroy current elements.
  756|     28|    this->destroy_range(this->begin(), this->end());
  757|     28|    this->set_size(0);
  758|     28|    CurSize = 0;
  759|     28|    this->grow(RHSSize);
  760|     28|  } 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|     28|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|     28|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|     28|  this->set_size(RHSSize);
  771|     28|  return *this;
  772|     28|}
_ZN4llvh11SmallVectorIPN6hermes5ValueELj2EEC2Ev:
  859|  30.7k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes5ValueELj2EED2Ev:
  861|  30.7k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  30.7k|    this->destroy_range(this->begin(), this->end());
  864|  30.7k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvEixEm:
  160|  2.82k|  reference operator[](size_type idx) {
  161|  2.82k|    assert(idx < size());
  162|  2.82k|    return begin()[idx];
  163|  2.82k|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree20BinaryExpressionNodeELj1EEC2Ev:
  859|  5.82k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree20BinaryExpressionNodeEEC2Ej:
  344|  5.82k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EEC2Em:
  279|  5.82k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvEC2Em:
  102|  5.82k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE10getFirstElEv:
   93|  12.6k|  void *getFirstEl() const {
   94|  12.6k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  12.6k|        reinterpret_cast<const char *>(this) +
   96|  12.6k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  12.6k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EE9push_backERKS4_:
  320|   648k|  void push_back(const T &Elt) {
  321|   648k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   648k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 963, False: 647k]
  |  |  ------------------
  ------------------
  322|    963|      this->grow();
  323|   648k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   648k|    this->set_size(this->size() + 1);
  325|   648k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EE4growEm:
  317|    963|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE8grow_podEmm:
  104|    963|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    963|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    963|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree20BinaryExpressionNodeELj1EED2Ev:
  861|  5.82k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  5.82k|    this->destroy_range(this->begin(), this->end());
  864|  5.82k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EE13destroy_rangeEPS4_S6_:
  282|  5.82k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree20BinaryExpressionNodeEED2Ev:
  349|  5.82k|  ~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.82k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 720, False: 5.10k]
  ------------------
  353|    720|      free(this->begin());
  354|  5.82k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE7isSmallEv:
  110|  5.82k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvEixEm:
  160|  8.73k|  reference operator[](size_type idx) {
  161|  8.73k|    assert(idx < size());
  162|  8.73k|    return begin()[idx];
  163|  8.73k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE5beginEv:
  135|   693k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE3endEv:
  139|   666k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes6ESTree24AssignmentExpressionNodeELj1EEC2Ev:
  859|  9.10k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree24AssignmentExpressionNodeEEC2Ej:
  344|  9.10k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EEC2Em:
  279|  9.10k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvEC2Em:
  102|  9.10k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE10getFirstElEv:
   93|  18.2k|  void *getFirstEl() const {
   94|  18.2k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  18.2k|        reinterpret_cast<const char *>(this) +
   96|  18.2k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  18.2k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EE9push_backERKS4_:
  320|  9.12k|  void push_back(const T &Elt) {
  321|  9.12k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  9.12k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 12, False: 9.11k]
  |  |  ------------------
  ------------------
  322|     12|      this->grow();
  323|  9.12k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  9.12k|    this->set_size(this->size() + 1);
  325|  9.12k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EE4growEm:
  317|     12|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE8grow_podEmm:
  104|     12|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     12|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     12|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree24AssignmentExpressionNodeELj1EED2Ev:
  861|  9.10k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  9.10k|    this->destroy_range(this->begin(), this->end());
  864|  9.10k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EE13destroy_rangeEPS4_S6_:
  282|  9.10k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree24AssignmentExpressionNodeEED2Ev:
  349|  9.10k|  ~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.10k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 10, False: 9.09k]
  ------------------
  353|     10|      free(this->begin());
  354|  9.10k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE7isSmallEv:
  110|  9.10k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes5irgen10LReferenceELj1EEC2Ev:
  859|  4.55k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5irgen10LReferenceEEC2Ej:
  344|  4.55k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EEC2Em:
  279|  4.55k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvEC2Em:
  102|  4.55k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE10getFirstElEv:
   93|  9.11k|  void *getFirstEl() const {
   94|  9.11k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  9.11k|        reinterpret_cast<const char *>(this) +
   96|  9.11k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  9.11k|  }
_ZN4llvh11SmallVectorIN6hermes5irgen10LReferenceELj1EED2Ev:
  861|  4.55k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  4.55k|    this->destroy_range(this->begin(), this->end());
  864|  4.55k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EE13destroy_rangeEPS3_S5_:
  282|  4.55k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE5beginEv:
  135|  18.2k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplIN6hermes5irgen10LReferenceEED2Ev:
  349|  4.55k|  ~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.55k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 5, False: 4.54k]
  ------------------
  353|      5|      free(this->begin());
  354|  4.55k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE7isSmallEv:
  110|  4.55k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplIN6hermes5irgen10LReferenceEE7reserveEm:
  386|  4.55k|  void reserve(size_type N) {
  387|  4.55k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 5, False: 4.54k]
  ------------------
  388|      5|      this->grow(N);
  389|  4.55k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EE4growEm:
  317|      5|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE8grow_podEmm:
  104|      5|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|      5|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|      5|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE5beginEv:
  135|  63.7k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE3endEv:
  139|  41.0k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EE9push_backERKS3_:
  320|  4.56k|  void push_back(const T &Elt) {
  321|  4.56k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  4.56k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.56k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|  4.56k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  4.56k|    this->set_size(this->size() + 1);
  325|  4.56k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE3endEv:
  139|  13.6k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE6rbeginEv:
  144|  4.55k|  reverse_iterator rbegin()            { return reverse_iterator(end()); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE4rendEv:
  146|  4.55k|  reverse_iterator rend()              { return reverse_iterator(begin()); }
_ZN4llvh11SmallVectorIN6hermes5irgen9GotoLabelELj2EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5irgen9GotoLabelEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen9GotoLabelELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE10getFirstElEv:
   93|   206k|  void *getFirstEl() const {
   94|   206k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   206k|        reinterpret_cast<const char *>(this) +
   96|   206k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   206k|  }
_ZN4llvh11SmallVectorIN6hermes5irgen9GotoLabelELj2EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen9GotoLabelELb1EE13destroy_rangeEPS3_S5_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE3endEv:
  139|   103k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes5irgen9GotoLabelEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 22, False: 103k]
  ------------------
  353|     22|      free(this->begin());
  354|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplIN6hermes5irgen9GotoLabelEE6resizeEm:
  361|   103k|  void resize(size_type N) {
  362|   103k|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 0, False: 103k]
  ------------------
  363|      0|      this->destroy_range(this->begin()+N, this->end());
  364|      0|      this->set_size(N);
  365|   103k|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 50, False: 103k]
  ------------------
  366|     50|      if (this->capacity() < N)
  ------------------
  |  Branch (366:11): [True: 22, False: 28]
  ------------------
  367|     22|        this->grow(N);
  368|   246k|      for (auto I = this->end(), E = this->begin() + N; I != E; ++I)
  ------------------
  |  Branch (368:57): [True: 246k, False: 50]
  ------------------
  369|   246k|        new (&*I) T();
  370|     50|      this->set_size(N);
  371|     50|    }
  372|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen9GotoLabelELb1EE4growEm:
  317|     22|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE8grow_podEmm:
  104|     22|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     22|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     22|  }
_ZN4llvh11SmallVectorIPN6hermes8VariableELj4EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes8VariableELj4EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh15SmallVectorImplIPN6hermes8VariableEED2Ev:
  349|   206k|  ~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|   206k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 206k]
  ------------------
  353|      0|      free(this->begin());
  354|   206k|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes5ValueEjEELj2EED2Ev:
  861|  10.3M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  10.3M|    this->destroy_range(this->begin(), this->end());
  864|  10.3M|  }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes5ValueEjEEED2Ev:
  349|  10.3M|  ~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|  10.3M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 1.18M, False: 9.17M]
  ------------------
  353|  1.18M|      free(this->begin());
  354|  10.3M|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes5ValueEjEELj2EEC2Ev:
  859|  10.3M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes5ValueEjEEEC2Ej:
  344|  10.3M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EEC2Em:
  279|  10.3M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvEC2Em:
  102|  10.3M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes8VariableELj8EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE4backEv:
  179|  11.0M|  reference back() {
  180|  11.0M|    assert(!empty());
  181|  11.0M|    return end()[-1];
  182|  11.0M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE8pop_backEv:
  327|  11.0M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvEixEm:
  160|  79.4M|  reference operator[](size_type idx) {
  161|  79.4M|    assert(idx < size());
  162|  79.4M|    return begin()[idx];
  163|  79.4M|  }
_ZN4llvh11SmallVectorIPN6hermes9ParameterELj8EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes9ParameterEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ParameterELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE10getFirstElEv:
   93|   206k|  void *getFirstEl() const {
   94|   206k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   206k|        reinterpret_cast<const char *>(this) +
   96|   206k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   206k|  }
_ZN4llvh11SmallVectorIPN6hermes9ParameterELj8EED2Ev:
  861|   103k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   103k|    this->destroy_range(this->begin(), this->end());
  864|   103k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ParameterELb1EE13destroy_rangeEPS3_S5_:
  282|   103k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes9ParameterEED2Ev:
  349|   103k|  ~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|   103k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 103k]
  ------------------
  353|      0|      free(this->begin());
  354|   103k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE7isSmallEv:
  110|   103k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE9push_backERKS6_:
  320|  15.8M|  void push_back(const T &Elt) {
  321|  15.8M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  15.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.19M, False: 14.6M]
  |  |  ------------------
  ------------------
  322|  1.19M|      this->grow();
  323|  15.8M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  15.8M|    this->set_size(this->size() + 1);
  325|  15.8M|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE4growEm:
  317|  1.19M|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE8grow_podEmm:
  104|  1.19M|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  1.19M|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  1.19M|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvEixEm:
  165|  76.5M|  const_reference operator[](size_type idx) const {
  166|  76.5M|    assert(idx < size());
  167|  76.5M|    return begin()[idx];
  168|  76.5M|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE5beginEv:
  137|  76.5M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes5ValueEjEEE5eraseEPKS6_:
  455|   128k|  iterator erase(const_iterator CI) {
  456|       |    // Just cast away constness because this is a non-const member function.
  457|   128k|    iterator I = const_cast<iterator>(CI);
  458|       |
  459|   128k|    assert(I >= this->begin() && "Iterator to erase is out of bounds.");
  460|   128k|    assert(I < this->end() && "Erasing at past-the-end iterator.");
  461|       |
  462|   128k|    iterator N = I;
  463|       |    // Shift all elts down one.
  464|   128k|    std::move(I+1, this->end(), I);
  465|       |    // Drop the last elt.
  466|   128k|    this->pop_back();
  467|   128k|    return(N);
  468|   128k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE8pop_backEv:
  327|   128k|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ParameterELb1EE9push_backERKS3_:
  320|   103k|  void push_back(const T &Elt) {
  321|   103k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|   103k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   103k|    this->set_size(this->size() + 1);
  325|   103k|  }
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj32EEC2Ev:
  859|    196|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj32EED2Ev:
  861|    196|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    196|    this->destroy_range(this->begin(), this->end());
  864|    196|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj1EEC2Ev:
  859|     26|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj1EEaSEOS4_:
  909|     13|  const SmallVector &operator=(SmallVector &&RHS) {
  910|     13|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|     13|    return *this;
  912|     13|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvEixEm:
  165|  8.80k|  const_reference operator[](size_type idx) const {
  166|  8.80k|    assert(idx < size());
  167|  8.80k|    return begin()[idx];
  168|  8.80k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj64EEC2ESt16initializer_listIS3_E:
  885|     13|  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  886|     13|    this->assign(IL);
  887|     13|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj2EEC2EOS4_:
  899|   810k|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|   810k|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 810k, False: 133]
  ------------------
  901|   810k|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|   810k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj2EED2Ev:
  861|  1.30M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  1.30M|    this->destroy_range(this->begin(), this->end());
  864|  1.30M|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj2EEC2Ev:
  859|   492k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEC2INSt3__116reverse_iteratorINS_12SuccIteratorINS1_14TerminatorInstES2_EEEEvEET_SC_:
  875|   492k|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|   492k|    this->append(S, E);
  877|   492k|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendINSt3__116reverse_iteratorINS_12SuccIteratorINS1_14TerminatorInstES2_EEEEvEEvT_SC_:
  404|   492k|  void append(in_iter in_start, in_iter in_end) {
  405|   492k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|   492k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 492k]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|   492k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|   492k|    this->set_size(this->size() + NumInputs);
  413|   492k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyINSt3__116reverse_iteratorINS_12SuccIteratorINS1_14TerminatorInstES2_EEEEPS3_EEvT_SD_T0_:
  295|   492k|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|   492k|    std::uninitialized_copy(I, E, Dest);
  298|   492k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj64EED2Ev:
  861|     13|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     13|    this->destroy_range(this->begin(), this->end());
  864|     13|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj32EEC2Ev:
  859|  95.6k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj32EED2Ev:
  861|  95.6k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  95.6k|    this->destroy_range(this->begin(), this->end());
  864|  95.6k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvEixEm:
  165|  8.78k|  const_reference operator[](size_type idx) const {
  166|  8.78k|    assert(idx < size());
  167|  8.78k|    return begin()[idx];
  168|  8.78k|  }
_ZN4llvh11SmallVectorINS_5TimerELj32EEC2Ev:
  859|    196|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINS_5TimerEEC2Ej:
  344|    196|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINS_5TimerELb0EEC2Em:
  194|    196|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINS_5TimerEvEC2Em:
  102|    196|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINS_5TimerEvE10getFirstElEv:
   93|    392|  void *getFirstEl() const {
   94|    392|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    392|        reinterpret_cast<const char *>(this) +
   96|    392|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    392|  }
_ZN4llvh11SmallVectorINS_5TimerELj32EED2Ev:
  861|    196|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    196|    this->destroy_range(this->begin(), this->end());
  864|    196|  }
_ZN4llvh23SmallVectorTemplateBaseINS_5TimerELb0EE13destroy_rangeEPS1_S3_:
  196|    196|  static void destroy_range(T *S, T *E) {
  197|    196|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 0, False: 196]
  ------------------
  198|      0|      --E;
  199|      0|      E->~T();
  200|      0|    }
  201|    196|  }
_ZN4llvh25SmallVectorTemplateCommonINS_5TimerEvE5beginEv:
  135|    392|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINS_5TimerEvE3endEv:
  139|    196|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINS_5TimerEED2Ev:
  349|    196|  ~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|    196|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 196]
  ------------------
  353|      0|      free(this->begin());
  354|    196|  }
_ZNK4llvh25SmallVectorTemplateCommonINS_5TimerEvE7isSmallEv:
  110|    196|  bool isSmall() const { return BeginX == getFirstEl(); }
Analysis.cpp:_ZN4llvh11SmallVectorIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLj32EEC2Ev:
  859|   310k|  SmallVector() : SmallVectorImpl<T>(N) {}
Analysis.cpp:_ZN4llvh15SmallVectorImplIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateEC2Ej:
  344|   310k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EEC2Em:
  279|   310k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevEC2Em:
  102|   310k|      : SmallVectorBase(getFirstEl(), Size) {}
Analysis.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE10getFirstElEv:
   93|   622k|  void *getFirstEl() const {
   94|   622k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   622k|        reinterpret_cast<const char *>(this) +
   96|   622k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   622k|  }
Analysis.cpp:_ZN4llvh11SmallVectorIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLj32EED2Ev:
  861|   310k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   310k|    this->destroy_range(this->begin(), this->end());
  864|   310k|  }
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EE13destroy_rangeEPSB_SD_:
  282|   310k|  static void destroy_range(T *, T *) {}
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE5beginEv:
  135|  19.9M|  iterator begin() { return (iterator)this->BeginX; }
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE3endEv:
  139|  19.6M|  iterator end() { return begin() + size(); }
Analysis.cpp:_ZN4llvh15SmallVectorImplIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateED2Ev:
  349|   310k|  ~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|   310k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 985, False: 309k]
  ------------------
  353|    985|      free(this->begin());
  354|   310k|  }
Analysis.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE7isSmallEv:
  110|   310k|  bool isSmall() const { return BeginX == getFirstEl(); }
Analysis.cpp:_ZN4llvh15SmallVectorImplIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateE12emplace_backIJRS4_EEEvDpOT_:
  662|  2.71M|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|  2.71M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.71M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2.59k, False: 2.71M]
  |  |  ------------------
  ------------------
  664|  2.59k|      this->grow();
  665|  2.71M|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|  2.71M|    this->set_size(this->size() + 1);
  667|  2.71M|  }
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EE4growEm:
  317|  2.59k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE8grow_podEmm:
  104|  2.59k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  2.59k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  2.59k|  }
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE4backEv:
  179|  16.6M|  reference back() {
  180|  16.6M|    assert(!empty());
  181|  16.6M|    return end()[-1];
  182|  16.6M|  }
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EE8pop_backEv:
  327|  2.71M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIPN6hermes12UniqueStringELj1EED2Ev:
  861|    610|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    610|    this->destroy_range(this->begin(), this->end());
  864|    610|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes12UniqueStringELb1EE13destroy_rangeEPS3_S5_:
  282|    614|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE5beginEv:
  135|  1.23k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE3endEv:
  139|    618|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes12UniqueStringEED2Ev:
  349|    610|  ~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|    610|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 610]
  ------------------
  353|      0|      free(this->begin());
  354|    610|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE7isSmallEv:
  110|    610|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE10getFirstElEv:
   93|  1.22k|  void *getFirstEl() const {
   94|  1.22k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  1.22k|        reinterpret_cast<const char *>(this) +
   96|  1.22k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  1.22k|  }
_ZN4llvh15SmallVectorImplIPN6hermes12UniqueStringEE6resizeEm:
  361|   212k|  void resize(size_type N) {
  362|   212k|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 4, False: 212k]
  ------------------
  363|      4|      this->destroy_range(this->begin()+N, this->end());
  364|      4|      this->set_size(N);
  365|   212k|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 0, False: 212k]
  ------------------
  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|   212k|  }
_ZN4llvh11SmallVectorINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELj4EEC2Ev:
  859|    247|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEEC2Ej:
  344|    247|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELb0EEC2Em:
  194|    247|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvEC2Em:
  102|    247|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIcLj4EEC2Ev:
  859|     11|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj4EED2Ev:
  861|     11|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     11|    this->destroy_range(this->begin(), this->end());
  864|     11|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EEC2ERKS3_:
  889|     81|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|     81|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 0, False: 81]
  ------------------
  891|      0|      SmallVectorImpl<T>::operator=(RHS);
  892|     81|  }
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEEC2Ej:
  344|    243|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINS_11SmallStringILj24EEELb0EEC2Em:
  194|    243|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvEC2Em:
  102|    243|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EEaSEOS3_:
  909|     81|  const SmallVector &operator=(SmallVector &&RHS) {
  910|     81|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|     81|    return *this;
  912|     81|  }
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEEaSEOS3_:
  775|     81|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|     81|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 81]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|     81|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 81]
  ------------------
  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|     81|  size_t RHSSize = RHS.size();
  793|     81|  size_t CurSize = this->size();
  794|     81|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 81, False: 0]
  ------------------
  795|       |    // Assign common elements.
  796|     81|    iterator NewEnd = this->begin();
  797|     81|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 81]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|     81|    this->destroy_range(NewEnd, this->end());
  802|     81|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|     81|    RHS.clear();
  806|       |
  807|     81|    return *this;
  808|     81|  }
  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|      0|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 0]
  ------------------
  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|      0|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 0]
  ------------------
  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|      0|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|      0|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|      0|  this->set_size(RHSSize);
  831|       |
  832|      0|  RHS.clear();
  833|      0|  return *this;
  834|     81|}
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEE5clearEv:
  356|     81|  void clear() {
  357|     81|    this->destroy_range(this->begin(), this->end());
  358|     81|    this->Size = 0;
  359|     81|  }
_ZN4llvh11SmallVectorIPN6hermes12UniqueStringELj1EEC2Ev:
  859|    610|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes12UniqueStringEEC2Ej:
  344|    610|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes12UniqueStringELb1EEC2Em:
  279|    610|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvEC2Em:
  102|    610|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes12UniqueStringELb1EE9push_backERKS3_:
  320|      4|  void push_back(const T &Elt) {
  321|      4|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|      4|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|      4|    this->set_size(this->size() + 1);
  325|      4|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EEC2Ev:
  859|    162|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE5beginEv:
  137|    162|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE3endEv:
  141|     81|  const_iterator end() const { return begin() + size(); }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLj16EEC2Ev:
  859|  6.61M|  SmallVector() : SmallVectorImpl<T>(N) {}
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryEC2Ej:
  344|  6.61M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLb1EEC2Em:
  279|  6.61M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvEC2Em:
  102|  6.61M|      : SmallVectorBase(getFirstEl(), Size) {}
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE10getFirstElEv:
   93|  13.2M|  void *getFirstEl() const {
   94|  13.2M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  13.2M|        reinterpret_cast<const char *>(this) +
   96|  13.2M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  13.2M|  }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLj16EED2Ev:
  861|  6.61M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  6.61M|    this->destroy_range(this->begin(), this->end());
  864|  6.61M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLb1EE13destroy_rangeEPS6_S8_:
  282|  6.61M|  static void destroy_range(T *, T *) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE5beginEv:
  135|  31.7M|  iterator begin() { return (iterator)this->BeginX; }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE3endEv:
  139|  25.1M|  iterator end() { return begin() + size(); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryED2Ev:
  349|  6.61M|  ~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.61M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 6.61M]
  ------------------
  353|      0|      free(this->begin());
  354|  6.61M|  }
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE7isSmallEv:
  110|  6.61M|  bool isSmall() const { return BeginX == getFirstEl(); }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE4backEv:
  179|  16.2M|  reference back() {
  180|  16.2M|    assert(!empty());
  181|  16.2M|    return end()[-1];
  182|  16.2M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLb1EE8pop_backEv:
  327|  2.29M|  void pop_back() { this->set_size(this->size() - 1); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryE12emplace_backIJRPNS1_6ESTree4NodeENS2_9TokenKindERNS_5SMLocEEEEvDpOT_:
  662|  2.29M|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|  2.29M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.29M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.29M]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|  2.29M|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|  2.29M|    this->set_size(this->size() + 1);
  667|  2.29M|  }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLj2EEC2Ev:
  859|  6.60M|  SmallVector() : SmallVectorImpl<T>(N) {}
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateEC2Ej:
  344|  6.60M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EEC2Em:
  279|  6.60M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevEC2Em:
  102|  6.60M|      : SmallVectorBase(getFirstEl(), Size) {}
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE10getFirstElEv:
   93|  13.2M|  void *getFirstEl() const {
   94|  13.2M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  13.2M|        reinterpret_cast<const char *>(this) +
   96|  13.2M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  13.2M|  }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLj2EED2Ev:
  861|  6.60M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  6.60M|    this->destroy_range(this->begin(), this->end());
  864|  6.60M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EE13destroy_rangeEPSB_SD_:
  282|  6.60M|  static void destroy_range(T *, T *) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE5beginEv:
  135|  33.0M|  iterator begin() { return (iterator)this->BeginX; }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE3endEv:
  139|  26.4M|  iterator end() { return begin() + size(); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateED2Ev:
  349|  6.60M|  ~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.60M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 16, False: 6.60M]
  ------------------
  353|     16|      free(this->begin());
  354|  6.60M|  }
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE7isSmallEv:
  110|  6.60M|  bool isSmall() const { return BeginX == getFirstEl(); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateE12emplace_backIJEEEvDpOT_:
  662|  6.61M|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|  6.61M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  6.61M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 18, False: 6.61M]
  |  |  ------------------
  ------------------
  664|     18|      this->grow();
  665|  6.61M|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|  6.61M|    this->set_size(this->size() + 1);
  667|  6.61M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EE4growEm:
  317|     18|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE8grow_podEmm:
  104|     18|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     18|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     18|  }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE4backEv:
  179|  13.2M|  reference back() {
  180|  13.2M|    assert(!empty());
  181|  13.2M|    return end()[-1];
  182|  13.2M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EE8pop_backEv:
  327|  6.61M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIPN6hermes6ESTree21ImportDeclarationNodeELj2EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree21ImportDeclarationNodeEEC2Ej:
  344|   103k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree21ImportDeclarationNodeELb1EEC2Em:
  279|   103k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvEC2Em:
  102|   103k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj2EEC2Ev:
  859|   103k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIN6hermes3sem12FunctionInfo7VarDeclELj4EEC2Ev:
  859|   310k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes3sem12FunctionInfo7VarDeclEEC2Ej:
  344|   310k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3sem12FunctionInfo7VarDeclELb1EEC2Em:
  279|   310k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvEC2Em:
  102|   310k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE4backEv:
  179|  9.10k|  reference back() {
  180|  9.10k|    assert(!empty());
  181|  9.10k|    return end()[-1];
  182|  9.10k|  }
_ZN4llvh15SmallVectorImplIN6hermes3sem12FunctionInfo7VarDeclEE12emplace_backIJS4_EEEvDpOT_:
  662|   103k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|   103k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   103k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 103k]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|   103k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|   103k|    this->set_size(this->size() + 1);
  667|   103k|  }
_ZN4llvh11SmallVectorIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELj4EEC2Ev:
  859|    122|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEEC2Ej:
  344|    122|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EEC2Em:
  194|    122|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvEC2Em:
  102|    122|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE10getFirstElEv:
   93|    244|  void *getFirstEl() const {
   94|    244|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    244|        reinterpret_cast<const char *>(this) +
   96|    244|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    244|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE4backEv:
  179|   187k|  reference back() {
  180|   187k|    assert(!empty());
  181|   187k|    return end()[-1];
  182|   187k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE3endEv:
  139|   190k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE5beginEv:
  135|   190k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EE9push_backEOSA_:
  231|  1.60k|  void push_back(T &&Elt) {
  232|  1.60k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.60k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.60k]
  |  |  ------------------
  ------------------
  233|      0|      this->grow();
  234|  1.60k|    ::new ((void*) this->end()) T(::std::move(Elt));
  235|  1.60k|    this->set_size(this->size() + 1);
  236|  1.60k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EE13destroy_rangeEPSA_SC_:
  196|    122|  static void destroy_range(T *S, T *E) {
  197|    122|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 0, False: 122]
  ------------------
  198|      0|      --E;
  199|      0|      E->~T();
  200|      0|    }
  201|    122|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE7isSmallEv:
  110|    122|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIDsLj5EEC2Ev:
  859|      3|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj5EEC2EOS1_:
  899|      6|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|      6|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 6, False: 0]
  ------------------
  901|      6|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|      6|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EE8pop_backEv:
  238|  1.60k|  void pop_back() {
  239|  1.60k|    this->set_size(this->size() - 1);
  240|  1.60k|    this->end()->~T();
  241|  1.60k|  }
_ZN4llvh11SmallVectorIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELj1EEC2ESt16initializer_listISA_E:
  885|    264|  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  886|    264|    this->assign(IL);
  887|    264|  }
_ZN4llvh11SmallVectorIN6hermes14CodePointRangeELj4EEC2Ev:
  859|    854|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEEC2Ej:
  344|  1.76k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EEC2Em:
  279|  1.76k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvEC2Em:
  102|  1.76k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIN6hermes14CodePointRangeELj4EED2Ev:
  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|  }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEED2Ev:
  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: 106, False: 1.65k]
  ------------------
  353|    106|      free(this->begin());
  354|  1.76k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE7isSmallEv:
  110|  1.76k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes14CodePointRangeELj4EEC2ERKS3_:
  889|    907|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|    907|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 231, False: 676]
  ------------------
  891|    231|      SmallVectorImpl<T>::operator=(RHS);
  892|    907|  }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEEaSERKS3_:
  727|    231|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|    231|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 231]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|    231|  size_t RHSSize = RHS.size();
  734|    231|  size_t CurSize = this->size();
  735|    231|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 231]
  ------------------
  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|    231|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 70, False: 161]
  ------------------
  755|       |    // Destroy current elements.
  756|     70|    this->destroy_range(this->begin(), this->end());
  757|     70|    this->set_size(0);
  758|     70|    CurSize = 0;
  759|     70|    this->grow(RHSSize);
  760|    161|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 161]
  ------------------
  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|    231|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|    231|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|    231|  this->set_size(RHSSize);
  771|    231|  return *this;
  772|    231|}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE18uninitialized_copyIKS2_S2_EEvPT_S7_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSA_12remove_constIS6_E4typeES8_EE5valueEvE4typeE:
  306|    231|                                           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|    231|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 231, False: 0]
  ------------------
  312|    231|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    231|  }
_ZN4llvh11SmallVectorIjLj5EEC2ESt16initializer_listIjE:
  885|   941k|  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  886|   941k|    this->assign(IL);
  887|   941k|  }
_ZN4llvh15SmallVectorImplIjE6assignESt16initializer_listIjE:
  450|   941k|  void assign(std::initializer_list<T> IL) {
  451|   941k|    clear();
  452|   941k|    append(IL);
  453|   941k|  }
_ZN4llvh15SmallVectorImplIjE6appendESt16initializer_listIjE:
  426|   941k|  void append(std::initializer_list<T> IL) {
  427|   941k|    append(IL.begin(), IL.end());
  428|   941k|  }
_ZN4llvh11SmallVectorIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELj4EED2Ev:
  861|    122|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    122|    this->destroy_range(this->begin(), this->end());
  864|    122|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEED2Ev:
  349|    122|  ~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|    122|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 122]
  ------------------
  353|      0|      free(this->begin());
  354|    122|  }
_ZN4llvh11SmallVectorIN6hermes5regex13CapturedRangeELj16EEC2EmRKS3_:
  867|     86|    : SmallVectorImpl<T>(N) {
  868|     86|    this->assign(Size, Value);
  869|     86|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEEC2Ej:
  344|     86|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex13CapturedRangeELb1EEC2Em:
  279|     86|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvEC2Em:
  102|     86|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE10getFirstElEv:
   93|    172|  void *getFirstEl() const {
   94|    172|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    172|        reinterpret_cast<const char *>(this) +
   96|    172|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    172|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEE6assignEmRKS3_:
  433|     86|  void assign(size_type NumElts, const T &Elt) {
  434|     86|    clear();
  435|     86|    if (this->capacity() < NumElts)
  ------------------
  |  Branch (435:9): [True: 0, False: 86]
  ------------------
  436|      0|      this->grow(NumElts);
  437|     86|    this->set_size(NumElts);
  438|     86|    std::uninitialized_fill(this->begin(), this->end(), Elt);
  439|     86|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEE5clearEv:
  356|     86|  void clear() {
  357|     86|    this->destroy_range(this->begin(), this->end());
  358|     86|    this->Size = 0;
  359|     86|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex13CapturedRangeELb1EE13destroy_rangeEPS3_S5_:
  282|    172|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE3endEv:
  139|    258|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIN6hermes5regex8LoopDataELj16EEC2EmRKS3_:
  867|     86|    : SmallVectorImpl<T>(N) {
  868|     86|    this->assign(Size, Value);
  869|     86|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEEC2Ej:
  344|     86|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex8LoopDataELb1EEC2Em:
  279|     86|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvEC2Em:
  102|     86|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE10getFirstElEv:
   93|    172|  void *getFirstEl() const {
   94|    172|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    172|        reinterpret_cast<const char *>(this) +
   96|    172|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    172|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEE6assignEmRKS3_:
  433|     86|  void assign(size_type NumElts, const T &Elt) {
  434|     86|    clear();
  435|     86|    if (this->capacity() < NumElts)
  ------------------
  |  Branch (435:9): [True: 0, False: 86]
  ------------------
  436|      0|      this->grow(NumElts);
  437|     86|    this->set_size(NumElts);
  438|     86|    std::uninitialized_fill(this->begin(), this->end(), Elt);
  439|     86|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEE5clearEv:
  356|     86|  void clear() {
  357|     86|    this->destroy_range(this->begin(), this->end());
  358|     86|    this->Size = 0;
  359|     86|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex8LoopDataELb1EE13destroy_rangeEPS3_S5_:
  282|    172|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE5beginEv:
  135|    516|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE3endEv:
  139|    258|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELj64EEC2Ev:
  859|     86|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEEC2Ej:
  344|     86|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELb1EEC2Em:
  279|     86|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvEC2Em:
  102|     86|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE10getFirstElEv:
   93|    172|  void *getFirstEl() const {
   94|    172|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    172|        reinterpret_cast<const char *>(this) +
   96|    172|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    172|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE4backEv:
  179|     72|  reference back() {
  180|     72|    assert(!empty());
  181|     72|    return end()[-1];
  182|     72|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE3endEv:
  139|    194|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE5beginEv:
  135|    280|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELb1EE8pop_backEv:
  327|     36|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELb1EE9push_backERKS6_:
  320|     36|  void push_back(const T &Elt) {
  321|     36|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     36|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 36]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|     36|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|     36|    this->set_size(this->size() + 1);
  325|     36|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE7isSmallEv:
  110|     86|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE7isSmallEv:
  110|     86|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELj64EED2Ev:
  861|     86|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     86|    this->destroy_range(this->begin(), this->end());
  864|     86|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELb1EE13destroy_rangeEPS6_S8_:
  282|     86|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEED2Ev:
  349|     86|  ~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|     86|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 86]
  ------------------
  353|      0|      free(this->begin());
  354|     86|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE7isSmallEv:
  110|     86|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE5beginEv:
  135|    516|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh11SmallVectorIN6hermes5regex8LoopDataELj16EED2Ev:
  861|     86|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     86|    this->destroy_range(this->begin(), this->end());
  864|     86|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEED2Ev:
  349|     86|  ~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|     86|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 86]
  ------------------
  353|      0|      free(this->begin());
  354|     86|  }
_ZN4llvh11SmallVectorIN6hermes5regex13CapturedRangeELj16EED2Ev:
  861|     86|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     86|    this->destroy_range(this->begin(), this->end());
  864|     86|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEED2Ev:
  349|     86|  ~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|     86|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 86]
  ------------------
  353|      0|      free(this->begin());
  354|     86|  }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EEaSERKS2_:
  894|     51|  const SmallVector &operator=(const SmallVector &RHS) {
  895|     51|    SmallVectorImpl<T>::operator=(RHS);
  896|     51|    return *this;
  897|     51|  }
_ZN4llvh15SmallVectorImplINS_7SMFixItEEaSERKS2_:
  727|     51|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|     51|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 51]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|     51|  size_t RHSSize = RHS.size();
  734|     51|  size_t CurSize = this->size();
  735|     51|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 51, False: 0]
  ------------------
  736|       |    // Assign common elements.
  737|     51|    iterator NewEnd;
  738|     51|    if (RHSSize)
  ------------------
  |  Branch (738:9): [True: 0, False: 51]
  ------------------
  739|      0|      NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
  740|     51|    else
  741|     51|      NewEnd = this->begin();
  742|       |
  743|       |    // Destroy excess elements.
  744|     51|    this->destroy_range(NewEnd, this->end());
  745|       |
  746|       |    // Trim.
  747|     51|    this->set_size(RHSSize);
  748|     51|    return *this;
  749|     51|  }
  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|     51|}
_ZN4llvh23SmallVectorTemplateBaseINS_7SMFixItELb0EE18uninitialized_copyIPKS1_PS1_EEvT_S7_T0_:
  214|    772|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  215|    772|    std::uninitialized_copy(I, E, Dest);
  216|    772|  }
_ZN4llvh11SmallVectorIDsLj8EEC2Ev:
  859|      4|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj8EED2Ev:
  861|      4|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      4|    this->destroy_range(this->begin(), this->end());
  864|      4|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE4dataEv:
  157|    772|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE5beginEv:
  137|    772|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EEC2IPKS1_vEET_S6_:
  875|    772|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|    772|    this->append(S, E);
  877|    772|  }
_ZN4llvh15SmallVectorImplINS_7SMFixItEE6appendIPKS1_vEEvT_S6_:
  404|    772|  void append(in_iter in_start, in_iter in_end) {
  405|    772|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    772|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 772]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    772|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    772|    this->set_size(this->size() + NumInputs);
  413|    772|  }
_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|  33.4M|  const Statistic &operator++() {
   80|  33.4M|    Value.fetch_add(1, std::memory_order_relaxed);
   81|  33.4M|    return init();
   82|  33.4M|  }
_ZN4llvh9Statistic4initEv:
  158|   650M|  Statistic &init() {
  159|   650M|    if (!Initialized.load(std::memory_order_acquire))
  ------------------
  |  Branch (159:9): [True: 21, False: 650M]
  ------------------
  160|     21|      RegisterStatistic();
  161|   650M|    return *this;
  162|   650M|  }
_ZN4llvh9StatisticppEi:
   84|   617M|  unsigned operator++(int) {
   85|   617M|    init();
   86|   617M|    return Value.fetch_add(1, std::memory_order_relaxed);
   87|   617M|  }
_ZN4llvh9StatisticpLEj:
   99|  1.96k|  const Statistic &operator+=(unsigned V) {
  100|  1.96k|    if (V == 0)
  ------------------
  |  Branch (100:9): [True: 1.70k, False: 257]
  ------------------
  101|  1.70k|      return *this;
  102|    257|    Value.fetch_add(V, std::memory_order_relaxed);
  103|    257|    return init();
  104|  1.96k|  }

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

_ZN4llvh18StringMapEntryBaseC2Em:
   43|     44|  explicit StringMapEntryBase(size_t Len) : StrLen(Len) {}
_ZNK4llvh18StringMapEntryBase12getKeyLengthEv:
   45|      4|  size_t getKeyLength() const { return StrLen; }
_ZN4llvh13StringMapImplC2Ej:
   63|      9|      : ItemSize(itemSize) {}
_ZN4llvh13StringMapImpl15getTombstoneValEv:
  102|    170|  static StringMapEntryBase *getTombstoneVal() {
  103|    170|    uintptr_t Val = static_cast<uintptr_t>(-1);
  104|    170|    Val <<= PointerLikeTypeTraits<StringMapEntryBase *>::NumLowBitsAvailable;
  105|    170|    return reinterpret_cast<StringMapEntryBase *>(Val);
  106|    170|  }
_ZNK4llvh13StringMapImpl5emptyEv:
  111|      4|  bool empty() const { return NumItems == 0; }
_ZNK4llvh13StringMapImpl4sizeEv:
  112|      2|  unsigned size() const { return NumItems; }
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEEC2Ev:
  226|      2|  StringMap() : StringMapImpl(static_cast<unsigned>(sizeof(MapEntryTy))) {}
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEED2Ev:
  289|      2|  ~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|      2|    if (!empty()) {
  ------------------
  |  Branch (293:9): [True: 1, False: 1]
  ------------------
  294|     17|      for (unsigned I = 0, E = NumBuckets; I != E; ++I) {
  ------------------
  |  Branch (294:44): [True: 16, False: 1]
  ------------------
  295|     16|        StringMapEntryBase *Bucket = TheTable[I];
  296|     16|        if (Bucket && Bucket != getTombstoneVal()) {
  ------------------
  |  Branch (296:13): [True: 1, False: 15]
  |  Branch (296:23): [True: 1, False: 0]
  ------------------
  297|      1|          static_cast<MapEntryTy*>(Bucket)->Destroy(Allocator);
  298|      1|        }
  299|     16|      }
  300|      1|    }
  301|      2|    free(TheTable);
  302|      2|  }
ESTreeIRGen-expr.cpp:_ZN4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueE7DestroyINS_15MallocAllocatorEEEvRT_:
  201|      1|  void Destroy(AllocatorTy &Allocator) {
  202|       |    // Free memory referenced by the item.
  203|      1|    size_t AllocSize = sizeof(StringMapEntry) + getKeyLength() + 1;
  204|      1|    this->~StringMapEntry();
  205|      1|    Allocator.Deallocate(static_cast<void *>(this), AllocSize);
  206|      1|  }
_ZN4llvh9StringMapINS_7SMRangeENS_15MallocAllocatorEEC2Ev:
  226|      2|  StringMap() : StringMapImpl(static_cast<unsigned>(sizeof(MapEntryTy))) {}
_ZN4llvh9StringMapINS_7SMRangeENS_15MallocAllocatorEED2Ev:
  289|      2|  ~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|      2|    if (!empty()) {
  ------------------
  |  Branch (293:9): [True: 1, False: 1]
  ------------------
  294|     17|      for (unsigned I = 0, E = NumBuckets; I != E; ++I) {
  ------------------
  |  Branch (294:44): [True: 16, False: 1]
  ------------------
  295|     16|        StringMapEntryBase *Bucket = TheTable[I];
  296|     16|        if (Bucket && Bucket != getTombstoneVal()) {
  ------------------
  |  Branch (296:13): [True: 1, False: 15]
  |  Branch (296:23): [True: 1, False: 0]
  ------------------
  297|      1|          static_cast<MapEntryTy*>(Bucket)->Destroy(Allocator);
  298|      1|        }
  299|     16|      }
  300|      1|    }
  301|      2|    free(TheTable);
  302|      2|  }
_ZN4llvh14StringMapEntryINS_7SMRangeEE7DestroyINS_15MallocAllocatorEEEvRT_:
  201|      1|  void Destroy(AllocatorTy &Allocator) {
  202|       |    // Free memory referenced by the item.
  203|      1|    size_t AllocSize = sizeof(StringMapEntry) + getKeyLength() + 1;
  204|      1|    this->~StringMapEntry();
  205|      1|    Allocator.Deallocate(static_cast<void *>(this), AllocSize);
  206|      1|  }
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEEixENS_9StringRefE:
  356|      3|  ValueTy &operator[](StringRef Key) { return try_emplace(Key).first->second; }
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEE11try_emplaceIJEEENSt3__14pairINS_17StringMapIteratorIS7_EEbEENS_9StringRefEDpOT_:
  395|      3|  std::pair<iterator, bool> try_emplace(StringRef Key, ArgsTy &&... Args) {
  396|      3|    unsigned BucketNo = LookupBucketFor(Key);
  397|      3|    StringMapEntryBase *&Bucket = TheTable[BucketNo];
  398|      3|    if (Bucket && Bucket != getTombstoneVal())
  ------------------
  |  Branch (398:9): [True: 2, False: 1]
  |  Branch (398:19): [True: 2, False: 0]
  ------------------
  399|      2|      return std::make_pair(iterator(TheTable + BucketNo, false),
  400|      2|                            false); // Already exists in map.
  401|       |
  402|      1|    if (Bucket == getTombstoneVal())
  ------------------
  |  Branch (402:9): [True: 0, False: 1]
  ------------------
  403|      0|      --NumTombstones;
  404|      1|    Bucket = MapEntryTy::Create(Key, Allocator, std::forward<ArgsTy>(Args)...);
  405|      1|    ++NumItems;
  406|      1|    assert(NumItems + NumTombstones <= NumBuckets);
  407|       |
  408|      1|    BucketNo = RehashTable(BucketNo);
  409|      1|    return std::make_pair(iterator(TheTable + BucketNo, false), true);
  410|      1|  }
ESTreeIRGen-expr.cpp:_ZN4llvh17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueEC2EPPNS_18StringMapEntryBaseEb:
  520|      3|      : base(Bucket, NoAdvance) {}
ESTreeIRGen-expr.cpp:_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE13PropertyValueEENS_14StringMapEntryIS8_EEEC2EPPNS_18StringMapEntryBaseEb:
  462|      3|      : Ptr(Bucket) {
  463|      3|    if (!NoAdvance) AdvancePastEmptyBuckets();
  ------------------
  |  Branch (463:9): [True: 3, False: 0]
  ------------------
  464|      3|  }
ESTreeIRGen-expr.cpp:_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE13PropertyValueEENS_14StringMapEntryIS8_EEE23AdvancePastEmptyBucketsEv:
  486|      3|  void AdvancePastEmptyBuckets() {
  487|      3|    while (*Ptr == nullptr || *Ptr == StringMapImpl::getTombstoneVal())
  ------------------
  |  Branch (487:12): [True: 0, False: 3]
  |  Branch (487:31): [True: 0, False: 3]
  ------------------
  488|      0|      ++Ptr;
  489|      3|  }
ESTreeIRGen-expr.cpp:_ZN4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueE6CreateINS_15MallocAllocatorEJEEEPS8_NS_9StringRefERT_DpOT0_:
  157|      1|                                InitTy &&... InitVals) {
  158|      1|    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|      1|    size_t AllocSize = sizeof(StringMapEntry) + KeyLength + 1;
  163|      1|    size_t Alignment = alignof(StringMapEntry);
  164|       |
  165|      1|    StringMapEntry *NewItem =
  166|      1|      static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment));
  167|      1|    assert(NewItem && "Unhandled out-of-memory");
  168|       |
  169|       |    // Construct the value.
  170|      1|    new (NewItem) StringMapEntry(KeyLength, std::forward<InitTy>(InitVals)...);
  171|       |
  172|       |    // Copy the string information.
  173|      1|    char *StrBuffer = const_cast<char*>(NewItem->getKeyData());
  174|      1|    if (KeyLength > 0)
  ------------------
  |  Branch (174:9): [True: 1, False: 0]
  ------------------
  175|      1|      memcpy(StrBuffer, Key.data(), KeyLength);
  176|      1|    StrBuffer[KeyLength] = 0;  // Null terminate for convenience of clients.
  177|      1|    return NewItem;
  178|      1|  }
ESTreeIRGen-expr.cpp:_ZN4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueEC2Em:
  131|      1|    : StringMapEntryBase(strLen), second() {}
ESTreeIRGen-expr.cpp:_ZNK4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueE10getKeyDataEv:
  149|      1|  const char *getKeyData() const {return reinterpret_cast<const char*>(this+1);}
ESTreeIRGen-expr.cpp:_ZNK4llvh17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueEdeEv:
  522|      3|  StringMapEntry<ValueTy> &operator*() const {
  523|      3|    return *static_cast<StringMapEntry<ValueTy> *>(*this->Ptr);
  524|      3|  }
_ZN4llvh9StringMapINS_7SMRangeENS_15MallocAllocatorEE11try_emplaceIJS1_EEENSt3__14pairINS_17StringMapIteratorIS1_EEbEENS_9StringRefEDpOT_:
  395|      1|  std::pair<iterator, bool> try_emplace(StringRef Key, ArgsTy &&... Args) {
  396|      1|    unsigned BucketNo = LookupBucketFor(Key);
  397|      1|    StringMapEntryBase *&Bucket = TheTable[BucketNo];
  398|      1|    if (Bucket && Bucket != getTombstoneVal())
  ------------------
  |  Branch (398:9): [True: 0, False: 1]
  |  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|      1|    if (Bucket == getTombstoneVal())
  ------------------
  |  Branch (402:9): [True: 0, False: 1]
  ------------------
  403|      0|      --NumTombstones;
  404|      1|    Bucket = MapEntryTy::Create(Key, Allocator, std::forward<ArgsTy>(Args)...);
  405|      1|    ++NumItems;
  406|      1|    assert(NumItems + NumTombstones <= NumBuckets);
  407|       |
  408|      1|    BucketNo = RehashTable(BucketNo);
  409|      1|    return std::make_pair(iterator(TheTable + BucketNo, false), true);
  410|      1|  }
_ZN4llvh17StringMapIteratorINS_7SMRangeEEC2EPPNS_18StringMapEntryBaseEb:
  520|      1|      : base(Bucket, NoAdvance) {}
_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorINS_7SMRangeEEENS_14StringMapEntryIS2_EEEC2EPPNS_18StringMapEntryBaseEb:
  462|      1|      : Ptr(Bucket) {
  463|      1|    if (!NoAdvance) AdvancePastEmptyBuckets();
  ------------------
  |  Branch (463:9): [True: 1, False: 0]
  ------------------
  464|      1|  }
_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorINS_7SMRangeEEENS_14StringMapEntryIS2_EEE23AdvancePastEmptyBucketsEv:
  486|      1|  void AdvancePastEmptyBuckets() {
  487|      1|    while (*Ptr == nullptr || *Ptr == StringMapImpl::getTombstoneVal())
  ------------------
  |  Branch (487:12): [True: 0, False: 1]
  |  Branch (487:31): [True: 0, False: 1]
  ------------------
  488|      0|      ++Ptr;
  489|      1|  }
_ZN4llvh14StringMapEntryINS_7SMRangeEE6CreateINS_15MallocAllocatorEJS1_EEEPS2_NS_9StringRefERT_DpOT0_:
  157|      1|                                InitTy &&... InitVals) {
  158|      1|    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|      1|    size_t AllocSize = sizeof(StringMapEntry) + KeyLength + 1;
  163|      1|    size_t Alignment = alignof(StringMapEntry);
  164|       |
  165|      1|    StringMapEntry *NewItem =
  166|      1|      static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment));
  167|      1|    assert(NewItem && "Unhandled out-of-memory");
  168|       |
  169|       |    // Construct the value.
  170|      1|    new (NewItem) StringMapEntry(KeyLength, std::forward<InitTy>(InitVals)...);
  171|       |
  172|       |    // Copy the string information.
  173|      1|    char *StrBuffer = const_cast<char*>(NewItem->getKeyData());
  174|      1|    if (KeyLength > 0)
  ------------------
  |  Branch (174:9): [True: 1, False: 0]
  ------------------
  175|      1|      memcpy(StrBuffer, Key.data(), KeyLength);
  176|      1|    StrBuffer[KeyLength] = 0;  // Null terminate for convenience of clients.
  177|      1|    return NewItem;
  178|      1|  }
_ZN4llvh14StringMapEntryINS_7SMRangeEEC2IJS1_EEEmDpOT_:
  134|      1|      : StringMapEntryBase(strLen), second(std::forward<InitTy>(InitVals)...) {}
_ZNK4llvh14StringMapEntryINS_7SMRangeEE10getKeyDataEv:
  149|      1|  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|     42|    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|     42|    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|  5.71M|        : Data(Str), Length(Str ? ::strlen(Str) : 0) {}
  ------------------
  |  Branch (91:29): [True: 5.71M, False: 0]
  ------------------
_ZN4llvh9StringRefC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  101|  29.4k|      : Data(Str.data()), Length(Str.length()) {}
_ZN4llvh9StringRefC2EPKcm:
   96|   331M|        : Data(data), Length(length) {}
_ZNK4llvh9StringRef4dataEv:
  133|   296M|    const char *data() const { return Data; }
_ZN4llvheqENS_9StringRefES0_:
  903|   171M|  inline bool operator==(StringRef LHS, StringRef RHS) {
  904|   171M|    return LHS.equals(RHS);
  905|   171M|  }
_ZNK4llvh9StringRef6equalsES0_:
  174|   171M|    bool equals(StringRef RHS) const {
  175|   171M|      return (Length == RHS.Length &&
  ------------------
  |  Branch (175:15): [True: 14.2M, False: 156M]
  ------------------
  176|   171M|              compareMemory(Data, RHS.Data, RHS.Length) == 0);
  ------------------
  |  Branch (176:15): [True: 9.93M, False: 4.36M]
  ------------------
  177|   171M|    }
_ZN4llvh9StringRef13compareMemoryEPKcS2_m:
   72|  14.3M|    static int compareMemory(const char *Lhs, const char *Rhs, size_t Length) {
   73|  14.3M|      if (Length == 0) { return 0; }
  ------------------
  |  Branch (73:11): [True: 2.66M, False: 11.6M]
  ------------------
   74|  11.6M|      return ::memcmp(Lhs,Rhs,Length);
   75|  14.3M|    }
_ZNK4llvh9StringRef4sizeEv:
  143|  1.35M|    size_t size() const { return Length; }
_ZNK4llvh9StringRef5beginEv:
  111|  16.7M|    iterator begin() const { return Data; }
_ZNK4llvh9StringRef3endEv:
  113|  16.6M|    iterator end() const { return Data + Length; }
_ZNK4llvh9StringRef11bytes_beginEv:
  115|  86.7k|    const unsigned char *bytes_begin() const {
  116|  86.7k|      return reinterpret_cast<const unsigned char *>(begin());
  117|  86.7k|    }
_ZNK4llvh9StringRef9bytes_endEv:
  118|  86.7k|    const unsigned char *bytes_end() const {
  119|  86.7k|      return reinterpret_cast<const unsigned char *>(end());
  120|  86.7k|    }
_ZNK4llvh9StringRef5bytesEv:
  121|     46|    iterator_range<const unsigned char *> bytes() const {
  122|     46|      return make_range(bytes_begin(), bytes_end());
  123|     46|    }
_ZNK4llvh9StringRef5emptyEv:
  138|    873|    bool empty() const { return Length == 0; }
_ZNK4llvh9StringRef7compareES0_:
  189|  50.4k|    int compare(StringRef RHS) const {
  190|       |      // Check the prefix for a mismatch.
  191|  50.4k|      if (int Res = compareMemory(Data, RHS.Data, std::min(Length, RHS.Length)))
  ------------------
  |  Branch (191:15): [True: 47.0k, False: 3.43k]
  ------------------
  192|  47.0k|        return Res < 0 ? -1 : 1;
  ------------------
  |  Branch (192:16): [True: 35.1k, False: 11.8k]
  ------------------
  193|       |
  194|       |      // Otherwise the prefixes match, so we only need to check the lengths.
  195|  3.43k|      if (Length == RHS.Length)
  ------------------
  |  Branch (195:11): [True: 0, False: 3.43k]
  ------------------
  196|      0|        return 0;
  197|  3.43k|      return Length < RHS.Length ? -1 : 1;
  ------------------
  |  Branch (197:14): [True: 2.48k, False: 956]
  ------------------
  198|  3.43k|    }
_ZNK4llvh9StringRef3strEv:
  233|  4.27k|    std::string str() const {
  234|  4.27k|      if (!Data) return std::string();
  ------------------
  |  Branch (234:11): [True: 133, False: 4.14k]
  ------------------
  235|  4.14k|      return std::string(Data, Length);
  236|  4.27k|    }
_ZNK4llvh9StringRefixEm:
  243|  67.3M|    char operator[](size_t Index) const {
  244|  67.3M|      assert(Index < Length && "Invalid index!");
  245|  67.3M|      return Data[Index];
  246|  67.3M|    }
_ZNK4llvh9StringRefcvNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEv:
  261|  3.40k|    operator std::string() const {
  262|  3.40k|      return str();
  263|  3.40k|    }
_ZNK4llvh9StringRef10startswithES0_:
  272|      8|    bool startswith(StringRef Prefix) const {
  273|      8|      return Length >= Prefix.Length &&
  ------------------
  |  Branch (273:14): [True: 6, False: 2]
  ------------------
  274|      8|             compareMemory(Data, Prefix.Data, Prefix.Length) == 0;
  ------------------
  |  Branch (274:14): [True: 4, False: 2]
  ------------------
  275|      8|    }
_ZNK4llvh9StringRef6substrEmm:
  603|      4|    StringRef substr(size_t Start, size_t N = npos) const {
  604|      4|      Start = std::min(Start, Length);
  605|      4|      return StringRef(Data + Start, std::min(N, Length - Start));
  606|      4|    }
_ZNK4llvh9StringRef10drop_frontEm:
  650|      4|    StringRef drop_front(size_t N = 1) const {
  651|      4|      assert(size() >= N && "Dropping more elements than exist");
  652|      4|      return substr(N);
  653|      4|    }
_ZN4llvh9StringRef13consume_frontES0_:
  683|      8|    bool consume_front(StringRef Prefix) {
  684|      8|      if (!startswith(Prefix))
  ------------------
  |  Branch (684:11): [True: 4, False: 4]
  ------------------
  685|      4|        return false;
  686|       |
  687|      4|      *this = drop_front(Prefix.size());
  688|      4|      return true;
  689|      8|    }
_ZN4llvhltENS_9StringRefES0_:
  910|  50.4k|  inline bool operator<(StringRef LHS, StringRef RHS) {
  911|  50.4k|    return LHS.compare(RHS) == -1;
  912|  50.4k|  }
_ZN4llvh9StringRefC2Ev:
   82|  2.29k|    /*implicit*/ StringRef() = default;
_ZN4llvh13StringLiteralC2ILm4EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm4ELi1EEERAT__Kc:
  889|  13.9M|        : StringRef(Str, N - 1) {
  890|  13.9M|    }
_ZN4llvh13StringLiteralC2ILm3EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm3ELi1EEERAT__Kc:
  889|  10.4M|        : StringRef(Str, N - 1) {
  890|  10.4M|    }
_ZN4llvh13StringLiteralC2ILm6EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm6ELi1EEERAT__Kc:
  889|  31.4M|        : StringRef(Str, N - 1) {
  890|  31.4M|    }
_ZN4llvh13StringLiteralC2ILm7EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm7ELi1EEERAT__Kc:
  889|  27.9M|        : StringRef(Str, N - 1) {
  890|  27.9M|    }
_ZN4llvh13StringLiteralC2ILm8EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm8ELi1EEERAT__Kc:
  889|  17.4M|        : StringRef(Str, N - 1) {
  890|  17.4M|    }
_ZN4llvh13StringLiteralC2ILm9EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm9ELi1EEERAT__Kc:
  889|  10.4M|        : StringRef(Str, N - 1) {
  890|  10.4M|    }
_ZN4llvh13StringLiteralC2ILm5EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm5ELi1EEERAT__Kc:
  889|  27.9M|        : StringRef(Str, N - 1) {
  890|  27.9M|    }
_ZN4llvh13StringLiteralC2ILm11EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm11ELi1EEERAT__Kc:
  889|  6.99M|        : StringRef(Str, N - 1) {
  890|  6.99M|    }
_ZN4llvh13StringLiteralC2ILm10EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm10ELi1EEERAT__Kc:
  889|  6.99M|        : StringRef(Str, N - 1) {
  890|  6.99M|    }

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

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

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

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

_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEppEv:
  158|  9.61M|  ilist_iterator &operator++() {
  159|  9.61M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  9.61M|    return *this;
  161|  9.61M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|  11.0M|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEppEv:
  158|   148M|  ilist_iterator &operator++() {
  159|   148M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|   148M|    return *this;
  161|   148M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEppEv:
  158|  13.0M|  ilist_iterator &operator++() {
  159|  13.0M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  13.0M|    return *this;
  161|  13.0M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb1EEppEv:
  158|  6.73M|  ilist_iterator &operator++() {
  159|  6.73M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  6.73M|    return *this;
  161|  6.73M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb1EEppEv:
  158|  1.48M|  ilist_iterator &operator++() {
  159|  1.48M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  1.48M|    return *this;
  161|  1.48M|  }
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb1EEES8_:
  149|  6.73M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  6.73M|    return LHS.NodePtr != RHS.NodePtr;
  151|  6.73M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEdeEv:
  139|   137M|  reference operator*() const {
  140|   137M|    assert(!NodePtr->isKnownSentinel());
  141|   137M|    return *Access::getValuePtr(NodePtr);
  142|   137M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEdeEv:
  139|  12.2M|  reference operator*() const {
  140|  12.2M|    assert(!NodePtr->isKnownSentinel());
  141|  12.2M|    return *Access::getValuePtr(NodePtr);
  142|  12.2M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb1EEdeEv:
  139|  1.48M|  reference operator*() const {
  140|  1.48M|    assert(!NodePtr->isKnownSentinel());
  141|  1.48M|    return *Access::getValuePtr(NodePtr);
  142|  1.48M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEppEv:
  158|  17.1M|  ilist_iterator &operator++() {
  159|  17.1M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  17.1M|    return *this;
  161|  17.1M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEdeEv:
  139|  15.4M|  reference operator*() const {
  140|  15.4M|    assert(!NodePtr->isKnownSentinel());
  141|  15.4M|    return *Access::getValuePtr(NodePtr);
  142|  15.4M|  }
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEES8_:
  149|  2.07M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  2.07M|    return LHS.NodePtr != RHS.NodePtr;
  151|  2.07M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEppEi:
  167|   103k|  ilist_iterator operator++(int) {
  168|   103k|    ilist_iterator tmp = *this;
  169|   103k|    ++*this;
  170|   103k|    return tmp;
  171|   103k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEppEv:
  158|  2.07M|  ilist_iterator &operator++() {
  159|  2.07M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  2.07M|    return *this;
  161|  2.07M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEdeEv:
  139|  2.06M|  reference operator*() const {
  140|  2.06M|    assert(!NodePtr->isKnownSentinel());
  141|  2.06M|    return *Access::getValuePtr(NodePtr);
  142|  2.06M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|    597|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb1ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|    605|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb1ELb0EEppEv:
  158|    605|  ilist_iterator &operator++() {
  159|    605|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|    605|    return *this;
  161|    605|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb1ELb0EEdeEv:
  139|    605|  reference operator*() const {
  140|    605|    assert(!NodePtr->isKnownSentinel());
  141|    605|    return *Access::getValuePtr(NodePtr);
  142|    605|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|  2.72k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEES9_:
  149|  4.98k|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  4.98k|    return LHS.NodePtr != RHS.NodePtr;
  151|  4.98k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEppEv:
  158|  4.98k|  ilist_iterator &operator++() {
  159|  4.98k|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  4.98k|    return *this;
  161|  4.98k|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEdeEv:
  139|  3.91k|  reference operator*() const {
  140|  3.91k|    assert(!NodePtr->isKnownSentinel());
  141|  3.91k|    return *Access::getValuePtr(NodePtr);
  142|  3.91k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEC2EPS5_:
   85|    597|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|  5.61M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEES8_:
  149|  15.6M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  15.6M|    return LHS.NodePtr != RHS.NodePtr;
  151|  15.6M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|  51.7M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEES8_:
  149|   151M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|   151M|    return LHS.NodePtr != RHS.NodePtr;
  151|   151M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|   111k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEC2EPS4_:
   85|  12.7M|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEES9_:
  149|   468k|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|   468k|    return LHS.NodePtr != RHS.NodePtr;
  151|   468k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEppEv:
  158|   468k|  ilist_iterator &operator++() {
  159|   468k|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|   468k|    return *this;
  161|   468k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEC2ERKNS_15ilist_node_implIS6_EE:
   83|   127k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|  13.4M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEdeEv:
  139|  7.29M|  reference operator*() const {
  140|  7.29M|    assert(!NodePtr->isKnownSentinel());
  141|  7.29M|    return *Access::getValuePtr(NodePtr);
  142|  7.29M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEppEi:
  167|  15.6M|  ilist_iterator operator++(int) {
  168|  15.6M|    ilist_iterator tmp = *this;
  169|  15.6M|    ++*this;
  170|  15.6M|    return tmp;
  171|  15.6M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb1EEC2ERKNS_15ilist_node_implIS5_EE:
   83|  1.48M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|  10.6M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEES8_:
  149|  3.80M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  3.80M|    return LHS.NodePtr != RHS.NodePtr;
  151|  3.80M|  }
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEES9_:
  149|  8.32M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  8.32M|    return LHS.NodePtr != RHS.NodePtr;
  151|  8.32M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb1ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|    604|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb1ELb0EEppEv:
  158|    604|  ilist_iterator &operator++() {
  159|    604|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|    604|    return *this;
  161|    604|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb1ELb0EEdeEv:
  139|    604|  reference operator*() const {
  140|    604|    assert(!NodePtr->isKnownSentinel());
  141|    604|    return *Access::getValuePtr(NodePtr);
  142|    604|  }
_ZN4llvheqERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEES9_:
  146|  20.4k|  friend bool operator==(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  147|  20.4k|    return LHS.NodePtr == RHS.NodePtr;
  148|  20.4k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb1EEC2ERKNS_15ilist_node_implIS5_EE:
   83|  1.48M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|  10.3M|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEppEi:
  167|   845k|  ilist_iterator operator++(int) {
  168|   845k|    ilist_iterator tmp = *this;
  169|   845k|    ++*this;
  170|   845k|    return tmp;
  171|   845k|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEptEv:
  143|  6.63M|  pointer operator->() const { return &operator*(); }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|   845k|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEC2EPS4_:
   85|   845k|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|   103k|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEC2EPS4_:
   85|   103k|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEC2EPS5_:
   85|  7.35M|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEppEi:
  167|  40.6k|  ilist_iterator operator++(int) {
  168|  40.6k|    ilist_iterator tmp = *this;
  169|  40.6k|    ++*this;
  170|  40.6k|    return tmp;
  171|  40.6k|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEdeEv:
  139|  20.3k|  reference operator*() const {
  140|  20.3k|    assert(!NodePtr->isKnownSentinel());
  141|  20.3k|    return *Access::getValuePtr(NodePtr);
  142|  20.3k|  }

_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getPrevEv:
   62|    604|  ilist_node_impl *getPrev() {
   63|    604|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   64|    604|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getNextEv:
   66|  9.61M|  ilist_node_impl *getNext() {
   67|  9.61M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  9.61M|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE5resetEv:
  244|  2.49M|  void reset() {
  245|  2.49M|    this->setPrev(this);
  246|  2.49M|    this->setNext(this);
  247|  2.49M|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7setPrevEPS7_:
   78|  2.49M|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7setNextEPS7_:
   79|  2.49M|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getPrevEv:
   62|  13.0M|  ilist_node_impl *getPrev() {
   63|  13.0M|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   64|  13.0M|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getNextEv:
   66|   148M|  ilist_node_impl *getNext() {
   67|   148M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|   148M|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getPrevEv:
   70|  12.2M|  const ilist_node_impl *getPrev() const {
   71|  12.2M|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|  12.2M|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getNextEv:
   74|  6.73M|  const ilist_node_impl *getNext() const {
   75|  6.73M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   76|  6.73M|  }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE5emptyEv:
  249|  10.7M|  bool empty() const { return this == this->getPrev(); }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS5_EE:
  225|   149M|  static pointer getValuePtr(node_type *N) {
  226|   149M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|   149M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS7_EE:
  178|   149M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|   149M|    return static_cast<typename OptionsT::pointer>(N);
  180|   149M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEE11getValuePtrEPKNS_15ilist_node_implIS5_EE:
  229|  1.48M|  static const_pointer getValuePtr(const node_type *N) {
  230|  1.48M|    return NodeAccess::getValuePtr<OptionsT>(N);
  231|  1.48M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEEENT_13const_pointerEPKNS_15ilist_node_implIS7_EE:
  184|  1.48M|  getValuePtr(const ilist_node_impl<OptionsT> *N) {
  185|  1.48M|    return static_cast<typename OptionsT::const_pointer>(N);
  186|  1.48M|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE7getNextEv:
   66|  17.1M|  ilist_node_impl *getNext() {
   67|  17.1M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  17.1M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS5_EE:
  225|  15.4M|  static pointer getValuePtr(node_type *N) {
  226|  15.4M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  15.4M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS7_EE:
  178|  15.4M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  15.4M|    return static_cast<typename OptionsT::pointer>(N);
  180|  15.4M|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE5resetEv:
  244|    196|  void reset() {
  245|    196|    this->setPrev(this);
  246|    196|    this->setNext(this);
  247|    196|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7setPrevEPS6_:
   78|    196|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7setNextEPS6_:
   79|    196|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7getNextEv:
   66|  2.07M|  ilist_node_impl *getNext() {
   67|  2.07M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  2.07M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEE10getNodePtrEPS4_:
  217|   310k|  static node_type *getNodePtr(pointer N) {
  218|   310k|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|   310k|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS8_7pointerE:
  167|   310k|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|   310k|    return N;
  169|   310k|  }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE5emptyEv:
  249|    196|  bool empty() const { return this == this->getPrev(); }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7getPrevEv:
   70|    196|  const ilist_node_impl *getPrev() const {
   71|    196|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|    196|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS5_EE:
  225|  2.06M|  static pointer getValuePtr(node_type *N) {
  226|  2.06M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  2.06M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS7_EE:
  178|  2.06M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  2.06M|    return static_cast<typename OptionsT::pointer>(N);
  180|  2.06M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEE10getNodePtrEPS4_:
  217|  33.4M|  static node_type *getNodePtr(pointer N) {
  218|  33.4M|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|  33.4M|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS8_7pointerE:
  167|  33.4M|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|  33.4M|    return N;
  169|  33.4M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE10getNodePtrEPS5_:
  217|  1.79k|  static node_type *getNodePtr(pointer N) {
  218|  1.79k|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|  1.79k|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS9_7pointerE:
  167|  1.79k|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|  1.79k|    return N;
  169|  1.79k|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEEC2Ev:
  239|    196|  ilist_sentinel() {
  240|    196|    this->initializeSentinel();
  241|    196|    reset();
  242|    196|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEEC2Ev:
   59|   103k|  ilist_node_impl() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEC2Ev:
  239|    160|  ilist_sentinel() {
  240|    160|    this->initializeSentinel();
  241|    160|    reset();
  242|    160|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEC2Ev:
   59|    757|  ilist_node_impl() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE5resetEv:
  244|    160|  void reset() {
  245|    160|    this->setPrev(this);
  246|    160|    this->setNext(this);
  247|    160|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7setPrevEPS7_:
   78|    160|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7setNextEPS7_:
   79|    160|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7getPrevEv:
   62|    605|  ilist_node_impl *getPrev() {
   63|    605|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   64|    605|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS6_EE:
  225|  4.52k|  static pointer getValuePtr(node_type *N) {
  226|  4.52k|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  4.52k|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS8_EE:
  178|  4.52k|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  4.52k|    return static_cast<typename OptionsT::pointer>(N);
  180|  4.52k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7getNextEv:
   66|  4.98k|  ilist_node_impl *getNext() {
   67|  4.98k|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  4.98k|  }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE5emptyEv:
  249|    605|  bool empty() const { return this == this->getPrev(); }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7getPrevEv:
   70|    605|  const ilist_node_impl *getPrev() const {
   71|    605|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|    605|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getNextEv:
   74|   468k|  const ilist_node_impl *getNext() const {
   75|   468k|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   76|   468k|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS6_EE:
  225|  7.29M|  static pointer getValuePtr(node_type *N) {
  226|  7.29M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  7.29M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS8_EE:
  178|  7.29M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  7.29M|    return static_cast<typename OptionsT::pointer>(N);
  180|  7.29M|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getPrevEv:
   70|    682|  const ilist_node_impl *getPrev() const {
   71|    682|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|    682|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE11getIteratorEv:
   82|  7.37M|  self_iterator getIterator() { return self_iterator(*this); }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE5emptyEv:
  249|    682|  bool empty() const { return this == this->getPrev(); }
_ZN4llvh22ilist_node_with_parentIN6hermes8FunctionENS1_6ModuleEJEEC2Ev:
  259|   103k|  ilist_node_with_parent() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEC2Ev:
  239|   103k|  ilist_sentinel() {
  240|   103k|    this->initializeSentinel();
  241|   103k|    reset();
  242|   103k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEC2Ev:
   59|   949k|  ilist_node_impl() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE5resetEv:
  244|   103k|  void reset() {
  245|   103k|    this->setPrev(this);
  246|   103k|    this->setNext(this);
  247|   103k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE7setPrevEPS6_:
   78|   103k|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE7setNextEPS6_:
   79|   103k|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh22ilist_node_with_parentIN6hermes10BasicBlockENS1_8FunctionEJEEC2Ev:
  259|   845k|  ilist_node_with_parent() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEEC2Ev:
  239|   845k|  ilist_sentinel() {
  240|   845k|    this->initializeSentinel();
  241|   845k|    reset();
  242|   845k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEEC2Ev:
   59|  11.2M|  ilist_node_impl() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE5resetEv:
  244|   845k|  void reset() {
  245|   845k|    this->setPrev(this);
  246|   845k|    this->setNext(this);
  247|   845k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7setPrevEPS6_:
   78|   845k|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7setNextEPS6_:
   79|   845k|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh22ilist_node_with_parentIN6hermes11InstructionENS1_10BasicBlockEJEEC2Ev:
  259|  10.3M|  ilist_node_with_parent() = default;
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE11getIteratorEv:
   82|  2.09k|  self_iterator getIterator() { return self_iterator(*this); }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE10getNodePtrEPS4_:
  217|  2.53M|  static node_type *getNodePtr(pointer N) {
  218|  2.53M|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|  2.53M|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS8_7pointerE:
  167|  2.53M|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|  2.53M|    return N;
  169|  2.53M|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEC2Ev:
  239|  2.49M|  ilist_sentinel() {
  240|  2.49M|    this->initializeSentinel();
  241|  2.49M|    reset();
  242|  2.49M|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEC2Ev:
   59|  16.7M|  ilist_node_impl() = default;
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE10getNodePtrEPS5_:
  217|  14.7M|  static node_type *getNodePtr(pointer N) {
  218|  14.7M|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|  14.7M|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS9_7pointerE:
  167|  14.7M|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|  14.7M|    return N;
  169|  14.7M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE11getValuePtrEPKNS_15ilist_node_implIS6_EE:
  229|  20.3k|  static const_pointer getValuePtr(const node_type *N) {
  230|  20.3k|    return NodeAccess::getValuePtr<OptionsT>(N);
  231|  20.3k|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEENT_13const_pointerEPKNS_15ilist_node_implIS8_EE:
  184|  20.3k|  getValuePtr(const ilist_node_impl<OptionsT> *N) {
  185|  20.3k|    return static_cast<typename OptionsT::const_pointer>(N);
  186|  20.3k|  }

_ZN4llvh15ilist_node_baseILb0EE7setPrevEPS1_:
   27|  65.8M|  void setPrev(ilist_node_base *Prev) { this->Prev = Prev; }
_ZN4llvh15ilist_node_baseILb0EE7setNextEPS1_:
   28|  65.8M|  void setNext(ilist_node_base *Next) { this->Next = Next; }
_ZNK4llvh15ilist_node_baseILb0EE7getPrevEv:
   29|  58.4M|  ilist_node_base *getPrev() const { return Prev; }
_ZNK4llvh15ilist_node_baseILb0EE7getNextEv:
   30|   195M|  ilist_node_base *getNext() const { return Next; }
_ZNK4llvh15ilist_node_baseILb0EE15isKnownSentinelEv:
   32|   176M|  bool isKnownSentinel() const { return false; }
_ZN4llvh15ilist_node_baseILb0EE18initializeSentinelEv:
   33|  3.44M|  void initializeSentinel() {}

_ZNK4llvh20iterator_facade_baseIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorENSt3__120forward_iterator_tagEPNS2_6GCCellElPS8_RS8_EneERKS4_:
  151|  16.4M|  bool operator!=(const DerivedT &RHS) const {
  152|  16.4M|    return !static_cast<const DerivedT *>(this)->operator==(RHS);
  153|  16.4M|  }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEENSt3__126random_access_iterator_tagES6_iPS6_SA_EppEv:
  126|   749k|  DerivedT &operator++() {
  127|   749k|    static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
  128|   749k|                  "Must pass the derived type to this template!");
  129|   749k|    return static_cast<DerivedT *>(this)->operator+=(1);
  130|   749k|  }
_ZNK4llvh20iterator_facade_baseINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEENSt3__126random_access_iterator_tagES6_iPS6_SA_EneERKS7_:
  151|  1.49M|  bool operator!=(const DerivedT &RHS) const {
  152|  1.49M|    return !static_cast<const DerivedT *>(this)->operator==(RHS);
  153|  1.49M|  }
_ZNK4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EneERKS5_:
  151|  7.97M|  bool operator!=(const DerivedT &RHS) const {
  152|  7.97M|    return !static_cast<const DerivedT *>(this)->operator==(RHS);
  153|  7.97M|  }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EppEv:
  126|  3.55M|  DerivedT &operator++() {
  127|  3.55M|    static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
  128|  3.55M|                  "Must pass the derived type to this template!");
  129|  3.55M|    return static_cast<DerivedT *>(this)->operator+=(1);
  130|  3.55M|  }
ESTreeIRGen-expr.cpp:_ZN4llvh20iterator_facade_baseINS_17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE13PropertyValueEENSt3__120forward_iterator_tagENS_14StringMapEntryIS8_EElPSD_RSD_EptEv:
  175|      3|  PointerT operator->() { return &static_cast<DerivedT *>(this)->operator*(); }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EmmEv:
  136|  1.17M|  DerivedT &operator--() {
  137|  1.17M|    static_assert(
  138|  1.17M|        IsBidirectional,
  139|  1.17M|        "The decrement operator is only defined for bidirectional iterators.");
  140|  1.17M|    return static_cast<DerivedT *>(this)->operator-=(1);
  141|  1.17M|  }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EppEi:
  131|  2.83M|  DerivedT operator++(int) {
  132|  2.83M|    DerivedT tmp = *static_cast<DerivedT *>(this);
  133|  2.83M|    ++*static_cast<DerivedT *>(this);
  134|  2.83M|    return tmp;
  135|  2.83M|  }
_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|     46|template <class T> iterator_range<T> make_range(T x, T y) {
   55|     46|  return iterator_range<T>(std::move(x), std::move(y));
   56|     46|}
_ZN4llvh10make_rangeIN6hermes2vm10NativeArgs15handle_iteratorEEENS_14iterator_rangeIT_EES6_S6_:
   54|     17|template <class T> iterator_range<T> make_range(T x, T y) {
   55|     17|  return iterator_range<T>(std::move(x), std::move(y));
   56|     17|}
_ZN4llvh14iterator_rangeIN6hermes2vm19StackFrameIteratorTILb0EEEEC2ES4_S4_:
   43|   391k|      : begin_iterator(std::move(begin_iterator)),
   44|   391k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIN6hermes2vm19StackFrameIteratorTILb0EEEE5beginEv:
   46|   391k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIN6hermes2vm19StackFrameIteratorTILb0EEEE3endEv:
   47|    373|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIN6hermes2vm10NativeArgs15handle_iteratorEEC2ES4_S4_:
   43|     17|      : begin_iterator(std::move(begin_iterator)),
   44|     17|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIN6hermes2vm10NativeArgs15handle_iteratorEE5beginEv:
   46|     17|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIN6hermes2vm10NativeArgs15handle_iteratorEE3endEv:
   47|     17|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorEEC2ES4_S4_:
   43|  1.06k|      : begin_iterator(std::move(begin_iterator)),
   44|  1.06k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorEE5beginEv:
   46|  1.06k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorEE3endEv:
   47|  1.06k|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeINSt3__111__wrap_iterIPKPN6hermes20GlobalObjectPropertyEEEEC2ES8_S8_:
   43|    392|      : begin_iterator(std::move(begin_iterator)),
   44|    392|        end_iterator(std::move(end_iterator)) {}
_ZN4llvh14iterator_rangeINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEEEC2ES7_S7_:
   43|   740k|      : begin_iterator(std::move(begin_iterator)),
   44|   740k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEEE5beginEv:
   46|   740k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEEE3endEv:
   47|   740k|  IteratorT end() const { return end_iterator; }
_ZNK4llvh14iterator_rangeINSt3__111__wrap_iterIPKPN6hermes20GlobalObjectPropertyEEEE5beginEv:
   46|    392|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINSt3__111__wrap_iterIPKPN6hermes20GlobalObjectPropertyEEEE3endEv:
   47|    392|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEEC2ES5_S5_:
   43|  1.12M|      : begin_iterator(std::move(begin_iterator)),
   44|  1.12M|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEE5beginEv:
   46|  1.12M|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEE3endEv:
   47|  1.12M|  IteratorT end() const { return end_iterator; }
_ZN4llvh10make_rangeINSt3__116reverse_iteratorIPKPN6hermes10BasicBlockEEEEENS_14iterator_rangeIT_EESA_SA_:
   54|   102k|template <class T> iterator_range<T> make_range(T x, T y) {
   55|   102k|  return iterator_range<T>(std::move(x), std::move(y));
   56|   102k|}
_ZN4llvh14iterator_rangeINSt3__116reverse_iteratorIPKPN6hermes10BasicBlockEEEEC2ES8_S8_:
   43|   102k|      : begin_iterator(std::move(begin_iterator)),
   44|   102k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorIPKPN6hermes10BasicBlockEEEE5beginEv:
   46|   102k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorIPKPN6hermes10BasicBlockEEEE3endEv:
   47|   102k|  IteratorT end() const { return end_iterator; }
_ZN4llvh10make_rangeINS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEEEENS_14iterator_rangeIT_EES9_S9_:
   54|   707k|template <class T> iterator_range<T> make_range(T x, T y) {
   55|   707k|  return iterator_range<T>(std::move(x), std::move(y));
   56|   707k|}
_ZN4llvh14iterator_rangeINS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEEEC2ES7_S7_:
   43|   707k|      : begin_iterator(std::move(begin_iterator)),
   44|   707k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEEE5beginEv:
   46|   707k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEEE3endEv:
   47|   707k|  IteratorT end() const { return end_iterator; }
_ZN4llvh10make_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEEENS_14iterator_rangeIT_EESA_SA_:
   54|  4.55k|template <class T> iterator_range<T> make_range(T x, T y) {
   55|  4.55k|  return iterator_range<T>(std::move(x), std::move(y));
   56|  4.55k|}
_ZN4llvh14iterator_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEEC2ES8_S8_:
   43|  4.55k|      : begin_iterator(std::move(begin_iterator)),
   44|  4.55k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEE5beginEv:
   46|  4.55k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEE3endEv:
   47|  4.55k|  IteratorT end() const { return end_iterator; }
_ZN4llvh10make_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEEENS_14iterator_rangeIT_EESA_SA_:
   54|   492k|template <class T> iterator_range<T> make_range(T x, T y) {
   55|   492k|  return iterator_range<T>(std::move(x), std::move(y));
   56|   492k|}
_ZN4llvh14iterator_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEEC2ES8_S8_:
   43|   492k|      : begin_iterator(std::move(begin_iterator)),
   44|   492k|        end_iterator(std::move(end_iterator)) {}
_ZN4llvh10make_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEEENS_14iterator_rangeIT_EES7_S7_:
   54|   492k|template <class T> iterator_range<T> make_range(T x, T y) {
   55|   492k|  return iterator_range<T>(std::move(x), std::move(y));
   56|   492k|}
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEE5beginEv:
   46|   492k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEE3endEv:
   47|   492k|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIPKN6hermes18SourceErrorManager11MessageDataEEC2ES5_S5_:
   43|     16|      : begin_iterator(std::move(begin_iterator)),
   44|     16|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIPKN6hermes18SourceErrorManager11MessageDataEE5beginEv:
   46|     16|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIPKN6hermes18SourceErrorManager11MessageDataEE3endEv:
   47|     16|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIPKhEC2ES2_S2_:
   43|     46|      : begin_iterator(std::move(begin_iterator)),
   44|     46|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIPKhE5beginEv:
   46|     46|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIPKhE3endEv:
   47|     46|  IteratorT end() const { return end_iterator; }

_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE3endEv:
  120|  11.0M|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6spliceENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS4_:
  239|  1.24M|  void splice(iterator I, simple_ilist &L2) {
  240|  1.24M|    splice(I, L2, L2.begin(), L2.end());
  241|  1.24M|  }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5beginEv:
  118|  2.42M|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6spliceENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS4_S9_S9_:
  249|  1.24M|  void splice(iterator I, simple_ilist &, iterator First, iterator Last) {
  250|  1.24M|    list_base_type::transferBefore(*I.getNodePtr(), *First.getNodePtr(),
  251|  1.24M|                                   *Last.getNodePtr());
  252|  1.24M|  }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE5beginEv:
  118|  18.7M|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE3endEv:
  120|  25.6M|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE6rbeginEv:
  122|  9.91M|  reverse_iterator rbegin() { return ++reverse_iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE4rendEv:
  126|   707k|  reverse_iterator rend() { return reverse_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE5beginEv:
  119|   740k|  const_iterator begin() const { return ++const_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE3endEv:
  121|   740k|  const_iterator end() const { return const_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE6rbeginEv:
  123|  1.48M|  const_reverse_iterator rbegin() const {
  124|  1.48M|    return ++const_reverse_iterator(Sentinel);
  125|  1.48M|  }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE4sizeEv:
  135|   740k|  LLVM_NODISCARD size_type size() const {
  136|   740k|    return std::distance(begin(), end());
  137|   740k|  }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE5emptyEv:
  132|  10.7M|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE5frontEv:
  139|   740k|  reference front() { return *begin(); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE4backEv:
  141|  9.20M|  reference back() { return *rbegin(); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE4backEv:
  142|  1.48M|  const_reference back() const { return *rbegin(); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE5beginEv:
  118|  3.11M|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE3endEv:
  120|  2.49M|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE5frontEv:
  139|  1.15M|  reference front() { return *begin(); }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE6removeERS2_:
  184|   103k|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZNK4llvh12simple_ilistIN6hermes8FunctionEJEE5emptyEv:
  132|    196|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE5beginEv:
  118|  4.11k|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE3endEv:
  120|   107k|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE9push_backERS3_:
  148|    597|  void push_back(reference Node) { insert(end(), Node); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE3endEv:
  120|  1.66k|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS3_:
  160|    597|  iterator insert(iterator I, reference Node) {
  161|    597|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|    597|    return iterator(&Node);
  163|    597|  }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEEC2Ev:
  103|    196|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEEC2Ev:
  103|    160|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE4backEv:
  141|    605|  reference back() { return *rbegin(); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE6rbeginEv:
  122|    605|  reverse_iterator rbegin() { return ++reverse_iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE5beginEv:
  118|  1.06k|  iterator begin() { return ++iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE5emptyEv:
  132|    605|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE6removeERS3_:
  184|    597|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE4sizeEv:
  135|  41.2k|  LLVM_NODISCARD size_type size() const {
  136|  41.2k|    return std::distance(begin(), end());
  137|  41.2k|  }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5beginEv:
  119|  63.6k|  const_iterator begin() const { return ++const_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE3endEv:
  121|  63.6k|  const_iterator end() const { return const_iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5frontEv:
  139|    156|  reference front() { return *begin(); }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5emptyEv:
  132|    682|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE4backEv:
  141|    604|  reference back() { return *rbegin(); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6rbeginEv:
  122|    604|  reverse_iterator rbegin() { return ++reverse_iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE6removeERS2_:
  184|  10.3M|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEEC2Ev:
  103|   103k|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEEC2Ev:
  103|   845k|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS2_Lb0ELb0EvEELb0ELb0EEERS2_:
  160|  10.3M|  iterator insert(iterator I, reference Node) {
  161|  10.3M|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|  10.3M|    return iterator(&Node);
  163|  10.3M|  }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE6removeERS2_:
  184|   845k|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS2_Lb0ELb0EvEELb0ELb0EEERS2_:
  160|   845k|  iterator insert(iterator I, reference Node) {
  161|   845k|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|   845k|    return iterator(&Node);
  163|   845k|  }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS2_Lb0ELb0EvEELb0ELb0EEERS2_:
  160|   103k|  iterator insert(iterator I, reference Node) {
  161|   103k|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|   103k|    return iterator(&Node);
  163|   103k|  }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEEC2Ev:
  103|  1.24M|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEEC2EOS4_:
  111|  1.24M|  simple_ilist(simple_ilist &&X) { splice(end(), X); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE9push_backERS3_:
  148|  7.35M|  void push_back(reference Node) { insert(end(), Node); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS3_:
  160|  7.35M|  iterator insert(iterator I, reference Node) {
  161|  7.35M|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|  7.35M|    return iterator(&Node);
  163|  7.35M|  }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6removeERS3_:
  184|  40.6k|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }

_ZNK4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEeqERKS6_:
  200|  1.49M|  inline bool operator==(const Self &x) const { return Idx == x.Idx; }
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEpLEi:
  217|   749k|  inline Self &operator+=(int RHS) {
  218|   749k|    int NewIdx = Idx + RHS;
  219|   749k|    assert(index_is_valid(NewIdx) && "Iterator index out of bound");
  220|   749k|    Idx = NewIdx;
  221|   749k|    return *this;
  222|   749k|  }
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEE14index_is_validEi:
  151|   749k|  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|   749k|    return Idx >= 0 && (Idx == 0 || Idx <= (int)Inst->getNumSuccessors());
  ------------------
  |  Branch (154:12): [True: 749k, False: 0]
  |  Branch (154:25): [True: 0, False: 749k]
  |  Branch (154:37): [True: 749k, False: 0]
  ------------------
  155|   749k|  }
_ZNK4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEdeEv:
  202|   749k|  inline BlockT *operator*() const { return Inst->getSuccessor(Idx); }
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEC2EPS3_:
  181|   740k|  explicit inline SuccIterator(InstructionT *Inst) : Inst(Inst), Idx(0) {}
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEC2EPS3_b:
  183|   740k|  inline SuccIterator(InstructionT *Inst, bool) : Inst(Inst) {
  184|   740k|    if (Inst)
  ------------------
  |  Branch (184:9): [True: 740k, False: 0]
  ------------------
  185|   740k|      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|   740k|  }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEC2EPS2_:
  181|  3.83M|  explicit inline SuccIterator(InstructionT *Inst) : Inst(Inst), Idx(0) {}
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEC2EPS2_b:
  183|  3.83M|  inline SuccIterator(InstructionT *Inst, bool) : Inst(Inst) {
  184|  3.83M|    if (Inst)
  ------------------
  |  Branch (184:9): [True: 3.83M, False: 0]
  ------------------
  185|  3.83M|      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|  3.83M|  }
_ZNK4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEeqERKS4_:
  200|  7.97M|  inline bool operator==(const Self &x) const { return Idx == x.Idx; }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEpLEi:
  217|  4.73M|  inline Self &operator+=(int RHS) {
  218|  4.73M|    int NewIdx = Idx + RHS;
  219|  4.73M|    assert(index_is_valid(NewIdx) && "Iterator index out of bound");
  220|  4.73M|    Idx = NewIdx;
  221|  4.73M|    return *this;
  222|  4.73M|  }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEE14index_is_validEi:
  151|  4.73M|  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|  4.73M|    return Idx >= 0 && (Idx == 0 || Idx <= (int)Inst->getNumSuccessors());
  ------------------
  |  Branch (154:12): [True: 4.73M, False: 0]
  |  Branch (154:25): [True: 945k, False: 3.78M]
  |  Branch (154:37): [True: 3.78M, False: 0]
  ------------------
  155|  4.73M|  }
_ZNK4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEdeEv:
  202|  4.14M|  inline BlockT *operator*() const { return Inst->getSuccessor(Idx); }
_ZNK4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEmiERKS4_:
  212|   492k|  int operator-(const Self &RHS) const {
  213|   492k|    assert(Inst == RHS.Inst && "Cannot compare iterators of different blocks!");
  214|   492k|    return Idx - RHS.Idx;
  215|   492k|  }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEmIEi:
  224|  1.17M|  inline Self &operator-=(int RHS) { return operator+=(-RHS); }

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

_ZN4llvh4castIN6hermes2vm15StringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  11.4M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  11.4M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  11.4M|  return cast_convert_val<X, Y*,
  257|  11.4M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  11.4M|}
_ZN4llvh3isaIN6hermes2vm15StringPrimitiveEPNS2_6GCCellEEEbRKT0_:
  142|  13.4M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  13.4M|  return isa_impl_wrap<X, const Y,
  144|  13.4M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  13.4M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15StringPrimitiveEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  13.4M|  static bool doit(const From &Val) {
  123|  13.4M|    return isa_impl_wrap<To, SimpleFrom,
  124|  13.4M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  13.4M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  13.4M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15StringPrimitiveEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  13.4M|  static bool doit(const FromTy &Val) {
  133|  13.4M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  13.4M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15StringPrimitiveEPKNS2_6GCCellEE4doitES6_:
  105|  13.4M|  static inline bool doit(const From *Val) {
  106|  13.4M|    assert(Val && "isa<> used on a null pointer");
  107|  13.4M|    return isa_impl<To, From>::doit(*Val);
  108|  13.4M|  }
_ZN4llvh8isa_implIN6hermes2vm15StringPrimitiveENS2_6GCCellEvE4doitERKS4_:
   58|  13.4M|  static inline bool doit(const From &Val) {
   59|  13.4M|    return To::classof(&Val);
   60|  13.4M|  }
_ZN4llvh13simplify_typeIKPN6hermes2vm6GCCellEE18getSimplifiedValueERS5_:
   48|   179M|  static RetType getSimplifiedValue(const From& Val) {
   49|   179M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   179M|  }
_ZN4llvh13simplify_typeIPN6hermes2vm6GCCellEE18getSimplifiedValueERS4_:
   38|   179M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes2vm15StringPrimitiveEPNS2_6GCCellES5_E4doitERKS5_:
  218|  11.4M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  11.4M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  11.4M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  11.4M|    return Res2;
  222|  11.4M|  }
_ZN4llvh4castIN6hermes2vm23ExternalStringPrimitiveIcEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|     93|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     93|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     93|  return cast_convert_val<X, Y*,
  257|     93|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     93|}
_ZN4llvh3isaIN6hermes2vm23ExternalStringPrimitiveIcEEPKNS2_6GCCellEEEbRKT0_:
  142|     93|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     93|  return isa_impl_wrap<X, const Y,
  144|     93|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     93|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIcEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|     93|  static bool doit(const From &Val) {
  123|     93|    return isa_impl_wrap<To, SimpleFrom,
  124|     93|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     93|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     93|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIcEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|    121|  static bool doit(const FromTy &Val) {
  133|    121|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    121|  }
_ZN4llvh11isa_impl_clIN6hermes2vm23ExternalStringPrimitiveIcEEPKNS2_6GCCellEE4doitES7_:
  105|    121|  static inline bool doit(const From *Val) {
  106|    121|    assert(Val && "isa<> used on a null pointer");
  107|    121|    return isa_impl<To, From>::doit(*Val);
  108|    121|  }
_ZN4llvh8isa_implIN6hermes2vm23ExternalStringPrimitiveIcEENS2_6GCCellEvE4doitERKS5_:
   58|    121|  static inline bool doit(const From &Val) {
   59|    121|    return To::classof(&Val);
   60|    121|  }
_ZN4llvh13simplify_typeIKPKN6hermes2vm6GCCellEE18getSimplifiedValueERS6_:
   48|  33.0M|  static RetType getSimplifiedValue(const From& Val) {
   49|  33.0M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  33.0M|  }
_ZN4llvh13simplify_typeIPKN6hermes2vm6GCCellEE18getSimplifiedValueERS5_:
   38|  33.0M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes2vm23ExternalStringPrimitiveIcEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|     93|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     93|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     93|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     93|    return Res2;
  222|     93|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellEEEbRKT0_:
  142|  22.4M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  22.4M|  return isa_impl_wrap<X, const Y,
  144|  22.4M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  22.4M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|  22.4M|  static bool doit(const From &Val) {
  123|  22.4M|    return isa_impl_wrap<To, SimpleFrom,
  124|  22.4M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  22.4M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  22.4M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  24.8M|  static bool doit(const FromTy &Val) {
  133|  24.8M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  24.8M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellEE4doitES7_:
  105|  24.8M|  static inline bool doit(const From *Val) {
  106|  24.8M|    assert(Val && "isa<> used on a null pointer");
  107|  24.8M|    return isa_impl<To, From>::doit(*Val);
  108|  24.8M|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS2_6GCCellEvE4doitERKS5_:
   58|  24.8M|  static inline bool doit(const From &Val) {
   59|  24.8M|    return To::classof(&Val);
   60|  24.8M|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|  9.64M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  9.64M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  9.64M|  return cast_convert_val<X, Y*,
  257|  9.64M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  9.64M|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|  9.64M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  9.64M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  9.64M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  9.64M|    return Res2;
  222|  9.64M|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellEEEbRKT0_:
  142|  6.38M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.38M|  return isa_impl_wrap<X, const Y,
  144|  6.38M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.38M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|  6.38M|  static bool doit(const From &Val) {
  123|  6.38M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.38M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.38M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.38M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  8.72M|  static bool doit(const FromTy &Val) {
  133|  8.72M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  8.72M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellEE4doitES7_:
  105|  8.72M|  static inline bool doit(const From *Val) {
  106|  8.72M|    assert(Val && "isa<> used on a null pointer");
  107|  8.72M|    return isa_impl<To, From>::doit(*Val);
  108|  8.72M|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS2_6GCCellEvE4doitERKS5_:
   58|  8.72M|  static inline bool doit(const From &Val) {
   59|  8.72M|    return To::classof(&Val);
   60|  8.72M|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|  3.19M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.19M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  3.19M|  return cast_convert_val<X, Y*,
  257|  3.19M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.19M|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|  3.19M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.19M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.19M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.19M|    return Res2;
  222|  3.19M|  }
_ZN4llvh4castIN6hermes2vm23ExternalStringPrimitiveIcEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|     28|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     28|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     28|  return cast_convert_val<X, Y*,
  257|     28|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     28|}
_ZN4llvh3isaIN6hermes2vm23ExternalStringPrimitiveIcEEPNS2_6GCCellEEEbRKT0_:
  142|     28|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     28|  return isa_impl_wrap<X, const Y,
  144|     28|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     28|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIcEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|     28|  static bool doit(const From &Val) {
  123|     28|    return isa_impl_wrap<To, SimpleFrom,
  124|     28|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     28|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     28|  }
_ZN4llvh16cast_convert_valIN6hermes2vm23ExternalStringPrimitiveIcEEPNS2_6GCCellES6_E4doitERKS6_:
  218|     28|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     28|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     28|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     28|    return Res2;
  222|     28|  }
_ZN4llvh4castIN6hermes2vm23ExternalStringPrimitiveIDsEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   213k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   213k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   213k|  return cast_convert_val<X, Y*,
  257|   213k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   213k|}
_ZN4llvh3isaIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellEEEbRKT0_:
  142|   213k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   213k|  return isa_impl_wrap<X, const Y,
  144|   213k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   213k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIDsEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|   213k|  static bool doit(const From &Val) {
  123|   213k|    return isa_impl_wrap<To, SimpleFrom,
  124|   213k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   213k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   213k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|   306k|  static bool doit(const FromTy &Val) {
  133|   306k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   306k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellEE4doitES7_:
  105|   306k|  static inline bool doit(const From *Val) {
  106|   306k|    assert(Val && "isa<> used on a null pointer");
  107|   306k|    return isa_impl<To, From>::doit(*Val);
  108|   306k|  }
_ZN4llvh8isa_implIN6hermes2vm23ExternalStringPrimitiveIDsEENS2_6GCCellEvE4doitERKS5_:
   58|   306k|  static inline bool doit(const From &Val) {
   59|   306k|    return To::classof(&Val);
   60|   306k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|   213k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   213k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   213k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   213k|    return Res2;
  222|   213k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_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_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEKPKNS2_6GCCellES7_E4doitERS8_:
  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_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  2.56M|  static bool doit(const FromTy &Val) {
  133|  2.56M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.56M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_6GCCellEE4doitES7_:
  105|  2.56M|  static inline bool doit(const From *Val) {
  106|  2.56M|    assert(Val && "isa<> used on a null pointer");
  107|  2.56M|    return isa_impl<To, From>::doit(*Val);
  108|  2.56M|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS2_6GCCellEvE4doitERKS5_:
   58|  2.56M|  static inline bool doit(const From &Val) {
   59|  2.56M|    return To::classof(&Val);
   60|  2.56M|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   391k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   391k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   391k|  return cast_convert_val<X, Y*,
  257|   391k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   391k|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|   391k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   391k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   391k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   391k|    return Res2;
  222|   391k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_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_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEKPKNS2_6GCCellES7_E4doitERS8_:
  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_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  2.56M|  static bool doit(const FromTy &Val) {
  133|  2.56M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.56M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_6GCCellEE4doitES7_:
  105|  2.56M|  static inline bool doit(const From *Val) {
  106|  2.56M|    assert(Val && "isa<> used on a null pointer");
  107|  2.56M|    return isa_impl<To, From>::doit(*Val);
  108|  2.56M|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS2_6GCCellEvE4doitERKS5_:
   58|  2.56M|  static inline bool doit(const From &Val) {
   59|  2.56M|    return To::classof(&Val);
   60|  2.56M|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   781k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   781k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   781k|  return cast_convert_val<X, Y*,
  257|   781k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   781k|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|   781k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   781k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   781k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   781k|    return Res2;
  222|   781k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm23BufferedStringPrimitiveIDsEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|     89|  static bool doit(const FromTy &Val) {
  133|     89|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     89|  }
_ZN4llvh11isa_impl_clIN6hermes2vm23BufferedStringPrimitiveIDsEEPKNS2_6GCCellEE4doitES7_:
  105|     89|  static inline bool doit(const From *Val) {
  106|     89|    assert(Val && "isa<> used on a null pointer");
  107|     89|    return isa_impl<To, From>::doit(*Val);
  108|     89|  }
_ZN4llvh8isa_implIN6hermes2vm23BufferedStringPrimitiveIDsEENS2_6GCCellEvE4doitERKS5_:
   58|     89|  static inline bool doit(const From &Val) {
   59|     89|    return To::classof(&Val);
   60|     89|  }
_ZN4llvh4castIN6hermes2vm23ExternalStringPrimitiveIDsEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  92.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  92.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  92.4k|  return cast_convert_val<X, Y*,
  257|  92.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  92.4k|}
_ZN4llvh3isaIN6hermes2vm23ExternalStringPrimitiveIDsEEPNS2_6GCCellEEEbRKT0_:
  142|  92.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  92.4k|  return isa_impl_wrap<X, const Y,
  144|  92.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  92.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIDsEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|  92.4k|  static bool doit(const From &Val) {
  123|  92.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  92.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  92.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  92.4k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm23ExternalStringPrimitiveIDsEEPNS2_6GCCellES6_E4doitERKS6_:
  218|  92.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  92.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  92.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  92.4k|    return Res2;
  222|  92.4k|  }
_ZN4llvh4castIN6hermes2vm11HiddenClassENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  24.7M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  24.7M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  24.7M|  return cast_convert_val<X, Y*,
  257|  24.7M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  24.7M|}
_ZN4llvh3isaIN6hermes2vm11HiddenClassEPNS2_6GCCellEEEbRKT0_:
  142|  27.1M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  27.1M|  return isa_impl_wrap<X, const Y,
  144|  27.1M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  27.1M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm11HiddenClassEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  27.1M|  static bool doit(const From &Val) {
  123|  27.1M|    return isa_impl_wrap<To, SimpleFrom,
  124|  27.1M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  27.1M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  27.1M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm11HiddenClassEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  27.1M|  static bool doit(const FromTy &Val) {
  133|  27.1M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  27.1M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm11HiddenClassEPKNS2_6GCCellEE4doitES6_:
  105|  27.1M|  static inline bool doit(const From *Val) {
  106|  27.1M|    assert(Val && "isa<> used on a null pointer");
  107|  27.1M|    return isa_impl<To, From>::doit(*Val);
  108|  27.1M|  }
_ZN4llvh8isa_implIN6hermes2vm11HiddenClassENS2_6GCCellEvE4doitERKS4_:
   58|  27.1M|  static inline bool doit(const From &Val) {
   59|  27.1M|    return To::classof(&Val);
   60|  27.1M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm11HiddenClassEPNS2_6GCCellES5_E4doitERKS5_:
  218|  24.7M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  24.7M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  24.7M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  24.7M|    return Res2;
  222|  24.7M|  }
_ZN4llvh4castIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|  5.77M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  5.77M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  5.77M|  return cast_convert_val<X, Y*,
  257|  5.77M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  5.77M|}
_ZN4llvh3isaIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPNS2_6GCCellEEEbRKT0_:
  142|  5.78M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.78M|  return isa_impl_wrap<X, const Y,
  144|  5.78M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.78M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|  5.78M|  static bool doit(const From &Val) {
  123|  5.78M|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.78M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.78M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.78M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|  5.78M|  static bool doit(const FromTy &Val) {
  133|  5.78M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.78M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPKNS2_6GCCellEE4doitES8_:
  105|  5.78M|  static inline bool doit(const From *Val) {
  106|  5.78M|    assert(Val && "isa<> used on a null pointer");
  107|  5.78M|    return isa_impl<To, From>::doit(*Val);
  108|  5.78M|  }
_ZN4llvh8isa_implIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEENS2_6GCCellEvE4doitERKS6_:
   58|  5.78M|  static inline bool doit(const From &Val) {
   59|  5.78M|    return To::classof(&Val);
   60|  5.78M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|  5.77M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  5.77M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  5.77M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  5.77M|    return Res2;
  222|  5.77M|  }
_ZN4llvh4castIN6hermes2vm7JSArrayENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.76M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.76M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.76M|  return cast_convert_val<X, Y*,
  257|  1.76M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.76M|}
_ZN4llvh3isaIN6hermes2vm7JSArrayEPNS2_6GCCellEEEbRKT0_:
  142|  4.46M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.46M|  return isa_impl_wrap<X, const Y,
  144|  4.46M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.46M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSArrayEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  4.46M|  static bool doit(const From &Val) {
  123|  4.46M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.46M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.46M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.46M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSArrayEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  4.46M|  static bool doit(const FromTy &Val) {
  133|  4.46M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.46M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm7JSArrayEPKNS2_6GCCellEE4doitES6_:
  105|  4.46M|  static inline bool doit(const From *Val) {
  106|  4.46M|    assert(Val && "isa<> used on a null pointer");
  107|  4.46M|    return isa_impl<To, From>::doit(*Val);
  108|  4.46M|  }
_ZN4llvh8isa_implIN6hermes2vm7JSArrayENS2_6GCCellEvE4doitERKS4_:
   58|  4.46M|  static inline bool doit(const From &Val) {
   59|  4.46M|    return To::classof(&Val);
   60|  4.46M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm7JSArrayEPNS2_6GCCellES5_E4doitERKS5_:
  218|  1.76M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.76M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.76M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.76M|    return Res2;
  222|  1.76M|  }
_ZN4llvh3isaIN6hermes2vm8JSObjectEPNS2_6GCCellEEEbRKT0_:
  142|  21.0M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  21.0M|  return isa_impl_wrap<X, const Y,
  144|  21.0M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  21.0M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSObjectEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  21.0M|  static bool doit(const From &Val) {
  123|  21.0M|    return isa_impl_wrap<To, SimpleFrom,
  124|  21.0M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  21.0M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  21.0M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSObjectEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  21.0M|  static bool doit(const FromTy &Val) {
  133|  21.0M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  21.0M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSObjectEPKNS2_6GCCellEE4doitES6_:
  105|  21.0M|  static inline bool doit(const From *Val) {
  106|  21.0M|    assert(Val && "isa<> used on a null pointer");
  107|  21.0M|    return isa_impl<To, From>::doit(*Val);
  108|  21.0M|  }
_ZN4llvh8isa_implIN6hermes2vm8JSObjectENS2_6GCCellEvE4doitERKS4_:
   58|  21.0M|  static inline bool doit(const From &Val) {
   59|  21.0M|    return To::classof(&Val);
   60|  21.0M|  }
_ZN4llvh4castIN6hermes2vm8JSObjectENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  17.6M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  17.6M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  17.6M|  return cast_convert_val<X, Y*,
  257|  17.6M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  17.6M|}
_ZN4llvh16cast_convert_valIN6hermes2vm8JSObjectEPNS2_6GCCellES5_E4doitERKS5_:
  218|  17.6M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  17.6M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  17.6M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  17.6M|    return Res2;
  222|  17.6M|  }
_ZN4llvh12cast_or_nullIN6hermes2vm11EnvironmentENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  4.11k|cast_or_null(Y *Val) {
  298|  4.11k|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 1.07k, False: 3.04k]
  ------------------
  299|  3.04k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|  3.04k|  return cast<X>(Val);
  301|  3.04k|}
_ZN4llvh3isaIN6hermes2vm11EnvironmentEPNS2_6GCCellEEEbRKT0_:
  142|  19.9k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  19.9k|  return isa_impl_wrap<X, const Y,
  144|  19.9k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  19.9k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm11EnvironmentEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  19.9k|  static bool doit(const From &Val) {
  123|  19.9k|    return isa_impl_wrap<To, SimpleFrom,
  124|  19.9k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  19.9k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  19.9k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm11EnvironmentEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  19.9k|  static bool doit(const FromTy &Val) {
  133|  19.9k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  19.9k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm11EnvironmentEPKNS2_6GCCellEE4doitES6_:
  105|  19.9k|  static inline bool doit(const From *Val) {
  106|  19.9k|    assert(Val && "isa<> used on a null pointer");
  107|  19.9k|    return isa_impl<To, From>::doit(*Val);
  108|  19.9k|  }
_ZN4llvh8isa_implIN6hermes2vm11EnvironmentENS2_6GCCellEvE4doitERKS4_:
   58|  19.9k|  static inline bool doit(const From &Val) {
   59|  19.9k|    return To::classof(&Val);
   60|  19.9k|  }
_ZN4llvh4castIN6hermes2vm11EnvironmentENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  16.9k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  16.9k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  16.9k|  return cast_convert_val<X, Y*,
  257|  16.9k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  16.9k|}
_ZN4llvh16cast_convert_valIN6hermes2vm11EnvironmentEPNS2_6GCCellES5_E4doitERKS5_:
  218|  16.9k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  16.9k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  16.9k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  16.9k|    return Res2;
  222|  16.9k|  }
_ZN4llvh4castIN6hermes2vm8CallableENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  4.96k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.96k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  4.96k|  return cast_convert_val<X, Y*,
  257|  4.96k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.96k|}
_ZN4llvh3isaIN6hermes2vm8CallableEPNS2_6GCCellEEEbRKT0_:
  142|  3.02M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.02M|  return isa_impl_wrap<X, const Y,
  144|  3.02M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.02M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8CallableEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  3.02M|  static bool doit(const From &Val) {
  123|  3.02M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.02M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.02M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.02M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8CallableEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  3.02M|  static bool doit(const FromTy &Val) {
  133|  3.02M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.02M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8CallableEPKNS2_6GCCellEE4doitES6_:
  105|  3.02M|  static inline bool doit(const From *Val) {
  106|  3.02M|    assert(Val && "isa<> used on a null pointer");
  107|  3.02M|    return isa_impl<To, From>::doit(*Val);
  108|  3.02M|  }
_ZN4llvh8isa_implIN6hermes2vm8CallableENS2_6GCCellEvE4doitERKS4_:
   58|  3.02M|  static inline bool doit(const From &Val) {
   59|  3.02M|    return To::classof(&Val);
   60|  3.02M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm8CallableEPNS2_6GCCellES5_E4doitERKS5_:
  218|  4.96k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.96k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.96k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.96k|    return Res2;
  222|  4.96k|  }
_ZN4llvh12cast_or_nullIN6hermes2vm8JSObjectENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  5.51M|cast_or_null(Y *Val) {
  298|  5.51M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 2.11M, False: 3.40M]
  ------------------
  299|  3.40M|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|  3.40M|  return cast<X>(Val);
  301|  3.40M|}
_ZN4llvh4castIN6hermes2vm10HostObjectENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   390k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   390k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   390k|  return cast_convert_val<X, Y*,
  257|   390k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   390k|}
_ZN4llvh3isaIN6hermes2vm10HostObjectEPNS2_6GCCellEEEbRKT0_:
  142|   390k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   390k|  return isa_impl_wrap<X, const Y,
  144|   390k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   390k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm10HostObjectEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   390k|  static bool doit(const From &Val) {
  123|   390k|    return isa_impl_wrap<To, SimpleFrom,
  124|   390k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   390k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   390k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm10HostObjectEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   390k|  static bool doit(const FromTy &Val) {
  133|   390k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   390k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm10HostObjectEPKNS2_6GCCellEE4doitES6_:
  105|   390k|  static inline bool doit(const From *Val) {
  106|   390k|    assert(Val && "isa<> used on a null pointer");
  107|   390k|    return isa_impl<To, From>::doit(*Val);
  108|   390k|  }
_ZN4llvh8isa_implIN6hermes2vm10HostObjectENS2_6GCCellEvE4doitERKS4_:
   58|   390k|  static inline bool doit(const From &Val) {
   59|   390k|    return To::classof(&Val);
   60|   390k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm10HostObjectEPNS2_6GCCellES5_E4doitERKS5_:
  218|   390k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   390k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   390k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   390k|    return Res2;
  222|   390k|  }
_ZN4llvh4castIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEE7SegmentENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESB_:
  254|  8.99M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  8.99M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  8.99M|  return cast_convert_val<X, Y*,
  257|  8.99M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  8.99M|}
_ZN4llvh3isaIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEE7SegmentEPNS2_6GCCellEEEbRKT0_:
  142|  8.99M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  8.99M|  return isa_impl_wrap<X, const Y,
  144|  8.99M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  8.99M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEE7SegmentEKPNS2_6GCCellEPKS7_E4doitERS9_:
  122|  8.99M|  static bool doit(const From &Val) {
  123|  8.99M|    return isa_impl_wrap<To, SimpleFrom,
  124|  8.99M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  8.99M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  8.99M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEE7SegmentEPKNS2_6GCCellES9_E4doitERKS9_:
  132|  8.99M|  static bool doit(const FromTy &Val) {
  133|  8.99M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  8.99M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEE7SegmentEPKNS2_6GCCellEE4doitES9_:
  105|  8.99M|  static inline bool doit(const From *Val) {
  106|  8.99M|    assert(Val && "isa<> used on a null pointer");
  107|  8.99M|    return isa_impl<To, From>::doit(*Val);
  108|  8.99M|  }
_ZN4llvh8isa_implIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEE7SegmentENS2_6GCCellEvE4doitERKS7_:
   58|  8.99M|  static inline bool doit(const From &Val) {
   59|  8.99M|    return To::classof(&Val);
   60|  8.99M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEE7SegmentEPNS2_6GCCellES8_E4doitERKS8_:
  218|  8.99M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  8.99M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  8.99M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  8.99M|    return Res2;
  222|  8.99M|  }
_ZN4llvh12cast_or_nullIN6hermes2vm15StringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  1.73M|cast_or_null(Y *Val) {
  298|  1.73M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 58.1k, False: 1.68M]
  ------------------
  299|  1.68M|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|  1.68M|  return cast<X>(Val);
  301|  1.68M|}
_ZN4llvh4castIN6hermes13LiteralStringENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.09M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.09M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.09M|  return cast_convert_val<X, Y*,
  257|  2.09M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.09M|}
_ZN4llvh3isaIN6hermes13LiteralStringEPNS1_5ValueEEEbRKT0_:
  142|  15.2M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  15.2M|  return isa_impl_wrap<X, const Y,
  144|  15.2M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  15.2M|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  15.2M|  static bool doit(const From &Val) {
  123|  15.2M|    return isa_impl_wrap<To, SimpleFrom,
  124|  15.2M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  15.2M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  15.2M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEPKNS1_5ValueES5_E4doitERKS5_:
  132|  15.2M|  static bool doit(const FromTy &Val) {
  133|  15.2M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  15.2M|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralStringEPKNS1_5ValueEE4doitES5_:
  105|  15.2M|  static inline bool doit(const From *Val) {
  106|  15.2M|    assert(Val && "isa<> used on a null pointer");
  107|  15.2M|    return isa_impl<To, From>::doit(*Val);
  108|  15.2M|  }
_ZN4llvh8isa_implIN6hermes13LiteralStringENS1_5ValueEvE4doitERKS3_:
   58|  15.2M|  static inline bool doit(const From &Val) {
   59|  15.2M|    return To::classof(&Val);
   60|  15.2M|  }
_ZN4llvh13simplify_typeIKPN6hermes5ValueEE18getSimplifiedValueERS4_:
   48|   252M|  static RetType getSimplifiedValue(const From& Val) {
   49|   252M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   252M|  }
_ZN4llvh13simplify_typeIPN6hermes5ValueEE18getSimplifiedValueERS3_:
   38|   252M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes13LiteralStringEPNS1_5ValueES4_E4doitERKS4_:
  218|  2.09M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.09M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.09M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.09M|    return Res2;
  222|  2.09M|  }
_ZN4llvh4castIN6hermes9ScopeDescENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   621k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   621k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   621k|  return cast_convert_val<X, Y*,
  257|   621k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   621k|}
_ZN4llvh3isaIN6hermes9ScopeDescEPNS1_5ValueEEEbRKT0_:
  142|   621k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   621k|  return isa_impl_wrap<X, const Y,
  144|   621k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   621k|}
_ZN4llvh13isa_impl_wrapIN6hermes9ScopeDescEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   621k|  static bool doit(const From &Val) {
  123|   621k|    return isa_impl_wrap<To, SimpleFrom,
  124|   621k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   621k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   621k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ScopeDescEPKNS1_5ValueES5_E4doitERKS5_:
  132|   621k|  static bool doit(const FromTy &Val) {
  133|   621k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   621k|  }
_ZN4llvh11isa_impl_clIN6hermes9ScopeDescEPKNS1_5ValueEE4doitES5_:
  105|   621k|  static inline bool doit(const From *Val) {
  106|   621k|    assert(Val && "isa<> used on a null pointer");
  107|   621k|    return isa_impl<To, From>::doit(*Val);
  108|   621k|  }
_ZN4llvh8isa_implIN6hermes9ScopeDescENS1_5ValueEvE4doitERKS3_:
   58|   621k|  static inline bool doit(const From &Val) {
   59|   621k|    return To::classof(&Val);
   60|   621k|  }
_ZN4llvh16cast_convert_valIN6hermes9ScopeDescEPNS1_5ValueES4_E4doitERKS4_:
  218|   621k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   621k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   621k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   621k|    return Res2;
  222|   621k|  }
_ZN4llvh4castIN6hermes17ScopeCreationInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   104k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   104k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   104k|  return cast_convert_val<X, Y*,
  257|   104k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   104k|}
_ZN4llvh3isaIN6hermes17ScopeCreationInstEPNS1_5ValueEEEbRKT0_:
  142|   104k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   104k|  return isa_impl_wrap<X, const Y,
  144|   104k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   104k|}
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   104k|  static bool doit(const From &Val) {
  123|   104k|    return isa_impl_wrap<To, SimpleFrom,
  124|   104k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   104k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   104k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   104k|  static bool doit(const FromTy &Val) {
  133|   104k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   104k|  }
_ZN4llvh11isa_impl_clIN6hermes17ScopeCreationInstEPKNS1_5ValueEE4doitES5_:
  105|   104k|  static inline bool doit(const From *Val) {
  106|   104k|    assert(Val && "isa<> used on a null pointer");
  107|   104k|    return isa_impl<To, From>::doit(*Val);
  108|   104k|  }
_ZN4llvh8isa_implIN6hermes17ScopeCreationInstENS1_5ValueEvE4doitERKS3_:
   58|   104k|  static inline bool doit(const From &Val) {
   59|   104k|    return To::classof(&Val);
   60|   104k|  }
_ZN4llvh16cast_convert_valIN6hermes17ScopeCreationInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   104k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   104k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   104k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   104k|    return Res2;
  222|   104k|  }
_ZN4llvh4castIN6hermes10BasicBlockENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   129M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   129M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   129M|  return cast_convert_val<X, Y*,
  257|   129M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   129M|}
_ZN4llvh3isaIN6hermes10BasicBlockEPNS1_5ValueEEEbRKT0_:
  142|   129M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   129M|  return isa_impl_wrap<X, const Y,
  144|   129M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   129M|}
_ZN4llvh13isa_impl_wrapIN6hermes10BasicBlockEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   129M|  static bool doit(const From &Val) {
  123|   129M|    return isa_impl_wrap<To, SimpleFrom,
  124|   129M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   129M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   129M|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BasicBlockEPKNS1_5ValueES5_E4doitERKS5_:
  132|   129M|  static bool doit(const FromTy &Val) {
  133|   129M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   129M|  }
_ZN4llvh11isa_impl_clIN6hermes10BasicBlockEPKNS1_5ValueEE4doitES5_:
  105|   129M|  static inline bool doit(const From *Val) {
  106|   129M|    assert(Val && "isa<> used on a null pointer");
  107|   129M|    return isa_impl<To, From>::doit(*Val);
  108|   129M|  }
_ZN4llvh8isa_implIN6hermes10BasicBlockENS1_5ValueEvE4doitERKS3_:
   58|   129M|  static inline bool doit(const From &Val) {
   59|   129M|    return To::classof(&Val);
   60|   129M|  }
_ZN4llvh16cast_convert_valIN6hermes10BasicBlockEPNS1_5ValueES4_E4doitERKS4_:
  218|   129M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   129M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   129M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   129M|    return Res2;
  222|   129M|  }
_ZN4llvh4castIN6hermes14AllocStackInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   713k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   713k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   713k|  return cast_convert_val<X, Y*,
  257|   713k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   713k|}
_ZN4llvh3isaIN6hermes14AllocStackInstEPNS1_5ValueEEEbRKT0_:
  142|   713k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   713k|  return isa_impl_wrap<X, const Y,
  144|   713k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   713k|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   713k|  static bool doit(const From &Val) {
  123|   713k|    return isa_impl_wrap<To, SimpleFrom,
  124|   713k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   713k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   713k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   713k|  static bool doit(const FromTy &Val) {
  133|   713k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   713k|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocStackInstEPKNS1_5ValueEE4doitES5_:
  105|   713k|  static inline bool doit(const From *Val) {
  106|   713k|    assert(Val && "isa<> used on a null pointer");
  107|   713k|    return isa_impl<To, From>::doit(*Val);
  108|   713k|  }
_ZN4llvh8isa_implIN6hermes14AllocStackInstENS1_5ValueEvE4doitERKS3_:
   58|   713k|  static inline bool doit(const From &Val) {
   59|   713k|    return To::classof(&Val);
   60|   713k|  }
_ZN4llvh16cast_convert_valIN6hermes14AllocStackInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   713k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   713k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   713k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   713k|    return Res2;
  222|   713k|  }
_ZN4llvh4castIN6hermes8VariableENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   521k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   521k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   521k|  return cast_convert_val<X, Y*,
  257|   521k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   521k|}
_ZN4llvh3isaIN6hermes8VariableEPNS1_5ValueEEEbRKT0_:
  142|  1.23M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.23M|  return isa_impl_wrap<X, const Y,
  144|  1.23M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.23M|}
_ZN4llvh13isa_impl_wrapIN6hermes8VariableEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  1.23M|  static bool doit(const From &Val) {
  123|  1.23M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.23M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.23M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.23M|  }
_ZN4llvh13isa_impl_wrapIN6hermes8VariableEPKNS1_5ValueES5_E4doitERKS5_:
  132|  1.23M|  static bool doit(const FromTy &Val) {
  133|  1.23M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.23M|  }
_ZN4llvh11isa_impl_clIN6hermes8VariableEPKNS1_5ValueEE4doitES5_:
  105|  1.23M|  static inline bool doit(const From *Val) {
  106|  1.23M|    assert(Val && "isa<> used on a null pointer");
  107|  1.23M|    return isa_impl<To, From>::doit(*Val);
  108|  1.23M|  }
_ZN4llvh8isa_implIN6hermes8VariableENS1_5ValueEvE4doitERKS3_:
   58|  1.23M|  static inline bool doit(const From &Val) {
   59|  1.23M|    return To::classof(&Val);
   60|  1.23M|  }
_ZN4llvh16cast_convert_valIN6hermes8VariableEPNS1_5ValueES4_E4doitERKS4_:
  218|   521k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   521k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   521k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   521k|    return Res2;
  222|   521k|  }
_ZN4llvh4castIN6hermes8FunctionENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   516k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   516k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   516k|  return cast_convert_val<X, Y*,
  257|   516k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   516k|}
_ZN4llvh3isaIN6hermes8FunctionEPNS1_5ValueEEEbRKT0_:
  142|   516k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   516k|  return isa_impl_wrap<X, const Y,
  144|   516k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   516k|}
_ZN4llvh13isa_impl_wrapIN6hermes8FunctionEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   516k|  static bool doit(const From &Val) {
  123|   516k|    return isa_impl_wrap<To, SimpleFrom,
  124|   516k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   516k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   516k|  }
_ZN4llvh13isa_impl_wrapIN6hermes8FunctionEPKNS1_5ValueES5_E4doitERKS5_:
  132|   516k|  static bool doit(const FromTy &Val) {
  133|   516k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   516k|  }
_ZN4llvh11isa_impl_clIN6hermes8FunctionEPKNS1_5ValueEE4doitES5_:
  105|   516k|  static inline bool doit(const From *Val) {
  106|   516k|    assert(Val && "isa<> used on a null pointer");
  107|   516k|    return isa_impl<To, From>::doit(*Val);
  108|   516k|  }
_ZN4llvh8isa_implIN6hermes8FunctionENS1_5ValueEvE4doitERKS3_:
   58|   516k|  static inline bool doit(const From &Val) {
   59|   516k|    return To::classof(&Val);
   60|   516k|  }
_ZN4llvh16cast_convert_valIN6hermes8FunctionEPNS1_5ValueES4_E4doitERKS4_:
  218|   516k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   516k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   516k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   516k|    return Res2;
  222|   516k|  }
_ZN4llvh4castIN6hermes13LiteralNumberENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.58M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.58M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.58M|  return cast_convert_val<X, Y*,
  257|  2.58M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.58M|}
_ZN4llvh3isaIN6hermes13LiteralNumberEPNS1_5ValueEEEbRKT0_:
  142|  4.24M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.24M|  return isa_impl_wrap<X, const Y,
  144|  4.24M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.24M|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  4.24M|  static bool doit(const From &Val) {
  123|  4.24M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.24M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.24M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.24M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEPKNS1_5ValueES5_E4doitERKS5_:
  132|  4.24M|  static bool doit(const FromTy &Val) {
  133|  4.24M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.24M|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralNumberEPKNS1_5ValueEE4doitES5_:
  105|  4.24M|  static inline bool doit(const From *Val) {
  106|  4.24M|    assert(Val && "isa<> used on a null pointer");
  107|  4.24M|    return isa_impl<To, From>::doit(*Val);
  108|  4.24M|  }
_ZN4llvh8isa_implIN6hermes13LiteralNumberENS1_5ValueEvE4doitERKS3_:
   58|  4.24M|  static inline bool doit(const From &Val) {
   59|  4.24M|    return To::classof(&Val);
   60|  4.24M|  }
_ZN4llvh16cast_convert_valIN6hermes13LiteralNumberEPNS1_5ValueES4_E4doitERKS4_:
  218|  2.58M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.58M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.58M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.58M|    return Res2;
  222|  2.58M|  }
_ZN4llvh3isaIN6hermes12GlobalObjectEPNS1_5ValueEEEbRKT0_:
  142|   501k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   501k|  return isa_impl_wrap<X, const Y,
  144|   501k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   501k|}
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   501k|  static bool doit(const From &Val) {
  123|   501k|    return isa_impl_wrap<To, SimpleFrom,
  124|   501k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   501k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   501k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEPKNS1_5ValueES5_E4doitERKS5_:
  132|   501k|  static bool doit(const FromTy &Val) {
  133|   501k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   501k|  }
_ZN4llvh11isa_impl_clIN6hermes12GlobalObjectEPKNS1_5ValueEE4doitES5_:
  105|   501k|  static inline bool doit(const From *Val) {
  106|   501k|    assert(Val && "isa<> used on a null pointer");
  107|   501k|    return isa_impl<To, From>::doit(*Val);
  108|   501k|  }
_ZN4llvh8isa_implIN6hermes12GlobalObjectENS1_5ValueEvE4doitERKS3_:
   58|   501k|  static inline bool doit(const From &Val) {
   59|   501k|    return To::classof(&Val);
   60|   501k|  }
_ZN4llvh3isaIN6hermes22HBCGetGlobalObjectInstEPNS1_5ValueEEEbRKT0_:
  142|   503k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   503k|  return isa_impl_wrap<X, const Y,
  144|   503k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   503k|}
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   503k|  static bool doit(const From &Val) {
  123|   503k|    return isa_impl_wrap<To, SimpleFrom,
  124|   503k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   503k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   503k|  }
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   503k|  static bool doit(const FromTy &Val) {
  133|   503k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   503k|  }
_ZN4llvh11isa_impl_clIN6hermes22HBCGetGlobalObjectInstEPKNS1_5ValueEE4doitES5_:
  105|   503k|  static inline bool doit(const From *Val) {
  106|   503k|    assert(Val && "isa<> used on a null pointer");
  107|   503k|    return isa_impl<To, From>::doit(*Val);
  108|   503k|  }
_ZN4llvh8isa_implIN6hermes22HBCGetGlobalObjectInstENS1_5ValueEvE4doitERKS3_:
   58|   503k|  static inline bool doit(const From &Val) {
   59|   503k|    return To::classof(&Val);
   60|   503k|  }
_ZN4llvh4castIN6hermes11LiteralBoolENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.69M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.69M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.69M|  return cast_convert_val<X, Y*,
  257|  1.69M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.69M|}
_ZN4llvh3isaIN6hermes11LiteralBoolEPNS1_5ValueEEEbRKT0_:
  142|  1.69M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.69M|  return isa_impl_wrap<X, const Y,
  144|  1.69M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.69M|}
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  1.69M|  static bool doit(const From &Val) {
  123|  1.69M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.69M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.69M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.69M|  }
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEPKNS1_5ValueES5_E4doitERKS5_:
  132|  1.69M|  static bool doit(const FromTy &Val) {
  133|  1.69M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.69M|  }
_ZN4llvh11isa_impl_clIN6hermes11LiteralBoolEPKNS1_5ValueEE4doitES5_:
  105|  1.69M|  static inline bool doit(const From *Val) {
  106|  1.69M|    assert(Val && "isa<> used on a null pointer");
  107|  1.69M|    return isa_impl<To, From>::doit(*Val);
  108|  1.69M|  }
_ZN4llvh8isa_implIN6hermes11LiteralBoolENS1_5ValueEvE4doitERKS3_:
   58|  1.69M|  static inline bool doit(const From &Val) {
   59|  1.69M|    return To::classof(&Val);
   60|  1.69M|  }
_ZN4llvh16cast_convert_valIN6hermes11LiteralBoolEPNS1_5ValueES4_E4doitERKS4_:
  218|  1.69M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.69M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.69M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.69M|    return Res2;
  222|  1.69M|  }
_ZN4llvh3isaIN6hermes13LiteralStringEPNS1_7LiteralEEEbRKT0_:
  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_wrapIN6hermes13LiteralStringEKPNS1_7LiteralEPKS3_E4doitERS5_:
  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_wrapIN6hermes13LiteralStringEPKNS1_7LiteralES5_E4doitERKS5_:
  132|   394k|  static bool doit(const FromTy &Val) {
  133|   394k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   394k|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralStringEPKNS1_7LiteralEE4doitES5_:
  105|   394k|  static inline bool doit(const From *Val) {
  106|   394k|    assert(Val && "isa<> used on a null pointer");
  107|   394k|    return isa_impl<To, From>::doit(*Val);
  108|   394k|  }
_ZN4llvh8isa_implIN6hermes13LiteralStringENS1_7LiteralEvE4doitERKS3_:
   58|   394k|  static inline bool doit(const From &Val) {
   59|   394k|    return To::classof(&Val);
   60|   394k|  }
_ZN4llvh13simplify_typeIKPN6hermes7LiteralEE18getSimplifiedValueERS4_:
   48|  4.66M|  static RetType getSimplifiedValue(const From& Val) {
   49|  4.66M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  4.66M|  }
_ZN4llvh13simplify_typeIPN6hermes7LiteralEE18getSimplifiedValueERS3_:
   38|  4.66M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes13LiteralNumberEPNS1_7LiteralEEEbRKT0_:
  142|  2.00M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.00M|  return isa_impl_wrap<X, const Y,
  144|  2.00M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.00M|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEKPNS1_7LiteralEPKS3_E4doitERS5_:
  122|  2.00M|  static bool doit(const From &Val) {
  123|  2.00M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.00M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.00M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.00M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEPKNS1_7LiteralES5_E4doitERKS5_:
  132|  2.00M|  static bool doit(const FromTy &Val) {
  133|  2.00M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.00M|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralNumberEPKNS1_7LiteralEE4doitES5_:
  105|  2.00M|  static inline bool doit(const From *Val) {
  106|  2.00M|    assert(Val && "isa<> used on a null pointer");
  107|  2.00M|    return isa_impl<To, From>::doit(*Val);
  108|  2.00M|  }
_ZN4llvh8isa_implIN6hermes13LiteralNumberENS1_7LiteralEvE4doitERKS3_:
   58|  2.00M|  static inline bool doit(const From &Val) {
   59|  2.00M|    return To::classof(&Val);
   60|  2.00M|  }
_ZN4llvh4castIN6hermes7LiteralENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  7.00M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  7.00M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  7.00M|  return cast_convert_val<X, Y*,
  257|  7.00M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  7.00M|}
_ZN4llvh16cast_convert_valIN6hermes7LiteralEPNS1_5ValueES4_E4doitERKS4_:
  218|  7.00M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  7.00M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  7.00M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  7.00M|    return Res2;
  222|  7.00M|  }
_ZN4llvh3isaIN6hermes7LiteralEPNS1_5ValueEEEbRKT0_:
  142|  18.6M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  18.6M|  return isa_impl_wrap<X, const Y,
  144|  18.6M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  18.6M|}
_ZN4llvh13isa_impl_wrapIN6hermes7LiteralEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  18.6M|  static bool doit(const From &Val) {
  123|  18.6M|    return isa_impl_wrap<To, SimpleFrom,
  124|  18.6M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  18.6M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  18.6M|  }
_ZN4llvh13isa_impl_wrapIN6hermes7LiteralEPKNS1_5ValueES5_E4doitERKS5_:
  132|  18.6M|  static bool doit(const FromTy &Val) {
  133|  18.6M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  18.6M|  }
_ZN4llvh11isa_impl_clIN6hermes7LiteralEPKNS1_5ValueEE4doitES5_:
  105|  18.6M|  static inline bool doit(const From *Val) {
  106|  18.6M|    assert(Val && "isa<> used on a null pointer");
  107|  18.6M|    return isa_impl<To, From>::doit(*Val);
  108|  18.6M|  }
_ZN4llvh8isa_implIN6hermes7LiteralENS1_5ValueEvE4doitERKS3_:
   58|  18.6M|  static inline bool doit(const From &Val) {
   59|  18.6M|    return To::classof(&Val);
   60|  18.6M|  }
_ZN4llvh4castIN6hermes11InstructionENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  19.4M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  19.4M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  19.4M|  return cast_convert_val<X, Y*,
  257|  19.4M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  19.4M|}
_ZN4llvh3isaIN6hermes11InstructionEPNS1_5ValueEEEbRKT0_:
  142|  58.9M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  58.9M|  return isa_impl_wrap<X, const Y,
  144|  58.9M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  58.9M|}
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  58.9M|  static bool doit(const From &Val) {
  123|  58.9M|    return isa_impl_wrap<To, SimpleFrom,
  124|  58.9M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  58.9M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  58.9M|  }
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEPKNS1_5ValueES5_E4doitERKS5_:
  132|  58.9M|  static bool doit(const FromTy &Val) {
  133|  58.9M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  58.9M|  }
_ZN4llvh11isa_impl_clIN6hermes11InstructionEPKNS1_5ValueEE4doitES5_:
  105|  58.9M|  static inline bool doit(const From *Val) {
  106|  58.9M|    assert(Val && "isa<> used on a null pointer");
  107|  58.9M|    return isa_impl<To, From>::doit(*Val);
  108|  58.9M|  }
_ZN4llvh8isa_implIN6hermes11InstructionENS1_5ValueEvE4doitERKS3_:
   58|  58.9M|  static inline bool doit(const From &Val) {
   59|  58.9M|    return To::classof(&Val);
   60|  58.9M|  }
_ZN4llvh16cast_convert_valIN6hermes11InstructionEPNS1_5ValueES4_E4doitERKS4_:
  218|  19.4M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  19.4M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  19.4M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  19.4M|    return Res2;
  222|  19.4M|  }
_ZN4llvh3isaIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellEEEbRKT0_:
  142|   806k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   806k|  return isa_impl_wrap<X, const Y,
  144|   806k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   806k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm21SymbolStringPrimitiveEKPKNS2_6GCCellES6_E4doitERS7_:
  122|   806k|  static bool doit(const From &Val) {
  123|   806k|    return isa_impl_wrap<To, SimpleFrom,
  124|   806k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   806k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   806k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellES6_E4doitERKS6_:
  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_clIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellEE4doitES6_:
  105|  1.22M|  static inline bool doit(const From *Val) {
  106|  1.22M|    assert(Val && "isa<> used on a null pointer");
  107|  1.22M|    return isa_impl<To, From>::doit(*Val);
  108|  1.22M|  }
_ZN4llvh8isa_implIN6hermes2vm21SymbolStringPrimitiveENS2_6GCCellEvE4doitERKS4_:
   58|  1.22M|  static inline bool doit(const From &Val) {
   59|  1.22M|    return To::classof(&Val);
   60|  1.22M|  }
_ZN4llvh4castIN6hermes2vm21SymbolStringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   416k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   416k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   416k|  return cast_convert_val<X, Y*,
  257|   416k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   416k|}
_ZN4llvh3isaIN6hermes2vm21SymbolStringPrimitiveEPNS2_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_wrapIN6hermes2vm21SymbolStringPrimitiveEKPNS2_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|  }
_ZN4llvh16cast_convert_valIN6hermes2vm21SymbolStringPrimitiveEPNS2_6GCCellES5_E4doitERKS5_:
  218|   416k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   416k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   416k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   416k|    return Res2;
  222|   416k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPNS2_6GCCellEEEbRKT0_:
  142|  2.34M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.34M|  return isa_impl_wrap<X, const Y,
  144|  2.34M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.34M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|  2.34M|  static bool doit(const From &Val) {
  123|  2.34M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.34M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.34M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.34M|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  2.34M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.34M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.34M|  return cast_convert_val<X, Y*,
  257|  2.34M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.34M|}
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPNS2_6GCCellEEEbRKT0_:
  142|  2.34M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.34M|  return isa_impl_wrap<X, const Y,
  144|  2.34M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.34M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|  2.34M|  static bool doit(const From &Val) {
  123|  2.34M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.34M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.34M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.34M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPNS2_6GCCellES6_E4doitERKS6_:
  218|  2.34M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.34M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.34M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.34M|    return Res2;
  222|  2.34M|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPNS2_6GCCellEEEbRKT0_:
  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_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  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|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  1.00M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.00M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.00M|  return cast_convert_val<X, Y*,
  257|  1.00M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.00M|}
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPNS2_6GCCellEEEbRKT0_:
  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_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  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|  }
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPNS2_6GCCellES6_E4doitERKS6_:
  218|  1.00M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.00M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.00M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.00M|    return Res2;
  222|  1.00M|  }
_ZN4llvh4castIN6hermes2vm21SymbolStringPrimitiveEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|   390k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   390k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   390k|  return cast_convert_val<X, Y*,
  257|   390k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   390k|}
_ZN4llvh16cast_convert_valIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellES6_E4doitERKS6_:
  218|   390k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   390k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   390k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   390k|    return Res2;
  222|   390k|  }
_ZN4llvh4castIN6hermes2vm15BigIntPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   781k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   781k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   781k|  return cast_convert_val<X, Y*,
  257|   781k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   781k|}
_ZN4llvh3isaIN6hermes2vm15BigIntPrimitiveEPNS2_6GCCellEEEbRKT0_:
  142|   781k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   781k|  return isa_impl_wrap<X, const Y,
  144|   781k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   781k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15BigIntPrimitiveEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   781k|  static bool doit(const From &Val) {
  123|   781k|    return isa_impl_wrap<To, SimpleFrom,
  124|   781k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   781k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   781k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15BigIntPrimitiveEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   781k|  static bool doit(const FromTy &Val) {
  133|   781k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   781k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15BigIntPrimitiveEPKNS2_6GCCellEE4doitES6_:
  105|   781k|  static inline bool doit(const From *Val) {
  106|   781k|    assert(Val && "isa<> used on a null pointer");
  107|   781k|    return isa_impl<To, From>::doit(*Val);
  108|   781k|  }
_ZN4llvh8isa_implIN6hermes2vm15BigIntPrimitiveENS2_6GCCellEvE4doitERKS4_:
   58|   781k|  static inline bool doit(const From &Val) {
   59|   781k|    return To::classof(&Val);
   60|   781k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm15BigIntPrimitiveEPNS2_6GCCellES5_E4doitERKS5_:
  218|   781k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   781k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   781k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   781k|    return Res2;
  222|   781k|  }
_ZN4llvh3isaIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEPNS2_6GCCellEEEbRKT0_:
  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_wrapIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  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_wrapIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEPKNS2_6GCCellES8_E4doitERKS8_:
  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_clIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEPKNS2_6GCCellEE4doitES8_:
  105|  1.68M|  static inline bool doit(const From *Val) {
  106|  1.68M|    assert(Val && "isa<> used on a null pointer");
  107|  1.68M|    return isa_impl<To, From>::doit(*Val);
  108|  1.68M|  }
_ZN4llvh8isa_implIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEENS2_6GCCellEvE4doitERKS6_:
   58|  1.68M|  static inline bool doit(const From &Val) {
   59|  1.68M|    return To::classof(&Val);
   60|  1.68M|  }
_ZN4llvh4castIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   840k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   840k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   840k|  return cast_convert_val<X, Y*,
  257|   840k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   840k|}
_ZN4llvh16cast_convert_valIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEPNS2_6GCCellES7_E4doitERKS7_:
  218|   840k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   840k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   840k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   840k|    return Res2;
  222|   840k|  }
_ZN4llvh4castIN6hermes2vm15DictPropertyMapENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  17.7M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  17.7M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  17.7M|  return cast_convert_val<X, Y*,
  257|  17.7M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  17.7M|}
_ZN4llvh3isaIN6hermes2vm15DictPropertyMapEPNS2_6GCCellEEEbRKT0_:
  142|  19.2M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  19.2M|  return isa_impl_wrap<X, const Y,
  144|  19.2M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  19.2M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DictPropertyMapEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  19.2M|  static bool doit(const From &Val) {
  123|  19.2M|    return isa_impl_wrap<To, SimpleFrom,
  124|  19.2M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  19.2M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  19.2M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DictPropertyMapEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  19.2M|  static bool doit(const FromTy &Val) {
  133|  19.2M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  19.2M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15DictPropertyMapEPKNS2_6GCCellEE4doitES6_:
  105|  19.2M|  static inline bool doit(const From *Val) {
  106|  19.2M|    assert(Val && "isa<> used on a null pointer");
  107|  19.2M|    return isa_impl<To, From>::doit(*Val);
  108|  19.2M|  }
_ZN4llvh8isa_implIN6hermes2vm15DictPropertyMapENS2_6GCCellEvE4doitERKS4_:
   58|  19.2M|  static inline bool doit(const From &Val) {
   59|  19.2M|    return To::classof(&Val);
   60|  19.2M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm15DictPropertyMapEPNS2_6GCCellES5_E4doitERKS5_:
  218|  17.7M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  17.7M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  17.7M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  17.7M|    return Res2;
  222|  17.7M|  }
_ZN4llvh12cast_or_nullIN6hermes2vm11HiddenClassENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  2.56M|cast_or_null(Y *Val) {
  298|  2.56M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 166k, False: 2.39M]
  ------------------
  299|  2.39M|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|  2.39M|  return cast<X>(Val);
  301|  2.39M|}
_ZN4llvh4castIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|    160|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    160|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    160|  return cast_convert_val<X, Y*,
  257|    160|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    160|}
_ZN4llvh3isaIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPNS2_6GCCellEEEbRKT0_:
  142|    160|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    160|  return isa_impl_wrap<X, const Y,
  144|    160|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    160|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|    160|  static bool doit(const From &Val) {
  123|    160|    return isa_impl_wrap<To, SimpleFrom,
  124|    160|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    160|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    160|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|    160|  static bool doit(const FromTy &Val) {
  133|    160|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    160|  }
_ZN4llvh11isa_impl_clIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPKNS2_6GCCellEE4doitES8_:
  105|    160|  static inline bool doit(const From *Val) {
  106|    160|    assert(Val && "isa<> used on a null pointer");
  107|    160|    return isa_impl<To, From>::doit(*Val);
  108|    160|  }
_ZN4llvh8isa_implIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEENS2_6GCCellEvE4doitERKS6_:
   58|    160|  static inline bool doit(const From &Val) {
   59|    160|    return To::classof(&Val);
   60|    160|  }
_ZN4llvh16cast_convert_valIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPNS2_6GCCellES7_E4doitERKS7_:
  218|    160|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    160|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    160|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    160|    return Res2;
  222|    160|  }
_ZN4llvh3isaIN6hermes2vm6DomainEPNS2_6GCCellEEEbRKT0_:
  142|    676|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    676|  return isa_impl_wrap<X, const Y,
  144|    676|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    676|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm6DomainEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|    676|  static bool doit(const From &Val) {
  123|    676|    return isa_impl_wrap<To, SimpleFrom,
  124|    676|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    676|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    676|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm6DomainEPKNS2_6GCCellES6_E4doitERKS6_:
  132|    676|  static bool doit(const FromTy &Val) {
  133|    676|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    676|  }
_ZN4llvh11isa_impl_clIN6hermes2vm6DomainEPKNS2_6GCCellEE4doitES6_:
  105|    676|  static inline bool doit(const From *Val) {
  106|    676|    assert(Val && "isa<> used on a null pointer");
  107|    676|    return isa_impl<To, From>::doit(*Val);
  108|    676|  }
_ZN4llvh8isa_implIN6hermes2vm6DomainENS2_6GCCellEvE4doitERKS4_:
   58|    676|  static inline bool doit(const From &Val) {
   59|    676|    return To::classof(&Val);
   60|    676|  }
_ZN4llvh4castIN6hermes2vm6DomainENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    676|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    676|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    676|  return cast_convert_val<X, Y*,
  257|    676|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    676|}
_ZN4llvh16cast_convert_valIN6hermes2vm6DomainEPNS2_6GCCellES5_E4doitERKS5_:
  218|    676|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    676|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    676|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    676|    return Res2;
  222|    676|  }
_ZN4llvh12cast_or_nullIN6hermes2vm8CallableENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|    122|cast_or_null(Y *Val) {
  298|    122|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 52, False: 70]
  ------------------
  299|     70|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|     70|  return cast<X>(Val);
  301|     70|}
_ZN4llvh4castIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESB_:
  254|  16.7M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  16.7M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  16.7M|  return cast_convert_val<X, Y*,
  257|  16.7M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  16.7M|}
_ZN4llvh3isaIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPNS2_6GCCellEEEbRKT0_:
  142|  16.7M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  16.7M|  return isa_impl_wrap<X, const Y,
  144|  16.7M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  16.7M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEKPNS2_6GCCellEPKS7_E4doitERS9_:
  122|  16.7M|  static bool doit(const From &Val) {
  123|  16.7M|    return isa_impl_wrap<To, SimpleFrom,
  124|  16.7M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  16.7M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  16.7M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPKNS2_6GCCellES9_E4doitERKS9_:
  132|  16.7M|  static bool doit(const FromTy &Val) {
  133|  16.7M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  16.7M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPKNS2_6GCCellEE4doitES9_:
  105|  16.7M|  static inline bool doit(const From *Val) {
  106|  16.7M|    assert(Val && "isa<> used on a null pointer");
  107|  16.7M|    return isa_impl<To, From>::doit(*Val);
  108|  16.7M|  }
_ZN4llvh8isa_implIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentENS2_6GCCellEvE4doitERKS7_:
   58|  16.7M|  static inline bool doit(const From &Val) {
   59|  16.7M|    return To::classof(&Val);
   60|  16.7M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPNS2_6GCCellES8_E4doitERKS8_:
  218|  16.7M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  16.7M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  16.7M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  16.7M|    return Res2;
  222|  16.7M|  }
_ZN4llvh12cast_or_nullIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  297|  7.63M|cast_or_null(Y *Val) {
  298|  7.63M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 1, False: 7.63M]
  ------------------
  299|  7.63M|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|  7.63M|  return cast<X>(Val);
  301|  7.63M|}
_ZN4llvh3isaIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPNS2_6GCCellEEEbRKT0_:
  142|  15.2M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  15.2M|  return isa_impl_wrap<X, const Y,
  144|  15.2M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  15.2M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|  15.2M|  static bool doit(const From &Val) {
  123|  15.2M|    return isa_impl_wrap<To, SimpleFrom,
  124|  15.2M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  15.2M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  15.2M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|  15.2M|  static bool doit(const FromTy &Val) {
  133|  15.2M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  15.2M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPKNS2_6GCCellEE4doitES8_:
  105|  15.2M|  static inline bool doit(const From *Val) {
  106|  15.2M|    assert(Val && "isa<> used on a null pointer");
  107|  15.2M|    return isa_impl<To, From>::doit(*Val);
  108|  15.2M|  }
_ZN4llvh8isa_implIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEENS2_6GCCellEvE4doitERKS6_:
   58|  15.2M|  static inline bool doit(const From &Val) {
   59|  15.2M|    return To::classof(&Val);
   60|  15.2M|  }
_ZN4llvh4castIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|  7.63M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  7.63M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  7.63M|  return cast_convert_val<X, Y*,
  257|  7.63M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  7.63M|}
_ZN4llvh16cast_convert_valIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|  7.63M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  7.63M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  7.63M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  7.63M|    return Res2;
  222|  7.63M|  }
_ZN4llvh3isaIN6hermes2vm10JSFunctionEPNS2_6GCCellEEEbRKT0_:
  142|   397k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   397k|  return isa_impl_wrap<X, const Y,
  144|   397k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   397k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm10JSFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   397k|  static bool doit(const From &Val) {
  123|   397k|    return isa_impl_wrap<To, SimpleFrom,
  124|   397k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   397k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   397k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm10JSFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   397k|  static bool doit(const FromTy &Val) {
  133|   397k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   397k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm10JSFunctionEPKNS2_6GCCellEE4doitES6_:
  105|   397k|  static inline bool doit(const From *Val) {
  106|   397k|    assert(Val && "isa<> used on a null pointer");
  107|   397k|    return isa_impl<To, From>::doit(*Val);
  108|   397k|  }
_ZN4llvh8isa_implIN6hermes2vm10JSFunctionENS2_6GCCellEvE4doitERKS4_:
   58|   397k|  static inline bool doit(const From &Val) {
   59|   397k|    return To::classof(&Val);
   60|   397k|  }
_ZN4llvh4castIN6hermes2vm10JSFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  2.85k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.85k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.85k|  return cast_convert_val<X, Y*,
  257|  2.85k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.85k|}
_ZN4llvh16cast_convert_valIN6hermes2vm10JSFunctionEPNS2_6GCCellES5_E4doitERKS5_:
  218|  2.85k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.85k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.85k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.85k|    return Res2;
  222|  2.85k|  }
_ZN4llvh3isaIN6hermes2vm19JSGeneratorFunctionEPNS2_6GCCellEEEbRKT0_:
  142|  7.55k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  7.55k|  return isa_impl_wrap<X, const Y,
  144|  7.55k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  7.55k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm19JSGeneratorFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  7.55k|  static bool doit(const From &Val) {
  123|  7.55k|    return isa_impl_wrap<To, SimpleFrom,
  124|  7.55k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  7.55k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  7.55k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm19JSGeneratorFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  7.55k|  static bool doit(const FromTy &Val) {
  133|  7.55k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  7.55k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm19JSGeneratorFunctionEPKNS2_6GCCellEE4doitES6_:
  105|  7.55k|  static inline bool doit(const From *Val) {
  106|  7.55k|    assert(Val && "isa<> used on a null pointer");
  107|  7.55k|    return isa_impl<To, From>::doit(*Val);
  108|  7.55k|  }
_ZN4llvh8isa_implIN6hermes2vm19JSGeneratorFunctionENS2_6GCCellEvE4doitERKS4_:
   58|  7.55k|  static inline bool doit(const From &Val) {
   59|  7.55k|    return To::classof(&Val);
   60|  7.55k|  }
_ZN4llvh4castIN6hermes2vm16PropertyAccessorENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  7.75k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  7.75k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  7.75k|  return cast_convert_val<X, Y*,
  257|  7.75k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  7.75k|}
_ZN4llvh3isaIN6hermes2vm16PropertyAccessorEPNS2_6GCCellEEEbRKT0_:
  142|  7.75k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  7.75k|  return isa_impl_wrap<X, const Y,
  144|  7.75k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  7.75k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm16PropertyAccessorEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  7.75k|  static bool doit(const From &Val) {
  123|  7.75k|    return isa_impl_wrap<To, SimpleFrom,
  124|  7.75k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  7.75k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  7.75k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm16PropertyAccessorEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  7.75k|  static bool doit(const FromTy &Val) {
  133|  7.75k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  7.75k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm16PropertyAccessorEPKNS2_6GCCellEE4doitES6_:
  105|  7.75k|  static inline bool doit(const From *Val) {
  106|  7.75k|    assert(Val && "isa<> used on a null pointer");
  107|  7.75k|    return isa_impl<To, From>::doit(*Val);
  108|  7.75k|  }
_ZN4llvh8isa_implIN6hermes2vm16PropertyAccessorENS2_6GCCellEvE4doitERKS4_:
   58|  7.75k|  static inline bool doit(const From &Val) {
   59|  7.75k|    return To::classof(&Val);
   60|  7.75k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm16PropertyAccessorEPNS2_6GCCellES5_E4doitERKS5_:
  218|  7.75k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  7.75k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  7.75k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  7.75k|    return Res2;
  222|  7.75k|  }
_ZN4llvh3isaIN6hermes2vm9ArrayImplEPNS2_6GCCellEEEbRKT0_:
  142|  8.80M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  8.80M|  return isa_impl_wrap<X, const Y,
  144|  8.80M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  8.80M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm9ArrayImplEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  8.80M|  static bool doit(const From &Val) {
  123|  8.80M|    return isa_impl_wrap<To, SimpleFrom,
  124|  8.80M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  8.80M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  8.80M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm9ArrayImplEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  8.80M|  static bool doit(const FromTy &Val) {
  133|  8.80M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  8.80M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm9ArrayImplEPKNS2_6GCCellEE4doitES6_:
  105|  8.80M|  static inline bool doit(const From *Val) {
  106|  8.80M|    assert(Val && "isa<> used on a null pointer");
  107|  8.80M|    return isa_impl<To, From>::doit(*Val);
  108|  8.80M|  }
_ZN4llvh8isa_implIN6hermes2vm9ArrayImplENS2_6GCCellEvE4doitERKS4_:
   58|  8.80M|  static inline bool doit(const From &Val) {
   59|  8.80M|    return To::classof(&Val);
   60|  8.80M|  }
_ZN4llvh4castIN6hermes2vm9ArrayImplENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  8.80M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  8.80M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  8.80M|  return cast_convert_val<X, Y*,
  257|  8.80M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  8.80M|}
_ZN4llvh16cast_convert_valIN6hermes2vm9ArrayImplEPNS2_6GCCellES5_E4doitERKS5_:
  218|  8.80M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  8.80M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  8.80M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  8.80M|    return Res2;
  222|  8.80M|  }
_ZN4llvh3isaIN6hermes2vm13BoundFunctionEPNS2_6GCCellEEEbRKT0_:
  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_wrapIN6hermes2vm13BoundFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  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|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm13BoundFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|      1|  static bool doit(const FromTy &Val) {
  133|      1|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      1|  }
_ZN4llvh11isa_impl_clIN6hermes2vm13BoundFunctionEPKNS2_6GCCellEE4doitES6_:
  105|      1|  static inline bool doit(const From *Val) {
  106|      1|    assert(Val && "isa<> used on a null pointer");
  107|      1|    return isa_impl<To, From>::doit(*Val);
  108|      1|  }
_ZN4llvh8isa_implIN6hermes2vm13BoundFunctionENS2_6GCCellEvE4doitERKS4_:
   58|      1|  static inline bool doit(const From &Val) {
   59|      1|    return To::classof(&Val);
   60|      1|  }
_ZN4llvh8dyn_castIN6hermes2vm13BoundFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|}
_ZN4llvh4castIN6hermes2vm14NativeFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  3.45M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.45M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  3.45M|  return cast_convert_val<X, Y*,
  257|  3.45M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.45M|}
_ZN4llvh3isaIN6hermes2vm14NativeFunctionEPNS2_6GCCellEEEbRKT0_:
  142|  3.85M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.85M|  return isa_impl_wrap<X, const Y,
  144|  3.85M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.85M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm14NativeFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  3.85M|  static bool doit(const From &Val) {
  123|  3.85M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.85M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.85M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.85M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm14NativeFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  3.85M|  static bool doit(const FromTy &Val) {
  133|  3.85M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.85M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm14NativeFunctionEPKNS2_6GCCellEE4doitES6_:
  105|  3.85M|  static inline bool doit(const From *Val) {
  106|  3.85M|    assert(Val && "isa<> used on a null pointer");
  107|  3.85M|    return isa_impl<To, From>::doit(*Val);
  108|  3.85M|  }
_ZN4llvh8isa_implIN6hermes2vm14NativeFunctionENS2_6GCCellEvE4doitERKS4_:
   58|  3.85M|  static inline bool doit(const From &Val) {
   59|  3.85M|    return To::classof(&Val);
   60|  3.85M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm14NativeFunctionEPNS2_6GCCellES5_E4doitERKS5_:
  218|  3.45M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.45M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.45M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.45M|    return Res2;
  222|  3.45M|  }
_ZN4llvh4castIN6hermes5regex14Width1LoopInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  51.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  51.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  51.8k|  return cast_convert_val<X, Y*,
  257|  51.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  51.8k|}
_ZN4llvh3isaIN6hermes5regex14Width1LoopInsnEPNS2_4InsnEEEbRKT0_:
  142|  51.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  51.8k|  return isa_impl_wrap<X, const Y,
  144|  51.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  51.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex14Width1LoopInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  51.8k|  static bool doit(const From &Val) {
  123|  51.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  51.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  51.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  51.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex14Width1LoopInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  51.9k|  static bool doit(const FromTy &Val) {
  133|  51.9k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  51.9k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex14Width1LoopInsnEPKNS2_4InsnEE4doitES6_:
  105|  51.9k|  static inline bool doit(const From *Val) {
  106|  51.9k|    assert(Val && "isa<> used on a null pointer");
  107|  51.9k|    return isa_impl<To, From>::doit(*Val);
  108|  51.9k|  }
_ZN4llvh13simplify_typeIKPN6hermes5regex4InsnEE18getSimplifiedValueERS5_:
   48|   412k|  static RetType getSimplifiedValue(const From& Val) {
   49|   412k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   412k|  }
_ZN4llvh13simplify_typeIPN6hermes5regex4InsnEE18getSimplifiedValueERS4_:
   38|   412k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes5regex14Width1LoopInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  51.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  51.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  51.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  51.8k|    return Res2;
  222|  51.8k|  }
_ZN4llvh4castIN6hermes5regex13BeginLoopInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.08k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.08k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.08k|  return cast_convert_val<X, Y*,
  257|  1.08k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.08k|}
_ZN4llvh3isaIN6hermes5regex13BeginLoopInsnEPNS2_4InsnEEEbRKT0_:
  142|  1.08k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.08k|  return isa_impl_wrap<X, const Y,
  144|  1.08k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.08k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex13BeginLoopInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  1.08k|  static bool doit(const From &Val) {
  123|  1.08k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.08k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.08k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.08k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex13BeginLoopInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  1.08k|  static bool doit(const FromTy &Val) {
  133|  1.08k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.08k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex13BeginLoopInsnEPKNS2_4InsnEE4doitES6_:
  105|  1.08k|  static inline bool doit(const From *Val) {
  106|  1.08k|    assert(Val && "isa<> used on a null pointer");
  107|  1.08k|    return isa_impl<To, From>::doit(*Val);
  108|  1.08k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex13BeginLoopInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  1.08k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.08k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.08k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.08k|    return Res2;
  222|  1.08k|  }
_ZN4llvh4castIN6hermes5regex11EndLoopInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    136|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    136|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    136|  return cast_convert_val<X, Y*,
  257|    136|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    136|}
_ZN4llvh3isaIN6hermes5regex11EndLoopInsnEPNS2_4InsnEEEbRKT0_:
  142|    136|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    136|  return isa_impl_wrap<X, const Y,
  144|    136|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    136|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex11EndLoopInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|    136|  static bool doit(const From &Val) {
  123|    136|    return isa_impl_wrap<To, SimpleFrom,
  124|    136|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    136|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    136|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex11EndLoopInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|    136|  static bool doit(const FromTy &Val) {
  133|    136|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    136|  }
_ZN4llvh11isa_impl_clIN6hermes5regex11EndLoopInsnEPKNS2_4InsnEE4doitES6_:
  105|    136|  static inline bool doit(const From *Val) {
  106|    136|    assert(Val && "isa<> used on a null pointer");
  107|    136|    return isa_impl<To, From>::doit(*Val);
  108|    136|  }
_ZN4llvh16cast_convert_valIN6hermes5regex11EndLoopInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|    136|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    136|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    136|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    136|    return Res2;
  222|    136|  }
_ZN4llvh4castIN6hermes5regex15AlternationInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   184k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   184k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   184k|  return cast_convert_val<X, Y*,
  257|   184k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   184k|}
_ZN4llvh3isaIN6hermes5regex15AlternationInsnEPNS2_4InsnEEEbRKT0_:
  142|   184k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   184k|  return isa_impl_wrap<X, const Y,
  144|   184k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   184k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex15AlternationInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|   184k|  static bool doit(const From &Val) {
  123|   184k|    return isa_impl_wrap<To, SimpleFrom,
  124|   184k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   184k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   184k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex15AlternationInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|   184k|  static bool doit(const FromTy &Val) {
  133|   184k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   184k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex15AlternationInsnEPKNS2_4InsnEE4doitES6_:
  105|   184k|  static inline bool doit(const From *Val) {
  106|   184k|    assert(Val && "isa<> used on a null pointer");
  107|   184k|    return isa_impl<To, From>::doit(*Val);
  108|   184k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex15AlternationInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|   184k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   184k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   184k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   184k|    return Res2;
  222|   184k|  }
_ZN4llvh4castIN6hermes5regex10Jump32InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  61.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  61.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  61.4k|  return cast_convert_val<X, Y*,
  257|  61.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  61.4k|}
_ZN4llvh3isaIN6hermes5regex10Jump32InsnEPNS2_4InsnEEEbRKT0_:
  142|  61.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  61.4k|  return isa_impl_wrap<X, const Y,
  144|  61.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  61.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex10Jump32InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  61.4k|  static bool doit(const From &Val) {
  123|  61.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  61.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  61.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  61.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex10Jump32InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  61.4k|  static bool doit(const FromTy &Val) {
  133|  61.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  61.4k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex10Jump32InsnEPKNS2_4InsnEE4doitES6_:
  105|  61.4k|  static inline bool doit(const From *Val) {
  106|  61.4k|    assert(Val && "isa<> used on a null pointer");
  107|  61.4k|    return isa_impl<To, From>::doit(*Val);
  108|  61.4k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex10Jump32InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  61.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  61.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  61.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  61.4k|    return Res2;
  222|  61.4k|  }
_ZN4llvh4castIN6hermes5regex28BeginMarkedSubexpressionInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.60k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.60k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.60k|  return cast_convert_val<X, Y*,
  257|  1.60k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.60k|}
_ZN4llvh3isaIN6hermes5regex28BeginMarkedSubexpressionInsnEPNS2_4InsnEEEbRKT0_:
  142|  1.60k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.60k|  return isa_impl_wrap<X, const Y,
  144|  1.60k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.60k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex28BeginMarkedSubexpressionInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  1.60k|  static bool doit(const From &Val) {
  123|  1.60k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.60k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.60k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.60k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex28BeginMarkedSubexpressionInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  1.60k|  static bool doit(const FromTy &Val) {
  133|  1.60k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.60k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex28BeginMarkedSubexpressionInsnEPKNS2_4InsnEE4doitES6_:
  105|  1.60k|  static inline bool doit(const From *Val) {
  106|  1.60k|    assert(Val && "isa<> used on a null pointer");
  107|  1.60k|    return isa_impl<To, From>::doit(*Val);
  108|  1.60k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex28BeginMarkedSubexpressionInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  1.60k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.60k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.60k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.60k|    return Res2;
  222|  1.60k|  }
_ZN4llvh4castIN6hermes5regex26EndMarkedSubexpressionInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.60k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.60k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.60k|  return cast_convert_val<X, Y*,
  257|  1.60k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.60k|}
_ZN4llvh3isaIN6hermes5regex26EndMarkedSubexpressionInsnEPNS2_4InsnEEEbRKT0_:
  142|  1.60k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.60k|  return isa_impl_wrap<X, const Y,
  144|  1.60k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.60k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex26EndMarkedSubexpressionInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  1.60k|  static bool doit(const From &Val) {
  123|  1.60k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.60k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.60k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.60k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex26EndMarkedSubexpressionInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  1.60k|  static bool doit(const FromTy &Val) {
  133|  1.60k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.60k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex26EndMarkedSubexpressionInsnEPKNS2_4InsnEE4doitES6_:
  105|  1.60k|  static inline bool doit(const From *Val) {
  106|  1.60k|    assert(Val && "isa<> used on a null pointer");
  107|  1.60k|    return isa_impl<To, From>::doit(*Val);
  108|  1.60k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex26EndMarkedSubexpressionInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  1.60k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.60k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.60k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.60k|    return Res2;
  222|  1.60k|  }
_ZN4llvh4castIN6hermes5regex11BackRefInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    136|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    136|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    136|  return cast_convert_val<X, Y*,
  257|    136|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    136|}
_ZN4llvh3isaIN6hermes5regex11BackRefInsnEPNS2_4InsnEEEbRKT0_:
  142|    136|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    136|  return isa_impl_wrap<X, const Y,
  144|    136|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    136|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex11BackRefInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|    136|  static bool doit(const From &Val) {
  123|    136|    return isa_impl_wrap<To, SimpleFrom,
  124|    136|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    136|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    136|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex11BackRefInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|    136|  static bool doit(const FromTy &Val) {
  133|    136|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    136|  }
_ZN4llvh11isa_impl_clIN6hermes5regex11BackRefInsnEPKNS2_4InsnEE4doitES6_:
  105|    136|  static inline bool doit(const From *Val) {
  106|    136|    assert(Val && "isa<> used on a null pointer");
  107|    136|    return isa_impl<To, From>::doit(*Val);
  108|    136|  }
_ZN4llvh16cast_convert_valIN6hermes5regex11BackRefInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|    136|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    136|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    136|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    136|    return Res2;
  222|    136|  }
_ZN4llvh4castIN6hermes5regex16WordBoundaryInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    368|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    368|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    368|  return cast_convert_val<X, Y*,
  257|    368|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    368|}
_ZN4llvh3isaIN6hermes5regex16WordBoundaryInsnEPNS2_4InsnEEEbRKT0_:
  142|    368|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    368|  return isa_impl_wrap<X, const Y,
  144|    368|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    368|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex16WordBoundaryInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|    368|  static bool doit(const From &Val) {
  123|    368|    return isa_impl_wrap<To, SimpleFrom,
  124|    368|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    368|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    368|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex16WordBoundaryInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|    368|  static bool doit(const FromTy &Val) {
  133|    368|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    368|  }
_ZN4llvh11isa_impl_clIN6hermes5regex16WordBoundaryInsnEPKNS2_4InsnEE4doitES6_:
  105|    368|  static inline bool doit(const From *Val) {
  106|    368|    assert(Val && "isa<> used on a null pointer");
  107|    368|    return isa_impl<To, From>::doit(*Val);
  108|    368|  }
_ZN4llvh16cast_convert_valIN6hermes5regex16WordBoundaryInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|    368|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    368|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    368|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    368|    return Res2;
  222|    368|  }
_ZN4llvh4castIN6hermes5regex20MatchNCharICase8InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  20.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  20.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  20.8k|  return cast_convert_val<X, Y*,
  257|  20.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  20.8k|}
_ZN4llvh3isaIN6hermes5regex20MatchNCharICase8InsnEPNS2_4InsnEEEbRKT0_:
  142|  20.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  20.8k|  return isa_impl_wrap<X, const Y,
  144|  20.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  20.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex20MatchNCharICase8InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  20.8k|  static bool doit(const From &Val) {
  123|  20.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  20.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  20.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  20.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex20MatchNCharICase8InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  20.8k|  static bool doit(const FromTy &Val) {
  133|  20.8k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  20.8k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex20MatchNCharICase8InsnEPKNS2_4InsnEE4doitES6_:
  105|  20.8k|  static inline bool doit(const From *Val) {
  106|  20.8k|    assert(Val && "isa<> used on a null pointer");
  107|  20.8k|    return isa_impl<To, From>::doit(*Val);
  108|  20.8k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex20MatchNCharICase8InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  20.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  20.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  20.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  20.8k|    return Res2;
  222|  20.8k|  }
_ZN4llvh4castIN6hermes5regex15MatchNChar8InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  2.81k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.81k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.81k|  return cast_convert_val<X, Y*,
  257|  2.81k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.81k|}
_ZN4llvh3isaIN6hermes5regex15MatchNChar8InsnEPNS2_4InsnEEEbRKT0_:
  142|  2.81k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.81k|  return isa_impl_wrap<X, const Y,
  144|  2.81k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.81k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchNChar8InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  2.81k|  static bool doit(const From &Val) {
  123|  2.81k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.81k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.81k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.81k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchNChar8InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  2.94k|  static bool doit(const FromTy &Val) {
  133|  2.94k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.94k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex15MatchNChar8InsnEPKNS2_4InsnEE4doitES6_:
  105|  2.94k|  static inline bool doit(const From *Val) {
  106|  2.94k|    assert(Val && "isa<> used on a null pointer");
  107|  2.94k|    return isa_impl<To, From>::doit(*Val);
  108|  2.94k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex15MatchNChar8InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  2.81k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.81k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.81k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.81k|    return Res2;
  222|  2.81k|  }
_ZN4llvh4castIN6hermes5regex19MatchCharICase8InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  84.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  84.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  84.4k|  return cast_convert_val<X, Y*,
  257|  84.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  84.4k|}
_ZN4llvh3isaIN6hermes5regex19MatchCharICase8InsnEPNS2_4InsnEEEbRKT0_:
  142|  84.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  84.4k|  return isa_impl_wrap<X, const Y,
  144|  84.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  84.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex19MatchCharICase8InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  84.4k|  static bool doit(const From &Val) {
  123|  84.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  84.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  84.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  84.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex19MatchCharICase8InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  84.4k|  static bool doit(const FromTy &Val) {
  133|  84.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  84.4k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex19MatchCharICase8InsnEPKNS2_4InsnEE4doitES6_:
  105|  84.4k|  static inline bool doit(const From *Val) {
  106|  84.4k|    assert(Val && "isa<> used on a null pointer");
  107|  84.4k|    return isa_impl<To, From>::doit(*Val);
  108|  84.4k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex19MatchCharICase8InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  84.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  84.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  84.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  84.4k|    return Res2;
  222|  84.4k|  }
_ZN4llvh4castIN6hermes5regex14MatchChar8InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    179|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    179|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    179|  return cast_convert_val<X, Y*,
  257|    179|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    179|}
_ZN4llvh3isaIN6hermes5regex14MatchChar8InsnEPNS2_4InsnEEEbRKT0_:
  142|    179|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    179|  return isa_impl_wrap<X, const Y,
  144|    179|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    179|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex14MatchChar8InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|    179|  static bool doit(const From &Val) {
  123|    179|    return isa_impl_wrap<To, SimpleFrom,
  124|    179|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    179|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    179|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex14MatchChar8InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|    179|  static bool doit(const FromTy &Val) {
  133|    179|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    179|  }
_ZN4llvh11isa_impl_clIN6hermes5regex14MatchChar8InsnEPKNS2_4InsnEE4doitES6_:
  105|    179|  static inline bool doit(const From *Val) {
  106|    179|    assert(Val && "isa<> used on a null pointer");
  107|    179|    return isa_impl<To, From>::doit(*Val);
  108|    179|  }
_ZN4llvh16cast_convert_valIN6hermes5regex14MatchChar8InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|    179|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    179|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    179|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    179|    return Res2;
  222|    179|  }
_ZN4llvh4castIN6hermes5regex20MatchCharICase16InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     38|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     38|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     38|  return cast_convert_val<X, Y*,
  257|     38|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     38|}
_ZN4llvh3isaIN6hermes5regex20MatchCharICase16InsnEPNS2_4InsnEEEbRKT0_:
  142|     38|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     38|  return isa_impl_wrap<X, const Y,
  144|     38|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     38|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex20MatchCharICase16InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|     38|  static bool doit(const From &Val) {
  123|     38|    return isa_impl_wrap<To, SimpleFrom,
  124|     38|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     38|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     38|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex20MatchCharICase16InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|     38|  static bool doit(const FromTy &Val) {
  133|     38|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     38|  }
_ZN4llvh11isa_impl_clIN6hermes5regex20MatchCharICase16InsnEPKNS2_4InsnEE4doitES6_:
  105|     38|  static inline bool doit(const From *Val) {
  106|     38|    assert(Val && "isa<> used on a null pointer");
  107|     38|    return isa_impl<To, From>::doit(*Val);
  108|     38|  }
_ZN4llvh16cast_convert_valIN6hermes5regex20MatchCharICase16InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|     38|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     38|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     38|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     38|    return Res2;
  222|     38|  }
_ZN4llvh4castIN6hermes5regex15MatchChar16InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|      7|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      7|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      7|  return cast_convert_val<X, Y*,
  257|      7|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      7|}
_ZN4llvh3isaIN6hermes5regex15MatchChar16InsnEPNS2_4InsnEEEbRKT0_:
  142|      7|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      7|  return isa_impl_wrap<X, const Y,
  144|      7|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      7|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchChar16InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|      7|  static bool doit(const From &Val) {
  123|      7|    return isa_impl_wrap<To, SimpleFrom,
  124|      7|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      7|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      7|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchChar16InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|      7|  static bool doit(const FromTy &Val) {
  133|      7|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      7|  }
_ZN4llvh11isa_impl_clIN6hermes5regex15MatchChar16InsnEPKNS2_4InsnEE4doitES6_:
  105|      7|  static inline bool doit(const From *Val) {
  106|      7|    assert(Val && "isa<> used on a null pointer");
  107|      7|    return isa_impl<To, From>::doit(*Val);
  108|      7|  }
_ZN4llvh16cast_convert_valIN6hermes5regex15MatchChar16InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|      7|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      7|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      7|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      7|    return Res2;
  222|      7|  }
_ZN4llvh8dyn_castIN6hermes2vm15StringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|     57|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     57|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 57, False: 0]
  ------------------
  335|     57|}
_ZN4llvh12cast_or_nullIN6hermes2vm15DictPropertyMapENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  1.58M|cast_or_null(Y *Val) {
  298|  1.58M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 0, False: 1.58M]
  ------------------
  299|  1.58M|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|  1.58M|  return cast<X>(Val);
  301|  1.58M|}
_ZN4llvh8dyn_castIN6hermes2vm14NativeFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   391k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   391k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 391k, False: 1]
  ------------------
  335|   391k|}
_ZN4llvh8dyn_castIN6hermes2vm10JSFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   394k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   394k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2.61k, False: 391k]
  ------------------
  335|   394k|}
_ZN4llvh4castIN6hermes2vm8JSRegExpENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     31|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     31|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     31|  return cast_convert_val<X, Y*,
  257|     31|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     31|}
_ZN4llvh3isaIN6hermes2vm8JSRegExpEPNS2_6GCCellEEEbRKT0_:
  142|   355k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   355k|  return isa_impl_wrap<X, const Y,
  144|   355k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   355k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSRegExpEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   355k|  static bool doit(const From &Val) {
  123|   355k|    return isa_impl_wrap<To, SimpleFrom,
  124|   355k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   355k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   355k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSRegExpEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   355k|  static bool doit(const FromTy &Val) {
  133|   355k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   355k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSRegExpEPKNS2_6GCCellEE4doitES6_:
  105|   355k|  static inline bool doit(const From *Val) {
  106|   355k|    assert(Val && "isa<> used on a null pointer");
  107|   355k|    return isa_impl<To, From>::doit(*Val);
  108|   355k|  }
_ZN4llvh8isa_implIN6hermes2vm8JSRegExpENS2_6GCCellEvE4doitERKS4_:
   58|   355k|  static inline bool doit(const From &Val) {
   59|   355k|    return To::classof(&Val);
   60|   355k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm8JSRegExpEPNS2_6GCCellES5_E4doitERKS5_:
  218|     31|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     31|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     31|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     31|    return Res2;
  222|     31|  }
_ZN4llvh8dyn_castIN6hermes2vm7JSErrorENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|     52|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     52|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 52, False: 0]
  ------------------
  335|     52|}
_ZN4llvh3isaIN6hermes2vm7JSErrorEPNS2_6GCCellEEEbRKT0_:
  142|   355k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   355k|  return isa_impl_wrap<X, const Y,
  144|   355k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   355k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSErrorEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   355k|  static bool doit(const From &Val) {
  123|   355k|    return isa_impl_wrap<To, SimpleFrom,
  124|   355k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   355k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   355k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSErrorEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   355k|  static bool doit(const FromTy &Val) {
  133|   355k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   355k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm7JSErrorEPKNS2_6GCCellEE4doitES6_:
  105|   355k|  static inline bool doit(const From *Val) {
  106|   355k|    assert(Val && "isa<> used on a null pointer");
  107|   355k|    return isa_impl<To, From>::doit(*Val);
  108|   355k|  }
_ZN4llvh8isa_implIN6hermes2vm7JSErrorENS2_6GCCellEvE4doitERKS4_:
   58|   355k|  static inline bool doit(const From &Val) {
   59|   355k|    return To::classof(&Val);
   60|   355k|  }
_ZN4llvh4castIN6hermes2vm7JSErrorENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    204|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    204|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    204|  return cast_convert_val<X, Y*,
  257|    204|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    204|}
_ZN4llvh16cast_convert_valIN6hermes2vm7JSErrorEPNS2_6GCCellES5_E4doitERKS5_:
  218|    204|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    204|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    204|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    204|    return Res2;
  222|    204|  }
_ZN4llvh12cast_or_nullIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  297|  9.60k|cast_or_null(Y *Val) {
  298|  9.60k|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 0, False: 9.60k]
  ------------------
  299|  9.60k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|  9.60k|  return cast<X>(Val);
  301|  9.60k|}
_ZN4llvh8dyn_castIN6hermes2vm7JSArrayENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   271k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   271k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 271k, False: 0]
  ------------------
  335|   271k|}
_ZN4llvh4castIN6hermes2vm15DecoratedObjectENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    160|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    160|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    160|  return cast_convert_val<X, Y*,
  257|    160|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    160|}
_ZN4llvh3isaIN6hermes2vm15DecoratedObjectEPNS2_6GCCellEEEbRKT0_:
  142|    160|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    160|  return isa_impl_wrap<X, const Y,
  144|    160|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    160|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DecoratedObjectEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|    160|  static bool doit(const From &Val) {
  123|    160|    return isa_impl_wrap<To, SimpleFrom,
  124|    160|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    160|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    160|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DecoratedObjectEPKNS2_6GCCellES6_E4doitERKS6_:
  132|    160|  static bool doit(const FromTy &Val) {
  133|    160|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    160|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15DecoratedObjectEPKNS2_6GCCellEE4doitES6_:
  105|    160|  static inline bool doit(const From *Val) {
  106|    160|    assert(Val && "isa<> used on a null pointer");
  107|    160|    return isa_impl<To, From>::doit(*Val);
  108|    160|  }
_ZN4llvh8isa_implIN6hermes2vm15DecoratedObjectENS2_6GCCellEvE4doitERKS4_:
   58|    160|  static inline bool doit(const From &Val) {
   59|    160|    return To::classof(&Val);
   60|    160|  }
_ZN4llvh16cast_convert_valIN6hermes2vm15DecoratedObjectEPNS2_6GCCellES5_E4doitERKS5_:
  218|    160|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    160|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    160|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    160|    return Res2;
  222|    160|  }
_ZN4llvh4castIN6hermes2vm8JSStringENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.68M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.68M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.68M|  return cast_convert_val<X, Y*,
  257|  1.68M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.68M|}
_ZN4llvh3isaIN6hermes2vm8JSStringEPNS2_6GCCellEEEbRKT0_:
  142|  2.03M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.03M|  return isa_impl_wrap<X, const Y,
  144|  2.03M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.03M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSStringEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  2.03M|  static bool doit(const From &Val) {
  123|  2.03M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.03M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.03M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.03M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSStringEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  2.03M|  static bool doit(const FromTy &Val) {
  133|  2.03M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.03M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSStringEPKNS2_6GCCellEE4doitES6_:
  105|  2.03M|  static inline bool doit(const From *Val) {
  106|  2.03M|    assert(Val && "isa<> used on a null pointer");
  107|  2.03M|    return isa_impl<To, From>::doit(*Val);
  108|  2.03M|  }
_ZN4llvh8isa_implIN6hermes2vm8JSStringENS2_6GCCellEvE4doitERKS4_:
   58|  2.03M|  static inline bool doit(const From &Val) {
   59|  2.03M|    return To::classof(&Val);
   60|  2.03M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm8JSStringEPNS2_6GCCellES5_E4doitERKS5_:
  218|  1.68M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.68M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.68M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.68M|    return Res2;
  222|  1.68M|  }
_ZN4llvh8dyn_castIN6hermes2vm23BufferedStringPrimitiveIDsEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|     31|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     31|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 29, False: 2]
  ------------------
  335|     31|}
_ZN4llvh3isaIN6hermes2vm23BufferedStringPrimitiveIDsEEPNS2_6GCCellEEEbRKT0_:
  142|     89|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     89|  return isa_impl_wrap<X, const Y,
  144|     89|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     89|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23BufferedStringPrimitiveIDsEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|     89|  static bool doit(const From &Val) {
  123|     89|    return isa_impl_wrap<To, SimpleFrom,
  124|     89|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     89|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     89|  }
_ZN4llvh4castIN6hermes2vm23BufferedStringPrimitiveIDsEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|     58|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     58|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     58|  return cast_convert_val<X, Y*,
  257|     58|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     58|}
_ZN4llvh16cast_convert_valIN6hermes2vm23BufferedStringPrimitiveIDsEEPNS2_6GCCellES6_E4doitERKS6_:
  218|     58|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     58|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     58|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     58|    return Res2;
  222|     58|  }
_ZN4llvh4castIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|    160|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    160|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    160|  return cast_convert_val<X, Y*,
  257|    160|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    160|}
_ZN4llvh3isaIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPNS2_6GCCellEEEbRKT0_:
  142|    160|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    160|  return isa_impl_wrap<X, const Y,
  144|    160|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    160|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|    160|  static bool doit(const From &Val) {
  123|    160|    return isa_impl_wrap<To, SimpleFrom,
  124|    160|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    160|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    160|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|    160|  static bool doit(const FromTy &Val) {
  133|    160|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    160|  }
_ZN4llvh11isa_impl_clIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPKNS2_6GCCellEE4doitES8_:
  105|    160|  static inline bool doit(const From *Val) {
  106|    160|    assert(Val && "isa<> used on a null pointer");
  107|    160|    return isa_impl<To, From>::doit(*Val);
  108|    160|  }
_ZN4llvh8isa_implIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEENS2_6GCCellEvE4doitERKS6_:
   58|    160|  static inline bool doit(const From &Val) {
   59|    160|    return To::classof(&Val);
   60|    160|  }
_ZN4llvh16cast_convert_valIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|    160|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    160|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    160|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    160|    return Res2;
  222|    160|  }
_ZN4llvh4castIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|    160|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    160|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    160|  return cast_convert_val<X, Y*,
  257|    160|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    160|}
_ZN4llvh3isaIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPNS2_6GCCellEEEbRKT0_:
  142|    160|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    160|  return isa_impl_wrap<X, const Y,
  144|    160|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    160|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|    160|  static bool doit(const From &Val) {
  123|    160|    return isa_impl_wrap<To, SimpleFrom,
  124|    160|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    160|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    160|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|    160|  static bool doit(const FromTy &Val) {
  133|    160|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    160|  }
_ZN4llvh11isa_impl_clIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPKNS2_6GCCellEE4doitES8_:
  105|    160|  static inline bool doit(const From *Val) {
  106|    160|    assert(Val && "isa<> used on a null pointer");
  107|    160|    return isa_impl<To, From>::doit(*Val);
  108|    160|  }
_ZN4llvh8isa_implIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEENS2_6GCCellEvE4doitERKS6_:
   58|    160|  static inline bool doit(const From &Val) {
   59|    160|    return To::classof(&Val);
   60|    160|  }
_ZN4llvh16cast_convert_valIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|    160|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    160|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    160|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    160|    return Res2;
  222|    160|  }
_ZN4llvh3isaIN6hermes2vm8JSNumberEPNS2_6GCCellEEEbRKT0_:
  142|   355k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   355k|  return isa_impl_wrap<X, const Y,
  144|   355k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   355k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSNumberEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   355k|  static bool doit(const From &Val) {
  123|   355k|    return isa_impl_wrap<To, SimpleFrom,
  124|   355k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   355k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   355k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSNumberEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   355k|  static bool doit(const FromTy &Val) {
  133|   355k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   355k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSNumberEPKNS2_6GCCellEE4doitES6_:
  105|   355k|  static inline bool doit(const From *Val) {
  106|   355k|    assert(Val && "isa<> used on a null pointer");
  107|   355k|    return isa_impl<To, From>::doit(*Val);
  108|   355k|  }
_ZN4llvh8isa_implIN6hermes2vm8JSNumberENS2_6GCCellEvE4doitERKS4_:
   58|   355k|  static inline bool doit(const From &Val) {
   59|   355k|    return To::classof(&Val);
   60|   355k|  }
_ZN4llvh3isaIN6hermes2vm9JSBooleanEPNS2_6GCCellEEEbRKT0_:
  142|   355k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   355k|  return isa_impl_wrap<X, const Y,
  144|   355k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   355k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm9JSBooleanEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   355k|  static bool doit(const From &Val) {
  123|   355k|    return isa_impl_wrap<To, SimpleFrom,
  124|   355k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   355k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   355k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm9JSBooleanEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   355k|  static bool doit(const FromTy &Val) {
  133|   355k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   355k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm9JSBooleanEPKNS2_6GCCellEE4doitES6_:
  105|   355k|  static inline bool doit(const From *Val) {
  106|   355k|    assert(Val && "isa<> used on a null pointer");
  107|   355k|    return isa_impl<To, From>::doit(*Val);
  108|   355k|  }
_ZN4llvh8isa_implIN6hermes2vm9JSBooleanENS2_6GCCellEvE4doitERKS4_:
   58|   355k|  static inline bool doit(const From &Val) {
   59|   355k|    return To::classof(&Val);
   60|   355k|  }
_ZN4llvh4castIN6hermes2vm9JSBooleanENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    160|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    160|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    160|  return cast_convert_val<X, Y*,
  257|    160|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    160|}
_ZN4llvh16cast_convert_valIN6hermes2vm9JSBooleanEPNS2_6GCCellES5_E4doitERKS5_:
  218|    160|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    160|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    160|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    160|    return Res2;
  222|    160|  }
_ZN4llvh3isaIN6hermes2vm9ArgumentsEPNS2_6GCCellEEEbRKT0_:
  142|   355k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   355k|  return isa_impl_wrap<X, const Y,
  144|   355k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   355k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm9ArgumentsEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   355k|  static bool doit(const From &Val) {
  123|   355k|    return isa_impl_wrap<To, SimpleFrom,
  124|   355k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   355k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   355k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm9ArgumentsEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   355k|  static bool doit(const FromTy &Val) {
  133|   355k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   355k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm9ArgumentsEPKNS2_6GCCellEE4doitES6_:
  105|   355k|  static inline bool doit(const From *Val) {
  106|   355k|    assert(Val && "isa<> used on a null pointer");
  107|   355k|    return isa_impl<To, From>::doit(*Val);
  108|   355k|  }
_ZN4llvh8isa_implIN6hermes2vm9ArgumentsENS2_6GCCellEvE4doitERKS4_:
   58|   355k|  static inline bool doit(const From &Val) {
   59|   355k|    return To::classof(&Val);
   60|   355k|  }
_ZN4llvh3isaIN6hermes2vm6JSDateEPNS2_6GCCellEEEbRKT0_:
  142|   355k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   355k|  return isa_impl_wrap<X, const Y,
  144|   355k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   355k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm6JSDateEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   355k|  static bool doit(const From &Val) {
  123|   355k|    return isa_impl_wrap<To, SimpleFrom,
  124|   355k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   355k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   355k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm6JSDateEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   355k|  static bool doit(const FromTy &Val) {
  133|   355k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   355k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm6JSDateEPKNS2_6GCCellEE4doitES6_:
  105|   355k|  static inline bool doit(const From *Val) {
  106|   355k|    assert(Val && "isa<> used on a null pointer");
  107|   355k|    return isa_impl<To, From>::doit(*Val);
  108|   355k|  }
_ZN4llvh8isa_implIN6hermes2vm6JSDateENS2_6GCCellEvE4doitERKS4_:
   58|   355k|  static inline bool doit(const From &Val) {
   59|   355k|    return To::classof(&Val);
   60|   355k|  }
_ZN4llvh3isaIN6hermes2vm15JSAsyncFunctionEPNS2_6GCCellEEEbRKT0_:
  142|     85|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     85|  return isa_impl_wrap<X, const Y,
  144|     85|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     85|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15JSAsyncFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|     85|  static bool doit(const From &Val) {
  123|     85|    return isa_impl_wrap<To, SimpleFrom,
  124|     85|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     85|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     85|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15JSAsyncFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|     85|  static bool doit(const FromTy &Val) {
  133|     85|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     85|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15JSAsyncFunctionEPKNS2_6GCCellEE4doitES6_:
  105|     85|  static inline bool doit(const From *Val) {
  106|     85|    assert(Val && "isa<> used on a null pointer");
  107|     85|    return isa_impl<To, From>::doit(*Val);
  108|     85|  }
_ZN4llvh8isa_implIN6hermes2vm15JSAsyncFunctionENS2_6GCCellEvE4doitERKS4_:
   58|     85|  static inline bool doit(const From &Val) {
   59|     85|    return To::classof(&Val);
   60|     85|  }
_ZN4llvh4castIN6hermes2vm8JSNumberENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    160|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    160|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    160|  return cast_convert_val<X, Y*,
  257|    160|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    160|}
_ZN4llvh16cast_convert_valIN6hermes2vm8JSNumberEPNS2_6GCCellES5_E4doitERKS5_:
  218|    160|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    160|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    160|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    160|    return Res2;
  222|    160|  }
_ZN4llvh12cast_or_nullIN6hermes2vm8JSRegExpENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|      1|cast_or_null(Y *Val) {
  298|      1|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 1, False: 0]
  ------------------
  299|      0|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|      0|}
_ZN4llvh4castIN6hermes2vm7HadesGC6OldGen12FreelistCellENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   585k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   585k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   585k|  return cast_convert_val<X, Y*,
  257|   585k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   585k|}
_ZN4llvh3isaIN6hermes2vm7HadesGC6OldGen12FreelistCellEPNS2_6GCCellEEEbRKT0_:
  142|  17.0M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  17.0M|  return isa_impl_wrap<X, const Y,
  144|  17.0M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  17.0M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm7HadesGC6OldGen12FreelistCellEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|  17.0M|  static bool doit(const From &Val) {
  123|  17.0M|    return isa_impl_wrap<To, SimpleFrom,
  124|  17.0M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  17.0M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  17.0M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm7HadesGC6OldGen12FreelistCellEPKNS2_6GCCellES8_E4doitERKS8_:
  132|  17.0M|  static bool doit(const FromTy &Val) {
  133|  17.0M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  17.0M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm7HadesGC6OldGen12FreelistCellEPKNS2_6GCCellEE4doitES8_:
  105|  17.0M|  static inline bool doit(const From *Val) {
  106|  17.0M|    assert(Val && "isa<> used on a null pointer");
  107|  17.0M|    return isa_impl<To, From>::doit(*Val);
  108|  17.0M|  }
_ZN4llvh8isa_implIN6hermes2vm7HadesGC6OldGen12FreelistCellENS2_6GCCellEvE4doitERKS6_:
   58|  17.0M|  static inline bool doit(const From &Val) {
   59|  17.0M|    return To::classof(&Val);
   60|  17.0M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm7HadesGC6OldGen12FreelistCellEPNS2_6GCCellES7_E4doitERKS7_:
  218|   585k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   585k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   585k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   585k|    return Res2;
  222|   585k|  }
_ZN4llvh8dyn_castIN6hermes14AllocArrayInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  10.0M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  10.0M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 202, False: 10.0M]
  ------------------
  335|  10.0M|}
_ZN4llvh3isaIN6hermes14AllocArrayInstEPNS1_11InstructionEEEbRKT0_:
  142|  14.9M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  14.9M|  return isa_impl_wrap<X, const Y,
  144|  14.9M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  14.9M|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  14.9M|  static bool doit(const From &Val) {
  123|  14.9M|    return isa_impl_wrap<To, SimpleFrom,
  124|  14.9M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  14.9M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  14.9M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  14.9M|  static bool doit(const FromTy &Val) {
  133|  14.9M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  14.9M|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocArrayInstEPKNS1_11InstructionEE4doitES5_:
  105|  14.9M|  static inline bool doit(const From *Val) {
  106|  14.9M|    assert(Val && "isa<> used on a null pointer");
  107|  14.9M|    return isa_impl<To, From>::doit(*Val);
  108|  14.9M|  }
_ZN4llvh8isa_implIN6hermes14AllocArrayInstENS1_11InstructionEvE4doitERKS3_:
   58|  14.9M|  static inline bool doit(const From &Val) {
   59|  14.9M|    return To::classof(&Val);
   60|  14.9M|  }
_ZN4llvh13simplify_typeIKPN6hermes11InstructionEE18getSimplifiedValueERS4_:
   48|   211M|  static RetType getSimplifiedValue(const From& Val) {
   49|   211M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   211M|  }
_ZN4llvh13simplify_typeIPN6hermes11InstructionEE18getSimplifiedValueERS3_:
   38|   211M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes14AllocArrayInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    303|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    303|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    303|  return cast_convert_val<X, Y*,
  257|    303|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    303|}
_ZN4llvh16cast_convert_valIN6hermes14AllocArrayInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    303|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    303|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    303|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    303|    return Res2;
  222|    303|  }
_ZN4llvh8dyn_castIN6hermes28HBCAllocObjectFromBufferInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  6.18M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  6.18M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 6.18M]
  ------------------
  335|  6.18M|}
_ZN4llvh3isaIN6hermes28HBCAllocObjectFromBufferInstEPNS1_11InstructionEEEbRKT0_:
  142|  11.1M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  11.1M|  return isa_impl_wrap<X, const Y,
  144|  11.1M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  11.1M|}
_ZN4llvh13isa_impl_wrapIN6hermes28HBCAllocObjectFromBufferInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  11.1M|  static bool doit(const From &Val) {
  123|  11.1M|    return isa_impl_wrap<To, SimpleFrom,
  124|  11.1M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  11.1M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  11.1M|  }
_ZN4llvh13isa_impl_wrapIN6hermes28HBCAllocObjectFromBufferInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  11.1M|  static bool doit(const FromTy &Val) {
  133|  11.1M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  11.1M|  }
_ZN4llvh11isa_impl_clIN6hermes28HBCAllocObjectFromBufferInstEPKNS1_11InstructionEE4doitES5_:
  105|  11.1M|  static inline bool doit(const From *Val) {
  106|  11.1M|    assert(Val && "isa<> used on a null pointer");
  107|  11.1M|    return isa_impl<To, From>::doit(*Val);
  108|  11.1M|  }
_ZN4llvh8isa_implIN6hermes28HBCAllocObjectFromBufferInstENS1_11InstructionEvE4doitERKS3_:
   58|  11.1M|  static inline bool doit(const From &Val) {
   59|  11.1M|    return To::classof(&Val);
   60|  11.1M|  }
_ZN4llvh8dyn_castIN6hermes14TerminatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  9.20M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  9.20M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 9.20M, False: 0]
  ------------------
  335|  9.20M|}
_ZN4llvh3isaIN6hermes14TerminatorInstEPNS1_11InstructionEEEbRKT0_:
  142|  25.2M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.2M|  return isa_impl_wrap<X, const Y,
  144|  25.2M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.2M|}
_ZN4llvh13isa_impl_wrapIN6hermes14TerminatorInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  25.2M|  static bool doit(const From &Val) {
  123|  25.2M|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.2M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.2M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.2M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14TerminatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  28.2M|  static bool doit(const FromTy &Val) {
  133|  28.2M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  28.2M|  }
_ZN4llvh11isa_impl_clIN6hermes14TerminatorInstEPKNS1_11InstructionEE4doitES5_:
  105|  28.2M|  static inline bool doit(const From *Val) {
  106|  28.2M|    assert(Val && "isa<> used on a null pointer");
  107|  28.2M|    return isa_impl<To, From>::doit(*Val);
  108|  28.2M|  }
_ZN4llvh8isa_implIN6hermes14TerminatorInstENS1_11InstructionEvE4doitERKS3_:
   58|  28.2M|  static inline bool doit(const From &Val) {
   59|  28.2M|    return To::classof(&Val);
   60|  28.2M|  }
_ZN4llvh4castIN6hermes14TerminatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  9.20M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  9.20M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  9.20M|  return cast_convert_val<X, Y*,
  257|  9.20M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  9.20M|}
_ZN4llvh16cast_convert_valIN6hermes14TerminatorInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  9.20M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  9.20M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  9.20M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  9.20M|    return Res2;
  222|  9.20M|  }
_ZN4llvh8dyn_castIN6hermes8CallInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  21.3M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  21.3M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 92.1k, False: 21.2M]
  ------------------
  335|  21.3M|}
_ZN4llvh3isaIN6hermes8CallInstEPNS1_11InstructionEEEbRKT0_:
  142|  22.9M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  22.9M|  return isa_impl_wrap<X, const Y,
  144|  22.9M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  22.9M|}
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  22.9M|  static bool doit(const From &Val) {
  123|  22.9M|    return isa_impl_wrap<To, SimpleFrom,
  124|  22.9M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  22.9M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  22.9M|  }
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  22.9M|  static bool doit(const FromTy &Val) {
  133|  22.9M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  22.9M|  }
_ZN4llvh11isa_impl_clIN6hermes8CallInstEPKNS1_11InstructionEE4doitES5_:
  105|  22.9M|  static inline bool doit(const From *Val) {
  106|  22.9M|    assert(Val && "isa<> used on a null pointer");
  107|  22.9M|    return isa_impl<To, From>::doit(*Val);
  108|  22.9M|  }
_ZN4llvh8isa_implIN6hermes8CallInstENS1_11InstructionEvE4doitERKS3_:
   58|  22.9M|  static inline bool doit(const From &Val) {
   59|  22.9M|    return To::classof(&Val);
   60|  22.9M|  }
_ZN4llvh8dyn_castIN6hermes8VariableENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   711k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   711k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 208k, False: 503k]
  ------------------
  335|   711k|}
_ZN4llvh4castIN6hermes9CatchInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  8.53M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  8.53M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  8.53M|  return cast_convert_val<X, Y*,
  257|  8.53M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  8.53M|}
_ZN4llvh3isaIN6hermes9CatchInstEPNS1_5ValueEEEbRKT0_:
  142|  8.53M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  8.53M|  return isa_impl_wrap<X, const Y,
  144|  8.53M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  8.53M|}
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  8.53M|  static bool doit(const From &Val) {
  123|  8.53M|    return isa_impl_wrap<To, SimpleFrom,
  124|  8.53M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  8.53M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  8.53M|  }
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  8.53M|  static bool doit(const FromTy &Val) {
  133|  8.53M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  8.53M|  }
_ZN4llvh11isa_impl_clIN6hermes9CatchInstEPKNS1_5ValueEE4doitES5_:
  105|  8.53M|  static inline bool doit(const From *Val) {
  106|  8.53M|    assert(Val && "isa<> used on a null pointer");
  107|  8.53M|    return isa_impl<To, From>::doit(*Val);
  108|  8.53M|  }
_ZN4llvh8isa_implIN6hermes9CatchInstENS1_5ValueEvE4doitERKS3_:
   58|  8.53M|  static inline bool doit(const From &Val) {
   59|  8.53M|    return To::classof(&Val);
   60|  8.53M|  }
_ZN4llvh16cast_convert_valIN6hermes9CatchInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  8.53M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  8.53M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  8.53M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  8.53M|    return Res2;
  222|  8.53M|  }
_ZN4llvh3isaIN6hermes15CallBuiltinInstEPNS1_8CallInstEEEbRKT0_:
  142|  61.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  61.4k|  return isa_impl_wrap<X, const Y,
  144|  61.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  61.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEKPNS1_8CallInstEPKS3_E4doitERS5_:
  122|  61.4k|  static bool doit(const From &Val) {
  123|  61.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  61.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  61.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  61.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEPKNS1_8CallInstES5_E4doitERKS5_:
  132|  61.4k|  static bool doit(const FromTy &Val) {
  133|  61.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  61.4k|  }
_ZN4llvh11isa_impl_clIN6hermes15CallBuiltinInstEPKNS1_8CallInstEE4doitES5_:
  105|  61.4k|  static inline bool doit(const From *Val) {
  106|  61.4k|    assert(Val && "isa<> used on a null pointer");
  107|  61.4k|    return isa_impl<To, From>::doit(*Val);
  108|  61.4k|  }
_ZN4llvh8isa_implIN6hermes15CallBuiltinInstENS1_8CallInstEvE4doitERKS3_:
   58|  61.4k|  static inline bool doit(const From &Val) {
   59|  61.4k|    return To::classof(&Val);
   60|  61.4k|  }
_ZN4llvh13simplify_typeIKPN6hermes8CallInstEE18getSimplifiedValueERS4_:
   48|   856k|  static RetType getSimplifiedValue(const From& Val) {
   49|   856k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   856k|  }
_ZN4llvh13simplify_typeIPN6hermes8CallInstEE18getSimplifiedValueERS3_:
   38|   856k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes12HBCCallNInstEPNS1_8CallInstEEEbRKT0_:
  142|   795k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   795k|  return isa_impl_wrap<X, const Y,
  144|   795k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   795k|}
_ZN4llvh13isa_impl_wrapIN6hermes12HBCCallNInstEKPNS1_8CallInstEPKS3_E4doitERS5_:
  122|   795k|  static bool doit(const From &Val) {
  123|   795k|    return isa_impl_wrap<To, SimpleFrom,
  124|   795k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   795k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   795k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12HBCCallNInstEPKNS1_8CallInstES5_E4doitERKS5_:
  132|   795k|  static bool doit(const FromTy &Val) {
  133|   795k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   795k|  }
_ZN4llvh11isa_impl_clIN6hermes12HBCCallNInstEPKNS1_8CallInstEE4doitES5_:
  105|   795k|  static inline bool doit(const From *Val) {
  106|   795k|    assert(Val && "isa<> used on a null pointer");
  107|   795k|    return isa_impl<To, From>::doit(*Val);
  108|   795k|  }
_ZN4llvh8isa_implIN6hermes12HBCCallNInstENS1_8CallInstEvE4doitERKS3_:
   58|   795k|  static inline bool doit(const From &Val) {
   59|   795k|    return To::classof(&Val);
   60|   795k|  }
_ZN4llvh3isaIN6hermes16LiteralUndefinedEPNS1_5ValueEEEbRKT0_:
  142|  2.82k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.82k|  return isa_impl_wrap<X, const Y,
  144|  2.82k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.82k|}
_ZN4llvh13isa_impl_wrapIN6hermes16LiteralUndefinedEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  2.82k|  static bool doit(const From &Val) {
  123|  2.82k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.82k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.82k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.82k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16LiteralUndefinedEPKNS1_5ValueES5_E4doitERKS5_:
  132|  2.82k|  static bool doit(const FromTy &Val) {
  133|  2.82k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.82k|  }
_ZN4llvh11isa_impl_clIN6hermes16LiteralUndefinedEPKNS1_5ValueEE4doitES5_:
  105|  2.82k|  static inline bool doit(const From *Val) {
  106|  2.82k|    assert(Val && "isa<> used on a null pointer");
  107|  2.82k|    return isa_impl<To, From>::doit(*Val);
  108|  2.82k|  }
_ZN4llvh8isa_implIN6hermes16LiteralUndefinedENS1_5ValueEvE4doitERKS3_:
   58|  2.82k|  static inline bool doit(const From &Val) {
   59|  2.82k|    return To::classof(&Val);
   60|  2.82k|  }
_ZN4llvh8dyn_castIN6hermes13LiteralStringENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  12.5M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  12.5M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.58M, False: 10.9M]
  ------------------
  335|  12.5M|}
_ZN4llvh4castIN6hermes13LiteralStringES2_EENS_10cast_rettyIT_PT0_E8ret_typeES6_:
  254|   501k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   501k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   501k|  return cast_convert_val<X, Y*,
  257|   501k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   501k|}
_ZN4llvh3isaIN6hermes13LiteralStringEPS2_EEbRKT0_:
  142|   501k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   501k|  return isa_impl_wrap<X, const Y,
  144|   501k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   501k|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEKPS2_PKS2_E4doitERS4_:
  122|   501k|  static bool doit(const From &Val) {
  123|   501k|    return isa_impl_wrap<To, SimpleFrom,
  124|   501k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   501k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   501k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEPKS2_S4_E4doitERKS4_:
  132|   501k|  static bool doit(const FromTy &Val) {
  133|   501k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   501k|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralStringEPKS2_E4doitES4_:
  105|   501k|  static inline bool doit(const From *Val) {
  106|   501k|    assert(Val && "isa<> used on a null pointer");
  107|   501k|    return isa_impl<To, From>::doit(*Val);
  108|   501k|  }
_ZN4llvh8isa_implIN6hermes13LiteralStringES2_vE4doitERKS2_:
   67|   501k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes13LiteralStringEE18getSimplifiedValueERS4_:
   48|   501k|  static RetType getSimplifiedValue(const From& Val) {
   49|   501k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   501k|  }
_ZN4llvh13simplify_typeIPN6hermes13LiteralStringEE18getSimplifiedValueERS3_:
   38|   501k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes13LiteralStringEPS2_S3_E4doitERKS3_:
  218|   501k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   501k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   501k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   501k|    return Res2;
  222|   501k|  }
_ZN4llvh8dyn_castIN6hermes13LiteralNumberENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.65M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.65M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.65M, False: 1]
  ------------------
  335|  1.65M|}
_ZN4llvh3isaIN6hermes13EmptySentinelEPNS1_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_wrapIN6hermes13EmptySentinelEKPNS1_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_wrapIN6hermes13EmptySentinelEPKNS1_5ValueES5_E4doitERKS5_:
  132|      2|  static bool doit(const FromTy &Val) {
  133|      2|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      2|  }
_ZN4llvh11isa_impl_clIN6hermes13EmptySentinelEPKNS1_5ValueEE4doitES5_:
  105|      2|  static inline bool doit(const From *Val) {
  106|      2|    assert(Val && "isa<> used on a null pointer");
  107|      2|    return isa_impl<To, From>::doit(*Val);
  108|      2|  }
_ZN4llvh8isa_implIN6hermes13EmptySentinelENS1_5ValueEvE4doitERKS3_:
   58|      2|  static inline bool doit(const From &Val) {
   59|      2|    return To::classof(&Val);
   60|      2|  }
_ZN4llvh3isaIN6hermes17GeneratorFunctionEPNS1_8FunctionEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes17GeneratorFunctionEKPNS1_8FunctionEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17GeneratorFunctionEPKNS1_8FunctionES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes17GeneratorFunctionEPKNS1_8FunctionEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes17GeneratorFunctionENS1_8FunctionEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh13simplify_typeIKPN6hermes8FunctionEE18getSimplifiedValueERS4_:
   48|   723k|  static RetType getSimplifiedValue(const From& Val) {
   49|   723k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   723k|  }
_ZN4llvh13simplify_typeIPN6hermes8FunctionEE18getSimplifiedValueERS3_:
   38|   723k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes13AsyncFunctionEPNS1_8FunctionEEEbRKT0_:
  142|   309k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   309k|  return isa_impl_wrap<X, const Y,
  144|   309k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   309k|}
_ZN4llvh13isa_impl_wrapIN6hermes13AsyncFunctionEKPNS1_8FunctionEPKS3_E4doitERS5_:
  122|   309k|  static bool doit(const From &Val) {
  123|   309k|    return isa_impl_wrap<To, SimpleFrom,
  124|   309k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   309k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   309k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13AsyncFunctionEPKNS1_8FunctionES5_E4doitERKS5_:
  132|   309k|  static bool doit(const FromTy &Val) {
  133|   309k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   309k|  }
_ZN4llvh11isa_impl_clIN6hermes13AsyncFunctionEPKNS1_8FunctionEE4doitES5_:
  105|   309k|  static inline bool doit(const From *Val) {
  106|   309k|    assert(Val && "isa<> used on a null pointer");
  107|   309k|    return isa_impl<To, From>::doit(*Val);
  108|   309k|  }
_ZN4llvh8isa_implIN6hermes13AsyncFunctionENS1_8FunctionEvE4doitERKS3_:
   58|   309k|  static inline bool doit(const From &Val) {
   59|   309k|    return To::classof(&Val);
   60|   309k|  }
_ZN4llvh3isaIN6hermes22GeneratorInnerFunctionEPNS1_8FunctionEEEbRKT0_:
  142|   310k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   310k|  return isa_impl_wrap<X, const Y,
  144|   310k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   310k|}
_ZN4llvh13isa_impl_wrapIN6hermes22GeneratorInnerFunctionEKPNS1_8FunctionEPKS3_E4doitERS5_:
  122|   310k|  static bool doit(const From &Val) {
  123|   310k|    return isa_impl_wrap<To, SimpleFrom,
  124|   310k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   310k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   310k|  }
_ZN4llvh13isa_impl_wrapIN6hermes22GeneratorInnerFunctionEPKNS1_8FunctionES5_E4doitERKS5_:
  132|   310k|  static bool doit(const FromTy &Val) {
  133|   310k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   310k|  }
_ZN4llvh11isa_impl_clIN6hermes22GeneratorInnerFunctionEPKNS1_8FunctionEE4doitES5_:
  105|   310k|  static inline bool doit(const From *Val) {
  106|   310k|    assert(Val && "isa<> used on a null pointer");
  107|   310k|    return isa_impl<To, From>::doit(*Val);
  108|   310k|  }
_ZN4llvh8isa_implIN6hermes22GeneratorInnerFunctionENS1_8FunctionEvE4doitERKS3_:
   58|   310k|  static inline bool doit(const From &Val) {
   59|   310k|    return To::classof(&Val);
   60|   310k|  }
_ZN4llvh4castIN6hermes11LiteralBoolENS1_7LiteralEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.82k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.82k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.82k|  return cast_convert_val<X, Y*,
  257|  2.82k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.82k|}
_ZN4llvh3isaIN6hermes11LiteralBoolEPNS1_7LiteralEEEbRKT0_:
  142|  2.82k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.82k|  return isa_impl_wrap<X, const Y,
  144|  2.82k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.82k|}
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEKPNS1_7LiteralEPKS3_E4doitERS5_:
  122|  2.82k|  static bool doit(const From &Val) {
  123|  2.82k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.82k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.82k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.82k|  }
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEPKNS1_7LiteralES5_E4doitERKS5_:
  132|  2.82k|  static bool doit(const FromTy &Val) {
  133|  2.82k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.82k|  }
_ZN4llvh11isa_impl_clIN6hermes11LiteralBoolEPKNS1_7LiteralEE4doitES5_:
  105|  2.82k|  static inline bool doit(const From *Val) {
  106|  2.82k|    assert(Val && "isa<> used on a null pointer");
  107|  2.82k|    return isa_impl<To, From>::doit(*Val);
  108|  2.82k|  }
_ZN4llvh8isa_implIN6hermes11LiteralBoolENS1_7LiteralEvE4doitERKS3_:
   58|  2.82k|  static inline bool doit(const From &Val) {
   59|  2.82k|    return To::classof(&Val);
   60|  2.82k|  }
_ZN4llvh16cast_convert_valIN6hermes11LiteralBoolEPNS1_7LiteralES4_E4doitERKS4_:
  218|  2.82k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.82k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.82k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.82k|    return Res2;
  222|  2.82k|  }
_ZN4llvh4castIN6hermes13LiteralNumberENS1_7LiteralEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.00M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.00M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.00M|  return cast_convert_val<X, Y*,
  257|  2.00M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.00M|}
_ZN4llvh16cast_convert_valIN6hermes13LiteralNumberEPNS1_7LiteralES4_E4doitERKS4_:
  218|  2.00M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.00M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.00M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.00M|    return Res2;
  222|  2.00M|  }
_ZN4llvh4castIN6hermes13LiteralBigIntENS1_7LiteralEEENS_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|      5|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes13LiteralBigIntEPNS1_7LiteralEEEbRKT0_:
  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_wrapIN6hermes13LiteralBigIntEKPNS1_7LiteralEPKS3_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_wrapIN6hermes13LiteralBigIntEPKNS1_7LiteralES5_E4doitERKS5_:
  132|      5|  static bool doit(const FromTy &Val) {
  133|      5|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      5|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralBigIntEPKNS1_7LiteralEE4doitES5_:
  105|      5|  static inline bool doit(const From *Val) {
  106|      5|    assert(Val && "isa<> used on a null pointer");
  107|      5|    return isa_impl<To, From>::doit(*Val);
  108|      5|  }
_ZN4llvh8isa_implIN6hermes13LiteralBigIntENS1_7LiteralEvE4doitERKS3_:
   58|      5|  static inline bool doit(const From &Val) {
   59|      5|    return To::classof(&Val);
   60|      5|  }
_ZN4llvh16cast_convert_valIN6hermes13LiteralBigIntEPNS1_7LiteralES4_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|  }
_ZN4llvh4castIN6hermes13LiteralStringENS1_7LiteralEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   394k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   394k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   394k|  return cast_convert_val<X, Y*,
  257|   394k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   394k|}
_ZN4llvh16cast_convert_valIN6hermes13LiteralStringEPNS1_7LiteralES4_E4doitERKS4_:
  218|   394k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   394k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   394k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   394k|    return Res2;
  222|   394k|  }
_ZN4llvh4castIN6hermes8CallInstENS1_16HBCConstructInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes8CallInstEPNS1_16HBCConstructInstEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEKPNS1_16HBCConstructInstEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEPKNS1_16HBCConstructInstES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes8CallInstEPKNS1_16HBCConstructInstEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes8CallInstENS1_16HBCConstructInstEvE4doitERKS3_:
   67|  25.0k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes16HBCConstructInstEE18getSimplifiedValueERS4_:
   48|  25.0k|  static RetType getSimplifiedValue(const From& Val) {
   49|  25.0k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  25.0k|  }
_ZN4llvh13simplify_typeIPN6hermes16HBCConstructInstEE18getSimplifiedValueERS3_:
   38|  25.0k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes8CallInstEPNS1_16HBCConstructInstES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh3isaIN6hermes38ThrowIfHasRestrictedGlobalPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.42M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.42M|  return isa_impl_wrap<X, const Y,
  144|  1.42M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.42M|}
_ZN4llvh13isa_impl_wrapIN6hermes38ThrowIfHasRestrictedGlobalPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.42M|  static bool doit(const From &Val) {
  123|  1.42M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.42M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.42M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.42M|  }
_ZN4llvh13isa_impl_wrapIN6hermes38ThrowIfHasRestrictedGlobalPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.42M|  static bool doit(const FromTy &Val) {
  133|  1.42M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.42M|  }
_ZN4llvh11isa_impl_clIN6hermes38ThrowIfHasRestrictedGlobalPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.42M|  static inline bool doit(const From *Val) {
  106|  1.42M|    assert(Val && "isa<> used on a null pointer");
  107|  1.42M|    return isa_impl<To, From>::doit(*Val);
  108|  1.42M|  }
_ZN4llvh8isa_implIN6hermes38ThrowIfHasRestrictedGlobalPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.42M|  static inline bool doit(const From &Val) {
   59|  1.42M|    return To::classof(&Val);
   60|  1.42M|  }
_ZN4llvh4castIN6hermes17ScopeCreationInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes17ScopeCreationInstEPNS1_11InstructionEEEbRKT0_:
  142|  6.29M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.29M|  return isa_impl_wrap<X, const Y,
  144|  6.29M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.29M|}
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  6.29M|  static bool doit(const From &Val) {
  123|  6.29M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.29M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.29M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.29M|  }
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  6.29M|  static bool doit(const FromTy &Val) {
  133|  6.29M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.29M|  }
_ZN4llvh11isa_impl_clIN6hermes17ScopeCreationInstEPKNS1_11InstructionEE4doitES5_:
  105|  6.29M|  static inline bool doit(const From *Val) {
  106|  6.29M|    assert(Val && "isa<> used on a null pointer");
  107|  6.29M|    return isa_impl<To, From>::doit(*Val);
  108|  6.29M|  }
_ZN4llvh8isa_implIN6hermes17ScopeCreationInstENS1_11InstructionEvE4doitERKS3_:
   58|  6.29M|  static inline bool doit(const From &Val) {
   59|  6.29M|    return To::classof(&Val);
   60|  6.29M|  }
_ZN4llvh16cast_convert_valIN6hermes17ScopeCreationInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes15CreateScopeInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes15CreateScopeInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.72M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.72M|  return isa_impl_wrap<X, const Y,
  144|  3.72M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.72M|}
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.72M|  static bool doit(const From &Val) {
  123|  3.72M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.72M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.72M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.72M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.72M|  static bool doit(const FromTy &Val) {
  133|  3.72M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.72M|  }
_ZN4llvh11isa_impl_clIN6hermes15CreateScopeInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.72M|  static inline bool doit(const From *Val) {
  106|  3.72M|    assert(Val && "isa<> used on a null pointer");
  107|  3.72M|    return isa_impl<To, From>::doit(*Val);
  108|  3.72M|  }
_ZN4llvh8isa_implIN6hermes15CreateScopeInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.72M|  static inline bool doit(const From &Val) {
   59|  3.72M|    return To::classof(&Val);
   60|  3.72M|  }
_ZN4llvh16cast_convert_valIN6hermes15CreateScopeInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes24HBCCreateEnvironmentInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes24HBCCreateEnvironmentInstEPNS1_11InstructionEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes24HBCCreateEnvironmentInstEPKNS1_11InstructionEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes24HBCCreateEnvironmentInstENS1_11InstructionEvE4doitERKS3_:
   58|   516k|  static inline bool doit(const From &Val) {
   59|   516k|    return To::classof(&Val);
   60|   516k|  }
_ZN4llvh16cast_convert_valIN6hermes24HBCCreateEnvironmentInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh8isa_implIN6hermes21HBCResolveEnvironmentENS1_11InstructionEvE4doitERKS3_:
   58|  6.18M|  static inline bool doit(const From &Val) {
   59|  6.18M|    return To::classof(&Val);
   60|  6.18M|  }
_ZN4llvh3isaIN6hermes20CreateInnerScopeInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.52M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.52M|  return isa_impl_wrap<X, const Y,
  144|  3.52M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.52M|}
_ZN4llvh13isa_impl_wrapIN6hermes20CreateInnerScopeInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.52M|  static bool doit(const From &Val) {
  123|  3.52M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.52M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.52M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.52M|  }
_ZN4llvh13isa_impl_wrapIN6hermes20CreateInnerScopeInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.52M|  static bool doit(const FromTy &Val) {
  133|  3.52M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.52M|  }
_ZN4llvh11isa_impl_clIN6hermes20CreateInnerScopeInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.52M|  static inline bool doit(const From *Val) {
  106|  3.52M|    assert(Val && "isa<> used on a null pointer");
  107|  3.52M|    return isa_impl<To, From>::doit(*Val);
  108|  3.52M|  }
_ZN4llvh8isa_implIN6hermes20CreateInnerScopeInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.52M|  static inline bool doit(const From &Val) {
   59|  3.52M|    return To::classof(&Val);
   60|  3.52M|  }
_ZN4llvh4castIN6hermes12AsNumberInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.00k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.00k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.00k|  return cast_convert_val<X, Y*,
  257|  1.00k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.00k|}
_ZN4llvh3isaIN6hermes12AsNumberInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.00k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.00k|  return isa_impl_wrap<X, const Y,
  144|  1.00k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.00k|}
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.00k|  static bool doit(const From &Val) {
  123|  1.00k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.00k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.00k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.00k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.00k|  static bool doit(const FromTy &Val) {
  133|  1.00k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.00k|  }
_ZN4llvh11isa_impl_clIN6hermes12AsNumberInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.00k|  static inline bool doit(const From *Val) {
  106|  1.00k|    assert(Val && "isa<> used on a null pointer");
  107|  1.00k|    return isa_impl<To, From>::doit(*Val);
  108|  1.00k|  }
_ZN4llvh8isa_implIN6hermes12AsNumberInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.00k|  static inline bool doit(const From &Val) {
   59|  1.00k|    return To::classof(&Val);
   60|  1.00k|  }
_ZN4llvh16cast_convert_valIN6hermes12AsNumberInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  1.00k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.00k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.00k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.00k|    return Res2;
  222|  1.00k|  }
_ZN4llvh4castIN6hermes13LoadStackInstENS1_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|   128k|  return cast_convert_val<X, Y*,
  257|   128k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   128k|}
_ZN4llvh3isaIN6hermes13LoadStackInstEPNS1_11InstructionEEEbRKT0_:
  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_wrapIN6hermes13LoadStackInstEKPNS1_11InstructionEPKS3_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_wrapIN6hermes13LoadStackInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   128k|  static bool doit(const FromTy &Val) {
  133|   128k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   128k|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadStackInstEPKNS1_11InstructionEE4doitES5_:
  105|   128k|  static inline bool doit(const From *Val) {
  106|   128k|    assert(Val && "isa<> used on a null pointer");
  107|   128k|    return isa_impl<To, From>::doit(*Val);
  108|   128k|  }
_ZN4llvh8isa_implIN6hermes13LoadStackInstENS1_11InstructionEvE4doitERKS3_:
   58|   128k|  static inline bool doit(const From &Val) {
   59|   128k|    return To::classof(&Val);
   60|   128k|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadStackInstEPNS1_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|  }
_ZN4llvh4castIN6hermes7MovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.34M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.34M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.34M|  return cast_convert_val<X, Y*,
  257|  1.34M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.34M|}
_ZN4llvh3isaIN6hermes7MovInstEPNS1_11InstructionEEEbRKT0_:
  142|  7.14M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  7.14M|  return isa_impl_wrap<X, const Y,
  144|  7.14M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  7.14M|}
_ZN4llvh13isa_impl_wrapIN6hermes7MovInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  7.14M|  static bool doit(const From &Val) {
  123|  7.14M|    return isa_impl_wrap<To, SimpleFrom,
  124|  7.14M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  7.14M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  7.14M|  }
_ZN4llvh13isa_impl_wrapIN6hermes7MovInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  7.14M|  static bool doit(const FromTy &Val) {
  133|  7.14M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  7.14M|  }
_ZN4llvh11isa_impl_clIN6hermes7MovInstEPKNS1_11InstructionEE4doitES5_:
  105|  7.14M|  static inline bool doit(const From *Val) {
  106|  7.14M|    assert(Val && "isa<> used on a null pointer");
  107|  7.14M|    return isa_impl<To, From>::doit(*Val);
  108|  7.14M|  }
_ZN4llvh8isa_implIN6hermes7MovInstENS1_11InstructionEvE4doitERKS3_:
   58|  7.14M|  static inline bool doit(const From &Val) {
   59|  7.14M|    return To::classof(&Val);
   60|  7.14M|  }
_ZN4llvh16cast_convert_valIN6hermes7MovInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  1.34M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.34M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.34M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.34M|    return Res2;
  222|  1.34M|  }
_ZN4llvh4castIN6hermes15ImplicitMovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.82k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.82k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.82k|  return cast_convert_val<X, Y*,
  257|  2.82k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.82k|}
_ZN4llvh3isaIN6hermes15ImplicitMovInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.82k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.82k|  return isa_impl_wrap<X, const Y,
  144|  2.82k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.82k|}
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.82k|  static bool doit(const From &Val) {
  123|  2.82k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.82k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.82k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.82k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.82k|  static bool doit(const FromTy &Val) {
  133|  2.82k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.82k|  }
_ZN4llvh11isa_impl_clIN6hermes15ImplicitMovInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.82k|  static inline bool doit(const From *Val) {
  106|  2.82k|    assert(Val && "isa<> used on a null pointer");
  107|  2.82k|    return isa_impl<To, From>::doit(*Val);
  108|  2.82k|  }
_ZN4llvh8isa_implIN6hermes15ImplicitMovInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.82k|  static inline bool doit(const From &Val) {
   59|  2.82k|    return To::classof(&Val);
   60|  2.82k|  }
_ZN4llvh16cast_convert_valIN6hermes15ImplicitMovInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  2.82k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.82k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.82k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.82k|    return Res2;
  222|  2.82k|  }
_ZN4llvh4castIN6hermes17UnaryOperatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  28.9k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  28.9k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  28.9k|  return cast_convert_val<X, Y*,
  257|  28.9k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  28.9k|}
_ZN4llvh3isaIN6hermes17UnaryOperatorInstEPNS1_11InstructionEEEbRKT0_:
  142|  28.9k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  28.9k|  return isa_impl_wrap<X, const Y,
  144|  28.9k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  28.9k|}
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  28.9k|  static bool doit(const From &Val) {
  123|  28.9k|    return isa_impl_wrap<To, SimpleFrom,
  124|  28.9k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  28.9k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  28.9k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  28.9k|  static bool doit(const FromTy &Val) {
  133|  28.9k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  28.9k|  }
_ZN4llvh11isa_impl_clIN6hermes17UnaryOperatorInstEPKNS1_11InstructionEE4doitES5_:
  105|  28.9k|  static inline bool doit(const From *Val) {
  106|  28.9k|    assert(Val && "isa<> used on a null pointer");
  107|  28.9k|    return isa_impl<To, From>::doit(*Val);
  108|  28.9k|  }
_ZN4llvh8isa_implIN6hermes17UnaryOperatorInstENS1_11InstructionEvE4doitERKS3_:
   58|  28.9k|  static inline bool doit(const From &Val) {
   59|  28.9k|    return To::classof(&Val);
   60|  28.9k|  }
_ZN4llvh16cast_convert_valIN6hermes17UnaryOperatorInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  28.9k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  28.9k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  28.9k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  28.9k|    return Res2;
  222|  28.9k|  }
_ZN4llvh4castIN6hermes16HBCLoadConstInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.64M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.64M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.64M|  return cast_convert_val<X, Y*,
  257|  1.64M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.64M|}
_ZN4llvh3isaIN6hermes16HBCLoadConstInstEPNS1_11InstructionEEEbRKT0_:
  142|  6.59M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.59M|  return isa_impl_wrap<X, const Y,
  144|  6.59M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.59M|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  6.59M|  static bool doit(const From &Val) {
  123|  6.59M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.59M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.59M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.59M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  6.59M|  static bool doit(const FromTy &Val) {
  133|  6.59M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.59M|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadConstInstEPKNS1_11InstructionEE4doitES5_:
  105|  6.59M|  static inline bool doit(const From *Val) {
  106|  6.59M|    assert(Val && "isa<> used on a null pointer");
  107|  6.59M|    return isa_impl<To, From>::doit(*Val);
  108|  6.59M|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadConstInstENS1_11InstructionEvE4doitERKS3_:
   58|  6.59M|  static inline bool doit(const From &Val) {
   59|  6.59M|    return To::classof(&Val);
   60|  6.59M|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadConstInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  1.64M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.64M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.64M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.64M|    return Res2;
  222|  1.64M|  }
_ZN4llvh4castIN6hermes16HBCLoadParamInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes16HBCLoadParamInstEPNS1_11InstructionEEEbRKT0_:
  142|  5.04M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.04M|  return isa_impl_wrap<X, const Y,
  144|  5.04M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.04M|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  5.04M|  static bool doit(const From &Val) {
  123|  5.04M|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.04M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.04M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.04M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  5.04M|  static bool doit(const FromTy &Val) {
  133|  5.04M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.04M|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadParamInstEPKNS1_11InstructionEE4doitES5_:
  105|  5.04M|  static inline bool doit(const From *Val) {
  106|  5.04M|    assert(Val && "isa<> used on a null pointer");
  107|  5.04M|    return isa_impl<To, From>::doit(*Val);
  108|  5.04M|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadParamInstENS1_11InstructionEvE4doitERKS3_:
   58|  5.04M|  static inline bool doit(const From &Val) {
   59|  5.04M|    return To::classof(&Val);
   60|  5.04M|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadParamInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes21HBCReifyArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    200|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    200|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    200|  return cast_convert_val<X, Y*,
  257|    200|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    200|}
_ZN4llvh3isaIN6hermes21HBCReifyArgumentsInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.96M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.96M|  return isa_impl_wrap<X, const Y,
  144|  3.96M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.96M|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.96M|  static bool doit(const From &Val) {
  123|  3.96M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.96M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.96M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.96M|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.96M|  static bool doit(const FromTy &Val) {
  133|  3.96M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.96M|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCReifyArgumentsInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.96M|  static inline bool doit(const From *Val) {
  106|  3.96M|    assert(Val && "isa<> used on a null pointer");
  107|  3.96M|    return isa_impl<To, From>::doit(*Val);
  108|  3.96M|  }
_ZN4llvh8isa_implIN6hermes21HBCReifyArgumentsInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.96M|  static inline bool doit(const From &Val) {
   59|  3.96M|    return To::classof(&Val);
   60|  3.96M|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCReifyArgumentsInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    200|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    200|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    200|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    200|    return Res2;
  222|    200|  }
_ZN4llvh4castIN6hermes15HBCSpillMovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.38M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.38M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.38M|  return cast_convert_val<X, Y*,
  257|  2.38M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.38M|}
_ZN4llvh3isaIN6hermes15HBCSpillMovInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.38M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.38M|  return isa_impl_wrap<X, const Y,
  144|  2.38M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.38M|}
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.38M|  static bool doit(const From &Val) {
  123|  2.38M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.38M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.38M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.38M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.38M|  static bool doit(const FromTy &Val) {
  133|  2.38M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.38M|  }
_ZN4llvh11isa_impl_clIN6hermes15HBCSpillMovInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.38M|  static inline bool doit(const From *Val) {
  106|  2.38M|    assert(Val && "isa<> used on a null pointer");
  107|  2.38M|    return isa_impl<To, From>::doit(*Val);
  108|  2.38M|  }
_ZN4llvh8isa_implIN6hermes15HBCSpillMovInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.38M|  static inline bool doit(const From &Val) {
   59|  2.38M|    return To::classof(&Val);
   60|  2.38M|  }
_ZN4llvh16cast_convert_valIN6hermes15HBCSpillMovInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  2.38M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.38M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.38M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.38M|    return Res2;
  222|  2.38M|  }
_ZN4llvh4castIN6hermes7PhiInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  17.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  17.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  17.6k|  return cast_convert_val<X, Y*,
  257|  17.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  17.6k|}
_ZN4llvh3isaIN6hermes7PhiInstEPNS1_11InstructionEEEbRKT0_:
  142|  21.6M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  21.6M|  return isa_impl_wrap<X, const Y,
  144|  21.6M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  21.6M|}
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  21.6M|  static bool doit(const From &Val) {
  123|  21.6M|    return isa_impl_wrap<To, SimpleFrom,
  124|  21.6M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  21.6M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  21.6M|  }
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  21.6M|  static bool doit(const FromTy &Val) {
  133|  21.6M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  21.6M|  }
_ZN4llvh11isa_impl_clIN6hermes7PhiInstEPKNS1_11InstructionEE4doitES5_:
  105|  21.6M|  static inline bool doit(const From *Val) {
  106|  21.6M|    assert(Val && "isa<> used on a null pointer");
  107|  21.6M|    return isa_impl<To, From>::doit(*Val);
  108|  21.6M|  }
_ZN4llvh8isa_implIN6hermes7PhiInstENS1_11InstructionEvE4doitERKS3_:
   58|  21.6M|  static inline bool doit(const From &Val) {
   59|  21.6M|    return To::classof(&Val);
   60|  21.6M|  }
_ZN4llvh16cast_convert_valIN6hermes7PhiInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  17.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  17.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  17.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  17.6k|    return Res2;
  222|  17.6k|  }
_ZN4llvh4castIN6hermes18BinaryOperatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   514k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   514k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   514k|  return cast_convert_val<X, Y*,
  257|   514k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   514k|}
_ZN4llvh3isaIN6hermes18BinaryOperatorInstEPNS1_11InstructionEEEbRKT0_:
  142|  4.13M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.13M|  return isa_impl_wrap<X, const Y,
  144|  4.13M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.13M|}
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  4.13M|  static bool doit(const From &Val) {
  123|  4.13M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.13M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.13M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.13M|  }
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  4.13M|  static bool doit(const FromTy &Val) {
  133|  4.13M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.13M|  }
_ZN4llvh11isa_impl_clIN6hermes18BinaryOperatorInstEPKNS1_11InstructionEE4doitES5_:
  105|  4.13M|  static inline bool doit(const From *Val) {
  106|  4.13M|    assert(Val && "isa<> used on a null pointer");
  107|  4.13M|    return isa_impl<To, From>::doit(*Val);
  108|  4.13M|  }
_ZN4llvh8isa_implIN6hermes18BinaryOperatorInstENS1_11InstructionEvE4doitERKS3_:
   58|  4.13M|  static inline bool doit(const From &Val) {
   59|  4.13M|    return To::classof(&Val);
   60|  4.13M|  }
_ZN4llvh16cast_convert_valIN6hermes18BinaryOperatorInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   514k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   514k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   514k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   514k|    return Res2;
  222|   514k|  }
_ZN4llvh4castIN6hermes17StorePropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.60k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.60k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.60k|  return cast_convert_val<X, Y*,
  257|  1.60k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.60k|}
_ZN4llvh3isaIN6hermes17StorePropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  5.13M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.13M|  return isa_impl_wrap<X, const Y,
  144|  5.13M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.13M|}
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  5.13M|  static bool doit(const From &Val) {
  123|  5.13M|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.13M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.13M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.13M|  }
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  5.13M|  static bool doit(const FromTy &Val) {
  133|  5.13M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.13M|  }
_ZN4llvh11isa_impl_clIN6hermes17StorePropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  5.13M|  static inline bool doit(const From *Val) {
  106|  5.13M|    assert(Val && "isa<> used on a null pointer");
  107|  5.13M|    return isa_impl<To, From>::doit(*Val);
  108|  5.13M|  }
_ZN4llvh8isa_implIN6hermes17StorePropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  5.13M|  static inline bool doit(const From &Val) {
   59|  5.13M|    return To::classof(&Val);
   60|  5.13M|  }
_ZN4llvh16cast_convert_valIN6hermes17StorePropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  1.60k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.60k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.60k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.60k|    return Res2;
  222|  1.60k|  }
_ZN4llvh4castIN6hermes20StoreOwnPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  3.30M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.30M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  3.30M|  return cast_convert_val<X, Y*,
  257|  3.30M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.30M|}
_ZN4llvh3isaIN6hermes20StoreOwnPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  10.9M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  10.9M|  return isa_impl_wrap<X, const Y,
  144|  10.9M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  10.9M|}
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  10.9M|  static bool doit(const From &Val) {
  123|  10.9M|    return isa_impl_wrap<To, SimpleFrom,
  124|  10.9M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  10.9M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  10.9M|  }
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  10.9M|  static bool doit(const FromTy &Val) {
  133|  10.9M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  10.9M|  }
_ZN4llvh11isa_impl_clIN6hermes20StoreOwnPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  10.9M|  static inline bool doit(const From *Val) {
  106|  10.9M|    assert(Val && "isa<> used on a null pointer");
  107|  10.9M|    return isa_impl<To, From>::doit(*Val);
  108|  10.9M|  }
_ZN4llvh8isa_implIN6hermes20StoreOwnPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  10.9M|  static inline bool doit(const From &Val) {
   59|  10.9M|    return To::classof(&Val);
   60|  10.9M|  }
_ZN4llvh16cast_convert_valIN6hermes20StoreOwnPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  3.30M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.30M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.30M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.30M|    return Res2;
  222|  3.30M|  }
_ZN4llvh4castIN6hermes23StoreNewOwnPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      1|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      1|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      1|  return cast_convert_val<X, Y*,
  257|      1|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      1|}
_ZN4llvh3isaIN6hermes23StoreNewOwnPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|   826k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   826k|  return isa_impl_wrap<X, const Y,
  144|   826k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   826k|}
_ZN4llvh13isa_impl_wrapIN6hermes23StoreNewOwnPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   826k|  static bool doit(const From &Val) {
  123|   826k|    return isa_impl_wrap<To, SimpleFrom,
  124|   826k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   826k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   826k|  }
_ZN4llvh13isa_impl_wrapIN6hermes23StoreNewOwnPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   826k|  static bool doit(const FromTy &Val) {
  133|   826k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   826k|  }
_ZN4llvh11isa_impl_clIN6hermes23StoreNewOwnPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|   826k|  static inline bool doit(const From *Val) {
  106|   826k|    assert(Val && "isa<> used on a null pointer");
  107|   826k|    return isa_impl<To, From>::doit(*Val);
  108|   826k|  }
_ZN4llvh8isa_implIN6hermes23StoreNewOwnPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|   826k|  static inline bool doit(const From &Val) {
   59|   826k|    return To::classof(&Val);
   60|   826k|  }
_ZN4llvh16cast_convert_valIN6hermes23StoreNewOwnPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      1|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      1|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      1|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      1|    return Res2;
  222|      1|  }
_ZN4llvh3isaIN6hermes21StoreGetterSetterInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.86M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.86M|  return isa_impl_wrap<X, const Y,
  144|  3.86M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.86M|}
_ZN4llvh13isa_impl_wrapIN6hermes21StoreGetterSetterInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.86M|  static bool doit(const From &Val) {
  123|  3.86M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.86M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.86M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.86M|  }
_ZN4llvh13isa_impl_wrapIN6hermes21StoreGetterSetterInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.86M|  static bool doit(const FromTy &Val) {
  133|  3.86M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.86M|  }
_ZN4llvh11isa_impl_clIN6hermes21StoreGetterSetterInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.86M|  static inline bool doit(const From *Val) {
  106|  3.86M|    assert(Val && "isa<> used on a null pointer");
  107|  3.86M|    return isa_impl<To, From>::doit(*Val);
  108|  3.86M|  }
_ZN4llvh8isa_implIN6hermes21StoreGetterSetterInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.86M|  static inline bool doit(const From &Val) {
   59|  3.86M|    return To::classof(&Val);
   60|  3.86M|  }
_ZN4llvh3isaIN6hermes18DeletePropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.86M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.86M|  return isa_impl_wrap<X, const Y,
  144|  3.86M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.86M|}
_ZN4llvh13isa_impl_wrapIN6hermes18DeletePropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.86M|  static bool doit(const From &Val) {
  123|  3.86M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.86M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.86M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.86M|  }
_ZN4llvh13isa_impl_wrapIN6hermes18DeletePropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.86M|  static bool doit(const FromTy &Val) {
  133|  3.86M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.86M|  }
_ZN4llvh11isa_impl_clIN6hermes18DeletePropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.86M|  static inline bool doit(const From *Val) {
  106|  3.86M|    assert(Val && "isa<> used on a null pointer");
  107|  3.86M|    return isa_impl<To, From>::doit(*Val);
  108|  3.86M|  }
_ZN4llvh8isa_implIN6hermes18DeletePropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.86M|  static inline bool doit(const From &Val) {
   59|  3.86M|    return To::classof(&Val);
   60|  3.86M|  }
_ZN4llvh4castIN6hermes16LoadPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   108k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   108k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   108k|  return cast_convert_val<X, Y*,
  257|   108k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   108k|}
_ZN4llvh3isaIN6hermes16LoadPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  5.78M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.78M|  return isa_impl_wrap<X, const Y,
  144|  5.78M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.78M|}
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  5.78M|  static bool doit(const From &Val) {
  123|  5.78M|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.78M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.78M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.78M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  5.78M|  static bool doit(const FromTy &Val) {
  133|  5.78M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.78M|  }
_ZN4llvh11isa_impl_clIN6hermes16LoadPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  5.78M|  static inline bool doit(const From *Val) {
  106|  5.78M|    assert(Val && "isa<> used on a null pointer");
  107|  5.78M|    return isa_impl<To, From>::doit(*Val);
  108|  5.78M|  }
_ZN4llvh8isa_implIN6hermes16LoadPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  5.78M|  static inline bool doit(const From &Val) {
   59|  5.78M|    return To::classof(&Val);
   60|  5.78M|  }
_ZN4llvh16cast_convert_valIN6hermes16LoadPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   108k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   108k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   108k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   108k|    return Res2;
  222|   108k|  }
_ZN4llvh4castIN6hermes25TryLoadGlobalPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   779k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   779k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   779k|  return cast_convert_val<X, Y*,
  257|   779k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   779k|}
_ZN4llvh3isaIN6hermes25TryLoadGlobalPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|   779k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   779k|  return isa_impl_wrap<X, const Y,
  144|   779k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   779k|}
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   779k|  static bool doit(const From &Val) {
  123|   779k|    return isa_impl_wrap<To, SimpleFrom,
  124|   779k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   779k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   779k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   779k|  static bool doit(const FromTy &Val) {
  133|   779k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   779k|  }
_ZN4llvh11isa_impl_clIN6hermes25TryLoadGlobalPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|   779k|  static inline bool doit(const From *Val) {
  106|   779k|    assert(Val && "isa<> used on a null pointer");
  107|   779k|    return isa_impl<To, From>::doit(*Val);
  108|   779k|  }
_ZN4llvh8isa_implIN6hermes25TryLoadGlobalPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|   779k|  static inline bool doit(const From &Val) {
   59|   779k|    return To::classof(&Val);
   60|   779k|  }
_ZN4llvh16cast_convert_valIN6hermes25TryLoadGlobalPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   779k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   779k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   779k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   779k|    return Res2;
  222|   779k|  }
_ZN4llvh4castIN6hermes13LoadFrameInstENS1_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|      4|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes13LoadFrameInstEPNS1_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_wrapIN6hermes13LoadFrameInstEKPNS1_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_wrapIN6hermes13LoadFrameInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadFrameInstEPKNS1_11InstructionEE4doitES5_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      4|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes13LoadFrameInstENS1_11InstructionEvE4doitERKS3_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadFrameInstEPNS1_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|  }
_ZN4llvh4castIN6hermes14StoreStackInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   576k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   576k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   576k|  return cast_convert_val<X, Y*,
  257|   576k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   576k|}
_ZN4llvh3isaIN6hermes14StoreStackInstEPNS1_11InstructionEEEbRKT0_:
  142|  6.56M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.56M|  return isa_impl_wrap<X, const Y,
  144|  6.56M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.56M|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  6.56M|  static bool doit(const From &Val) {
  123|  6.56M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.56M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.56M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.56M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  6.56M|  static bool doit(const FromTy &Val) {
  133|  6.56M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.56M|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreStackInstEPKNS1_11InstructionEE4doitES5_:
  105|  6.56M|  static inline bool doit(const From *Val) {
  106|  6.56M|    assert(Val && "isa<> used on a null pointer");
  107|  6.56M|    return isa_impl<To, From>::doit(*Val);
  108|  6.56M|  }
_ZN4llvh8isa_implIN6hermes14StoreStackInstENS1_11InstructionEvE4doitERKS3_:
   58|  6.56M|  static inline bool doit(const From &Val) {
   59|  6.56M|    return To::classof(&Val);
   60|  6.56M|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreStackInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   576k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   576k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   576k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   576k|    return Res2;
  222|   576k|  }
_ZN4llvh4castIN6hermes14StoreFrameInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   104k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   104k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   104k|  return cast_convert_val<X, Y*,
  257|   104k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   104k|}
_ZN4llvh3isaIN6hermes14StoreFrameInstEPNS1_11InstructionEEEbRKT0_:
  142|   104k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   104k|  return isa_impl_wrap<X, const Y,
  144|   104k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   104k|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   104k|  static bool doit(const From &Val) {
  123|   104k|    return isa_impl_wrap<To, SimpleFrom,
  124|   104k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   104k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   104k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   104k|  static bool doit(const FromTy &Val) {
  133|   104k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   104k|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreFrameInstEPKNS1_11InstructionEE4doitES5_:
  105|   104k|  static inline bool doit(const From *Val) {
  106|   104k|    assert(Val && "isa<> used on a null pointer");
  107|   104k|    return isa_impl<To, From>::doit(*Val);
  108|   104k|  }
_ZN4llvh8isa_implIN6hermes14StoreFrameInstENS1_11InstructionEvE4doitERKS3_:
   58|   104k|  static inline bool doit(const From &Val) {
   59|   104k|    return To::classof(&Val);
   60|   104k|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreFrameInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   104k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   104k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   104k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   104k|    return Res2;
  222|   104k|  }
_ZN4llvh4castIN6hermes14AllocStackInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   134k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   134k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   134k|  return cast_convert_val<X, Y*,
  257|   134k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   134k|}
_ZN4llvh3isaIN6hermes14AllocStackInstEPNS1_11InstructionEEEbRKT0_:
  142|   134k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   134k|  return isa_impl_wrap<X, const Y,
  144|   134k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   134k|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   134k|  static bool doit(const From &Val) {
  123|   134k|    return isa_impl_wrap<To, SimpleFrom,
  124|   134k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   134k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   134k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   134k|  static bool doit(const FromTy &Val) {
  133|   134k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   134k|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocStackInstEPKNS1_11InstructionEE4doitES5_:
  105|   134k|  static inline bool doit(const From *Val) {
  106|   134k|    assert(Val && "isa<> used on a null pointer");
  107|   134k|    return isa_impl<To, From>::doit(*Val);
  108|   134k|  }
_ZN4llvh8isa_implIN6hermes14AllocStackInstENS1_11InstructionEvE4doitERKS3_:
   58|   134k|  static inline bool doit(const From &Val) {
   59|   134k|    return To::classof(&Val);
   60|   134k|  }
_ZN4llvh16cast_convert_valIN6hermes14AllocStackInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   134k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   134k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   134k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   134k|    return Res2;
  222|   134k|  }
_ZN4llvh4castIN6hermes15AllocObjectInstENS1_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|      2|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes15AllocObjectInstEPNS1_11InstructionEEEbRKT0_:
  142|  4.53M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.53M|  return isa_impl_wrap<X, const Y,
  144|  4.53M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.53M|}
_ZN4llvh13isa_impl_wrapIN6hermes15AllocObjectInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  4.53M|  static bool doit(const From &Val) {
  123|  4.53M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.53M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.53M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.53M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15AllocObjectInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  4.53M|  static bool doit(const FromTy &Val) {
  133|  4.53M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.53M|  }
_ZN4llvh11isa_impl_clIN6hermes15AllocObjectInstEPKNS1_11InstructionEE4doitES5_:
  105|  4.53M|  static inline bool doit(const From *Val) {
  106|  4.53M|    assert(Val && "isa<> used on a null pointer");
  107|  4.53M|    return isa_impl<To, From>::doit(*Val);
  108|  4.53M|  }
_ZN4llvh8isa_implIN6hermes15AllocObjectInstENS1_11InstructionEvE4doitERKS3_:
   58|  4.53M|  static inline bool doit(const From &Val) {
   59|  4.53M|    return To::classof(&Val);
   60|  4.53M|  }
_ZN4llvh16cast_convert_valIN6hermes15AllocObjectInstEPNS1_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|  }
_ZN4llvh4castIN6hermes19CreateArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     13|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     13|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     13|  return cast_convert_val<X, Y*,
  257|     13|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     13|}
_ZN4llvh3isaIN6hermes19CreateArgumentsInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.39M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.39M|  return isa_impl_wrap<X, const Y,
  144|  1.39M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.39M|}
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.39M|  static bool doit(const From &Val) {
  123|  1.39M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.39M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.39M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.39M|  }
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.39M|  static bool doit(const FromTy &Val) {
  133|  1.39M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.39M|  }
_ZN4llvh11isa_impl_clIN6hermes19CreateArgumentsInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.39M|  static inline bool doit(const From *Val) {
  106|  1.39M|    assert(Val && "isa<> used on a null pointer");
  107|  1.39M|    return isa_impl<To, From>::doit(*Val);
  108|  1.39M|  }
_ZN4llvh8isa_implIN6hermes19CreateArgumentsInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.39M|  static inline bool doit(const From &Val) {
   59|  1.39M|    return To::classof(&Val);
   60|  1.39M|  }
_ZN4llvh16cast_convert_valIN6hermes19CreateArgumentsInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     13|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     13|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     13|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     13|    return Res2;
  222|     13|  }
_ZN4llvh4castIN6hermes9CatchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  81.2k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  81.2k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  81.2k|  return cast_convert_val<X, Y*,
  257|  81.2k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  81.2k|}
_ZN4llvh3isaIN6hermes9CatchInstEPNS1_11InstructionEEEbRKT0_:
  142|  81.2k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  81.2k|  return isa_impl_wrap<X, const Y,
  144|  81.2k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  81.2k|}
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  81.2k|  static bool doit(const From &Val) {
  123|  81.2k|    return isa_impl_wrap<To, SimpleFrom,
  124|  81.2k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  81.2k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  81.2k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  81.2k|  static bool doit(const FromTy &Val) {
  133|  81.2k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  81.2k|  }
_ZN4llvh11isa_impl_clIN6hermes9CatchInstEPKNS1_11InstructionEE4doitES5_:
  105|  81.2k|  static inline bool doit(const From *Val) {
  106|  81.2k|    assert(Val && "isa<> used on a null pointer");
  107|  81.2k|    return isa_impl<To, From>::doit(*Val);
  108|  81.2k|  }
_ZN4llvh8isa_implIN6hermes9CatchInstENS1_11InstructionEvE4doitERKS3_:
   58|   121k|  static inline bool doit(const From &Val) {
   59|   121k|    return To::classof(&Val);
   60|   121k|  }
_ZN4llvh16cast_convert_valIN6hermes9CatchInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  81.2k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  81.2k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  81.2k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  81.2k|    return Res2;
  222|  81.2k|  }
_ZN4llvh3isaIN6hermes14DirectEvalInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.42M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.42M|  return isa_impl_wrap<X, const Y,
  144|  1.42M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.42M|}
_ZN4llvh13isa_impl_wrapIN6hermes14DirectEvalInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.42M|  static bool doit(const From &Val) {
  123|  1.42M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.42M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.42M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.42M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14DirectEvalInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.42M|  static bool doit(const FromTy &Val) {
  133|  1.42M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.42M|  }
_ZN4llvh11isa_impl_clIN6hermes14DirectEvalInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.42M|  static inline bool doit(const From *Val) {
  106|  1.42M|    assert(Val && "isa<> used on a null pointer");
  107|  1.42M|    return isa_impl<To, From>::doit(*Val);
  108|  1.42M|  }
_ZN4llvh8isa_implIN6hermes14DirectEvalInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.42M|  static inline bool doit(const From &Val) {
   59|  1.42M|    return To::classof(&Val);
   60|  1.42M|  }
_ZN4llvh4castIN6hermes16CreateRegExpInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    119|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    119|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    119|  return cast_convert_val<X, Y*,
  257|    119|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    119|}
_ZN4llvh3isaIN6hermes16CreateRegExpInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.48M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.48M|  return isa_impl_wrap<X, const Y,
  144|  1.48M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.48M|}
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.48M|  static bool doit(const From &Val) {
  123|  1.48M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.48M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.48M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.48M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.48M|  static bool doit(const FromTy &Val) {
  133|  1.48M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.48M|  }
_ZN4llvh11isa_impl_clIN6hermes16CreateRegExpInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.48M|  static inline bool doit(const From *Val) {
  106|  1.48M|    assert(Val && "isa<> used on a null pointer");
  107|  1.48M|    return isa_impl<To, From>::doit(*Val);
  108|  1.48M|  }
_ZN4llvh8isa_implIN6hermes16CreateRegExpInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.48M|  static inline bool doit(const From &Val) {
   59|  1.48M|    return To::classof(&Val);
   60|  1.48M|  }
_ZN4llvh16cast_convert_valIN6hermes16CreateRegExpInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    119|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    119|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    119|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    119|    return Res2;
  222|    119|  }
_ZN4llvh4castIN6hermes10TryEndInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  40.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  40.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  40.6k|  return cast_convert_val<X, Y*,
  257|  40.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  40.6k|}
_ZN4llvh3isaIN6hermes10TryEndInstEPNS1_11InstructionEEEbRKT0_:
  142|   700k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   700k|  return isa_impl_wrap<X, const Y,
  144|   700k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   700k|}
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   700k|  static bool doit(const From &Val) {
  123|   700k|    return isa_impl_wrap<To, SimpleFrom,
  124|   700k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   700k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   700k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   700k|  static bool doit(const FromTy &Val) {
  133|   700k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   700k|  }
_ZN4llvh11isa_impl_clIN6hermes10TryEndInstEPKNS1_11InstructionEE4doitES5_:
  105|   700k|  static inline bool doit(const From *Val) {
  106|   700k|    assert(Val && "isa<> used on a null pointer");
  107|   700k|    return isa_impl<To, From>::doit(*Val);
  108|   700k|  }
_ZN4llvh8isa_implIN6hermes10TryEndInstENS1_11InstructionEvE4doitERKS3_:
   58|   700k|  static inline bool doit(const From &Val) {
   59|   700k|    return To::classof(&Val);
   60|   700k|  }
_ZN4llvh16cast_convert_valIN6hermes10TryEndInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  40.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  40.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  40.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  40.6k|    return Res2;
  222|  40.6k|  }
_ZN4llvh4castIN6hermes16GetNewTargetInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      9|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      9|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      9|  return cast_convert_val<X, Y*,
  257|      9|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      9|}
_ZN4llvh3isaIN6hermes16GetNewTargetInstEPNS1_11InstructionEEEbRKT0_:
  142|      9|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      9|  return isa_impl_wrap<X, const Y,
  144|      9|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      9|}
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      9|  static bool doit(const From &Val) {
  123|      9|    return isa_impl_wrap<To, SimpleFrom,
  124|      9|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      9|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      9|  }
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      9|  static bool doit(const FromTy &Val) {
  133|      9|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      9|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNewTargetInstEPKNS1_11InstructionEE4doitES5_:
  105|      9|  static inline bool doit(const From *Val) {
  106|      9|    assert(Val && "isa<> used on a null pointer");
  107|      9|    return isa_impl<To, From>::doit(*Val);
  108|      9|  }
_ZN4llvh8isa_implIN6hermes16GetNewTargetInstENS1_11InstructionEvE4doitERKS3_:
   58|      9|  static inline bool doit(const From &Val) {
   59|      9|    return To::classof(&Val);
   60|      9|  }
_ZN4llvh16cast_convert_valIN6hermes16GetNewTargetInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      9|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      9|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      9|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      9|    return Res2;
  222|      9|  }
_ZN4llvh4castIN6hermes17IteratorBeginInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  44.7k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  44.7k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  44.7k|  return cast_convert_val<X, Y*,
  257|  44.7k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  44.7k|}
_ZN4llvh3isaIN6hermes17IteratorBeginInstEPNS1_11InstructionEEEbRKT0_:
  142|  44.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  44.7k|  return isa_impl_wrap<X, const Y,
  144|  44.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  44.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  44.7k|  static bool doit(const From &Val) {
  123|  44.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  44.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  44.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  44.7k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  44.7k|  static bool doit(const FromTy &Val) {
  133|  44.7k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  44.7k|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorBeginInstEPKNS1_11InstructionEE4doitES5_:
  105|  44.7k|  static inline bool doit(const From *Val) {
  106|  44.7k|    assert(Val && "isa<> used on a null pointer");
  107|  44.7k|    return isa_impl<To, From>::doit(*Val);
  108|  44.7k|  }
_ZN4llvh8isa_implIN6hermes17IteratorBeginInstENS1_11InstructionEvE4doitERKS3_:
   58|  44.7k|  static inline bool doit(const From &Val) {
   59|  44.7k|    return To::classof(&Val);
   60|  44.7k|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorBeginInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  44.7k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  44.7k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  44.7k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  44.7k|    return Res2;
  222|  44.7k|  }
_ZN4llvh4castIN6hermes16IteratorNextInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  60.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  60.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  60.8k|  return cast_convert_val<X, Y*,
  257|  60.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  60.8k|}
_ZN4llvh3isaIN6hermes16IteratorNextInstEPNS1_11InstructionEEEbRKT0_:
  142|  60.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  60.8k|  return isa_impl_wrap<X, const Y,
  144|  60.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  60.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  60.8k|  static bool doit(const From &Val) {
  123|  60.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  60.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  60.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  60.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  60.8k|  static bool doit(const FromTy &Val) {
  133|  60.8k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  60.8k|  }
_ZN4llvh11isa_impl_clIN6hermes16IteratorNextInstEPKNS1_11InstructionEE4doitES5_:
  105|  60.8k|  static inline bool doit(const From *Val) {
  106|  60.8k|    assert(Val && "isa<> used on a null pointer");
  107|  60.8k|    return isa_impl<To, From>::doit(*Val);
  108|  60.8k|  }
_ZN4llvh8isa_implIN6hermes16IteratorNextInstENS1_11InstructionEvE4doitERKS3_:
   58|  60.8k|  static inline bool doit(const From &Val) {
   59|  60.8k|    return To::classof(&Val);
   60|  60.8k|  }
_ZN4llvh16cast_convert_valIN6hermes16IteratorNextInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  60.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  60.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  60.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  60.8k|    return Res2;
  222|  60.8k|  }
_ZN4llvh4castIN6hermes17IteratorCloseInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  85.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  85.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  85.3k|  return cast_convert_val<X, Y*,
  257|  85.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  85.3k|}
_ZN4llvh3isaIN6hermes17IteratorCloseInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.55M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.55M|  return isa_impl_wrap<X, const Y,
  144|  1.55M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.55M|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.55M|  static bool doit(const From &Val) {
  123|  1.55M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.55M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.55M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.55M|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.55M|  static bool doit(const FromTy &Val) {
  133|  1.55M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.55M|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorCloseInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.55M|  static inline bool doit(const From *Val) {
  106|  1.55M|    assert(Val && "isa<> used on a null pointer");
  107|  1.55M|    return isa_impl<To, From>::doit(*Val);
  108|  1.55M|  }
_ZN4llvh8isa_implIN6hermes17IteratorCloseInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.55M|  static inline bool doit(const From &Val) {
   59|  1.55M|    return To::classof(&Val);
   60|  1.55M|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorCloseInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  85.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  85.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  85.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  85.3k|    return Res2;
  222|  85.3k|  }
_ZN4llvh4castIN6hermes25HBCStoreToEnvironmentInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   104k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   104k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   104k|  return cast_convert_val<X, Y*,
  257|   104k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   104k|}
_ZN4llvh3isaIN6hermes25HBCStoreToEnvironmentInstEPNS1_11InstructionEEEbRKT0_:
  142|   104k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   104k|  return isa_impl_wrap<X, const Y,
  144|   104k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   104k|}
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   104k|  static bool doit(const From &Val) {
  123|   104k|    return isa_impl_wrap<To, SimpleFrom,
  124|   104k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   104k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   104k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   104k|  static bool doit(const FromTy &Val) {
  133|   104k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   104k|  }
_ZN4llvh11isa_impl_clIN6hermes25HBCStoreToEnvironmentInstEPKNS1_11InstructionEE4doitES5_:
  105|   104k|  static inline bool doit(const From *Val) {
  106|   104k|    assert(Val && "isa<> used on a null pointer");
  107|   104k|    return isa_impl<To, From>::doit(*Val);
  108|   104k|  }
_ZN4llvh8isa_implIN6hermes25HBCStoreToEnvironmentInstENS1_11InstructionEvE4doitERKS3_:
   58|   104k|  static inline bool doit(const From &Val) {
   59|   104k|    return To::classof(&Val);
   60|   104k|  }
_ZN4llvh16cast_convert_valIN6hermes25HBCStoreToEnvironmentInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   104k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   104k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   104k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   104k|    return Res2;
  222|   104k|  }
_ZN4llvh4castIN6hermes26HBCLoadFromEnvironmentInstENS1_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|      4|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes26HBCLoadFromEnvironmentInstEPNS1_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_wrapIN6hermes26HBCLoadFromEnvironmentInstEKPNS1_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_wrapIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_11InstructionEE4doitES5_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      4|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes26HBCLoadFromEnvironmentInstENS1_11InstructionEvE4doitERKS3_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh16cast_convert_valIN6hermes26HBCLoadFromEnvironmentInstEPNS1_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|  }
_ZN4llvh4castIN6hermes18CreateFunctionInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes18CreateFunctionInstEPNS1_11InstructionEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes18CreateFunctionInstEPKNS1_11InstructionEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes18CreateFunctionInstENS1_11InstructionEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes18CreateFunctionInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes21HBCCreateFunctionInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes21HBCCreateFunctionInstEPNS1_11InstructionEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCCreateFunctionInstEPKNS1_11InstructionEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes21HBCCreateFunctionInstENS1_11InstructionEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCCreateFunctionInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes10BranchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   484k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   484k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   484k|  return cast_convert_val<X, Y*,
  257|   484k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   484k|}
_ZN4llvh3isaIN6hermes10BranchInstEPNS1_11InstructionEEEbRKT0_:
  142|   484k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   484k|  return isa_impl_wrap<X, const Y,
  144|   484k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   484k|}
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   484k|  static bool doit(const From &Val) {
  123|   484k|    return isa_impl_wrap<To, SimpleFrom,
  124|   484k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   484k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   484k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   484k|  static bool doit(const FromTy &Val) {
  133|   484k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   484k|  }
_ZN4llvh11isa_impl_clIN6hermes10BranchInstEPKNS1_11InstructionEE4doitES5_:
  105|   484k|  static inline bool doit(const From *Val) {
  106|   484k|    assert(Val && "isa<> used on a null pointer");
  107|   484k|    return isa_impl<To, From>::doit(*Val);
  108|   484k|  }
_ZN4llvh8isa_implIN6hermes10BranchInstENS1_11InstructionEvE4doitERKS3_:
   58|   484k|  static inline bool doit(const From &Val) {
   59|   484k|    return To::classof(&Val);
   60|   484k|  }
_ZN4llvh16cast_convert_valIN6hermes10BranchInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   484k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   484k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   484k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   484k|    return Res2;
  222|   484k|  }
_ZN4llvh4castIN6hermes10ReturnInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes10ReturnInstEPNS1_11InstructionEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes10ReturnInstEPKNS1_11InstructionEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes10ReturnInstENS1_11InstructionEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes10ReturnInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes9ThrowInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  39.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  39.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  39.8k|  return cast_convert_val<X, Y*,
  257|  39.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  39.8k|}
_ZN4llvh3isaIN6hermes9ThrowInstEPNS1_11InstructionEEEbRKT0_:
  142|  39.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  39.8k|  return isa_impl_wrap<X, const Y,
  144|  39.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  39.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  39.8k|  static bool doit(const From &Val) {
  123|  39.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  39.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  39.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  39.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEPKNS1_11InstructionES5_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_clIN6hermes9ThrowInstEPKNS1_11InstructionEE4doitES5_:
  105|  39.8k|  static inline bool doit(const From *Val) {
  106|  39.8k|    assert(Val && "isa<> used on a null pointer");
  107|  39.8k|    return isa_impl<To, From>::doit(*Val);
  108|  39.8k|  }
_ZN4llvh8isa_implIN6hermes9ThrowInstENS1_11InstructionEvE4doitERKS3_:
   58|  39.8k|  static inline bool doit(const From &Val) {
   59|  39.8k|    return To::classof(&Val);
   60|  39.8k|  }
_ZN4llvh16cast_convert_valIN6hermes9ThrowInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  39.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  39.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  39.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  39.8k|    return Res2;
  222|  39.8k|  }
_ZN4llvh3isaIN6hermes10SwitchInstEPNS1_11InstructionEEEbRKT0_:
  142|  12.1M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  12.1M|  return isa_impl_wrap<X, const Y,
  144|  12.1M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  12.1M|}
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  12.1M|  static bool doit(const From &Val) {
  123|  12.1M|    return isa_impl_wrap<To, SimpleFrom,
  124|  12.1M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  12.1M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  12.1M|  }
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  12.1M|  static bool doit(const FromTy &Val) {
  133|  12.1M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  12.1M|  }
_ZN4llvh11isa_impl_clIN6hermes10SwitchInstEPKNS1_11InstructionEE4doitES5_:
  105|  12.1M|  static inline bool doit(const From *Val) {
  106|  12.1M|    assert(Val && "isa<> used on a null pointer");
  107|  12.1M|    return isa_impl<To, From>::doit(*Val);
  108|  12.1M|  }
_ZN4llvh8isa_implIN6hermes10SwitchInstENS1_11InstructionEvE4doitERKS3_:
   58|  12.1M|  static inline bool doit(const From &Val) {
   59|  12.1M|    return To::classof(&Val);
   60|  12.1M|  }
_ZN4llvh4castIN6hermes14CondBranchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  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|   165k|  return cast_convert_val<X, Y*,
  257|   165k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   165k|}
_ZN4llvh3isaIN6hermes14CondBranchInstEPNS1_11InstructionEEEbRKT0_:
  142|   165k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   165k|  return isa_impl_wrap<X, const Y,
  144|   165k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   165k|}
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   165k|  static bool doit(const From &Val) {
  123|   165k|    return isa_impl_wrap<To, SimpleFrom,
  124|   165k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   165k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   165k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   165k|  static bool doit(const FromTy &Val) {
  133|   165k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   165k|  }
_ZN4llvh11isa_impl_clIN6hermes14CondBranchInstEPKNS1_11InstructionEE4doitES5_:
  105|   165k|  static inline bool doit(const From *Val) {
  106|   165k|    assert(Val && "isa<> used on a null pointer");
  107|   165k|    return isa_impl<To, From>::doit(*Val);
  108|   165k|  }
_ZN4llvh8isa_implIN6hermes14CondBranchInstENS1_11InstructionEvE4doitERKS3_:
   58|   165k|  static inline bool doit(const From &Val) {
   59|   165k|    return To::classof(&Val);
   60|   165k|  }
_ZN4llvh16cast_convert_valIN6hermes14CondBranchInstEPNS1_11InstructionES4_E4doitERKS4_:
  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|  }
_ZN4llvh4castIN6hermes13GetPNamesInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  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|     15|  return cast_convert_val<X, Y*,
  257|     15|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     15|}
_ZN4llvh3isaIN6hermes13GetPNamesInstEPNS1_11InstructionEEEbRKT0_:
  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_wrapIN6hermes13GetPNamesInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  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_wrapIN6hermes13GetPNamesInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|     15|  static bool doit(const FromTy &Val) {
  133|     15|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     15|  }
_ZN4llvh11isa_impl_clIN6hermes13GetPNamesInstEPKNS1_11InstructionEE4doitES5_:
  105|     15|  static inline bool doit(const From *Val) {
  106|     15|    assert(Val && "isa<> used on a null pointer");
  107|     15|    return isa_impl<To, From>::doit(*Val);
  108|     15|  }
_ZN4llvh8isa_implIN6hermes13GetPNamesInstENS1_11InstructionEvE4doitERKS3_:
   58|     15|  static inline bool doit(const From &Val) {
   59|     15|    return To::classof(&Val);
   60|     15|  }
_ZN4llvh16cast_convert_valIN6hermes13GetPNamesInstEPNS1_11InstructionES4_E4doitERKS4_:
  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|  }
_ZN4llvh4castIN6hermes16GetNextPNameInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  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|     15|  return cast_convert_val<X, Y*,
  257|     15|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     15|}
_ZN4llvh3isaIN6hermes16GetNextPNameInstEPNS1_11InstructionEEEbRKT0_:
  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_wrapIN6hermes16GetNextPNameInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  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_wrapIN6hermes16GetNextPNameInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|     15|  static bool doit(const FromTy &Val) {
  133|     15|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     15|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNextPNameInstEPKNS1_11InstructionEE4doitES5_:
  105|     15|  static inline bool doit(const From *Val) {
  106|     15|    assert(Val && "isa<> used on a null pointer");
  107|     15|    return isa_impl<To, From>::doit(*Val);
  108|     15|  }
_ZN4llvh8isa_implIN6hermes16GetNextPNameInstENS1_11InstructionEvE4doitERKS3_:
   58|     15|  static inline bool doit(const From &Val) {
   59|     15|    return To::classof(&Val);
   60|     15|  }
_ZN4llvh16cast_convert_valIN6hermes16GetNextPNameInstEPNS1_11InstructionES4_E4doitERKS4_:
  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|  }
_ZN4llvh4castIN6hermes12TryStartInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  40.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  40.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  40.6k|  return cast_convert_val<X, Y*,
  257|  40.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  40.6k|}
_ZN4llvh3isaIN6hermes12TryStartInstEPNS1_11InstructionEEEbRKT0_:
  142|  40.6k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  40.6k|  return isa_impl_wrap<X, const Y,
  144|  40.6k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  40.6k|}
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  40.6k|  static bool doit(const From &Val) {
  123|  40.6k|    return isa_impl_wrap<To, SimpleFrom,
  124|  40.6k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  40.6k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  40.6k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  40.6k|  static bool doit(const FromTy &Val) {
  133|  40.6k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  40.6k|  }
_ZN4llvh11isa_impl_clIN6hermes12TryStartInstEPKNS1_11InstructionEE4doitES5_:
  105|  40.6k|  static inline bool doit(const From *Val) {
  106|  40.6k|    assert(Val && "isa<> used on a null pointer");
  107|  40.6k|    return isa_impl<To, From>::doit(*Val);
  108|  40.6k|  }
_ZN4llvh8isa_implIN6hermes12TryStartInstENS1_11InstructionEvE4doitERKS3_:
   58|  40.6k|  static inline bool doit(const From &Val) {
   59|  40.6k|    return To::classof(&Val);
   60|  40.6k|  }
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  40.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  40.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  40.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  40.6k|    return Res2;
  222|  40.6k|  }
_ZN4llvh3isaIN6hermes13SwitchImmInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.48M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.48M|  return isa_impl_wrap<X, const Y,
  144|  1.48M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.48M|}
_ZN4llvh13isa_impl_wrapIN6hermes13SwitchImmInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.48M|  static bool doit(const From &Val) {
  123|  1.48M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.48M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.48M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.48M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13SwitchImmInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.48M|  static bool doit(const FromTy &Val) {
  133|  1.48M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.48M|  }
_ZN4llvh11isa_impl_clIN6hermes13SwitchImmInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.48M|  static inline bool doit(const From *Val) {
  106|  1.48M|    assert(Val && "isa<> used on a null pointer");
  107|  1.48M|    return isa_impl<To, From>::doit(*Val);
  108|  1.48M|  }
_ZN4llvh8isa_implIN6hermes13SwitchImmInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.48M|  static inline bool doit(const From &Val) {
   59|  1.48M|    return To::classof(&Val);
   60|  1.48M|  }
_ZN4llvh4castIN6hermes8CallInstENS1_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|   100k|  return cast_convert_val<X, Y*,
  257|   100k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   100k|}
_ZN4llvh16cast_convert_valIN6hermes8CallInstEPNS1_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|  }
_ZN4llvh4castIN6hermes13ConstructInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes13ConstructInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.64M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.64M|  return isa_impl_wrap<X, const Y,
  144|  3.64M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.64M|}
_ZN4llvh13isa_impl_wrapIN6hermes13ConstructInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.64M|  static bool doit(const From &Val) {
  123|  3.64M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.64M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.64M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.64M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13ConstructInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.64M|  static bool doit(const FromTy &Val) {
  133|  3.64M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.64M|  }
_ZN4llvh11isa_impl_clIN6hermes13ConstructInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.64M|  static inline bool doit(const From *Val) {
  106|  3.64M|    assert(Val && "isa<> used on a null pointer");
  107|  3.64M|    return isa_impl<To, From>::doit(*Val);
  108|  3.64M|  }
_ZN4llvh8isa_implIN6hermes13ConstructInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.64M|  static inline bool doit(const From &Val) {
   59|  3.64M|    return To::classof(&Val);
   60|  3.64M|  }
_ZN4llvh16cast_convert_valIN6hermes13ConstructInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh4castIN6hermes15CallBuiltinInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.82k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.82k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.82k|  return cast_convert_val<X, Y*,
  257|  2.82k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.82k|}
_ZN4llvh3isaIN6hermes15CallBuiltinInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.48M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.48M|  return isa_impl_wrap<X, const Y,
  144|  1.48M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.48M|}
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.48M|  static bool doit(const From &Val) {
  123|  1.48M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.48M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.48M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.48M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.48M|  static bool doit(const FromTy &Val) {
  133|  1.48M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.48M|  }
_ZN4llvh11isa_impl_clIN6hermes15CallBuiltinInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.48M|  static inline bool doit(const From *Val) {
  106|  1.48M|    assert(Val && "isa<> used on a null pointer");
  107|  1.48M|    return isa_impl<To, From>::doit(*Val);
  108|  1.48M|  }
_ZN4llvh8isa_implIN6hermes15CallBuiltinInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.48M|  static inline bool doit(const From &Val) {
   59|  1.48M|    return To::classof(&Val);
   60|  1.48M|  }
_ZN4llvh16cast_convert_valIN6hermes15CallBuiltinInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  2.82k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.82k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.82k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.82k|    return Res2;
  222|  2.82k|  }
_ZN4llvh4castIN6hermes16HBCConstructInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes16HBCConstructInstEPNS1_11InstructionEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCConstructInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCConstructInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCConstructInstEPKNS1_11InstructionEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes16HBCConstructInstENS1_11InstructionEvE4doitERKS3_:
   58|  25.0k|  static inline bool doit(const From &Val) {
   59|  25.0k|    return To::classof(&Val);
   60|  25.0k|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCConstructInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh3isaIN6hermes21GetBuiltinClosureInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.47M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.47M|  return isa_impl_wrap<X, const Y,
  144|  1.47M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.47M|}
_ZN4llvh13isa_impl_wrapIN6hermes21GetBuiltinClosureInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.47M|  static bool doit(const From &Val) {
  123|  1.47M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.47M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.47M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.47M|  }
_ZN4llvh13isa_impl_wrapIN6hermes21GetBuiltinClosureInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.47M|  static bool doit(const FromTy &Val) {
  133|  1.47M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.47M|  }
_ZN4llvh11isa_impl_clIN6hermes21GetBuiltinClosureInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.47M|  static inline bool doit(const From *Val) {
  106|  1.47M|    assert(Val && "isa<> used on a null pointer");
  107|  1.47M|    return isa_impl<To, From>::doit(*Val);
  108|  1.47M|  }
_ZN4llvh8isa_implIN6hermes21GetBuiltinClosureInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.47M|  static inline bool doit(const From &Val) {
   59|  1.47M|    return To::classof(&Val);
   60|  1.47M|  }
_ZN4llvh4castIN6hermes22HBCGetGlobalObjectInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   503k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   503k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   503k|  return cast_convert_val<X, Y*,
  257|   503k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   503k|}
_ZN4llvh3isaIN6hermes22HBCGetGlobalObjectInstEPNS1_11InstructionEEEbRKT0_:
  142|   503k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   503k|  return isa_impl_wrap<X, const Y,
  144|   503k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   503k|}
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   503k|  static bool doit(const From &Val) {
  123|   503k|    return isa_impl_wrap<To, SimpleFrom,
  124|   503k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   503k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   503k|  }
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   503k|  static bool doit(const FromTy &Val) {
  133|   503k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   503k|  }
_ZN4llvh11isa_impl_clIN6hermes22HBCGetGlobalObjectInstEPKNS1_11InstructionEE4doitES5_:
  105|   503k|  static inline bool doit(const From *Val) {
  106|   503k|    assert(Val && "isa<> used on a null pointer");
  107|   503k|    return isa_impl<To, From>::doit(*Val);
  108|   503k|  }
_ZN4llvh8isa_implIN6hermes22HBCGetGlobalObjectInstENS1_11InstructionEvE4doitERKS3_:
   58|   503k|  static inline bool doit(const From &Val) {
   59|   503k|    return To::classof(&Val);
   60|   503k|  }
_ZN4llvh16cast_convert_valIN6hermes22HBCGetGlobalObjectInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   503k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   503k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   503k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   503k|    return Res2;
  222|   503k|  }
_ZN4llvh4castIN6hermes16HBCGetThisNSInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      9|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      9|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      9|  return cast_convert_val<X, Y*,
  257|      9|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      9|}
_ZN4llvh3isaIN6hermes16HBCGetThisNSInstEPNS1_11InstructionEEEbRKT0_:
  142|      9|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      9|  return isa_impl_wrap<X, const Y,
  144|      9|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      9|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      9|  static bool doit(const From &Val) {
  123|      9|    return isa_impl_wrap<To, SimpleFrom,
  124|      9|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      9|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      9|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      9|  static bool doit(const FromTy &Val) {
  133|      9|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      9|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCGetThisNSInstEPKNS1_11InstructionEE4doitES5_:
  105|      9|  static inline bool doit(const From *Val) {
  106|      9|    assert(Val && "isa<> used on a null pointer");
  107|      9|    return isa_impl<To, From>::doit(*Val);
  108|      9|  }
_ZN4llvh8isa_implIN6hermes16HBCGetThisNSInstENS1_11InstructionEvE4doitERKS3_:
   58|      9|  static inline bool doit(const From &Val) {
   59|      9|    return To::classof(&Val);
   60|      9|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCGetThisNSInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      9|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      9|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      9|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      9|    return Res2;
  222|      9|  }
_ZN4llvh4castIN6hermes17HBCCreateThisInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes17HBCCreateThisInstEPNS1_11InstructionEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes17HBCCreateThisInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17HBCCreateThisInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes17HBCCreateThisInstEPKNS1_11InstructionEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes17HBCCreateThisInstENS1_11InstructionEvE4doitERKS3_:
   58|  25.0k|  static inline bool doit(const From &Val) {
   59|  25.0k|    return To::classof(&Val);
   60|  25.0k|  }
_ZN4llvh16cast_convert_valIN6hermes17HBCCreateThisInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh4castIN6hermes27HBCGetConstructedObjectInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes27HBCGetConstructedObjectInstEPNS1_11InstructionEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes27HBCGetConstructedObjectInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes27HBCGetConstructedObjectInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes27HBCGetConstructedObjectInstEPKNS1_11InstructionEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes27HBCGetConstructedObjectInstENS1_11InstructionEvE4doitERKS3_:
   58|  25.0k|  static inline bool doit(const From &Val) {
   59|  25.0k|    return To::classof(&Val);
   60|  25.0k|  }
_ZN4llvh16cast_convert_valIN6hermes27HBCGetConstructedObjectInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree11ProgramNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    392|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    392|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 392, False: 0]
  ------------------
  335|    392|}
_ZN4llvh3isaIN6hermes6ESTree11ProgramNodeEPNS2_4NodeEEEbRKT0_:
  142|    988|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    988|  return isa_impl_wrap<X, const Y,
  144|    988|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    988|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|    988|  static bool doit(const From &Val) {
  123|    988|    return isa_impl_wrap<To, SimpleFrom,
  124|    988|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    988|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    988|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|    988|  static bool doit(const FromTy &Val) {
  133|    988|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    988|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11ProgramNodeEPKNS2_4NodeEE4doitES6_:
  105|    988|  static inline bool doit(const From *Val) {
  106|    988|    assert(Val && "isa<> used on a null pointer");
  107|    988|    return isa_impl<To, From>::doit(*Val);
  108|    988|  }
_ZN4llvh8isa_implIN6hermes6ESTree11ProgramNodeENS2_4NodeEvE4doitERKS4_:
   58|    988|  static inline bool doit(const From &Val) {
   59|    988|    return To::classof(&Val);
   60|    988|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree4NodeEE18getSimplifiedValueERS5_:
   48|  60.6M|  static RetType getSimplifiedValue(const From& Val) {
   49|  60.6M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  60.6M|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree4NodeEE18getSimplifiedValueERS4_:
   38|  60.6M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree11ProgramNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    596|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    596|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    596|  return cast_convert_val<X, Y*,
  257|    596|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    596|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree11ProgramNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    596|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    596|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    596|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    596|    return Res2;
  222|    596|  }
_ZN4llvh8dyn_castIN6hermes6ESTree23ExpressionStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   713k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   713k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 359k, False: 354k]
  ------------------
  335|   713k|}
_ZN4llvh3isaIN6hermes6ESTree23ExpressionStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.79M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.79M|  return isa_impl_wrap<X, const Y,
  144|  1.79M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.79M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23ExpressionStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.79M|  static bool doit(const From &Val) {
  123|  1.79M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.79M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.79M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.79M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23ExpressionStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.79M|  static bool doit(const FromTy &Val) {
  133|  1.79M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.79M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23ExpressionStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.79M|  static inline bool doit(const From *Val) {
  106|  1.79M|    assert(Val && "isa<> used on a null pointer");
  107|  1.79M|    return isa_impl<To, From>::doit(*Val);
  108|  1.79M|  }
_ZN4llvh8isa_implIN6hermes6ESTree23ExpressionStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.79M|  static inline bool doit(const From &Val) {
   59|  1.79M|    return To::classof(&Val);
   60|  1.79M|  }
_ZN4llvh4castIN6hermes6ESTree23ExpressionStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.07M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.07M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.07M|  return cast_convert_val<X, Y*,
  257|  1.07M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.07M|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree23ExpressionStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  1.07M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.07M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.07M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.07M|    return Res2;
  222|  1.07M|  }
_ZN4llvh3isaIN6hermes6ESTree22FunctionExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   138k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   138k|  return isa_impl_wrap<X, const Y,
  144|   138k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   138k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22FunctionExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   138k|  static bool doit(const From &Val) {
  123|   138k|    return isa_impl_wrap<To, SimpleFrom,
  124|   138k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   138k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   138k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22FunctionExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   138k|  static bool doit(const FromTy &Val) {
  133|   138k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   138k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22FunctionExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   138k|  static inline bool doit(const From *Val) {
  106|   138k|    assert(Val && "isa<> used on a null pointer");
  107|   138k|    return isa_impl<To, From>::doit(*Val);
  108|   138k|  }
_ZN4llvh8isa_implIN6hermes6ESTree22FunctionExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   138k|  static inline bool doit(const From &Val) {
   59|   138k|    return To::classof(&Val);
   60|   138k|  }
_ZN4llvh3isaIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   344k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   344k|  return isa_impl_wrap<X, const Y,
  144|   344k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   344k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   344k|  static bool doit(const From &Val) {
  123|   344k|    return isa_impl_wrap<To, SimpleFrom,
  124|   344k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   344k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   344k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   344k|  static bool doit(const FromTy &Val) {
  133|   344k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   344k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   344k|  static inline bool doit(const From *Val) {
  106|   344k|    assert(Val && "isa<> used on a null pointer");
  107|   344k|    return isa_impl<To, From>::doit(*Val);
  108|   344k|  }
_ZN4llvh8isa_implIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   344k|  static inline bool doit(const From &Val) {
   59|   344k|    return To::classof(&Val);
   60|   344k|  }
_ZN4llvh3isaIN6hermes12GlobalObjectEPNS1_7LiteralEEEbRKT0_:
  142|  2.25M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.25M|  return isa_impl_wrap<X, const Y,
  144|  2.25M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.25M|}
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEKPNS1_7LiteralEPKS3_E4doitERS5_:
  122|  2.25M|  static bool doit(const From &Val) {
  123|  2.25M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.25M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.25M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.25M|  }
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEPKNS1_7LiteralES5_E4doitERKS5_:
  132|  2.25M|  static bool doit(const FromTy &Val) {
  133|  2.25M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.25M|  }
_ZN4llvh11isa_impl_clIN6hermes12GlobalObjectEPKNS1_7LiteralEE4doitES5_:
  105|  2.25M|  static inline bool doit(const From *Val) {
  106|  2.25M|    assert(Val && "isa<> used on a null pointer");
  107|  2.25M|    return isa_impl<To, From>::doit(*Val);
  108|  2.25M|  }
_ZN4llvh8isa_implIN6hermes12GlobalObjectENS1_7LiteralEvE4doitERKS3_:
   58|  2.25M|  static inline bool doit(const From &Val) {
   59|  2.25M|    return To::classof(&Val);
   60|  2.25M|  }
_ZN4llvh4castIN6hermes11InstructionENS1_22HBCGetGlobalObjectInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   503k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   503k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   503k|  return cast_convert_val<X, Y*,
  257|   503k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   503k|}
_ZN4llvh3isaIN6hermes11InstructionEPNS1_22HBCGetGlobalObjectInstEEEbRKT0_:
  142|   503k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   503k|  return isa_impl_wrap<X, const Y,
  144|   503k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   503k|}
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEKPNS1_22HBCGetGlobalObjectInstEPKS3_E4doitERS5_:
  122|   503k|  static bool doit(const From &Val) {
  123|   503k|    return isa_impl_wrap<To, SimpleFrom,
  124|   503k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   503k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   503k|  }
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEPKNS1_22HBCGetGlobalObjectInstES5_E4doitERKS5_:
  132|   503k|  static bool doit(const FromTy &Val) {
  133|   503k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   503k|  }
_ZN4llvh11isa_impl_clIN6hermes11InstructionEPKNS1_22HBCGetGlobalObjectInstEE4doitES5_:
  105|   503k|  static inline bool doit(const From *Val) {
  106|   503k|    assert(Val && "isa<> used on a null pointer");
  107|   503k|    return isa_impl<To, From>::doit(*Val);
  108|   503k|  }
_ZN4llvh8isa_implIN6hermes11InstructionENS1_22HBCGetGlobalObjectInstEvE4doitERKS3_:
   67|   503k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes22HBCGetGlobalObjectInstEE18getSimplifiedValueERS4_:
   48|   503k|  static RetType getSimplifiedValue(const From& Val) {
   49|   503k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   503k|  }
_ZN4llvh13simplify_typeIPN6hermes22HBCGetGlobalObjectInstEE18getSimplifiedValueERS3_:
   38|   503k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes11InstructionEPNS1_22HBCGetGlobalObjectInstES4_E4doitERKS4_:
  218|   503k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   503k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   503k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   503k|    return Res2;
  222|   503k|  }
_ZN4llvh4castIN6hermes11InstructionENS1_16HBCLoadConstInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.75M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.75M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.75M|  return cast_convert_val<X, Y*,
  257|  1.75M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.75M|}
_ZN4llvh3isaIN6hermes11InstructionEPNS1_16HBCLoadConstInstEEEbRKT0_:
  142|  1.75M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.75M|  return isa_impl_wrap<X, const Y,
  144|  1.75M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.75M|}
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEKPNS1_16HBCLoadConstInstEPKS3_E4doitERS5_:
  122|  1.75M|  static bool doit(const From &Val) {
  123|  1.75M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.75M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.75M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.75M|  }
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEPKNS1_16HBCLoadConstInstES5_E4doitERKS5_:
  132|  1.75M|  static bool doit(const FromTy &Val) {
  133|  1.75M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.75M|  }
_ZN4llvh11isa_impl_clIN6hermes11InstructionEPKNS1_16HBCLoadConstInstEE4doitES5_:
  105|  1.75M|  static inline bool doit(const From *Val) {
  106|  1.75M|    assert(Val && "isa<> used on a null pointer");
  107|  1.75M|    return isa_impl<To, From>::doit(*Val);
  108|  1.75M|  }
_ZN4llvh8isa_implIN6hermes11InstructionENS1_16HBCLoadConstInstEvE4doitERKS3_:
   67|  1.75M|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes16HBCLoadConstInstEE18getSimplifiedValueERS4_:
   48|  1.75M|  static RetType getSimplifiedValue(const From& Val) {
   49|  1.75M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  1.75M|  }
_ZN4llvh13simplify_typeIPN6hermes16HBCLoadConstInstEE18getSimplifiedValueERS3_:
   38|  1.75M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes11InstructionEPNS1_16HBCLoadConstInstES4_E4doitERKS4_:
  218|  1.75M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.75M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.75M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.75M|    return Res2;
  222|  1.75M|  }
_ZN4llvh3isaIN6hermes24HBCCreateEnvironmentInstENS1_11InstructionEEEbRKT0_:
  142|   413k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   413k|  return isa_impl_wrap<X, const Y,
  144|   413k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   413k|}
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEKNS1_11InstructionES4_E4doitERS4_:
  132|   413k|  static bool doit(const FromTy &Val) {
  133|   413k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   413k|  }
_ZN4llvh11isa_impl_clIN6hermes24HBCCreateEnvironmentInstEKNS1_11InstructionEE4doitERS4_:
   77|   413k|  static inline bool doit(const From &Val) {
   78|   413k|    return isa_impl<To, From>::doit(Val);
   79|   413k|  }
_ZN4llvh8dyn_castIN6hermes7PhiInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  21.5M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  21.5M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 13.2k, False: 21.5M]
  ------------------
  335|  21.5M|}
_ZN4llvh8dyn_castIN6hermes20StoreOwnPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  4.53M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.53M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2.48M, False: 2.05M]
  ------------------
  335|  4.53M|}
_ZN4llvh8dyn_castIN6hermes7LiteralENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  9.39M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  9.39M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 4.94M, False: 4.44M]
  ------------------
  335|  9.39M|}
_ZN4llvh4castIN6hermes5ValueENS1_16HBCGetThisNSInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      9|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      9|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      9|  return cast_convert_val<X, Y*,
  257|      9|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      9|}
_ZN4llvh3isaIN6hermes5ValueEPNS1_16HBCGetThisNSInstEEEbRKT0_:
  142|      9|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      9|  return isa_impl_wrap<X, const Y,
  144|      9|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      9|}
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEKPNS1_16HBCGetThisNSInstEPKS3_E4doitERS5_:
  122|      9|  static bool doit(const From &Val) {
  123|      9|    return isa_impl_wrap<To, SimpleFrom,
  124|      9|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      9|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      9|  }
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEPKNS1_16HBCGetThisNSInstES5_E4doitERKS5_:
  132|      9|  static bool doit(const FromTy &Val) {
  133|      9|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      9|  }
_ZN4llvh11isa_impl_clIN6hermes5ValueEPKNS1_16HBCGetThisNSInstEE4doitES5_:
  105|      9|  static inline bool doit(const From *Val) {
  106|      9|    assert(Val && "isa<> used on a null pointer");
  107|      9|    return isa_impl<To, From>::doit(*Val);
  108|      9|  }
_ZN4llvh8isa_implIN6hermes5ValueENS1_16HBCGetThisNSInstEvE4doitERKS3_:
   67|      9|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes16HBCGetThisNSInstEE18getSimplifiedValueERS4_:
   48|      9|  static RetType getSimplifiedValue(const From& Val) {
   49|      9|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|      9|  }
_ZN4llvh13simplify_typeIPN6hermes16HBCGetThisNSInstEE18getSimplifiedValueERS3_:
   38|      9|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes5ValueEPNS1_16HBCGetThisNSInstES4_E4doitERKS4_:
  218|      9|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      9|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      9|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      9|    return Res2;
  222|      9|  }
_ZN4llvh8dyn_castIN6hermes15CreateScopeInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  3.62M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  3.62M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 103k, False: 3.52M]
  ------------------
  335|  3.62M|}
_ZN4llvh8dyn_castIN6hermes20CreateInnerScopeInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  3.52M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  3.52M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 3.52M]
  ------------------
  335|  3.52M|}
_ZN4llvh8dyn_castIN6hermes19CreateArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.39M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.39M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 13, False: 1.39M]
  ------------------
  335|  1.39M|}
_ZN4llvh8dyn_castIN6hermes16LoadPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  3.08k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  3.08k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 82, False: 2.99k]
  ------------------
  335|  3.08k|}
_ZN4llvh3isaIN6hermes16LoadPropertyInstEPNS1_5ValueEEEbRKT0_:
  142|  71.6k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  71.6k|  return isa_impl_wrap<X, const Y,
  144|  71.6k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  71.6k|}
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  71.6k|  static bool doit(const From &Val) {
  123|  71.6k|    return isa_impl_wrap<To, SimpleFrom,
  124|  71.6k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  71.6k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  71.6k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  71.6k|  static bool doit(const FromTy &Val) {
  133|  71.6k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  71.6k|  }
_ZN4llvh11isa_impl_clIN6hermes16LoadPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|  71.6k|  static inline bool doit(const From *Val) {
  106|  71.6k|    assert(Val && "isa<> used on a null pointer");
  107|  71.6k|    return isa_impl<To, From>::doit(*Val);
  108|  71.6k|  }
_ZN4llvh8isa_implIN6hermes16LoadPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|  71.6k|  static inline bool doit(const From &Val) {
   59|  71.6k|    return To::classof(&Val);
   60|  71.6k|  }
_ZN4llvh4castIN6hermes16LoadPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  68.5k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  68.5k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  68.5k|  return cast_convert_val<X, Y*,
  257|  68.5k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  68.5k|}
_ZN4llvh16cast_convert_valIN6hermes16LoadPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  68.5k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  68.5k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  68.5k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  68.5k|    return Res2;
  222|  68.5k|  }
_ZN4llvh8dyn_castIN6hermes7PhiInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|    174|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    174|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 174]
  ------------------
  335|    174|}
_ZN4llvh3isaIN6hermes7PhiInstEPNS1_5ValueEEEbRKT0_:
  142|  4.56k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.56k|  return isa_impl_wrap<X, const Y,
  144|  4.56k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.56k|}
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  4.56k|  static bool doit(const From &Val) {
  123|  4.56k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.56k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.56k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.56k|  }
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  4.56k|  static bool doit(const FromTy &Val) {
  133|  4.56k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.56k|  }
_ZN4llvh11isa_impl_clIN6hermes7PhiInstEPKNS1_5ValueEE4doitES5_:
  105|  4.56k|  static inline bool doit(const From *Val) {
  106|  4.56k|    assert(Val && "isa<> used on a null pointer");
  107|  4.56k|    return isa_impl<To, From>::doit(*Val);
  108|  4.56k|  }
_ZN4llvh8isa_implIN6hermes7PhiInstENS1_5ValueEvE4doitERKS3_:
   58|  4.56k|  static inline bool doit(const From &Val) {
   59|  4.56k|    return To::classof(&Val);
   60|  4.56k|  }
_ZN4llvh4castIN6hermes7PhiInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  4.39k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.39k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  4.39k|  return cast_convert_val<X, Y*,
  257|  4.39k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.39k|}
_ZN4llvh16cast_convert_valIN6hermes7PhiInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  4.39k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.39k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.39k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.39k|    return Res2;
  222|  4.39k|  }
_ZN4llvh8dyn_castIN6hermes11InstructionENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  24.2M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  24.2M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 12.8M, False: 11.3M]
  ------------------
  335|  24.2M|}
_ZN4llvh8dyn_castIN6hermes21HBCReifyArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.70M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.70M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 174, False: 1.70M]
  ------------------
  335|  1.70M|}
_ZN4llvh8dyn_castIN6hermes13ConstructInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  3.62M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  3.62M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 25.0k, False: 3.59M]
  ------------------
  335|  3.62M|}
_ZN4llvh8dyn_castIN6hermes7MovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  5.79M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.79M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 80, False: 5.79M]
  ------------------
  335|  5.79M|}
_ZN4llvh3isaIN6hermes16HBCLoadConstInstEPNS1_5ValueEEEbRKT0_:
  142|  1.75M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.75M|  return isa_impl_wrap<X, const Y,
  144|  1.75M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.75M|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  1.75M|  static bool doit(const From &Val) {
  123|  1.75M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.75M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.75M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.75M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  1.75M|  static bool doit(const FromTy &Val) {
  133|  1.75M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.75M|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadConstInstEPKNS1_5ValueEE4doitES5_:
  105|  1.75M|  static inline bool doit(const From *Val) {
  106|  1.75M|    assert(Val && "isa<> used on a null pointer");
  107|  1.75M|    return isa_impl<To, From>::doit(*Val);
  108|  1.75M|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadConstInstENS1_5ValueEvE4doitERKS3_:
   58|  1.75M|  static inline bool doit(const From &Val) {
   59|  1.75M|    return To::classof(&Val);
   60|  1.75M|  }
_ZN4llvh4castIN6hermes16HBCLoadConstInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.75M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.75M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.75M|  return cast_convert_val<X, Y*,
  257|  1.75M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.75M|}
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadConstInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  1.75M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.75M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.75M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.75M|    return Res2;
  222|  1.75M|  }
_ZN4llvh8dyn_castIN6hermes10SwitchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  7.65M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  7.65M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 7.65M]
  ------------------
  335|  7.65M|}
_ZN4llvh3isaIN6hermes9CatchInstENS1_11InstructionEEEbRKT0_:
  142|  40.6k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  40.6k|  return isa_impl_wrap<X, const Y,
  144|  40.6k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  40.6k|}
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEKNS1_11InstructionES4_E4doitERS4_:
  132|  40.6k|  static bool doit(const FromTy &Val) {
  133|  40.6k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  40.6k|  }
_ZN4llvh11isa_impl_clIN6hermes9CatchInstEKNS1_11InstructionEE4doitERS4_:
   77|  40.6k|  static inline bool doit(const From &Val) {
   78|  40.6k|    return isa_impl<To, From>::doit(Val);
   79|  40.6k|  }
_ZN4llvh4castIN6hermes7MovInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.34M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.34M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.34M|  return cast_convert_val<X, Y*,
  257|  1.34M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.34M|}
_ZN4llvh3isaIN6hermes7MovInstEPNS1_5ValueEEEbRKT0_:
  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_wrapIN6hermes7MovInstEKPNS1_5ValueEPKS3_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_wrapIN6hermes7MovInstEPKNS1_5ValueES5_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_clIN6hermes7MovInstEPKNS1_5ValueEE4doitES5_:
  105|  1.34M|  static inline bool doit(const From *Val) {
  106|  1.34M|    assert(Val && "isa<> used on a null pointer");
  107|  1.34M|    return isa_impl<To, From>::doit(*Val);
  108|  1.34M|  }
_ZN4llvh8isa_implIN6hermes7MovInstENS1_5ValueEvE4doitERKS3_:
   58|  1.34M|  static inline bool doit(const From &Val) {
   59|  1.34M|    return To::classof(&Val);
   60|  1.34M|  }
_ZN4llvh16cast_convert_valIN6hermes7MovInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  1.34M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.34M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.34M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.34M|    return Res2;
  222|  1.34M|  }
_ZN4llvh3isaIN6hermes21HBCResolveEnvironmentENS1_11InstructionEEEbRKT0_:
  142|  6.18M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.18M|  return isa_impl_wrap<X, const Y,
  144|  6.18M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.18M|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCResolveEnvironmentEKNS1_11InstructionES4_E4doitERS4_:
  132|  6.18M|  static bool doit(const FromTy &Val) {
  133|  6.18M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.18M|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCResolveEnvironmentEKNS1_11InstructionEE4doitERS4_:
   77|  6.18M|  static inline bool doit(const From &Val) {
   78|  6.18M|    return isa_impl<To, From>::doit(Val);
   79|  6.18M|  }
_ZN4llvh8dyn_castIN6hermes17ScopeCreationInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  6.18M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  6.18M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 103k, False: 6.08M]
  ------------------
  335|  6.18M|}
_ZN4llvh3isaIN6hermes15AllocObjectInstEPNS1_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_wrapIN6hermes15AllocObjectInstEKPNS1_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_wrapIN6hermes15AllocObjectInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      2|  static bool doit(const FromTy &Val) {
  133|      2|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      2|  }
_ZN4llvh11isa_impl_clIN6hermes15AllocObjectInstEPKNS1_5ValueEE4doitES5_:
  105|      2|  static inline bool doit(const From *Val) {
  106|      2|    assert(Val && "isa<> used on a null pointer");
  107|      2|    return isa_impl<To, From>::doit(*Val);
  108|      2|  }
_ZN4llvh8isa_implIN6hermes15AllocObjectInstENS1_5ValueEvE4doitERKS3_:
   58|      2|  static inline bool doit(const From &Val) {
   59|      2|    return To::classof(&Val);
   60|      2|  }
_ZN4llvh4castIN6hermes15AllocObjectInstENS1_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|      2|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh16cast_convert_valIN6hermes15AllocObjectInstEPNS1_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|  }
_ZN4llvh8dyn_castIN6hermes14StoreStackInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  5.98M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.98M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 576k, False: 5.41M]
  ------------------
  335|  5.98M|}
_ZN4llvh3isaIN6hermes18BinaryOperatorInstEPNS1_5ValueEEEbRKT0_:
  142|   157k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   157k|  return isa_impl_wrap<X, const Y,
  144|   157k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   157k|}
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   157k|  static bool doit(const From &Val) {
  123|   157k|    return isa_impl_wrap<To, SimpleFrom,
  124|   157k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   157k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   157k|  }
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   157k|  static bool doit(const FromTy &Val) {
  133|   157k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   157k|  }
_ZN4llvh11isa_impl_clIN6hermes18BinaryOperatorInstEPKNS1_5ValueEE4doitES5_:
  105|   157k|  static inline bool doit(const From *Val) {
  106|   157k|    assert(Val && "isa<> used on a null pointer");
  107|   157k|    return isa_impl<To, From>::doit(*Val);
  108|   157k|  }
_ZN4llvh8isa_implIN6hermes18BinaryOperatorInstENS1_5ValueEvE4doitERKS3_:
   58|   157k|  static inline bool doit(const From &Val) {
   59|   157k|    return To::classof(&Val);
   60|   157k|  }
_ZN4llvh4castIN6hermes18BinaryOperatorInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   157k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   157k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   157k|  return cast_convert_val<X, Y*,
  257|   157k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   157k|}
_ZN4llvh16cast_convert_valIN6hermes18BinaryOperatorInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   157k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   157k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   157k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   157k|    return Res2;
  222|   157k|  }
_ZN4llvh8dyn_castIN6hermes18BinaryOperatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  3.62M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  3.62M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 157k, False: 3.46M]
  ------------------
  335|  3.62M|}
_ZN4llvh8dyn_castIN6hermes12TryStartInstENS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   604k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   604k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 40.6k, False: 563k]
  ------------------
  335|   604k|}
_ZN4llvh3isaIN6hermes12TryStartInstEPNS1_14TerminatorInstEEEbRKT0_:
  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_wrapIN6hermes12TryStartInstEKPNS1_14TerminatorInstEPKS3_E4doitERS5_:
  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_wrapIN6hermes12TryStartInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  3.08M|  static bool doit(const FromTy &Val) {
  133|  3.08M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.08M|  }
_ZN4llvh11isa_impl_clIN6hermes12TryStartInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  3.08M|  static inline bool doit(const From *Val) {
  106|  3.08M|    assert(Val && "isa<> used on a null pointer");
  107|  3.08M|    return isa_impl<To, From>::doit(*Val);
  108|  3.08M|  }
_ZN4llvh8isa_implIN6hermes12TryStartInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  3.08M|  static inline bool doit(const From &Val) {
   59|  3.08M|    return To::classof(&Val);
   60|  3.08M|  }
_ZN4llvh13simplify_typeIKPN6hermes14TerminatorInstEE18getSimplifiedValueERS4_:
   48|   644k|  static RetType getSimplifiedValue(const From& Val) {
   49|   644k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   644k|  }
_ZN4llvh13simplify_typeIPN6hermes14TerminatorInstEE18getSimplifiedValueERS3_:
   38|   644k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes12TryStartInstENS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  40.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  40.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  40.6k|  return cast_convert_val<X, Y*,
  257|  40.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  40.6k|}
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPNS1_14TerminatorInstES4_E4doitERKS4_:
  218|  40.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  40.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  40.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  40.6k|    return Res2;
  222|  40.6k|  }
_ZN4llvh4castIN6hermes6ESTree14IdentifierNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  1.36M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.36M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.36M|  return cast_convert_val<X, Y*,
  257|  1.36M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.36M|}
_ZN4llvh3isaIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeEEEbRKT0_:
  142|  1.39M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.39M|  return isa_impl_wrap<X, const Y,
  144|  1.39M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.39M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree14IdentifierNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|  1.39M|  static bool doit(const From &Val) {
  123|  1.39M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.39M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.39M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.39M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  8.19M|  static bool doit(const FromTy &Val) {
  133|  8.19M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  8.19M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeEE4doitES6_:
  105|  8.19M|  static inline bool doit(const From *Val) {
  106|  8.19M|    assert(Val && "isa<> used on a null pointer");
  107|  8.19M|    return isa_impl<To, From>::doit(*Val);
  108|  8.19M|  }
_ZN4llvh8isa_implIN6hermes6ESTree14IdentifierNodeENS2_4NodeEvE4doitERKS4_:
   58|  8.19M|  static inline bool doit(const From &Val) {
   59|  8.19M|    return To::classof(&Val);
   60|  8.19M|  }
_ZN4llvh13simplify_typeIKPKN6hermes6ESTree4NodeEE18getSimplifiedValueERS6_:
   48|  1.51M|  static RetType getSimplifiedValue(const From& Val) {
   49|  1.51M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  1.51M|  }
_ZN4llvh13simplify_typeIPKN6hermes6ESTree4NodeEE18getSimplifiedValueERS5_:
   38|  1.51M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeES6_E4doitERKS6_:
  218|  1.36M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.36M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.36M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.36M|    return Res2;
  222|  1.36M|  }
_ZN4llvh16dyn_cast_or_nullIN6hermes8VariableENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  358|  2.39k|dyn_cast_or_null(Y *Val) {
  359|  2.39k|  return (Val && isa<X>(Val)) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (359:11): [True: 2.39k, False: 0]
  |  Branch (359:18): [True: 1.16k, False: 1.23k]
  ------------------
  360|  2.39k|}
_ZN4llvh16dyn_cast_or_nullIN6hermes20GlobalObjectPropertyENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  358|  10.7k|dyn_cast_or_null(Y *Val) {
  359|  10.7k|  return (Val && isa<X>(Val)) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (359:11): [True: 1.35k, False: 9.38k]
  |  Branch (359:18): [True: 1.35k, False: 0]
  ------------------
  360|  10.7k|}
_ZN4llvh4castIN6hermes20GlobalObjectPropertyENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   513k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   513k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   513k|  return cast_convert_val<X, Y*,
  257|   513k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   513k|}
_ZN4llvh16cast_convert_valIN6hermes20GlobalObjectPropertyEPNS1_5ValueES4_E4doitERKS4_:
  218|   513k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   513k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   513k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   513k|    return Res2;
  222|   513k|  }
_ZN4llvh4castIN6hermes6ESTree22FunctionExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    164|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    164|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    164|  return cast_convert_val<X, Y*,
  257|    164|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    164|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree22FunctionExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    164|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    164|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    164|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    164|    return Res2;
  222|    164|  }
_ZN4llvh3isaIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_16FunctionLikeNodeEEEbRKT0_:
  142|   928k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   928k|  return isa_impl_wrap<X, const Y,
  144|   928k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   928k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEKPNS2_16FunctionLikeNodeEPKS4_E4doitERS6_:
  122|   928k|  static bool doit(const From &Val) {
  123|   928k|    return isa_impl_wrap<To, SimpleFrom,
  124|   928k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   928k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   928k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_16FunctionLikeNodeES6_E4doitERKS6_:
  132|   928k|  static bool doit(const FromTy &Val) {
  133|   928k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   928k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_16FunctionLikeNodeEE4doitES6_:
  105|   928k|  static inline bool doit(const From *Val) {
  106|   928k|    assert(Val && "isa<> used on a null pointer");
  107|   928k|    return isa_impl<To, From>::doit(*Val);
  108|   928k|  }
_ZN4llvh8isa_implIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_16FunctionLikeNodeEvE4doitERKS4_:
   58|   928k|  static inline bool doit(const From &Val) {
   59|   928k|    return To::classof(&Val);
   60|   928k|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree16FunctionLikeNodeEE18getSimplifiedValueERS5_:
   48|   935k|  static RetType getSimplifiedValue(const From& Val) {
   49|   935k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   935k|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree16FunctionLikeNodeEE18getSimplifiedValueERS4_:
   38|   935k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes20GlobalObjectPropertyEPNS1_5ValueEEEbRKT0_:
  142|  1.52M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.52M|  return isa_impl_wrap<X, const Y,
  144|  1.52M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.52M|}
_ZN4llvh13isa_impl_wrapIN6hermes20GlobalObjectPropertyEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  1.52M|  static bool doit(const From &Val) {
  123|  1.52M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.52M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.52M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.52M|  }
_ZN4llvh13isa_impl_wrapIN6hermes20GlobalObjectPropertyEPKNS1_5ValueES5_E4doitERKS5_:
  132|  1.52M|  static bool doit(const FromTy &Val) {
  133|  1.52M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.52M|  }
_ZN4llvh11isa_impl_clIN6hermes20GlobalObjectPropertyEPKNS1_5ValueEE4doitES5_:
  105|  1.52M|  static inline bool doit(const From *Val) {
  106|  1.52M|    assert(Val && "isa<> used on a null pointer");
  107|  1.52M|    return isa_impl<To, From>::doit(*Val);
  108|  1.52M|  }
_ZN4llvh8isa_implIN6hermes20GlobalObjectPropertyENS1_5ValueEvE4doitERKS3_:
   58|  1.52M|  static inline bool doit(const From &Val) {
   59|  1.52M|    return To::classof(&Val);
   60|  1.52M|  }
_ZN4llvh16dyn_cast_or_nullIN6hermes6ESTree11ProgramNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  358|    114|dyn_cast_or_null(Y *Val) {
  359|    114|  return (Val && isa<X>(Val)) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (359:11): [True: 114, False: 0]
  |  Branch (359:18): [True: 114, False: 0]
  ------------------
  360|    114|}
_ZN4llvh3isaIN6hermes6ESTree11ProgramNodeEPS3_EEbRKT0_:
  142|    228|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    228|  return isa_impl_wrap<X, const Y,
  144|    228|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    228|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEKPS3_PKS3_E4doitERS5_:
  122|    228|  static bool doit(const From &Val) {
  123|    228|    return isa_impl_wrap<To, SimpleFrom,
  124|    228|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    228|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    228|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEPKS3_S5_E4doitERKS5_:
  132|    228|  static bool doit(const FromTy &Val) {
  133|    228|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    228|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11ProgramNodeEPKS3_E4doitES5_:
  105|    228|  static inline bool doit(const From *Val) {
  106|    228|    assert(Val && "isa<> used on a null pointer");
  107|    228|    return isa_impl<To, From>::doit(*Val);
  108|    228|  }
_ZN4llvh8isa_implIN6hermes6ESTree11ProgramNodeES3_vE4doitERKS3_:
   67|    228|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree11ProgramNodeEE18getSimplifiedValueERS5_:
   48|    228|  static RetType getSimplifiedValue(const From& Val) {
   49|    228|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|    228|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree11ProgramNodeEE18getSimplifiedValueERS4_:
   38|    228|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree11ProgramNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    114|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    114|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    114|  return cast_convert_val<X, Y*,
  257|    114|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    114|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree11ProgramNodeEPS3_S4_E4doitERKS4_:
  218|    114|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    114|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    114|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    114|    return Res2;
  222|    114|  }
_ZN4llvh8dyn_castIN6hermes6ESTree22VariableDeclaratorNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  12.1k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  12.1k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2.73k, False: 9.46k]
  ------------------
  335|  12.1k|}
_ZN4llvh3isaIN6hermes6ESTree22VariableDeclaratorNodeEPNS2_4NodeEEEbRKT0_:
  142|  21.5k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  21.5k|  return isa_impl_wrap<X, const Y,
  144|  21.5k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  21.5k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22VariableDeclaratorNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  21.5k|  static bool doit(const From &Val) {
  123|  21.5k|    return isa_impl_wrap<To, SimpleFrom,
  124|  21.5k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  21.5k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  21.5k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22VariableDeclaratorNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  21.5k|  static bool doit(const FromTy &Val) {
  133|  21.5k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  21.5k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22VariableDeclaratorNodeEPKNS2_4NodeEE4doitES6_:
  105|  21.5k|  static inline bool doit(const From *Val) {
  106|  21.5k|    assert(Val && "isa<> used on a null pointer");
  107|  21.5k|    return isa_impl<To, From>::doit(*Val);
  108|  21.5k|  }
_ZN4llvh8isa_implIN6hermes6ESTree22VariableDeclaratorNodeENS2_4NodeEvE4doitERKS4_:
   58|  21.5k|  static inline bool doit(const From &Val) {
   59|  21.5k|    return To::classof(&Val);
   60|  21.5k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree23FunctionDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   722k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   722k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 3.87k, False: 718k]
  ------------------
  335|   722k|}
_ZN4llvh4castIN6hermes6ESTree23FunctionDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  7.75k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  7.75k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  7.75k|  return cast_convert_val<X, Y*,
  257|  7.75k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  7.75k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  7.75k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  7.75k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  7.75k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  7.75k|    return Res2;
  222|  7.75k|  }
_ZN4llvh3isaIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_4NodeEEEbRKT0_:
  142|   742k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   742k|  return isa_impl_wrap<X, const Y,
  144|   742k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   742k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   742k|  static bool doit(const From &Val) {
  123|   742k|    return isa_impl_wrap<To, SimpleFrom,
  124|   742k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   742k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   742k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   742k|  static bool doit(const FromTy &Val) {
  133|   742k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   742k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_4NodeEE4doitES6_:
  105|   742k|  static inline bool doit(const From *Val) {
  106|   742k|    assert(Val && "isa<> used on a null pointer");
  107|   742k|    return isa_impl<To, From>::doit(*Val);
  108|   742k|  }
_ZN4llvh8isa_implIN6hermes6ESTree23FunctionDeclarationNodeENS2_4NodeEvE4doitERKS4_:
   58|   742k|  static inline bool doit(const From &Val) {
   59|   742k|    return To::classof(&Val);
   60|   742k|  }
_ZN4llvh4castIN6hermes6ESTree9EmptyNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     82|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     82|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     82|  return cast_convert_val<X, Y*,
  257|     82|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     82|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree9EmptyNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     82|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     82|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     82|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     82|    return Res2;
  222|     82|  }
_ZN4llvh4castIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   206k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   206k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   206k|  return cast_convert_val<X, Y*,
  257|   206k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   206k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   206k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   206k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   206k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   206k|    return Res2;
  222|   206k|  }
_ZN4llvh3isaIN6hermes6ESTree18WhileStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.34k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.34k|  return isa_impl_wrap<X, const Y,
  144|  5.34k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.34k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18WhileStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.34k|  static bool doit(const From &Val) {
  123|  5.34k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.34k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.34k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.34k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18WhileStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.34k|  static bool doit(const FromTy &Val) {
  133|  5.34k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.34k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18WhileStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.34k|  static inline bool doit(const From *Val) {
  106|  5.34k|    assert(Val && "isa<> used on a null pointer");
  107|  5.34k|    return isa_impl<To, From>::doit(*Val);
  108|  5.34k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18WhileStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.34k|  static inline bool doit(const From &Val) {
   59|  5.34k|    return To::classof(&Val);
   60|  5.34k|  }
_ZN4llvh3isaIN6hermes6ESTree20DoWhileStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.34k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.34k|  return isa_impl_wrap<X, const Y,
  144|  5.34k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.34k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20DoWhileStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.34k|  static bool doit(const From &Val) {
  123|  5.34k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.34k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.34k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.34k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20DoWhileStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.34k|  static bool doit(const FromTy &Val) {
  133|  5.34k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.34k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20DoWhileStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.34k|  static inline bool doit(const From *Val) {
  106|  5.34k|    assert(Val && "isa<> used on a null pointer");
  107|  5.34k|    return isa_impl<To, From>::doit(*Val);
  108|  5.34k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20DoWhileStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.34k|  static inline bool doit(const From &Val) {
   59|  5.34k|    return To::classof(&Val);
   60|  5.34k|  }
_ZN4llvh4castIN6hermes6ESTree18ForInStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     45|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     45|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     45|  return cast_convert_val<X, Y*,
  257|     45|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     45|}
_ZN4llvh3isaIN6hermes6ESTree18ForInStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   713k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   713k|  return isa_impl_wrap<X, const Y,
  144|   713k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   713k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForInStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   713k|  static bool doit(const From &Val) {
  123|   713k|    return isa_impl_wrap<To, SimpleFrom,
  124|   713k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   713k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   713k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForInStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   713k|  static bool doit(const FromTy &Val) {
  133|   713k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   713k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ForInStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   713k|  static inline bool doit(const From *Val) {
  106|   713k|    assert(Val && "isa<> used on a null pointer");
  107|   713k|    return isa_impl<To, From>::doit(*Val);
  108|   713k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ForInStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   713k|  static inline bool doit(const From &Val) {
   59|   713k|    return To::classof(&Val);
   60|   713k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18ForInStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     45|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     45|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     45|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     45|    return Res2;
  222|     45|  }
_ZN4llvh3isaIN6hermes6ESTree18ForOfStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   713k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   713k|  return isa_impl_wrap<X, const Y,
  144|   713k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   713k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForOfStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   713k|  static bool doit(const From &Val) {
  123|   713k|    return isa_impl_wrap<To, SimpleFrom,
  124|   713k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   713k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   713k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForOfStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   713k|  static bool doit(const FromTy &Val) {
  133|   713k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   713k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ForOfStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   713k|  static inline bool doit(const From *Val) {
  106|   713k|    assert(Val && "isa<> used on a null pointer");
  107|   713k|    return isa_impl<To, From>::doit(*Val);
  108|   713k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ForOfStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   713k|  static inline bool doit(const From &Val) {
   59|   713k|    return To::classof(&Val);
   60|   713k|  }
_ZN4llvh3isaIN6hermes6ESTree16ForStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.34k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.34k|  return isa_impl_wrap<X, const Y,
  144|  5.34k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.34k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ForStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.34k|  static bool doit(const From &Val) {
  123|  5.34k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.34k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.34k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.34k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ForStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.34k|  static bool doit(const FromTy &Val) {
  133|  5.34k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.34k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16ForStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.34k|  static inline bool doit(const From *Val) {
  106|  5.34k|    assert(Val && "isa<> used on a null pointer");
  107|  5.34k|    return isa_impl<To, From>::doit(*Val);
  108|  5.34k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16ForStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.34k|  static inline bool doit(const From &Val) {
   59|  5.34k|    return To::classof(&Val);
   60|  5.34k|  }
_ZN4llvh4castIN6hermes6ESTree18EmptyStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  10.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  10.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  10.6k|  return cast_convert_val<X, Y*,
  257|  10.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  10.6k|}
_ZN4llvh3isaIN6hermes6ESTree18EmptyStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  16.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  16.0k|  return isa_impl_wrap<X, const Y,
  144|  16.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  16.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18EmptyStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  16.0k|  static bool doit(const From &Val) {
  123|  16.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  16.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  16.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  16.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18EmptyStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  16.0k|  static bool doit(const FromTy &Val) {
  133|  16.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  16.0k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18EmptyStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  16.0k|  static inline bool doit(const From *Val) {
  106|  16.0k|    assert(Val && "isa<> used on a null pointer");
  107|  16.0k|    return isa_impl<To, From>::doit(*Val);
  108|  16.0k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18EmptyStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  16.0k|  static inline bool doit(const From &Val) {
   59|  16.0k|    return To::classof(&Val);
   60|  16.0k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18EmptyStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  10.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  10.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  10.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  10.6k|    return Res2;
  222|  10.6k|  }
_ZN4llvh4castIN6hermes6ESTree18BlockStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   309k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   309k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   309k|  return cast_convert_val<X, Y*,
  257|   309k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   309k|}
_ZN4llvh3isaIN6hermes6ESTree18BlockStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   870k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   870k|  return isa_impl_wrap<X, const Y,
  144|   870k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   870k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   870k|  static bool doit(const From &Val) {
  123|   870k|    return isa_impl_wrap<To, SimpleFrom,
  124|   870k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   870k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   870k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   870k|  static bool doit(const FromTy &Val) {
  133|   870k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   870k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BlockStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   870k|  static inline bool doit(const From *Val) {
  106|   870k|    assert(Val && "isa<> used on a null pointer");
  107|   870k|    return isa_impl<To, From>::doit(*Val);
  108|   870k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BlockStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   870k|  static inline bool doit(const From &Val) {
   59|   870k|    return To::classof(&Val);
   60|   870k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18BlockStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   309k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   309k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   309k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   309k|    return Res2;
  222|   309k|  }
_ZN4llvh3isaIN6hermes6ESTree18BreakStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.34k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.34k|  return isa_impl_wrap<X, const Y,
  144|  5.34k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.34k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BreakStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.34k|  static bool doit(const From &Val) {
  123|  5.34k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.34k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.34k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.34k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BreakStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.34k|  static bool doit(const FromTy &Val) {
  133|  5.34k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.34k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BreakStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.34k|  static inline bool doit(const From *Val) {
  106|  5.34k|    assert(Val && "isa<> used on a null pointer");
  107|  5.34k|    return isa_impl<To, From>::doit(*Val);
  108|  5.34k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BreakStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.34k|  static inline bool doit(const From &Val) {
   59|  5.34k|    return To::classof(&Val);
   60|  5.34k|  }
_ZN4llvh3isaIN6hermes6ESTree21ContinueStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.34k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.34k|  return isa_impl_wrap<X, const Y,
  144|  5.34k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.34k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ContinueStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.34k|  static bool doit(const From &Val) {
  123|  5.34k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.34k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.34k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.34k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ContinueStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.34k|  static bool doit(const FromTy &Val) {
  133|  5.34k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.34k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21ContinueStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.34k|  static inline bool doit(const From *Val) {
  106|  5.34k|    assert(Val && "isa<> used on a null pointer");
  107|  5.34k|    return isa_impl<To, From>::doit(*Val);
  108|  5.34k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21ContinueStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.34k|  static inline bool doit(const From &Val) {
   59|  5.34k|    return To::classof(&Val);
   60|  5.34k|  }
_ZN4llvh3isaIN6hermes6ESTree18ThrowStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.34k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.34k|  return isa_impl_wrap<X, const Y,
  144|  5.34k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.34k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThrowStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.34k|  static bool doit(const From &Val) {
  123|  5.34k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.34k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.34k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.34k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThrowStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.34k|  static bool doit(const FromTy &Val) {
  133|  5.34k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.34k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ThrowStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.34k|  static inline bool doit(const From *Val) {
  106|  5.34k|    assert(Val && "isa<> used on a null pointer");
  107|  5.34k|    return isa_impl<To, From>::doit(*Val);
  108|  5.34k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ThrowStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.34k|  static inline bool doit(const From &Val) {
   59|  5.34k|    return To::classof(&Val);
   60|  5.34k|  }
_ZN4llvh4castIN6hermes6ESTree19ReturnStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   206k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   206k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   206k|  return cast_convert_val<X, Y*,
  257|   206k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   206k|}
_ZN4llvh3isaIN6hermes6ESTree19ReturnStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   919k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   919k|  return isa_impl_wrap<X, const Y,
  144|   919k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   919k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ReturnStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   919k|  static bool doit(const From &Val) {
  123|   919k|    return isa_impl_wrap<To, SimpleFrom,
  124|   919k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   919k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   919k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ReturnStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   919k|  static bool doit(const FromTy &Val) {
  133|   919k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   919k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19ReturnStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   919k|  static inline bool doit(const From *Val) {
  106|   919k|    assert(Val && "isa<> used on a null pointer");
  107|   919k|    return isa_impl<To, From>::doit(*Val);
  108|   919k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19ReturnStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   919k|  static inline bool doit(const From &Val) {
   59|   919k|    return To::classof(&Val);
   60|   919k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19ReturnStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   206k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   206k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   206k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   206k|    return Res2;
  222|   206k|  }
_ZN4llvh3isaIN6hermes6ESTree19SwitchStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   251k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   251k|  return isa_impl_wrap<X, const Y,
  144|   251k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   251k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19SwitchStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   251k|  static bool doit(const From &Val) {
  123|   251k|    return isa_impl_wrap<To, SimpleFrom,
  124|   251k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   251k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   251k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19SwitchStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   251k|  static bool doit(const FromTy &Val) {
  133|   251k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   251k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19SwitchStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   251k|  static inline bool doit(const From *Val) {
  106|   251k|    assert(Val && "isa<> used on a null pointer");
  107|   251k|    return isa_impl<To, From>::doit(*Val);
  108|   251k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19SwitchStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   251k|  static inline bool doit(const From &Val) {
   59|   251k|    return To::classof(&Val);
   60|   251k|  }
_ZN4llvh4castIN6hermes6ESTree20LabeledStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   502k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   502k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   502k|  return cast_convert_val<X, Y*,
  257|   502k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   502k|}
_ZN4llvh3isaIN6hermes6ESTree20LabeledStatementNodeEPNS2_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_wrapIN6hermes6ESTree20LabeledStatementNodeEKPNS2_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_wrapIN6hermes6ESTree20LabeledStatementNodeEPKNS2_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_clIN6hermes6ESTree20LabeledStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.00M|  static inline bool doit(const From *Val) {
  106|  1.00M|    assert(Val && "isa<> used on a null pointer");
  107|  1.00M|    return isa_impl<To, From>::doit(*Val);
  108|  1.00M|  }
_ZN4llvh8isa_implIN6hermes6ESTree20LabeledStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.00M|  static inline bool doit(const From &Val) {
   59|  1.00M|    return To::classof(&Val);
   60|  1.00M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20LabeledStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   502k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   502k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   502k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   502k|    return Res2;
  222|   502k|  }
_ZN4llvh3isaIN6hermes6ESTree16TryStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.34k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.34k|  return isa_impl_wrap<X, const Y,
  144|  5.34k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.34k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16TryStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.34k|  static bool doit(const From &Val) {
  123|  5.34k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.34k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.34k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.34k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16TryStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.34k|  static bool doit(const FromTy &Val) {
  133|  5.34k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.34k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16TryStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.34k|  static inline bool doit(const From *Val) {
  106|  5.34k|    assert(Val && "isa<> used on a null pointer");
  107|  5.34k|    return isa_impl<To, From>::doit(*Val);
  108|  5.34k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16TryStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.34k|  static inline bool doit(const From &Val) {
   59|  5.34k|    return To::classof(&Val);
   60|  5.34k|  }
_ZN4llvh3isaIN6hermes6ESTree15IfStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   713k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   713k|  return isa_impl_wrap<X, const Y,
  144|   713k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   713k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15IfStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   713k|  static bool doit(const From &Val) {
  123|   713k|    return isa_impl_wrap<To, SimpleFrom,
  124|   713k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   713k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   713k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15IfStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   713k|  static bool doit(const FromTy &Val) {
  133|   713k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   713k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree15IfStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   713k|  static inline bool doit(const From *Val) {
  106|   713k|    assert(Val && "isa<> used on a null pointer");
  107|   713k|    return isa_impl<To, From>::doit(*Val);
  108|   713k|  }
_ZN4llvh8isa_implIN6hermes6ESTree15IfStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   713k|  static inline bool doit(const From &Val) {
   59|   713k|    return To::classof(&Val);
   60|   713k|  }
_ZN4llvh3isaIN6hermes6ESTree15NullLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.92M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.92M|  return isa_impl_wrap<X, const Y,
  144|  1.92M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.92M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15NullLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.92M|  static bool doit(const From &Val) {
  123|  1.92M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.92M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.92M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.92M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15NullLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.92M|  static bool doit(const FromTy &Val) {
  133|  1.92M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.92M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree15NullLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.92M|  static inline bool doit(const From *Val) {
  106|  1.92M|    assert(Val && "isa<> used on a null pointer");
  107|  1.92M|    return isa_impl<To, From>::doit(*Val);
  108|  1.92M|  }
_ZN4llvh8isa_implIN6hermes6ESTree15NullLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.92M|  static inline bool doit(const From &Val) {
   59|  1.92M|    return To::classof(&Val);
   60|  1.92M|  }
_ZN4llvh3isaIN6hermes6ESTree18BooleanLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.92M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.92M|  return isa_impl_wrap<X, const Y,
  144|  1.92M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.92M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BooleanLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.92M|  static bool doit(const From &Val) {
  123|  1.92M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.92M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.92M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.92M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BooleanLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.92M|  static bool doit(const FromTy &Val) {
  133|  1.92M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.92M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BooleanLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.92M|  static inline bool doit(const From *Val) {
  106|  1.92M|    assert(Val && "isa<> used on a null pointer");
  107|  1.92M|    return isa_impl<To, From>::doit(*Val);
  108|  1.92M|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BooleanLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.92M|  static inline bool doit(const From &Val) {
   59|  1.92M|    return To::classof(&Val);
   60|  1.92M|  }
_ZN4llvh4castIN6hermes6ESTree17StringLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     60|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     60|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     60|  return cast_convert_val<X, Y*,
  257|     60|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     60|}
_ZN4llvh3isaIN6hermes6ESTree17StringLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.92M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.92M|  return isa_impl_wrap<X, const Y,
  144|  1.92M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.92M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17StringLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.92M|  static bool doit(const From &Val) {
  123|  1.92M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.92M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.92M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.92M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17StringLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.92M|  static bool doit(const FromTy &Val) {
  133|  1.92M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.92M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17StringLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.92M|  static inline bool doit(const From *Val) {
  106|  1.92M|    assert(Val && "isa<> used on a null pointer");
  107|  1.92M|    return isa_impl<To, From>::doit(*Val);
  108|  1.92M|  }
_ZN4llvh8isa_implIN6hermes6ESTree17StringLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.92M|  static inline bool doit(const From &Val) {
   59|  1.92M|    return To::classof(&Val);
   60|  1.92M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree17StringLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     60|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     60|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     60|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     60|    return Res2;
  222|     60|  }
_ZN4llvh4castIN6hermes6ESTree18NumericLiteralNodeENS2_4NodeEEENS_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|  4.78M|  return cast_convert_val<X, Y*,
  257|  4.78M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.78M|}
_ZN4llvh3isaIN6hermes6ESTree18NumericLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  6.74M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.74M|  return isa_impl_wrap<X, const Y,
  144|  6.74M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.74M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18NumericLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  6.74M|  static bool doit(const From &Val) {
  123|  6.74M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.74M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.74M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.74M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18NumericLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  6.74M|  static bool doit(const FromTy &Val) {
  133|  6.74M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.74M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18NumericLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  6.74M|  static inline bool doit(const From *Val) {
  106|  6.74M|    assert(Val && "isa<> used on a null pointer");
  107|  6.74M|    return isa_impl<To, From>::doit(*Val);
  108|  6.74M|  }
_ZN4llvh8isa_implIN6hermes6ESTree18NumericLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  6.74M|  static inline bool doit(const From &Val) {
   59|  6.74M|    return To::classof(&Val);
   60|  6.74M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18NumericLiteralNodeEPNS2_4NodeES5_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|  }
_ZN4llvh4castIN6hermes6ESTree17RegExpLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    239|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    239|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    239|  return cast_convert_val<X, Y*,
  257|    239|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    239|}
_ZN4llvh3isaIN6hermes6ESTree17RegExpLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.92M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.92M|  return isa_impl_wrap<X, const Y,
  144|  1.92M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.92M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17RegExpLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.92M|  static bool doit(const From &Val) {
  123|  1.92M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.92M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.92M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.92M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17RegExpLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.92M|  static bool doit(const FromTy &Val) {
  133|  1.92M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.92M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17RegExpLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.92M|  static inline bool doit(const From *Val) {
  106|  1.92M|    assert(Val && "isa<> used on a null pointer");
  107|  1.92M|    return isa_impl<To, From>::doit(*Val);
  108|  1.92M|  }
_ZN4llvh8isa_implIN6hermes6ESTree17RegExpLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.92M|  static inline bool doit(const From &Val) {
   59|  1.92M|    return To::classof(&Val);
   60|  1.92M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree17RegExpLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    239|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    239|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    239|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    239|    return Res2;
  222|    239|  }
_ZN4llvh4castIN6hermes6ESTree17BigIntLiteralNodeENS2_4NodeEEENS_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|     15|  return cast_convert_val<X, Y*,
  257|     15|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     15|}
_ZN4llvh3isaIN6hermes6ESTree17BigIntLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|   332k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   332k|  return isa_impl_wrap<X, const Y,
  144|   332k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   332k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17BigIntLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   332k|  static bool doit(const From &Val) {
  123|   332k|    return isa_impl_wrap<To, SimpleFrom,
  124|   332k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   332k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   332k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17BigIntLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   332k|  static bool doit(const FromTy &Val) {
  133|   332k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   332k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17BigIntLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|   332k|  static inline bool doit(const From *Val) {
  106|   332k|    assert(Val && "isa<> used on a null pointer");
  107|   332k|    return isa_impl<To, From>::doit(*Val);
  108|   332k|  }
_ZN4llvh8isa_implIN6hermes6ESTree17BigIntLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|   332k|  static inline bool doit(const From &Val) {
   59|   332k|    return To::classof(&Val);
   60|   332k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree17BigIntLiteralNodeEPNS2_4NodeES5_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|  }
_ZN4llvh3isaIN6hermes6ESTree18ThisExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   130k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   130k|  return isa_impl_wrap<X, const Y,
  144|   130k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   130k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThisExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   130k|  static bool doit(const From &Val) {
  123|   130k|    return isa_impl_wrap<To, SimpleFrom,
  124|   130k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   130k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   130k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThisExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   130k|  static bool doit(const FromTy &Val) {
  133|   130k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   130k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ThisExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   130k|  static inline bool doit(const From *Val) {
  106|   130k|    assert(Val && "isa<> used on a null pointer");
  107|   130k|    return isa_impl<To, From>::doit(*Val);
  108|   130k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ThisExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   130k|  static inline bool doit(const From &Val) {
   59|   130k|    return To::classof(&Val);
   60|   130k|  }
_ZN4llvh3isaIN6hermes6ESTree9SuperNodeEPNS2_4NodeEEEbRKT0_:
  142|  5.70k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.70k|  return isa_impl_wrap<X, const Y,
  144|  5.70k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.70k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9SuperNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  5.70k|  static bool doit(const From &Val) {
  123|  5.70k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.70k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.70k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.70k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9SuperNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  5.70k|  static bool doit(const FromTy &Val) {
  133|  5.70k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.70k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree9SuperNodeEPKNS2_4NodeEE4doitES6_:
  105|  5.70k|  static inline bool doit(const From *Val) {
  106|  5.70k|    assert(Val && "isa<> used on a null pointer");
  107|  5.70k|    return isa_impl<To, From>::doit(*Val);
  108|  5.70k|  }
_ZN4llvh8isa_implIN6hermes6ESTree9SuperNodeENS2_4NodeEvE4doitERKS4_:
   58|  5.70k|  static inline bool doit(const From &Val) {
   59|  5.70k|    return To::classof(&Val);
   60|  5.70k|  }
_ZN4llvh4castIN6hermes6ESTree22SequenceExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    294|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    294|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    294|  return cast_convert_val<X, Y*,
  257|    294|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    294|}
_ZN4llvh3isaIN6hermes6ESTree22SequenceExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  23.6k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  23.6k|  return isa_impl_wrap<X, const Y,
  144|  23.6k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  23.6k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22SequenceExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  23.6k|  static bool doit(const From &Val) {
  123|  23.6k|    return isa_impl_wrap<To, SimpleFrom,
  124|  23.6k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  23.6k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  23.6k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22SequenceExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  23.6k|  static bool doit(const FromTy &Val) {
  133|  23.6k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  23.6k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22SequenceExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  23.6k|  static inline bool doit(const From *Val) {
  106|  23.6k|    assert(Val && "isa<> used on a null pointer");
  107|  23.6k|    return isa_impl<To, From>::doit(*Val);
  108|  23.6k|  }
_ZN4llvh8isa_implIN6hermes6ESTree22SequenceExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  23.6k|  static inline bool doit(const From &Val) {
   59|  23.6k|    return To::classof(&Val);
   60|  23.6k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree22SequenceExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    294|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    294|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    294|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    294|    return Res2;
  222|    294|  }
_ZN4llvh4castIN6hermes6ESTree20ObjectExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|      6|  return cast_convert_val<X, Y*,
  257|      6|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      6|}
_ZN4llvh3isaIN6hermes6ESTree20ObjectExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   289k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   289k|  return isa_impl_wrap<X, const Y,
  144|   289k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   289k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20ObjectExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   289k|  static bool doit(const From &Val) {
  123|   289k|    return isa_impl_wrap<To, SimpleFrom,
  124|   289k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   289k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   289k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20ObjectExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   289k|  static bool doit(const FromTy &Val) {
  133|   289k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   289k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20ObjectExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   289k|  static inline bool doit(const From *Val) {
  106|   289k|    assert(Val && "isa<> used on a null pointer");
  107|   289k|    return isa_impl<To, From>::doit(*Val);
  108|   289k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20ObjectExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   289k|  static inline bool doit(const From &Val) {
   59|   289k|    return To::classof(&Val);
   60|   289k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20ObjectExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  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|  }
_ZN4llvh4castIN6hermes6ESTree19ArrayExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  45.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  45.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  45.0k|  return cast_convert_val<X, Y*,
  257|  45.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  45.0k|}
_ZN4llvh3isaIN6hermes6ESTree19ArrayExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   383k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   383k|  return isa_impl_wrap<X, const Y,
  144|   383k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   383k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ArrayExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   383k|  static bool doit(const From &Val) {
  123|   383k|    return isa_impl_wrap<To, SimpleFrom,
  124|   383k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   383k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   383k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ArrayExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   383k|  static bool doit(const FromTy &Val) {
  133|   383k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   383k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19ArrayExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   383k|  static inline bool doit(const From *Val) {
  106|   383k|    assert(Val && "isa<> used on a null pointer");
  107|   383k|    return isa_impl<To, From>::doit(*Val);
  108|   383k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19ArrayExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   383k|  static inline bool doit(const From &Val) {
   59|   383k|    return To::classof(&Val);
   60|   383k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19ArrayExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  45.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  45.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  45.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  45.0k|    return Res2;
  222|  45.0k|  }
_ZN4llvh3isaIN6hermes6ESTree17SpreadElementNodeEPNS2_4NodeEEEbRKT0_:
  142|  2.51M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.51M|  return isa_impl_wrap<X, const Y,
  144|  2.51M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.51M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17SpreadElementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  2.51M|  static bool doit(const From &Val) {
  123|  2.51M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.51M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.51M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.51M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17SpreadElementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  2.51M|  static bool doit(const FromTy &Val) {
  133|  2.51M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.51M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17SpreadElementNodeEPKNS2_4NodeEE4doitES6_:
  105|  2.51M|  static inline bool doit(const From *Val) {
  106|  2.51M|    assert(Val && "isa<> used on a null pointer");
  107|  2.51M|    return isa_impl<To, From>::doit(*Val);
  108|  2.51M|  }
_ZN4llvh8isa_implIN6hermes6ESTree17SpreadElementNodeENS2_4NodeEvE4doitERKS4_:
   58|  2.51M|  static inline bool doit(const From &Val) {
   59|  2.51M|    return To::classof(&Val);
   60|  2.51M|  }
_ZN4llvh4castIN6hermes6ESTree17NewExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  75.1k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  75.1k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  75.1k|  return cast_convert_val<X, Y*,
  257|  75.1k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  75.1k|}
_ZN4llvh3isaIN6hermes6ESTree17NewExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   402k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   402k|  return isa_impl_wrap<X, const Y,
  144|   402k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   402k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17NewExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   402k|  static bool doit(const From &Val) {
  123|   402k|    return isa_impl_wrap<To, SimpleFrom,
  124|   402k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   402k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   402k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17NewExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   402k|  static bool doit(const FromTy &Val) {
  133|   402k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   402k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17NewExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   402k|  static inline bool doit(const From *Val) {
  106|   402k|    assert(Val && "isa<> used on a null pointer");
  107|   402k|    return isa_impl<To, From>::doit(*Val);
  108|   402k|  }
_ZN4llvh8isa_implIN6hermes6ESTree17NewExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   402k|  static inline bool doit(const From &Val) {
   59|   402k|    return To::classof(&Val);
   60|   402k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree17NewExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  75.1k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  75.1k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  75.1k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  75.1k|    return Res2;
  222|  75.1k|  }
_ZN4llvh4castIN6hermes6ESTree18CallExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|      9|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      9|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      9|  return cast_convert_val<X, Y*,
  257|      9|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      9|}
_ZN4llvh3isaIN6hermes6ESTree18CallExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   333k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   333k|  return isa_impl_wrap<X, const Y,
  144|   333k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   333k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   333k|  static bool doit(const From &Val) {
  123|   333k|    return isa_impl_wrap<To, SimpleFrom,
  124|   333k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   333k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   333k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   333k|  static bool doit(const FromTy &Val) {
  133|   333k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   333k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18CallExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   333k|  static inline bool doit(const From *Val) {
  106|   333k|    assert(Val && "isa<> used on a null pointer");
  107|   333k|    return isa_impl<To, From>::doit(*Val);
  108|   333k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18CallExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   333k|  static inline bool doit(const From &Val) {
   59|   333k|    return To::classof(&Val);
   60|   333k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18CallExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|      9|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      9|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      9|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      9|    return Res2;
  222|      9|  }
_ZN4llvh4castIN6hermes6ESTree26OptionalCallExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|     48|  return cast_convert_val<X, Y*,
  257|     48|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     48|}
_ZN4llvh3isaIN6hermes6ESTree26OptionalCallExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  9.23M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  9.23M|  return isa_impl_wrap<X, const Y,
  144|  9.23M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  9.23M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree26OptionalCallExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  9.23M|  static bool doit(const From &Val) {
  123|  9.23M|    return isa_impl_wrap<To, SimpleFrom,
  124|  9.23M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  9.23M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  9.23M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree26OptionalCallExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  9.23M|  static bool doit(const FromTy &Val) {
  133|  9.23M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  9.23M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree26OptionalCallExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  9.23M|  static inline bool doit(const From *Val) {
  106|  9.23M|    assert(Val && "isa<> used on a null pointer");
  107|  9.23M|    return isa_impl<To, From>::doit(*Val);
  108|  9.23M|  }
_ZN4llvh8isa_implIN6hermes6ESTree26OptionalCallExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  9.23M|  static inline bool doit(const From &Val) {
   59|  9.23M|    return To::classof(&Val);
   60|  9.23M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree26OptionalCallExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  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|  }
_ZN4llvh4castIN6hermes6ESTree24AssignmentExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  9.12k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  9.12k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  9.12k|  return cast_convert_val<X, Y*,
  257|  9.12k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  9.12k|}
_ZN4llvh3isaIN6hermes6ESTree24AssignmentExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   391k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   391k|  return isa_impl_wrap<X, const Y,
  144|   391k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   391k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree24AssignmentExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   391k|  static bool doit(const From &Val) {
  123|   391k|    return isa_impl_wrap<To, SimpleFrom,
  124|   391k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   391k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   391k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree24AssignmentExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   391k|  static bool doit(const FromTy &Val) {
  133|   391k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   391k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree24AssignmentExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   391k|  static inline bool doit(const From *Val) {
  106|   391k|    assert(Val && "isa<> used on a null pointer");
  107|   391k|    return isa_impl<To, From>::doit(*Val);
  108|   391k|  }
_ZN4llvh8isa_implIN6hermes6ESTree24AssignmentExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   391k|  static inline bool doit(const From &Val) {
   59|   391k|    return To::classof(&Val);
   60|   391k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree24AssignmentExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  9.12k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  9.12k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  9.12k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  9.12k|    return Res2;
  222|  9.12k|  }
_ZN4llvh4castIN6hermes6ESTree19UnaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  55.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  55.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  55.3k|  return cast_convert_val<X, Y*,
  257|  55.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  55.3k|}
_ZN4llvh3isaIN6hermes6ESTree19UnaryExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   211k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   211k|  return isa_impl_wrap<X, const Y,
  144|   211k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   211k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19UnaryExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   211k|  static bool doit(const From &Val) {
  123|   211k|    return isa_impl_wrap<To, SimpleFrom,
  124|   211k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   211k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   211k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19UnaryExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   211k|  static bool doit(const FromTy &Val) {
  133|   211k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   211k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19UnaryExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   211k|  static inline bool doit(const From *Val) {
  106|   211k|    assert(Val && "isa<> used on a null pointer");
  107|   211k|    return isa_impl<To, From>::doit(*Val);
  108|   211k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19UnaryExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   211k|  static inline bool doit(const From &Val) {
   59|   211k|    return To::classof(&Val);
   60|   211k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19UnaryExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  55.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  55.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  55.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  55.3k|    return Res2;
  222|  55.3k|  }
_ZN4llvh4castIN6hermes6ESTree20UpdateExpressionNodeENS2_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|      2|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes6ESTree20UpdateExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  27.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  27.0k|  return isa_impl_wrap<X, const Y,
  144|  27.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  27.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20UpdateExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  27.0k|  static bool doit(const From &Val) {
  123|  27.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  27.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  27.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  27.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20UpdateExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  27.0k|  static bool doit(const FromTy &Val) {
  133|  27.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  27.0k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20UpdateExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  27.0k|  static inline bool doit(const From *Val) {
  106|  27.0k|    assert(Val && "isa<> used on a null pointer");
  107|  27.0k|    return isa_impl<To, From>::doit(*Val);
  108|  27.0k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20UpdateExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  27.0k|  static inline bool doit(const From &Val) {
   59|  27.0k|    return To::classof(&Val);
   60|  27.0k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20UpdateExpressionNodeEPNS2_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|  }
_ZN4llvh4castIN6hermes6ESTree20MemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  52.7k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  52.7k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  52.7k|  return cast_convert_val<X, Y*,
  257|  52.7k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  52.7k|}
_ZN4llvh3isaIN6hermes6ESTree20MemberExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   486k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   486k|  return isa_impl_wrap<X, const Y,
  144|   486k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   486k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   486k|  static bool doit(const From &Val) {
  123|   486k|    return isa_impl_wrap<To, SimpleFrom,
  124|   486k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   486k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   486k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   511k|  static bool doit(const FromTy &Val) {
  133|   511k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   511k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20MemberExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   511k|  static inline bool doit(const From *Val) {
  106|   511k|    assert(Val && "isa<> used on a null pointer");
  107|   511k|    return isa_impl<To, From>::doit(*Val);
  108|   511k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20MemberExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   511k|  static inline bool doit(const From &Val) {
   59|   511k|    return To::classof(&Val);
   60|   511k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20MemberExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  52.7k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  52.7k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  52.7k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  52.7k|    return Res2;
  222|  52.7k|  }
_ZN4llvh4castIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  77.7k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  77.7k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  77.7k|  return cast_convert_val<X, Y*,
  257|  77.7k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  77.7k|}
_ZN4llvh3isaIN6hermes6ESTree28OptionalMemberExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  9.29M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  9.29M|  return isa_impl_wrap<X, const Y,
  144|  9.29M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  9.29M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28OptionalMemberExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  9.29M|  static bool doit(const From &Val) {
  123|  9.29M|    return isa_impl_wrap<To, SimpleFrom,
  124|  9.29M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  9.29M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  9.29M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28OptionalMemberExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  9.29M|  static bool doit(const FromTy &Val) {
  133|  9.29M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  9.29M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree28OptionalMemberExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  9.29M|  static inline bool doit(const From *Val) {
  106|  9.29M|    assert(Val && "isa<> used on a null pointer");
  107|  9.29M|    return isa_impl<To, From>::doit(*Val);
  108|  9.29M|  }
_ZN4llvh8isa_implIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  9.29M|  static inline bool doit(const From &Val) {
   59|  9.29M|    return To::classof(&Val);
   60|  9.29M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree28OptionalMemberExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  77.7k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  77.7k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  77.7k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  77.7k|    return Res2;
  222|  77.7k|  }
_ZN4llvh4castIN6hermes6ESTree21LogicalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  75.1k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  75.1k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  75.1k|  return cast_convert_val<X, Y*,
  257|  75.1k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  75.1k|}
_ZN4llvh3isaIN6hermes6ESTree21LogicalExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   359k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   359k|  return isa_impl_wrap<X, const Y,
  144|   359k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   359k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21LogicalExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   359k|  static bool doit(const From &Val) {
  123|   359k|    return isa_impl_wrap<To, SimpleFrom,
  124|   359k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   359k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   359k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21LogicalExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   359k|  static bool doit(const FromTy &Val) {
  133|   359k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   359k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21LogicalExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   359k|  static inline bool doit(const From *Val) {
  106|   359k|    assert(Val && "isa<> used on a null pointer");
  107|   359k|    return isa_impl<To, From>::doit(*Val);
  108|   359k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21LogicalExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   359k|  static inline bool doit(const From &Val) {
   59|   359k|    return To::classof(&Val);
   60|   359k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree21LogicalExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  75.1k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  75.1k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  75.1k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  75.1k|    return Res2;
  222|  75.1k|  }
_ZN4llvh4castIN6hermes6ESTree25ConditionalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  11.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  11.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  11.0k|  return cast_convert_val<X, Y*,
  257|  11.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  11.0k|}
_ZN4llvh3isaIN6hermes6ESTree25ConditionalExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  38.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  38.0k|  return isa_impl_wrap<X, const Y,
  144|  38.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  38.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree25ConditionalExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  38.0k|  static bool doit(const From &Val) {
  123|  38.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  38.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  38.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  38.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree25ConditionalExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  38.0k|  static bool doit(const FromTy &Val) {
  133|  38.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  38.0k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree25ConditionalExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  38.0k|  static inline bool doit(const From *Val) {
  106|  38.0k|    assert(Val && "isa<> used on a null pointer");
  107|  38.0k|    return isa_impl<To, From>::doit(*Val);
  108|  38.0k|  }
_ZN4llvh8isa_implIN6hermes6ESTree25ConditionalExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  38.0k|  static inline bool doit(const From &Val) {
   59|  38.0k|    return To::classof(&Val);
   60|  38.0k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree25ConditionalExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  11.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  11.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  11.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  11.0k|    return Res2;
  222|  11.0k|  }
_ZN4llvh4castIN6hermes6ESTree20BinaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   851k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   851k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   851k|  return cast_convert_val<X, Y*,
  257|   851k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   851k|}
_ZN4llvh3isaIN6hermes6ESTree20BinaryExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.75M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.75M|  return isa_impl_wrap<X, const Y,
  144|  1.75M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.75M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20BinaryExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.75M|  static bool doit(const From &Val) {
  123|  1.75M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.75M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.75M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.75M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20BinaryExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.75M|  static bool doit(const FromTy &Val) {
  133|  1.75M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.75M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20BinaryExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.75M|  static inline bool doit(const From *Val) {
  106|  1.75M|    assert(Val && "isa<> used on a null pointer");
  107|  1.75M|    return isa_impl<To, From>::doit(*Val);
  108|  1.75M|  }
_ZN4llvh8isa_implIN6hermes6ESTree20BinaryExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.75M|  static inline bool doit(const From &Val) {
   59|  1.75M|    return To::classof(&Val);
   60|  1.75M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20BinaryExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   851k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   851k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   851k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   851k|    return Res2;
  222|   851k|  }
_ZN4llvh3isaIN6hermes6ESTree16MetaPropertyNodeEPNS2_4NodeEEEbRKT0_:
  142|   130k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   130k|  return isa_impl_wrap<X, const Y,
  144|   130k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   130k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16MetaPropertyNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   130k|  static bool doit(const From &Val) {
  123|   130k|    return isa_impl_wrap<To, SimpleFrom,
  124|   130k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   130k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   130k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16MetaPropertyNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   130k|  static bool doit(const FromTy &Val) {
  133|   130k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   130k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16MetaPropertyNodeEPKNS2_4NodeEE4doitES6_:
  105|   130k|  static inline bool doit(const From *Val) {
  106|   130k|    assert(Val && "isa<> used on a null pointer");
  107|   130k|    return isa_impl<To, From>::doit(*Val);
  108|   130k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16MetaPropertyNodeENS2_4NodeEvE4doitERKS4_:
   58|   130k|  static inline bool doit(const From &Val) {
   59|   130k|    return To::classof(&Val);
   60|   130k|  }
_ZN4llvh4castIN6hermes6ESTree23VariableDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  2.73k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.73k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.73k|  return cast_convert_val<X, Y*,
  257|  2.73k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.73k|}
_ZN4llvh3isaIN6hermes6ESTree23VariableDeclarationNodeEPNS2_4NodeEEEbRKT0_:
  142|   276k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   276k|  return isa_impl_wrap<X, const Y,
  144|   276k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   276k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23VariableDeclarationNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   276k|  static bool doit(const From &Val) {
  123|   276k|    return isa_impl_wrap<To, SimpleFrom,
  124|   276k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   276k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   276k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23VariableDeclarationNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   276k|  static bool doit(const FromTy &Val) {
  133|   276k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   276k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23VariableDeclarationNodeEPKNS2_4NodeEE4doitES6_:
  105|   276k|  static inline bool doit(const From *Val) {
  106|   276k|    assert(Val && "isa<> used on a null pointer");
  107|   276k|    return isa_impl<To, From>::doit(*Val);
  108|   276k|  }
_ZN4llvh8isa_implIN6hermes6ESTree23VariableDeclarationNodeENS2_4NodeEvE4doitERKS4_:
   58|   276k|  static inline bool doit(const From &Val) {
   59|   276k|    return To::classof(&Val);
   60|   276k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree23VariableDeclarationNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  2.73k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.73k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.73k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.73k|    return Res2;
  222|  2.73k|  }
_ZN4llvh4castIN6hermes6ESTree19TemplateLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  69.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  69.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  69.8k|  return cast_convert_val<X, Y*,
  257|  69.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  69.8k|}
_ZN4llvh3isaIN6hermes6ESTree19TemplateLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  93.1k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  93.1k|  return isa_impl_wrap<X, const Y,
  144|  93.1k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  93.1k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  93.1k|  static bool doit(const From &Val) {
  123|  93.1k|    return isa_impl_wrap<To, SimpleFrom,
  124|  93.1k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  93.1k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  93.1k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  93.1k|  static bool doit(const FromTy &Val) {
  133|  93.1k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  93.1k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19TemplateLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  93.1k|  static inline bool doit(const From *Val) {
  106|  93.1k|    assert(Val && "isa<> used on a null pointer");
  107|  93.1k|    return isa_impl<To, From>::doit(*Val);
  108|  93.1k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19TemplateLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  93.1k|  static inline bool doit(const From &Val) {
   59|  93.1k|    return To::classof(&Val);
   60|  93.1k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19TemplateLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  69.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  69.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  69.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  69.8k|    return Res2;
  222|  69.8k|  }
_ZN4llvh4castIN6hermes6ESTree28TaggedTemplateExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  8.46k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  8.46k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  8.46k|  return cast_convert_val<X, Y*,
  257|  8.46k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  8.46k|}
_ZN4llvh3isaIN6hermes6ESTree28TaggedTemplateExpressionNodeEPNS2_4NodeEEEbRKT0_:
  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_wrapIN6hermes6ESTree28TaggedTemplateExpressionNodeEKPNS2_4NodeEPKS4_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_wrapIN6hermes6ESTree28TaggedTemplateExpressionNodeEPKNS2_4NodeES6_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_clIN6hermes6ESTree28TaggedTemplateExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  11.2k|  static inline bool doit(const From *Val) {
  106|  11.2k|    assert(Val && "isa<> used on a null pointer");
  107|  11.2k|    return isa_impl<To, From>::doit(*Val);
  108|  11.2k|  }
_ZN4llvh8isa_implIN6hermes6ESTree28TaggedTemplateExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  11.2k|  static inline bool doit(const From &Val) {
   59|  11.2k|    return To::classof(&Val);
   60|  11.2k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree28TaggedTemplateExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  8.46k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  8.46k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  8.46k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  8.46k|    return Res2;
  222|  8.46k|  }
_ZN4llvh4castIN6hermes6ESTree19TemplateElementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.49M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.49M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.49M|  return cast_convert_val<X, Y*,
  257|  1.49M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.49M|}
_ZN4llvh3isaIN6hermes6ESTree19TemplateElementNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.49M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.49M|  return isa_impl_wrap<X, const Y,
  144|  1.49M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.49M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateElementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.49M|  static bool doit(const From &Val) {
  123|  1.49M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.49M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.49M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.49M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateElementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.49M|  static bool doit(const FromTy &Val) {
  133|  1.49M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.49M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19TemplateElementNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.49M|  static inline bool doit(const From *Val) {
  106|  1.49M|    assert(Val && "isa<> used on a null pointer");
  107|  1.49M|    return isa_impl<To, From>::doit(*Val);
  108|  1.49M|  }
_ZN4llvh8isa_implIN6hermes6ESTree19TemplateElementNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.49M|  static inline bool doit(const From &Val) {
   59|  1.49M|    return To::classof(&Val);
   60|  1.49M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19TemplateElementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  1.49M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.49M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.49M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.49M|    return Res2;
  222|  1.49M|  }
_ZN4llvh3isaIN6hermes6ESTree21ImportDeclarationNodeEPNS2_4NodeEEEbRKT0_:
  142|   713k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   713k|  return isa_impl_wrap<X, const Y,
  144|   713k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   713k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ImportDeclarationNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   713k|  static bool doit(const From &Val) {
  123|   713k|    return isa_impl_wrap<To, SimpleFrom,
  124|   713k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   713k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   713k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ImportDeclarationNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   713k|  static bool doit(const FromTy &Val) {
  133|   713k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   713k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21ImportDeclarationNodeEPKNS2_4NodeEE4doitES6_:
  105|   713k|  static inline bool doit(const From *Val) {
  106|   713k|    assert(Val && "isa<> used on a null pointer");
  107|   713k|    return isa_impl<To, From>::doit(*Val);
  108|   713k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21ImportDeclarationNodeENS2_4NodeEvE4doitERKS4_:
   58|   713k|  static inline bool doit(const From &Val) {
   59|   713k|    return To::classof(&Val);
   60|   713k|  }
_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|      1|    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|  22.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  22.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  22.3k|  return cast_convert_val<X, Y*,
  257|  22.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  22.3k|}
_ZN4llvh3isaIN6hermes6ESTree16ArrayPatternNodeEPNS2_4NodeEEEbRKT0_:
  142|  22.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  22.3k|  return isa_impl_wrap<X, const Y,
  144|  22.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  22.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  22.3k|  static bool doit(const From &Val) {
  123|  22.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  22.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  22.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  22.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  67.1k|  static bool doit(const FromTy &Val) {
  133|  67.1k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  67.1k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeEE4doitES6_:
  105|  67.1k|  static inline bool doit(const From *Val) {
  106|  67.1k|    assert(Val && "isa<> used on a null pointer");
  107|  67.1k|    return isa_impl<To, From>::doit(*Val);
  108|  67.1k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16ArrayPatternNodeENS2_4NodeEvE4doitERKS4_:
   58|  67.1k|  static inline bool doit(const From &Val) {
   59|  67.1k|    return To::classof(&Val);
   60|  67.1k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree16ArrayPatternNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  22.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  22.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  22.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  22.3k|    return Res2;
  222|  22.3k|  }
_ZN4llvh3isaIN6hermes6ESTree15RestElementNodeEPNS2_4NodeEEEbRKT0_:
  142|   123k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   123k|  return isa_impl_wrap<X, const Y,
  144|   123k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   123k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15RestElementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   123k|  static bool doit(const From &Val) {
  123|   123k|    return isa_impl_wrap<To, SimpleFrom,
  124|   123k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   123k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   123k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15RestElementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   123k|  static bool doit(const FromTy &Val) {
  133|   123k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   123k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree15RestElementNodeEPKNS2_4NodeEE4doitES6_:
  105|   123k|  static inline bool doit(const From *Val) {
  106|   123k|    assert(Val && "isa<> used on a null pointer");
  107|   123k|    return isa_impl<To, From>::doit(*Val);
  108|   123k|  }
_ZN4llvh8isa_implIN6hermes6ESTree15RestElementNodeENS2_4NodeEvE4doitERKS4_:
   58|   123k|  static inline bool doit(const From &Val) {
   59|   123k|    return To::classof(&Val);
   60|   123k|  }
_ZN4llvh3isaIN6hermes6ESTree21AssignmentPatternNodeEPNS2_4NodeEEEbRKT0_:
  142|   123k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   123k|  return isa_impl_wrap<X, const Y,
  144|   123k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   123k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   123k|  static bool doit(const From &Val) {
  123|   123k|    return isa_impl_wrap<To, SimpleFrom,
  124|   123k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   123k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   123k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   145k|  static bool doit(const FromTy &Val) {
  133|   145k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   145k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21AssignmentPatternNodeEPKNS2_4NodeEE4doitES6_:
  105|   145k|  static inline bool doit(const From *Val) {
  106|   145k|    assert(Val && "isa<> used on a null pointer");
  107|   145k|    return isa_impl<To, From>::doit(*Val);
  108|   145k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21AssignmentPatternNodeENS2_4NodeEvE4doitERKS4_:
   58|   352k|  static inline bool doit(const From &Val) {
   59|   352k|    return To::classof(&Val);
   60|   352k|  }
_ZN4llvh3isaIN6hermes6ESTree22TypeCastExpressionNodeEPNS2_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_wrapIN6hermes6ESTree22TypeCastExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  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|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22TypeCastExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|      1|  static bool doit(const FromTy &Val) {
  133|      1|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      1|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22TypeCastExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|      1|  static inline bool doit(const From *Val) {
  106|      1|    assert(Val && "isa<> used on a null pointer");
  107|      1|    return isa_impl<To, From>::doit(*Val);
  108|      1|  }
_ZN4llvh8isa_implIN6hermes6ESTree22TypeCastExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|      1|  static inline bool doit(const From &Val) {
   59|      1|    return To::classof(&Val);
   60|      1|  }
_ZN4llvh8isa_implIN6hermes6ESTree22ComponentParameterNodeENS2_4NodeEvE4doitERKS4_:
   58|   309k|  static inline bool doit(const From &Val) {
   59|   309k|    return To::classof(&Val);
   60|   309k|  }
_ZN4llvh3isaIN6hermes6ESTree18CoverEmptyArgsNodeEPNS2_4NodeEEEbRKT0_:
  142|   206k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   206k|  return isa_impl_wrap<X, const Y,
  144|   206k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   206k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CoverEmptyArgsNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   206k|  static bool doit(const From &Val) {
  123|   206k|    return isa_impl_wrap<To, SimpleFrom,
  124|   206k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   206k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   206k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CoverEmptyArgsNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   206k|  static bool doit(const FromTy &Val) {
  133|   206k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   206k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18CoverEmptyArgsNodeEPKNS2_4NodeEE4doitES6_:
  105|   206k|  static inline bool doit(const From *Val) {
  106|   206k|    assert(Val && "isa<> used on a null pointer");
  107|   206k|    return isa_impl<To, From>::doit(*Val);
  108|   206k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18CoverEmptyArgsNodeENS2_4NodeEvE4doitERKS4_:
   58|   206k|  static inline bool doit(const From &Val) {
   59|   206k|    return To::classof(&Val);
   60|   206k|  }
_ZN4llvh3isaIN6hermes6ESTree24CoverTypedIdentifierNodeEPNS2_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_wrapIN6hermes6ESTree24CoverTypedIdentifierNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  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|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree24CoverTypedIdentifierNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|      1|  static bool doit(const FromTy &Val) {
  133|      1|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      1|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree24CoverTypedIdentifierNodeEPKNS2_4NodeEE4doitES6_:
  105|      1|  static inline bool doit(const From *Val) {
  106|      1|    assert(Val && "isa<> used on a null pointer");
  107|      1|    return isa_impl<To, From>::doit(*Val);
  108|      1|  }
_ZN4llvh8isa_implIN6hermes6ESTree24CoverTypedIdentifierNodeENS2_4NodeEvE4doitERKS4_:
   58|      1|  static inline bool doit(const From &Val) {
   59|      1|    return To::classof(&Val);
   60|      1|  }
_ZN4llvh8dyn_castIN6hermes6ESTree18NumericLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.96M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.96M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.59M, False: 375k]
  ------------------
  335|  1.96M|}
_ZN4llvh4castIN6hermes6ESTree14IdentifierNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  2.62M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.62M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.62M|  return cast_convert_val<X, Y*,
  257|  2.62M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.62M|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree14IdentifierNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  2.62M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.62M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.62M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.62M|    return Res2;
  222|  2.62M|  }
_ZN4llvh8dyn_castIN6hermes6ESTree14IdentifierNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  2.67M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.67M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 710k, False: 1.96M]
  ------------------
  335|  2.67M|}
_ZN4llvh3isaIN6hermes6ESTree9EmptyNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.40M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.40M|  return isa_impl_wrap<X, const Y,
  144|  1.40M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.40M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9EmptyNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.40M|  static bool doit(const From &Val) {
  123|  1.40M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.40M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.40M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.40M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9EmptyNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.43M|  static bool doit(const FromTy &Val) {
  133|  1.43M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.43M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree9EmptyNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.43M|  static inline bool doit(const From *Val) {
  106|  1.43M|    assert(Val && "isa<> used on a null pointer");
  107|  1.43M|    return isa_impl<To, From>::doit(*Val);
  108|  1.43M|  }
_ZN4llvh8isa_implIN6hermes6ESTree9EmptyNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.43M|  static inline bool doit(const From &Val) {
   59|  1.43M|    return To::classof(&Val);
   60|  1.43M|  }
_ZN4llvh8dyn_castIN6hermes6ESTree20MemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   433k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   433k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 17.5k, False: 416k]
  ------------------
  335|   433k|}
_ZN4llvh8dyn_castIN6hermes6ESTree23VariableDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   273k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   273k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 273k]
  ------------------
  335|   273k|}
_ZN4llvh4castIN6hermes6ESTree22VariableDeclaratorNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  9.36k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  9.36k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  9.36k|  return cast_convert_val<X, Y*,
  257|  9.36k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  9.36k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree22VariableDeclaratorNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  9.36k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  9.36k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  9.36k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  9.36k|    return Res2;
  222|  9.36k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree11PatternNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  22.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  22.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 22.3k, False: 0]
  ------------------
  335|  22.3k|}
_ZN4llvh3isaIN6hermes6ESTree11PatternNodeEPNS2_4NodeEEEbRKT0_:
  142|  48.6k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  48.6k|  return isa_impl_wrap<X, const Y,
  144|  48.6k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  48.6k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11PatternNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  48.6k|  static bool doit(const From &Val) {
  123|  48.6k|    return isa_impl_wrap<To, SimpleFrom,
  124|  48.6k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  48.6k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  48.6k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11PatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  48.6k|  static bool doit(const FromTy &Val) {
  133|  48.6k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  48.6k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11PatternNodeEPKNS2_4NodeEE4doitES6_:
  105|  48.6k|  static inline bool doit(const From *Val) {
  106|  48.6k|    assert(Val && "isa<> used on a null pointer");
  107|  48.6k|    return isa_impl<To, From>::doit(*Val);
  108|  48.6k|  }
_ZN4llvh8isa_implIN6hermes6ESTree11PatternNodeENS2_4NodeEvE4doitERKS4_:
   58|   151k|  static inline bool doit(const From &Val) {
   59|   151k|    return To::classof(&Val);
   60|   151k|  }
_ZN4llvh4castIN6hermes6ESTree11PatternNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  22.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  22.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  22.3k|  return cast_convert_val<X, Y*,
  257|  22.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  22.3k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree11PatternNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  22.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  22.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  22.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  22.3k|    return Res2;
  222|  22.3k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree16ArrayPatternNodeENS2_11PatternNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  22.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  22.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 22.3k, False: 0]
  ------------------
  335|  22.3k|}
_ZN4llvh3isaIN6hermes6ESTree16ArrayPatternNodeEPNS2_11PatternNodeEEEbRKT0_:
  142|  44.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  44.7k|  return isa_impl_wrap<X, const Y,
  144|  44.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  44.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEKPNS2_11PatternNodeEPKS4_E4doitERS6_:
  122|  44.7k|  static bool doit(const From &Val) {
  123|  44.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  44.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  44.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  44.7k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEPKNS2_11PatternNodeES6_E4doitERKS6_:
  132|  44.7k|  static bool doit(const FromTy &Val) {
  133|  44.7k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  44.7k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16ArrayPatternNodeEPKNS2_11PatternNodeEE4doitES6_:
  105|  44.7k|  static inline bool doit(const From *Val) {
  106|  44.7k|    assert(Val && "isa<> used on a null pointer");
  107|  44.7k|    return isa_impl<To, From>::doit(*Val);
  108|  44.7k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16ArrayPatternNodeENS2_11PatternNodeEvE4doitERKS4_:
   58|  44.7k|  static inline bool doit(const From &Val) {
   59|  44.7k|    return To::classof(&Val);
   60|  44.7k|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree11PatternNodeEE18getSimplifiedValueERS5_:
   48|  44.7k|  static RetType getSimplifiedValue(const From& Val) {
   49|  44.7k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  44.7k|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree11PatternNodeEE18getSimplifiedValueERS4_:
   38|  44.7k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree16ArrayPatternNodeENS2_11PatternNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  22.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  22.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  22.3k|  return cast_convert_val<X, Y*,
  257|  22.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  22.3k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree16ArrayPatternNodeEPNS2_11PatternNodeES5_E4doitERKS5_:
  218|  22.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  22.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  22.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  22.3k|    return Res2;
  222|  22.3k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree15RestElementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   123k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   123k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 123k]
  ------------------
  335|   123k|}
_ZN4llvh8dyn_castIN6hermes6ESTree21AssignmentPatternNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   123k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   123k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 123k]
  ------------------
  335|   123k|}
_ZN4llvh3isaIN6hermes6ESTree14IdentifierNodeEPNS2_4NodeEEEbRKT0_:
  142|  6.80M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.80M|  return isa_impl_wrap<X, const Y,
  144|  6.80M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.80M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree14IdentifierNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  6.80M|  static bool doit(const From &Val) {
  123|  6.80M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.80M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.80M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.80M|  }
_ZN4llvh4castIN6hermes6ESTree12PropertyNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|      4|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes6ESTree12PropertyNodeEPNS2_4NodeEEEbRKT0_:
  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_wrapIN6hermes6ESTree12PropertyNodeEKPNS2_4NodeEPKS4_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_wrapIN6hermes6ESTree12PropertyNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree12PropertyNodeEPKNS2_4NodeEE4doitES6_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      4|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes6ESTree12PropertyNodeENS2_4NodeEvE4doitERKS4_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree12PropertyNodeEPNS2_4NodeES5_E4doitERKS5_:
  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|  }
_ZN4llvh8dyn_castIN6hermes20GlobalObjectPropertyENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   503k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   503k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 503k, False: 0]
  ------------------
  335|   503k|}
_ZN4llvh8dyn_castIN6hermes6ESTree17StringLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.92M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.92M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 20, False: 1.92M]
  ------------------
  335|  1.92M|}
_ZN4llvh8dyn_castIN6hermes6ESTree17RegExpLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.92M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.92M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 119, False: 1.92M]
  ------------------
  335|  1.92M|}
_ZN4llvh8dyn_castIN6hermes6ESTree18BooleanLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.92M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.92M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 1.92M]
  ------------------
  335|  1.92M|}
_ZN4llvh8dyn_castIN6hermes6ESTree17BigIntLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   332k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   332k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 5, False: 332k]
  ------------------
  335|   332k|}
_ZN4llvh8dyn_castIN6hermes6ESTree24AssignmentExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   382k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   382k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 4.57k, False: 377k]
  ------------------
  335|   382k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18CallExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   333k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   333k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 3, False: 333k]
  ------------------
  335|   333k|}
_ZN4llvh8dyn_castIN6hermes6ESTree26OptionalCallExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   328k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   328k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 16, False: 328k]
  ------------------
  335|   328k|}
_ZN4llvh8dyn_castIN6hermes6ESTree17NewExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   327k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   327k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 25.0k, False: 302k]
  ------------------
  335|   327k|}
_ZN4llvh8dyn_castIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   311k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   311k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 25.9k, False: 285k]
  ------------------
  335|   311k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19ArrayExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   329k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   329k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 44.8k, False: 284k]
  ------------------
  335|   329k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20ObjectExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   284k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   284k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2, False: 284k]
  ------------------
  335|   284k|}
_ZN4llvh8dyn_castIN6hermes6ESTree21LogicalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   284k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   284k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 24.3k, False: 260k]
  ------------------
  335|   284k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20BinaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   908k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   908k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 747k, False: 161k]
  ------------------
  335|   908k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19UnaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   156k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   156k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 25.9k, False: 130k]
  ------------------
  335|   156k|}
_ZN4llvh8dyn_castIN6hermes6ESTree16MetaPropertyNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   130k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   130k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 130k]
  ------------------
  335|   130k|}
_ZN4llvh8dyn_castIN6hermes6ESTree22FunctionExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   130k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   130k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 82, False: 130k]
  ------------------
  335|   130k|}
_ZN4llvh8dyn_castIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   130k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   130k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 103k, False: 27.0k]
  ------------------
  335|   130k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20UpdateExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  27.0k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  27.0k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1, False: 27.0k]
  ------------------
  335|  27.0k|}
_ZN4llvh8dyn_castIN6hermes6ESTree25ConditionalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  27.0k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  27.0k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 3.66k, False: 23.3k]
  ------------------
  335|  27.0k|}
_ZN4llvh8dyn_castIN6hermes6ESTree22SequenceExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  23.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  23.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 98, False: 23.2k]
  ------------------
  335|  23.3k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19TemplateLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  23.2k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  23.2k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 20.4k, False: 2.82k]
  ------------------
  335|  23.2k|}
_ZN4llvh8dyn_castIN6hermes6ESTree28TaggedTemplateExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  2.82k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.82k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2.82k, False: 0]
  ------------------
  335|  2.82k|}
_ZN4llvh8dyn_castIN6hermes6ESTree17SpreadElementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.27M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.27M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 1.27M]
  ------------------
  335|  1.27M|}
_ZN4llvh4castIN6hermes5ValueENS1_13LiteralNumberEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   698k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   698k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   698k|  return cast_convert_val<X, Y*,
  257|   698k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   698k|}
_ZN4llvh3isaIN6hermes5ValueEPNS1_13LiteralNumberEEEbRKT0_:
  142|   698k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   698k|  return isa_impl_wrap<X, const Y,
  144|   698k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   698k|}
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEKPNS1_13LiteralNumberEPKS3_E4doitERS5_:
  122|   698k|  static bool doit(const From &Val) {
  123|   698k|    return isa_impl_wrap<To, SimpleFrom,
  124|   698k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   698k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   698k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEPKNS1_13LiteralNumberES5_E4doitERKS5_:
  132|   698k|  static bool doit(const FromTy &Val) {
  133|   698k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   698k|  }
_ZN4llvh11isa_impl_clIN6hermes5ValueEPKNS1_13LiteralNumberEE4doitES5_:
  105|   698k|  static inline bool doit(const From *Val) {
  106|   698k|    assert(Val && "isa<> used on a null pointer");
  107|   698k|    return isa_impl<To, From>::doit(*Val);
  108|   698k|  }
_ZN4llvh8isa_implIN6hermes5ValueENS1_13LiteralNumberEvE4doitERKS3_:
   67|   698k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes13LiteralNumberEE18getSimplifiedValueERS4_:
   48|   698k|  static RetType getSimplifiedValue(const From& Val) {
   49|   698k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   698k|  }
_ZN4llvh13simplify_typeIPN6hermes13LiteralNumberEE18getSimplifiedValueERS3_:
   38|   698k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes5ValueEPNS1_13LiteralNumberES4_E4doitERKS4_:
  218|   698k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   698k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   698k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   698k|    return Res2;
  222|   698k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree18BlockStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   560k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   560k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 309k, False: 251k]
  ------------------
  335|   560k|}
_ZN4llvh8dyn_castIN6hermes6ESTree21ImportDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   713k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   713k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 713k]
  ------------------
  335|   713k|}
_ZN4llvh8dyn_castIN6hermes6ESTree15IfStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   713k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   713k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 713k]
  ------------------
  335|   713k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18ForInStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   713k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   713k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 15, False: 713k]
  ------------------
  335|   713k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18ForOfStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   713k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   713k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 713k]
  ------------------
  335|   713k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19ReturnStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   713k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   713k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 103k, False: 610k]
  ------------------
  335|   713k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19SwitchStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   251k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   251k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 251k]
  ------------------
  335|   251k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20LabeledStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   507k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   507k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 256k, False: 251k]
  ------------------
  335|   507k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18WhileStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.34k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.34k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 5.34k]
  ------------------
  335|  5.34k|}
_ZN4llvh8dyn_castIN6hermes6ESTree16ForStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.34k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.34k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 5.34k]
  ------------------
  335|  5.34k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20DoWhileStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.34k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.34k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 5.34k]
  ------------------
  335|  5.34k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18BreakStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.34k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.34k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 5.34k]
  ------------------
  335|  5.34k|}
_ZN4llvh8dyn_castIN6hermes6ESTree21ContinueStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.34k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.34k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 5.34k]
  ------------------
  335|  5.34k|}
_ZN4llvh8dyn_castIN6hermes6ESTree16TryStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.34k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.34k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 5.34k]
  ------------------
  335|  5.34k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18ThrowStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.34k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.34k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 5.34k]
  ------------------
  335|  5.34k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18BlockStatementNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|     82|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     82|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 82, False: 0]
  ------------------
  335|     82|}
_ZN4llvh3isaIN6hermes6ESTree18BlockStatementNodeEPS3_EEbRKT0_:
  142|    164|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    164|  return isa_impl_wrap<X, const Y,
  144|    164|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    164|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEKPS3_PKS3_E4doitERS5_:
  122|    164|  static bool doit(const From &Val) {
  123|    164|    return isa_impl_wrap<To, SimpleFrom,
  124|    164|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    164|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    164|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEPKS3_S5_E4doitERKS5_:
  132|    164|  static bool doit(const FromTy &Val) {
  133|    164|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    164|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BlockStatementNodeEPKS3_E4doitES5_:
  105|    164|  static inline bool doit(const From *Val) {
  106|    164|    assert(Val && "isa<> used on a null pointer");
  107|    164|    return isa_impl<To, From>::doit(*Val);
  108|    164|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BlockStatementNodeES3_vE4doitERKS3_:
   67|    164|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree18BlockStatementNodeEE18getSimplifiedValueERS5_:
   48|    164|  static RetType getSimplifiedValue(const From& Val) {
   49|    164|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|    164|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree18BlockStatementNodeEE18getSimplifiedValueERS4_:
   38|    164|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree18BlockStatementNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     82|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     82|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     82|  return cast_convert_val<X, Y*,
  257|     82|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     82|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree18BlockStatementNodeEPS3_S4_E4doitERKS4_:
  218|     82|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     82|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     82|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     82|    return Res2;
  222|     82|  }
_ZN4llvh3isaIN6hermes6ESTree21AssignmentPatternNodeENS2_4NodeEEEbRKT0_:
  142|   206k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   206k|  return isa_impl_wrap<X, const Y,
  144|   206k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   206k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEKNS2_4NodeES5_E4doitERS5_:
  132|   206k|  static bool doit(const FromTy &Val) {
  133|   206k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   206k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21AssignmentPatternNodeEKNS2_4NodeEE4doitERS5_:
   77|   206k|  static inline bool doit(const From &Val) {
   78|   206k|    return isa_impl<To, From>::doit(Val);
   79|   206k|  }
_ZN4llvh4castIN6hermes15CreateScopeInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes15CreateScopeInstEPNS1_5ValueEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes15CreateScopeInstEPKNS1_5ValueEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes15CreateScopeInstENS1_5ValueEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes15CreateScopeInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes24HBCCreateEnvironmentInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes24HBCCreateEnvironmentInstEPNS1_5ValueEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes24HBCCreateEnvironmentInstEPKNS1_5ValueEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes24HBCCreateEnvironmentInstENS1_5ValueEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes24HBCCreateEnvironmentInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes12AsNumberInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    509|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    509|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    509|  return cast_convert_val<X, Y*,
  257|    509|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    509|}
_ZN4llvh3isaIN6hermes12AsNumberInstEPNS1_5ValueEEEbRKT0_:
  142|    509|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    509|  return isa_impl_wrap<X, const Y,
  144|    509|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    509|}
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    509|  static bool doit(const From &Val) {
  123|    509|    return isa_impl_wrap<To, SimpleFrom,
  124|    509|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    509|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    509|  }
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    509|  static bool doit(const FromTy &Val) {
  133|    509|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    509|  }
_ZN4llvh11isa_impl_clIN6hermes12AsNumberInstEPKNS1_5ValueEE4doitES5_:
  105|    509|  static inline bool doit(const From *Val) {
  106|    509|    assert(Val && "isa<> used on a null pointer");
  107|    509|    return isa_impl<To, From>::doit(*Val);
  108|    509|  }
_ZN4llvh8isa_implIN6hermes12AsNumberInstENS1_5ValueEvE4doitERKS3_:
   58|    509|  static inline bool doit(const From &Val) {
   59|    509|    return To::classof(&Val);
   60|    509|  }
_ZN4llvh16cast_convert_valIN6hermes12AsNumberInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    509|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    509|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    509|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    509|    return Res2;
  222|    509|  }
_ZN4llvh4castIN6hermes13LoadStackInstENS1_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|   128k|  return cast_convert_val<X, Y*,
  257|   128k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   128k|}
_ZN4llvh3isaIN6hermes13LoadStackInstEPNS1_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_wrapIN6hermes13LoadStackInstEKPNS1_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_wrapIN6hermes13LoadStackInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   128k|  static bool doit(const FromTy &Val) {
  133|   128k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   128k|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadStackInstEPKNS1_5ValueEE4doitES5_:
  105|   128k|  static inline bool doit(const From *Val) {
  106|   128k|    assert(Val && "isa<> used on a null pointer");
  107|   128k|    return isa_impl<To, From>::doit(*Val);
  108|   128k|  }
_ZN4llvh8isa_implIN6hermes13LoadStackInstENS1_5ValueEvE4doitERKS3_:
   58|   128k|  static inline bool doit(const From &Val) {
   59|   128k|    return To::classof(&Val);
   60|   128k|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadStackInstEPNS1_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|  }
_ZN4llvh4castIN6hermes15ImplicitMovInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.82k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.82k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.82k|  return cast_convert_val<X, Y*,
  257|  2.82k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.82k|}
_ZN4llvh3isaIN6hermes15ImplicitMovInstEPNS1_5ValueEEEbRKT0_:
  142|  2.82k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.82k|  return isa_impl_wrap<X, const Y,
  144|  2.82k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.82k|}
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  2.82k|  static bool doit(const From &Val) {
  123|  2.82k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.82k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.82k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.82k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  2.82k|  static bool doit(const FromTy &Val) {
  133|  2.82k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.82k|  }
_ZN4llvh11isa_impl_clIN6hermes15ImplicitMovInstEPKNS1_5ValueEE4doitES5_:
  105|  2.82k|  static inline bool doit(const From *Val) {
  106|  2.82k|    assert(Val && "isa<> used on a null pointer");
  107|  2.82k|    return isa_impl<To, From>::doit(*Val);
  108|  2.82k|  }
_ZN4llvh8isa_implIN6hermes15ImplicitMovInstENS1_5ValueEvE4doitERKS3_:
   58|  2.82k|  static inline bool doit(const From &Val) {
   59|  2.82k|    return To::classof(&Val);
   60|  2.82k|  }
_ZN4llvh16cast_convert_valIN6hermes15ImplicitMovInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  2.82k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.82k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.82k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.82k|    return Res2;
  222|  2.82k|  }
_ZN4llvh4castIN6hermes17UnaryOperatorInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.3k|  return cast_convert_val<X, Y*,
  257|  25.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.3k|}
_ZN4llvh3isaIN6hermes17UnaryOperatorInstEPNS1_5ValueEEEbRKT0_:
  142|  25.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.3k|  return isa_impl_wrap<X, const Y,
  144|  25.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  25.3k|  static bool doit(const From &Val) {
  123|  25.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  25.3k|  static bool doit(const FromTy &Val) {
  133|  25.3k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.3k|  }
_ZN4llvh11isa_impl_clIN6hermes17UnaryOperatorInstEPKNS1_5ValueEE4doitES5_:
  105|  25.3k|  static inline bool doit(const From *Val) {
  106|  25.3k|    assert(Val && "isa<> used on a null pointer");
  107|  25.3k|    return isa_impl<To, From>::doit(*Val);
  108|  25.3k|  }
_ZN4llvh8isa_implIN6hermes17UnaryOperatorInstENS1_5ValueEvE4doitERKS3_:
   58|  25.3k|  static inline bool doit(const From &Val) {
   59|  25.3k|    return To::classof(&Val);
   60|  25.3k|  }
_ZN4llvh16cast_convert_valIN6hermes17UnaryOperatorInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  25.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.3k|    return Res2;
  222|  25.3k|  }
_ZN4llvh4castIN6hermes16HBCLoadParamInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes16HBCLoadParamInstEPNS1_5ValueEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadParamInstEPKNS1_5ValueEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadParamInstENS1_5ValueEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadParamInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes21HBCReifyArgumentsInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    174|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    174|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    174|  return cast_convert_val<X, Y*,
  257|    174|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    174|}
_ZN4llvh3isaIN6hermes21HBCReifyArgumentsInstEPNS1_5ValueEEEbRKT0_:
  142|    174|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    174|  return isa_impl_wrap<X, const Y,
  144|    174|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    174|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    174|  static bool doit(const From &Val) {
  123|    174|    return isa_impl_wrap<To, SimpleFrom,
  124|    174|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    174|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    174|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    174|  static bool doit(const FromTy &Val) {
  133|    174|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    174|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCReifyArgumentsInstEPKNS1_5ValueEE4doitES5_:
  105|    174|  static inline bool doit(const From *Val) {
  106|    174|    assert(Val && "isa<> used on a null pointer");
  107|    174|    return isa_impl<To, From>::doit(*Val);
  108|    174|  }
_ZN4llvh8isa_implIN6hermes21HBCReifyArgumentsInstENS1_5ValueEvE4doitERKS3_:
   58|    174|  static inline bool doit(const From &Val) {
   59|    174|    return To::classof(&Val);
   60|    174|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCReifyArgumentsInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    174|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    174|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    174|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    174|    return Res2;
  222|    174|  }
_ZN4llvh4castIN6hermes15HBCSpillMovInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.38M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.38M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.38M|  return cast_convert_val<X, Y*,
  257|  2.38M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.38M|}
_ZN4llvh3isaIN6hermes15HBCSpillMovInstEPNS1_5ValueEEEbRKT0_:
  142|  2.38M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.38M|  return isa_impl_wrap<X, const Y,
  144|  2.38M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.38M|}
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  2.38M|  static bool doit(const From &Val) {
  123|  2.38M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.38M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.38M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.38M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  2.38M|  static bool doit(const FromTy &Val) {
  133|  2.38M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.38M|  }
_ZN4llvh11isa_impl_clIN6hermes15HBCSpillMovInstEPKNS1_5ValueEE4doitES5_:
  105|  2.38M|  static inline bool doit(const From *Val) {
  106|  2.38M|    assert(Val && "isa<> used on a null pointer");
  107|  2.38M|    return isa_impl<To, From>::doit(*Val);
  108|  2.38M|  }
_ZN4llvh8isa_implIN6hermes15HBCSpillMovInstENS1_5ValueEvE4doitERKS3_:
   58|  2.38M|  static inline bool doit(const From &Val) {
   59|  2.38M|    return To::classof(&Val);
   60|  2.38M|  }
_ZN4llvh16cast_convert_valIN6hermes15HBCSpillMovInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  2.38M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.38M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.38M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.38M|    return Res2;
  222|  2.38M|  }
_ZN4llvh4castIN6hermes17StorePropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.32k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.32k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.32k|  return cast_convert_val<X, Y*,
  257|  1.32k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.32k|}
_ZN4llvh3isaIN6hermes17StorePropertyInstEPNS1_5ValueEEEbRKT0_:
  142|  1.32k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.32k|  return isa_impl_wrap<X, const Y,
  144|  1.32k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.32k|}
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  1.32k|  static bool doit(const From &Val) {
  123|  1.32k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.32k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.32k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.32k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  1.32k|  static bool doit(const FromTy &Val) {
  133|  1.32k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.32k|  }
_ZN4llvh11isa_impl_clIN6hermes17StorePropertyInstEPKNS1_5ValueEE4doitES5_:
  105|  1.32k|  static inline bool doit(const From *Val) {
  106|  1.32k|    assert(Val && "isa<> used on a null pointer");
  107|  1.32k|    return isa_impl<To, From>::doit(*Val);
  108|  1.32k|  }
_ZN4llvh8isa_implIN6hermes17StorePropertyInstENS1_5ValueEvE4doitERKS3_:
   58|  1.32k|  static inline bool doit(const From &Val) {
   59|  1.32k|    return To::classof(&Val);
   60|  1.32k|  }
_ZN4llvh16cast_convert_valIN6hermes17StorePropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  1.32k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.32k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.32k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.32k|    return Res2;
  222|  1.32k|  }
_ZN4llvh4castIN6hermes20StoreOwnPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   826k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   826k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   826k|  return cast_convert_val<X, Y*,
  257|   826k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   826k|}
_ZN4llvh3isaIN6hermes20StoreOwnPropertyInstEPNS1_5ValueEEEbRKT0_:
  142|   826k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   826k|  return isa_impl_wrap<X, const Y,
  144|   826k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   826k|}
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   826k|  static bool doit(const From &Val) {
  123|   826k|    return isa_impl_wrap<To, SimpleFrom,
  124|   826k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   826k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   826k|  }
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   826k|  static bool doit(const FromTy &Val) {
  133|   826k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   826k|  }
_ZN4llvh11isa_impl_clIN6hermes20StoreOwnPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|   826k|  static inline bool doit(const From *Val) {
  106|   826k|    assert(Val && "isa<> used on a null pointer");
  107|   826k|    return isa_impl<To, From>::doit(*Val);
  108|   826k|  }
_ZN4llvh8isa_implIN6hermes20StoreOwnPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|   826k|  static inline bool doit(const From &Val) {
   59|   826k|    return To::classof(&Val);
   60|   826k|  }
_ZN4llvh16cast_convert_valIN6hermes20StoreOwnPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   826k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   826k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   826k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   826k|    return Res2;
  222|   826k|  }
_ZN4llvh4castIN6hermes23StoreNewOwnPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      1|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      1|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      1|  return cast_convert_val<X, Y*,
  257|      1|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      1|}
_ZN4llvh3isaIN6hermes23StoreNewOwnPropertyInstEPNS1_5ValueEEEbRKT0_:
  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_wrapIN6hermes23StoreNewOwnPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  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|  }
_ZN4llvh13isa_impl_wrapIN6hermes23StoreNewOwnPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      1|  static bool doit(const FromTy &Val) {
  133|      1|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      1|  }
_ZN4llvh11isa_impl_clIN6hermes23StoreNewOwnPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|      1|  static inline bool doit(const From *Val) {
  106|      1|    assert(Val && "isa<> used on a null pointer");
  107|      1|    return isa_impl<To, From>::doit(*Val);
  108|      1|  }
_ZN4llvh8isa_implIN6hermes23StoreNewOwnPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|      1|  static inline bool doit(const From &Val) {
   59|      1|    return To::classof(&Val);
   60|      1|  }
_ZN4llvh16cast_convert_valIN6hermes23StoreNewOwnPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      1|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      1|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      1|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      1|    return Res2;
  222|      1|  }
_ZN4llvh4castIN6hermes25TryLoadGlobalPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   501k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   501k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   501k|  return cast_convert_val<X, Y*,
  257|   501k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   501k|}
_ZN4llvh3isaIN6hermes25TryLoadGlobalPropertyInstEPNS1_5ValueEEEbRKT0_:
  142|   501k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   501k|  return isa_impl_wrap<X, const Y,
  144|   501k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   501k|}
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   501k|  static bool doit(const From &Val) {
  123|   501k|    return isa_impl_wrap<To, SimpleFrom,
  124|   501k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   501k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   501k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   501k|  static bool doit(const FromTy &Val) {
  133|   501k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   501k|  }
_ZN4llvh11isa_impl_clIN6hermes25TryLoadGlobalPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|   501k|  static inline bool doit(const From *Val) {
  106|   501k|    assert(Val && "isa<> used on a null pointer");
  107|   501k|    return isa_impl<To, From>::doit(*Val);
  108|   501k|  }
_ZN4llvh8isa_implIN6hermes25TryLoadGlobalPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|   501k|  static inline bool doit(const From &Val) {
   59|   501k|    return To::classof(&Val);
   60|   501k|  }
_ZN4llvh16cast_convert_valIN6hermes25TryLoadGlobalPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   501k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   501k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   501k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   501k|    return Res2;
  222|   501k|  }
_ZN4llvh4castIN6hermes13LoadFrameInstENS1_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|      4|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes13LoadFrameInstEPNS1_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_wrapIN6hermes13LoadFrameInstEKPNS1_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_wrapIN6hermes13LoadFrameInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadFrameInstEPKNS1_5ValueEE4doitES5_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      4|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes13LoadFrameInstENS1_5ValueEvE4doitERKS3_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadFrameInstEPNS1_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|  }
_ZN4llvh4castIN6hermes14StoreStackInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   576k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   576k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   576k|  return cast_convert_val<X, Y*,
  257|   576k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   576k|}
_ZN4llvh3isaIN6hermes14StoreStackInstEPNS1_5ValueEEEbRKT0_:
  142|   576k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   576k|  return isa_impl_wrap<X, const Y,
  144|   576k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   576k|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   576k|  static bool doit(const From &Val) {
  123|   576k|    return isa_impl_wrap<To, SimpleFrom,
  124|   576k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   576k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   576k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   576k|  static bool doit(const FromTy &Val) {
  133|   576k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   576k|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreStackInstEPKNS1_5ValueEE4doitES5_:
  105|   576k|  static inline bool doit(const From *Val) {
  106|   576k|    assert(Val && "isa<> used on a null pointer");
  107|   576k|    return isa_impl<To, From>::doit(*Val);
  108|   576k|  }
_ZN4llvh8isa_implIN6hermes14StoreStackInstENS1_5ValueEvE4doitERKS3_:
   58|   576k|  static inline bool doit(const From &Val) {
   59|   576k|    return To::classof(&Val);
   60|   576k|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreStackInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   576k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   576k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   576k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   576k|    return Res2;
  222|   576k|  }
_ZN4llvh4castIN6hermes14StoreFrameInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   104k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   104k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   104k|  return cast_convert_val<X, Y*,
  257|   104k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   104k|}
_ZN4llvh3isaIN6hermes14StoreFrameInstEPNS1_5ValueEEEbRKT0_:
  142|   104k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   104k|  return isa_impl_wrap<X, const Y,
  144|   104k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   104k|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   104k|  static bool doit(const From &Val) {
  123|   104k|    return isa_impl_wrap<To, SimpleFrom,
  124|   104k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   104k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   104k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   104k|  static bool doit(const FromTy &Val) {
  133|   104k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   104k|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreFrameInstEPKNS1_5ValueEE4doitES5_:
  105|   104k|  static inline bool doit(const From *Val) {
  106|   104k|    assert(Val && "isa<> used on a null pointer");
  107|   104k|    return isa_impl<To, From>::doit(*Val);
  108|   104k|  }
_ZN4llvh8isa_implIN6hermes14StoreFrameInstENS1_5ValueEvE4doitERKS3_:
   58|   104k|  static inline bool doit(const From &Val) {
   59|   104k|    return To::classof(&Val);
   60|   104k|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreFrameInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   104k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   104k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   104k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   104k|    return Res2;
  222|   104k|  }
_ZN4llvh4castIN6hermes14AllocArrayInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    101|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    101|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    101|  return cast_convert_val<X, Y*,
  257|    101|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    101|}
_ZN4llvh3isaIN6hermes14AllocArrayInstEPNS1_5ValueEEEbRKT0_:
  142|    101|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    101|  return isa_impl_wrap<X, const Y,
  144|    101|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    101|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    101|  static bool doit(const From &Val) {
  123|    101|    return isa_impl_wrap<To, SimpleFrom,
  124|    101|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    101|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    101|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    101|  static bool doit(const FromTy &Val) {
  133|    101|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    101|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocArrayInstEPKNS1_5ValueEE4doitES5_:
  105|    101|  static inline bool doit(const From *Val) {
  106|    101|    assert(Val && "isa<> used on a null pointer");
  107|    101|    return isa_impl<To, From>::doit(*Val);
  108|    101|  }
_ZN4llvh8isa_implIN6hermes14AllocArrayInstENS1_5ValueEvE4doitERKS3_:
   58|    101|  static inline bool doit(const From &Val) {
   59|    101|    return To::classof(&Val);
   60|    101|  }
_ZN4llvh16cast_convert_valIN6hermes14AllocArrayInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    101|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    101|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    101|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    101|    return Res2;
  222|    101|  }
_ZN4llvh4castIN6hermes19CreateArgumentsInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes19CreateArgumentsInstEPNS1_5ValueEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes19CreateArgumentsInstEPKNS1_5ValueEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes19CreateArgumentsInstENS1_5ValueEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes19CreateArgumentsInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes16CreateRegExpInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    119|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    119|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    119|  return cast_convert_val<X, Y*,
  257|    119|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    119|}
_ZN4llvh3isaIN6hermes16CreateRegExpInstEPNS1_5ValueEEEbRKT0_:
  142|    119|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    119|  return isa_impl_wrap<X, const Y,
  144|    119|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    119|}
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    119|  static bool doit(const From &Val) {
  123|    119|    return isa_impl_wrap<To, SimpleFrom,
  124|    119|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    119|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    119|  }
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    119|  static bool doit(const FromTy &Val) {
  133|    119|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    119|  }
_ZN4llvh11isa_impl_clIN6hermes16CreateRegExpInstEPKNS1_5ValueEE4doitES5_:
  105|    119|  static inline bool doit(const From *Val) {
  106|    119|    assert(Val && "isa<> used on a null pointer");
  107|    119|    return isa_impl<To, From>::doit(*Val);
  108|    119|  }
_ZN4llvh8isa_implIN6hermes16CreateRegExpInstENS1_5ValueEvE4doitERKS3_:
   58|    119|  static inline bool doit(const From &Val) {
   59|    119|    return To::classof(&Val);
   60|    119|  }
_ZN4llvh16cast_convert_valIN6hermes16CreateRegExpInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    119|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    119|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    119|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    119|    return Res2;
  222|    119|  }
_ZN4llvh4castIN6hermes10TryEndInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  40.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  40.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  40.6k|  return cast_convert_val<X, Y*,
  257|  40.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  40.6k|}
_ZN4llvh3isaIN6hermes10TryEndInstEPNS1_5ValueEEEbRKT0_:
  142|  40.6k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  40.6k|  return isa_impl_wrap<X, const Y,
  144|  40.6k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  40.6k|}
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  40.6k|  static bool doit(const From &Val) {
  123|  40.6k|    return isa_impl_wrap<To, SimpleFrom,
  124|  40.6k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  40.6k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  40.6k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  40.6k|  static bool doit(const FromTy &Val) {
  133|  40.6k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  40.6k|  }
_ZN4llvh11isa_impl_clIN6hermes10TryEndInstEPKNS1_5ValueEE4doitES5_:
  105|  40.6k|  static inline bool doit(const From *Val) {
  106|  40.6k|    assert(Val && "isa<> used on a null pointer");
  107|  40.6k|    return isa_impl<To, From>::doit(*Val);
  108|  40.6k|  }
_ZN4llvh8isa_implIN6hermes10TryEndInstENS1_5ValueEvE4doitERKS3_:
   58|  40.6k|  static inline bool doit(const From &Val) {
   59|  40.6k|    return To::classof(&Val);
   60|  40.6k|  }
_ZN4llvh16cast_convert_valIN6hermes10TryEndInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  40.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  40.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  40.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  40.6k|    return Res2;
  222|  40.6k|  }
_ZN4llvh4castIN6hermes16GetNewTargetInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      9|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      9|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      9|  return cast_convert_val<X, Y*,
  257|      9|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      9|}
_ZN4llvh3isaIN6hermes16GetNewTargetInstEPNS1_5ValueEEEbRKT0_:
  142|      9|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      9|  return isa_impl_wrap<X, const Y,
  144|      9|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      9|}
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      9|  static bool doit(const From &Val) {
  123|      9|    return isa_impl_wrap<To, SimpleFrom,
  124|      9|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      9|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      9|  }
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      9|  static bool doit(const FromTy &Val) {
  133|      9|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      9|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNewTargetInstEPKNS1_5ValueEE4doitES5_:
  105|      9|  static inline bool doit(const From *Val) {
  106|      9|    assert(Val && "isa<> used on a null pointer");
  107|      9|    return isa_impl<To, From>::doit(*Val);
  108|      9|  }
_ZN4llvh8isa_implIN6hermes16GetNewTargetInstENS1_5ValueEvE4doitERKS3_:
   58|      9|  static inline bool doit(const From &Val) {
   59|      9|    return To::classof(&Val);
   60|      9|  }
_ZN4llvh16cast_convert_valIN6hermes16GetNewTargetInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      9|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      9|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      9|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      9|    return Res2;
  222|      9|  }
_ZN4llvh4castIN6hermes17IteratorBeginInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  22.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  22.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  22.3k|  return cast_convert_val<X, Y*,
  257|  22.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  22.3k|}
_ZN4llvh3isaIN6hermes17IteratorBeginInstEPNS1_5ValueEEEbRKT0_:
  142|  22.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  22.3k|  return isa_impl_wrap<X, const Y,
  144|  22.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  22.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  22.3k|  static bool doit(const From &Val) {
  123|  22.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  22.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  22.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  22.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  22.3k|  static bool doit(const FromTy &Val) {
  133|  22.3k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  22.3k|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorBeginInstEPKNS1_5ValueEE4doitES5_:
  105|  22.3k|  static inline bool doit(const From *Val) {
  106|  22.3k|    assert(Val && "isa<> used on a null pointer");
  107|  22.3k|    return isa_impl<To, From>::doit(*Val);
  108|  22.3k|  }
_ZN4llvh8isa_implIN6hermes17IteratorBeginInstENS1_5ValueEvE4doitERKS3_:
   58|  22.3k|  static inline bool doit(const From &Val) {
   59|  22.3k|    return To::classof(&Val);
   60|  22.3k|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorBeginInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  22.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  22.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  22.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  22.3k|    return Res2;
  222|  22.3k|  }
_ZN4llvh4castIN6hermes16IteratorNextInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  20.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  20.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  20.3k|  return cast_convert_val<X, Y*,
  257|  20.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  20.3k|}
_ZN4llvh3isaIN6hermes16IteratorNextInstEPNS1_5ValueEEEbRKT0_:
  142|  20.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  20.3k|  return isa_impl_wrap<X, const Y,
  144|  20.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  20.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  20.3k|  static bool doit(const From &Val) {
  123|  20.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  20.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  20.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  20.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  20.3k|  static bool doit(const FromTy &Val) {
  133|  20.3k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  20.3k|  }
_ZN4llvh11isa_impl_clIN6hermes16IteratorNextInstEPKNS1_5ValueEE4doitES5_:
  105|  20.3k|  static inline bool doit(const From *Val) {
  106|  20.3k|    assert(Val && "isa<> used on a null pointer");
  107|  20.3k|    return isa_impl<To, From>::doit(*Val);
  108|  20.3k|  }
_ZN4llvh8isa_implIN6hermes16IteratorNextInstENS1_5ValueEvE4doitERKS3_:
   58|  20.3k|  static inline bool doit(const From &Val) {
   59|  20.3k|    return To::classof(&Val);
   60|  20.3k|  }
_ZN4llvh16cast_convert_valIN6hermes16IteratorNextInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  20.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  20.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  20.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  20.3k|    return Res2;
  222|  20.3k|  }
_ZN4llvh4castIN6hermes17IteratorCloseInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  42.7k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  42.7k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  42.7k|  return cast_convert_val<X, Y*,
  257|  42.7k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  42.7k|}
_ZN4llvh3isaIN6hermes17IteratorCloseInstEPNS1_5ValueEEEbRKT0_:
  142|  42.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  42.7k|  return isa_impl_wrap<X, const Y,
  144|  42.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  42.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  42.7k|  static bool doit(const From &Val) {
  123|  42.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  42.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  42.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  42.7k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  42.7k|  static bool doit(const FromTy &Val) {
  133|  42.7k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  42.7k|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorCloseInstEPKNS1_5ValueEE4doitES5_:
  105|  42.7k|  static inline bool doit(const From *Val) {
  106|  42.7k|    assert(Val && "isa<> used on a null pointer");
  107|  42.7k|    return isa_impl<To, From>::doit(*Val);
  108|  42.7k|  }
_ZN4llvh8isa_implIN6hermes17IteratorCloseInstENS1_5ValueEvE4doitERKS3_:
   58|  42.7k|  static inline bool doit(const From &Val) {
   59|  42.7k|    return To::classof(&Val);
   60|  42.7k|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorCloseInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  42.7k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  42.7k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  42.7k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  42.7k|    return Res2;
  222|  42.7k|  }
_ZN4llvh4castIN6hermes25HBCStoreToEnvironmentInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   104k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   104k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   104k|  return cast_convert_val<X, Y*,
  257|   104k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   104k|}
_ZN4llvh3isaIN6hermes25HBCStoreToEnvironmentInstEPNS1_5ValueEEEbRKT0_:
  142|   104k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   104k|  return isa_impl_wrap<X, const Y,
  144|   104k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   104k|}
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   104k|  static bool doit(const From &Val) {
  123|   104k|    return isa_impl_wrap<To, SimpleFrom,
  124|   104k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   104k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   104k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   104k|  static bool doit(const FromTy &Val) {
  133|   104k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   104k|  }
_ZN4llvh11isa_impl_clIN6hermes25HBCStoreToEnvironmentInstEPKNS1_5ValueEE4doitES5_:
  105|   104k|  static inline bool doit(const From *Val) {
  106|   104k|    assert(Val && "isa<> used on a null pointer");
  107|   104k|    return isa_impl<To, From>::doit(*Val);
  108|   104k|  }
_ZN4llvh8isa_implIN6hermes25HBCStoreToEnvironmentInstENS1_5ValueEvE4doitERKS3_:
   58|   104k|  static inline bool doit(const From &Val) {
   59|   104k|    return To::classof(&Val);
   60|   104k|  }
_ZN4llvh16cast_convert_valIN6hermes25HBCStoreToEnvironmentInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   104k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   104k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   104k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   104k|    return Res2;
  222|   104k|  }
_ZN4llvh4castIN6hermes26HBCLoadFromEnvironmentInstENS1_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|      4|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes26HBCLoadFromEnvironmentInstEPNS1_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_wrapIN6hermes26HBCLoadFromEnvironmentInstEKPNS1_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_wrapIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_5ValueEE4doitES5_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      4|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes26HBCLoadFromEnvironmentInstENS1_5ValueEvE4doitERKS3_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh16cast_convert_valIN6hermes26HBCLoadFromEnvironmentInstEPNS1_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|  }
_ZN4llvh4castIN6hermes18CreateFunctionInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes18CreateFunctionInstEPNS1_5ValueEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes18CreateFunctionInstEPKNS1_5ValueEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes18CreateFunctionInstENS1_5ValueEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes18CreateFunctionInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes21HBCCreateFunctionInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   103k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   103k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   103k|  return cast_convert_val<X, Y*,
  257|   103k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   103k|}
_ZN4llvh3isaIN6hermes21HBCCreateFunctionInstEPNS1_5ValueEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   103k|  static bool doit(const From &Val) {
  123|   103k|    return isa_impl_wrap<To, SimpleFrom,
  124|   103k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   103k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   103k|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCCreateFunctionInstEPKNS1_5ValueEE4doitES5_:
  105|   103k|  static inline bool doit(const From *Val) {
  106|   103k|    assert(Val && "isa<> used on a null pointer");
  107|   103k|    return isa_impl<To, From>::doit(*Val);
  108|   103k|  }
_ZN4llvh8isa_implIN6hermes21HBCCreateFunctionInstENS1_5ValueEvE4doitERKS3_:
   58|   103k|  static inline bool doit(const From &Val) {
   59|   103k|    return To::classof(&Val);
   60|   103k|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCCreateFunctionInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   103k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   103k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   103k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   103k|    return Res2;
  222|   103k|  }
_ZN4llvh4castIN6hermes10BranchInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   484k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   484k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   484k|  return cast_convert_val<X, Y*,
  257|   484k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   484k|}
_ZN4llvh3isaIN6hermes10BranchInstEPNS1_5ValueEEEbRKT0_:
  142|   484k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   484k|  return isa_impl_wrap<X, const Y,
  144|   484k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   484k|}
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   484k|  static bool doit(const From &Val) {
  123|   484k|    return isa_impl_wrap<To, SimpleFrom,
  124|   484k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   484k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   484k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   484k|  static bool doit(const FromTy &Val) {
  133|   484k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   484k|  }
_ZN4llvh11isa_impl_clIN6hermes10BranchInstEPKNS1_5ValueEE4doitES5_:
  105|   484k|  static inline bool doit(const From *Val) {
  106|   484k|    assert(Val && "isa<> used on a null pointer");
  107|   484k|    return isa_impl<To, From>::doit(*Val);
  108|   484k|  }
_ZN4llvh8isa_implIN6hermes10BranchInstENS1_5ValueEvE4doitERKS3_:
   58|   484k|  static inline bool doit(const From &Val) {
   59|   484k|    return To::classof(&Val);
   60|   484k|  }
_ZN4llvh16cast_convert_valIN6hermes10BranchInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   484k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   484k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   484k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   484k|    return Res2;
  222|   484k|  }
_ZN4llvh4castIN6hermes10ReturnInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   206k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   206k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   206k|  return cast_convert_val<X, Y*,
  257|   206k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   206k|}
_ZN4llvh3isaIN6hermes10ReturnInstEPNS1_5ValueEEEbRKT0_:
  142|   206k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   206k|  return isa_impl_wrap<X, const Y,
  144|   206k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   206k|}
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   206k|  static bool doit(const From &Val) {
  123|   206k|    return isa_impl_wrap<To, SimpleFrom,
  124|   206k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   206k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   206k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   206k|  static bool doit(const FromTy &Val) {
  133|   206k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   206k|  }
_ZN4llvh11isa_impl_clIN6hermes10ReturnInstEPKNS1_5ValueEE4doitES5_:
  105|   206k|  static inline bool doit(const From *Val) {
  106|   206k|    assert(Val && "isa<> used on a null pointer");
  107|   206k|    return isa_impl<To, From>::doit(*Val);
  108|   206k|  }
_ZN4llvh8isa_implIN6hermes10ReturnInstENS1_5ValueEvE4doitERKS3_:
   58|   206k|  static inline bool doit(const From &Val) {
   59|   206k|    return To::classof(&Val);
   60|   206k|  }
_ZN4llvh16cast_convert_valIN6hermes10ReturnInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   206k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   206k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   206k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   206k|    return Res2;
  222|   206k|  }
_ZN4llvh4castIN6hermes9ThrowInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  20.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  20.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  20.3k|  return cast_convert_val<X, Y*,
  257|  20.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  20.3k|}
_ZN4llvh3isaIN6hermes9ThrowInstEPNS1_5ValueEEEbRKT0_:
  142|  20.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  20.3k|  return isa_impl_wrap<X, const Y,
  144|  20.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  20.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  20.3k|  static bool doit(const From &Val) {
  123|  20.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  20.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  20.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  20.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  20.3k|  static bool doit(const FromTy &Val) {
  133|  20.3k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  20.3k|  }
_ZN4llvh11isa_impl_clIN6hermes9ThrowInstEPKNS1_5ValueEE4doitES5_:
  105|  20.3k|  static inline bool doit(const From *Val) {
  106|  20.3k|    assert(Val && "isa<> used on a null pointer");
  107|  20.3k|    return isa_impl<To, From>::doit(*Val);
  108|  20.3k|  }
_ZN4llvh8isa_implIN6hermes9ThrowInstENS1_5ValueEvE4doitERKS3_:
   58|  20.3k|  static inline bool doit(const From &Val) {
   59|  20.3k|    return To::classof(&Val);
   60|  20.3k|  }
_ZN4llvh16cast_convert_valIN6hermes9ThrowInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  20.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  20.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  20.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  20.3k|    return Res2;
  222|  20.3k|  }
_ZN4llvh4castIN6hermes14CondBranchInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  91.9k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  91.9k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  91.9k|  return cast_convert_val<X, Y*,
  257|  91.9k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  91.9k|}
_ZN4llvh3isaIN6hermes14CondBranchInstEPNS1_5ValueEEEbRKT0_:
  142|  91.9k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  91.9k|  return isa_impl_wrap<X, const Y,
  144|  91.9k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  91.9k|}
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  91.9k|  static bool doit(const From &Val) {
  123|  91.9k|    return isa_impl_wrap<To, SimpleFrom,
  124|  91.9k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  91.9k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  91.9k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  91.9k|  static bool doit(const FromTy &Val) {
  133|  91.9k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  91.9k|  }
_ZN4llvh11isa_impl_clIN6hermes14CondBranchInstEPKNS1_5ValueEE4doitES5_:
  105|  91.9k|  static inline bool doit(const From *Val) {
  106|  91.9k|    assert(Val && "isa<> used on a null pointer");
  107|  91.9k|    return isa_impl<To, From>::doit(*Val);
  108|  91.9k|  }
_ZN4llvh8isa_implIN6hermes14CondBranchInstENS1_5ValueEvE4doitERKS3_:
   58|  91.9k|  static inline bool doit(const From &Val) {
   59|  91.9k|    return To::classof(&Val);
   60|  91.9k|  }
_ZN4llvh16cast_convert_valIN6hermes14CondBranchInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  91.9k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  91.9k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  91.9k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  91.9k|    return Res2;
  222|  91.9k|  }
_ZN4llvh4castIN6hermes13GetPNamesInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  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|     15|  return cast_convert_val<X, Y*,
  257|     15|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     15|}
_ZN4llvh3isaIN6hermes13GetPNamesInstEPNS1_5ValueEEEbRKT0_:
  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_wrapIN6hermes13GetPNamesInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  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_wrapIN6hermes13GetPNamesInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     15|  static bool doit(const FromTy &Val) {
  133|     15|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     15|  }
_ZN4llvh11isa_impl_clIN6hermes13GetPNamesInstEPKNS1_5ValueEE4doitES5_:
  105|     15|  static inline bool doit(const From *Val) {
  106|     15|    assert(Val && "isa<> used on a null pointer");
  107|     15|    return isa_impl<To, From>::doit(*Val);
  108|     15|  }
_ZN4llvh8isa_implIN6hermes13GetPNamesInstENS1_5ValueEvE4doitERKS3_:
   58|     15|  static inline bool doit(const From &Val) {
   59|     15|    return To::classof(&Val);
   60|     15|  }
_ZN4llvh16cast_convert_valIN6hermes13GetPNamesInstEPNS1_5ValueES4_E4doitERKS4_:
  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|  }
_ZN4llvh4castIN6hermes16GetNextPNameInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  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|     15|  return cast_convert_val<X, Y*,
  257|     15|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     15|}
_ZN4llvh3isaIN6hermes16GetNextPNameInstEPNS1_5ValueEEEbRKT0_:
  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_wrapIN6hermes16GetNextPNameInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  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_wrapIN6hermes16GetNextPNameInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     15|  static bool doit(const FromTy &Val) {
  133|     15|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     15|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNextPNameInstEPKNS1_5ValueEE4doitES5_:
  105|     15|  static inline bool doit(const From *Val) {
  106|     15|    assert(Val && "isa<> used on a null pointer");
  107|     15|    return isa_impl<To, From>::doit(*Val);
  108|     15|  }
_ZN4llvh8isa_implIN6hermes16GetNextPNameInstENS1_5ValueEvE4doitERKS3_:
   58|     15|  static inline bool doit(const From &Val) {
   59|     15|    return To::classof(&Val);
   60|     15|  }
_ZN4llvh16cast_convert_valIN6hermes16GetNextPNameInstEPNS1_5ValueES4_E4doitERKS4_:
  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|  }
_ZN4llvh4castIN6hermes12TryStartInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  40.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  40.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  40.6k|  return cast_convert_val<X, Y*,
  257|  40.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  40.6k|}
_ZN4llvh3isaIN6hermes12TryStartInstEPNS1_5ValueEEEbRKT0_:
  142|  40.6k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  40.6k|  return isa_impl_wrap<X, const Y,
  144|  40.6k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  40.6k|}
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  40.6k|  static bool doit(const From &Val) {
  123|  40.6k|    return isa_impl_wrap<To, SimpleFrom,
  124|  40.6k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  40.6k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  40.6k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  40.6k|  static bool doit(const FromTy &Val) {
  133|  40.6k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  40.6k|  }
_ZN4llvh11isa_impl_clIN6hermes12TryStartInstEPKNS1_5ValueEE4doitES5_:
  105|  40.6k|  static inline bool doit(const From *Val) {
  106|  40.6k|    assert(Val && "isa<> used on a null pointer");
  107|  40.6k|    return isa_impl<To, From>::doit(*Val);
  108|  40.6k|  }
_ZN4llvh8isa_implIN6hermes12TryStartInstENS1_5ValueEvE4doitERKS3_:
   58|  40.6k|  static inline bool doit(const From &Val) {
   59|  40.6k|    return To::classof(&Val);
   60|  40.6k|  }
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  40.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  40.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  40.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  40.6k|    return Res2;
  222|  40.6k|  }
_ZN4llvh4castIN6hermes8CallInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.84k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.84k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.84k|  return cast_convert_val<X, Y*,
  257|  2.84k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.84k|}
_ZN4llvh3isaIN6hermes8CallInstEPNS1_5ValueEEEbRKT0_:
  142|  2.84k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.84k|  return isa_impl_wrap<X, const Y,
  144|  2.84k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.84k|}
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  2.84k|  static bool doit(const From &Val) {
  123|  2.84k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.84k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.84k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.84k|  }
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  2.84k|  static bool doit(const FromTy &Val) {
  133|  2.84k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.84k|  }
_ZN4llvh11isa_impl_clIN6hermes8CallInstEPKNS1_5ValueEE4doitES5_:
  105|  2.84k|  static inline bool doit(const From *Val) {
  106|  2.84k|    assert(Val && "isa<> used on a null pointer");
  107|  2.84k|    return isa_impl<To, From>::doit(*Val);
  108|  2.84k|  }
_ZN4llvh8isa_implIN6hermes8CallInstENS1_5ValueEvE4doitERKS3_:
   58|  2.84k|  static inline bool doit(const From &Val) {
   59|  2.84k|    return To::classof(&Val);
   60|  2.84k|  }
_ZN4llvh16cast_convert_valIN6hermes8CallInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  2.84k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.84k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.84k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.84k|    return Res2;
  222|  2.84k|  }
_ZN4llvh4castIN6hermes13ConstructInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes13ConstructInstEPNS1_5ValueEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes13ConstructInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13ConstructInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes13ConstructInstEPKNS1_5ValueEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes13ConstructInstENS1_5ValueEvE4doitERKS3_:
   58|  25.0k|  static inline bool doit(const From &Val) {
   59|  25.0k|    return To::classof(&Val);
   60|  25.0k|  }
_ZN4llvh16cast_convert_valIN6hermes13ConstructInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh4castIN6hermes15CallBuiltinInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.82k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.82k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  2.82k|  return cast_convert_val<X, Y*,
  257|  2.82k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.82k|}
_ZN4llvh3isaIN6hermes15CallBuiltinInstEPNS1_5ValueEEEbRKT0_:
  142|  2.82k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.82k|  return isa_impl_wrap<X, const Y,
  144|  2.82k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.82k|}
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  2.82k|  static bool doit(const From &Val) {
  123|  2.82k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.82k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.82k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.82k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  2.82k|  static bool doit(const FromTy &Val) {
  133|  2.82k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.82k|  }
_ZN4llvh11isa_impl_clIN6hermes15CallBuiltinInstEPKNS1_5ValueEE4doitES5_:
  105|  2.82k|  static inline bool doit(const From *Val) {
  106|  2.82k|    assert(Val && "isa<> used on a null pointer");
  107|  2.82k|    return isa_impl<To, From>::doit(*Val);
  108|  2.82k|  }
_ZN4llvh8isa_implIN6hermes15CallBuiltinInstENS1_5ValueEvE4doitERKS3_:
   58|  2.82k|  static inline bool doit(const From &Val) {
   59|  2.82k|    return To::classof(&Val);
   60|  2.82k|  }
_ZN4llvh16cast_convert_valIN6hermes15CallBuiltinInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  2.82k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.82k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.82k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.82k|    return Res2;
  222|  2.82k|  }
_ZN4llvh4castIN6hermes16HBCConstructInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes16HBCConstructInstEPNS1_5ValueEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCConstructInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCConstructInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCConstructInstEPKNS1_5ValueEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes16HBCConstructInstENS1_5ValueEvE4doitERKS3_:
   58|  25.0k|  static inline bool doit(const From &Val) {
   59|  25.0k|    return To::classof(&Val);
   60|  25.0k|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCConstructInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh4castIN6hermes22HBCGetGlobalObjectInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   503k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   503k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   503k|  return cast_convert_val<X, Y*,
  257|   503k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   503k|}
_ZN4llvh16cast_convert_valIN6hermes22HBCGetGlobalObjectInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   503k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   503k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   503k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   503k|    return Res2;
  222|   503k|  }
_ZN4llvh4castIN6hermes16HBCGetThisNSInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      9|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      9|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      9|  return cast_convert_val<X, Y*,
  257|      9|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      9|}
_ZN4llvh3isaIN6hermes16HBCGetThisNSInstEPNS1_5ValueEEEbRKT0_:
  142|      9|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      9|  return isa_impl_wrap<X, const Y,
  144|      9|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      9|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      9|  static bool doit(const From &Val) {
  123|      9|    return isa_impl_wrap<To, SimpleFrom,
  124|      9|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      9|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      9|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      9|  static bool doit(const FromTy &Val) {
  133|      9|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      9|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCGetThisNSInstEPKNS1_5ValueEE4doitES5_:
  105|      9|  static inline bool doit(const From *Val) {
  106|      9|    assert(Val && "isa<> used on a null pointer");
  107|      9|    return isa_impl<To, From>::doit(*Val);
  108|      9|  }
_ZN4llvh8isa_implIN6hermes16HBCGetThisNSInstENS1_5ValueEvE4doitERKS3_:
   58|      9|  static inline bool doit(const From &Val) {
   59|      9|    return To::classof(&Val);
   60|      9|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCGetThisNSInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      9|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      9|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      9|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      9|    return Res2;
  222|      9|  }
_ZN4llvh4castIN6hermes17HBCCreateThisInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes17HBCCreateThisInstEPNS1_5ValueEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes17HBCCreateThisInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17HBCCreateThisInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes17HBCCreateThisInstEPKNS1_5ValueEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes17HBCCreateThisInstENS1_5ValueEvE4doitERKS3_:
   58|  25.0k|  static inline bool doit(const From &Val) {
   59|  25.0k|    return To::classof(&Val);
   60|  25.0k|  }
_ZN4llvh16cast_convert_valIN6hermes17HBCCreateThisInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh4castIN6hermes27HBCGetConstructedObjectInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  25.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  25.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  25.0k|  return cast_convert_val<X, Y*,
  257|  25.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  25.0k|}
_ZN4llvh3isaIN6hermes27HBCGetConstructedObjectInstEPNS1_5ValueEEEbRKT0_:
  142|  25.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  25.0k|  return isa_impl_wrap<X, const Y,
  144|  25.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  25.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes27HBCGetConstructedObjectInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  25.0k|  static bool doit(const From &Val) {
  123|  25.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  25.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  25.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  25.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes27HBCGetConstructedObjectInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  25.0k|  static bool doit(const FromTy &Val) {
  133|  25.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  25.0k|  }
_ZN4llvh11isa_impl_clIN6hermes27HBCGetConstructedObjectInstEPKNS1_5ValueEE4doitES5_:
  105|  25.0k|  static inline bool doit(const From *Val) {
  106|  25.0k|    assert(Val && "isa<> used on a null pointer");
  107|  25.0k|    return isa_impl<To, From>::doit(*Val);
  108|  25.0k|  }
_ZN4llvh8isa_implIN6hermes27HBCGetConstructedObjectInstENS1_5ValueEvE4doitERKS3_:
   58|  25.0k|  static inline bool doit(const From &Val) {
   59|  25.0k|    return To::classof(&Val);
   60|  25.0k|  }
_ZN4llvh16cast_convert_valIN6hermes27HBCGetConstructedObjectInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  25.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  25.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  25.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  25.0k|    return Res2;
  222|  25.0k|  }
_ZN4llvh4castIN6hermes13LiteralBigIntENS1_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|      5|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes13LiteralBigIntEPNS1_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_wrapIN6hermes13LiteralBigIntEKPNS1_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_wrapIN6hermes13LiteralBigIntEPKNS1_5ValueES5_E4doitERKS5_:
  132|      5|  static bool doit(const FromTy &Val) {
  133|      5|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      5|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralBigIntEPKNS1_5ValueEE4doitES5_:
  105|      5|  static inline bool doit(const From *Val) {
  106|      5|    assert(Val && "isa<> used on a null pointer");
  107|      5|    return isa_impl<To, From>::doit(*Val);
  108|      5|  }
_ZN4llvh8isa_implIN6hermes13LiteralBigIntENS1_5ValueEvE4doitERKS3_:
   58|      5|  static inline bool doit(const From &Val) {
   59|      5|    return To::classof(&Val);
   60|      5|  }
_ZN4llvh16cast_convert_valIN6hermes13LiteralBigIntEPNS1_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|  }
_ZN4llvh4castIN6hermes9ParameterENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   206k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   206k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   206k|  return cast_convert_val<X, Y*,
  257|   206k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   206k|}
_ZN4llvh3isaIN6hermes9ParameterEPNS1_5ValueEEEbRKT0_:
  142|   206k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   206k|  return isa_impl_wrap<X, const Y,
  144|   206k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   206k|}
_ZN4llvh13isa_impl_wrapIN6hermes9ParameterEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   206k|  static bool doit(const From &Val) {
  123|   206k|    return isa_impl_wrap<To, SimpleFrom,
  124|   206k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   206k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   206k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ParameterEPKNS1_5ValueES5_E4doitERKS5_:
  132|   206k|  static bool doit(const FromTy &Val) {
  133|   206k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   206k|  }
_ZN4llvh11isa_impl_clIN6hermes9ParameterEPKNS1_5ValueEE4doitES5_:
  105|   206k|  static inline bool doit(const From *Val) {
  106|   206k|    assert(Val && "isa<> used on a null pointer");
  107|   206k|    return isa_impl<To, From>::doit(*Val);
  108|   206k|  }
_ZN4llvh8isa_implIN6hermes9ParameterENS1_5ValueEvE4doitERKS3_:
   58|   206k|  static inline bool doit(const From &Val) {
   59|   206k|    return To::classof(&Val);
   60|   206k|  }
_ZN4llvh16cast_convert_valIN6hermes9ParameterEPNS1_5ValueES4_E4doitERKS4_:
  218|   206k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   206k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   206k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   206k|    return Res2;
  222|   206k|  }
_ZN4llvh8dyn_castIN6hermes14TerminatorInstEKNS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.48M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.48M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.48M, False: 0]
  ------------------
  335|  1.48M|}
_ZN4llvh3isaIN6hermes14TerminatorInstEPKNS1_11InstructionEEEbRKT0_:
  142|  2.96M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.96M|  return isa_impl_wrap<X, const Y,
  144|  2.96M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.96M|}
_ZN4llvh13isa_impl_wrapIN6hermes14TerminatorInstEKPKNS1_11InstructionES5_E4doitERS6_:
  122|  2.96M|  static bool doit(const From &Val) {
  123|  2.96M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.96M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.96M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.96M|  }
_ZN4llvh13simplify_typeIKPKN6hermes11InstructionEE18getSimplifiedValueERS5_:
   48|  2.96M|  static RetType getSimplifiedValue(const From& Val) {
   49|  2.96M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  2.96M|  }
_ZN4llvh13simplify_typeIPKN6hermes11InstructionEE18getSimplifiedValueERS4_:
   38|  2.96M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes14TerminatorInstEKNS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.48M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.48M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.48M|  return cast_convert_val<X, Y*,
  257|  1.48M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.48M|}
_ZN4llvh16cast_convert_valIN6hermes14TerminatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  218|  1.48M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.48M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.48M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.48M|    return Res2;
  222|  1.48M|  }
_ZN4llvh8dyn_castIN6hermes10BranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  14.0M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  14.0M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 9.09M, False: 4.90M]
  ------------------
  335|  14.0M|}
_ZN4llvh3isaIN6hermes10BranchInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  23.1M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  23.1M|  return isa_impl_wrap<X, const Y,
  144|  23.1M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  23.1M|}
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  23.1M|  static bool doit(const From &Val) {
  123|  23.1M|    return isa_impl_wrap<To, SimpleFrom,
  124|  23.1M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  23.1M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  23.1M|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  23.1M|  static bool doit(const FromTy &Val) {
  133|  23.1M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  23.1M|  }
_ZN4llvh11isa_impl_clIN6hermes10BranchInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  23.1M|  static inline bool doit(const From *Val) {
  106|  23.1M|    assert(Val && "isa<> used on a null pointer");
  107|  23.1M|    return isa_impl<To, From>::doit(*Val);
  108|  23.1M|  }
_ZN4llvh8isa_implIN6hermes10BranchInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  23.1M|  static inline bool doit(const From &Val) {
   59|  23.1M|    return To::classof(&Val);
   60|  23.1M|  }
_ZN4llvh13simplify_typeIKPKN6hermes14TerminatorInstEE18getSimplifiedValueERS5_:
   48|  50.9M|  static RetType getSimplifiedValue(const From& Val) {
   49|  50.9M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  50.9M|  }
_ZN4llvh13simplify_typeIPKN6hermes14TerminatorInstEE18getSimplifiedValueERS4_:
   38|  50.9M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes10BranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  9.09M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  9.09M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  9.09M|  return cast_convert_val<X, Y*,
  257|  9.09M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  9.09M|}
_ZN4llvh16cast_convert_valIN6hermes10BranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|  9.09M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  9.09M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  9.09M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  9.09M|    return Res2;
  222|  9.09M|  }
_ZN4llvh8dyn_castIN6hermes10ReturnInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  4.90M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.90M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 414k, False: 4.49M]
  ------------------
  335|  4.90M|}
_ZN4llvh3isaIN6hermes10ReturnInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  5.32M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.32M|  return isa_impl_wrap<X, const Y,
  144|  5.32M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.32M|}
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  5.32M|  static bool doit(const From &Val) {
  123|  5.32M|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.32M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.32M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.32M|  }
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  5.32M|  static bool doit(const FromTy &Val) {
  133|  5.32M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.32M|  }
_ZN4llvh11isa_impl_clIN6hermes10ReturnInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  5.32M|  static inline bool doit(const From *Val) {
  106|  5.32M|    assert(Val && "isa<> used on a null pointer");
  107|  5.32M|    return isa_impl<To, From>::doit(*Val);
  108|  5.32M|  }
_ZN4llvh8isa_implIN6hermes10ReturnInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  5.32M|  static inline bool doit(const From &Val) {
   59|  5.32M|    return To::classof(&Val);
   60|  5.32M|  }
_ZN4llvh4castIN6hermes10ReturnInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   414k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   414k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   414k|  return cast_convert_val<X, Y*,
  257|   414k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   414k|}
_ZN4llvh16cast_convert_valIN6hermes10ReturnInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|   414k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   414k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   414k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   414k|    return Res2;
  222|   414k|  }
_ZN4llvh8dyn_castIN6hermes9ThrowInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  4.49M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.49M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 142k, False: 4.35M]
  ------------------
  335|  4.49M|}
_ZN4llvh3isaIN6hermes9ThrowInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  4.63M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.63M|  return isa_impl_wrap<X, const Y,
  144|  4.63M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.63M|}
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  4.63M|  static bool doit(const From &Val) {
  123|  4.63M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.63M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.63M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.63M|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  4.63M|  static bool doit(const FromTy &Val) {
  133|  4.63M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.63M|  }
_ZN4llvh11isa_impl_clIN6hermes9ThrowInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  4.63M|  static inline bool doit(const From *Val) {
  106|  4.63M|    assert(Val && "isa<> used on a null pointer");
  107|  4.63M|    return isa_impl<To, From>::doit(*Val);
  108|  4.63M|  }
_ZN4llvh8isa_implIN6hermes9ThrowInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  4.63M|  static inline bool doit(const From &Val) {
   59|  4.63M|    return To::classof(&Val);
   60|  4.63M|  }
_ZN4llvh4castIN6hermes9ThrowInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|   142k|  return cast_convert_val<X, Y*,
  257|   142k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   142k|}
_ZN4llvh16cast_convert_valIN6hermes9ThrowInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  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|  }
_ZN4llvh8dyn_castIN6hermes10SwitchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  4.35M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.35M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 4.35M]
  ------------------
  335|  4.35M|}
_ZN4llvh3isaIN6hermes10SwitchInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  4.35M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.35M|  return isa_impl_wrap<X, const Y,
  144|  4.35M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.35M|}
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  4.35M|  static bool doit(const From &Val) {
  123|  4.35M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.35M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.35M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.35M|  }
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  4.35M|  static bool doit(const FromTy &Val) {
  133|  4.35M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.35M|  }
_ZN4llvh11isa_impl_clIN6hermes10SwitchInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  4.35M|  static inline bool doit(const From *Val) {
  106|  4.35M|    assert(Val && "isa<> used on a null pointer");
  107|  4.35M|    return isa_impl<To, From>::doit(*Val);
  108|  4.35M|  }
_ZN4llvh8isa_implIN6hermes10SwitchInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  4.35M|  static inline bool doit(const From &Val) {
   59|  4.35M|    return To::classof(&Val);
   60|  4.35M|  }
_ZN4llvh8dyn_castIN6hermes14CondBranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  4.35M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.35M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 3.13M, False: 1.21M]
  ------------------
  335|  4.35M|}
_ZN4llvh3isaIN6hermes14CondBranchInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  7.48M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  7.48M|  return isa_impl_wrap<X, const Y,
  144|  7.48M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  7.48M|}
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  7.48M|  static bool doit(const From &Val) {
  123|  7.48M|    return isa_impl_wrap<To, SimpleFrom,
  124|  7.48M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  7.48M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  7.48M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  7.48M|  static bool doit(const FromTy &Val) {
  133|  7.48M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  7.48M|  }
_ZN4llvh11isa_impl_clIN6hermes14CondBranchInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  7.48M|  static inline bool doit(const From *Val) {
  106|  7.48M|    assert(Val && "isa<> used on a null pointer");
  107|  7.48M|    return isa_impl<To, From>::doit(*Val);
  108|  7.48M|  }
_ZN4llvh8isa_implIN6hermes14CondBranchInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  7.48M|  static inline bool doit(const From &Val) {
   59|  7.48M|    return To::classof(&Val);
   60|  7.48M|  }
_ZN4llvh4castIN6hermes14CondBranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  3.13M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.13M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  3.13M|  return cast_convert_val<X, Y*,
  257|  3.13M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.13M|}
_ZN4llvh16cast_convert_valIN6hermes14CondBranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|  3.13M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.13M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.13M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.13M|    return Res2;
  222|  3.13M|  }
_ZN4llvh8dyn_castIN6hermes13GetPNamesInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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: 315, False: 1.21M]
  ------------------
  335|  1.21M|}
_ZN4llvh3isaIN6hermes13GetPNamesInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  1.21M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.21M|  return isa_impl_wrap<X, const Y,
  144|  1.21M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.21M|}
_ZN4llvh13isa_impl_wrapIN6hermes13GetPNamesInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  1.21M|  static bool doit(const From &Val) {
  123|  1.21M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.21M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.21M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.21M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13GetPNamesInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  1.21M|  static bool doit(const FromTy &Val) {
  133|  1.21M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.21M|  }
_ZN4llvh11isa_impl_clIN6hermes13GetPNamesInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  1.21M|  static inline bool doit(const From *Val) {
  106|  1.21M|    assert(Val && "isa<> used on a null pointer");
  107|  1.21M|    return isa_impl<To, From>::doit(*Val);
  108|  1.21M|  }
_ZN4llvh8isa_implIN6hermes13GetPNamesInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  1.21M|  static inline bool doit(const From &Val) {
   59|  1.21M|    return To::classof(&Val);
   60|  1.21M|  }
_ZN4llvh4castIN6hermes13GetPNamesInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    315|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    315|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    315|  return cast_convert_val<X, Y*,
  257|    315|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    315|}
_ZN4llvh16cast_convert_valIN6hermes13GetPNamesInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|    315|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    315|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    315|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    315|    return Res2;
  222|    315|  }
_ZN4llvh8dyn_castIN6hermes16GetNextPNameInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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: 315, False: 1.21M]
  ------------------
  335|  1.21M|}
_ZN4llvh3isaIN6hermes16GetNextPNameInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  1.21M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.21M|  return isa_impl_wrap<X, const Y,
  144|  1.21M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.21M|}
_ZN4llvh13isa_impl_wrapIN6hermes16GetNextPNameInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  1.21M|  static bool doit(const From &Val) {
  123|  1.21M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.21M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.21M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.21M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16GetNextPNameInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  1.21M|  static bool doit(const FromTy &Val) {
  133|  1.21M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.21M|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNextPNameInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  1.21M|  static inline bool doit(const From *Val) {
  106|  1.21M|    assert(Val && "isa<> used on a null pointer");
  107|  1.21M|    return isa_impl<To, From>::doit(*Val);
  108|  1.21M|  }
_ZN4llvh8isa_implIN6hermes16GetNextPNameInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  1.21M|  static inline bool doit(const From &Val) {
   59|  1.21M|    return To::classof(&Val);
   60|  1.21M|  }
_ZN4llvh4castIN6hermes16GetNextPNameInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    315|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    315|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    315|  return cast_convert_val<X, Y*,
  257|    315|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    315|}
_ZN4llvh16cast_convert_valIN6hermes16GetNextPNameInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|    315|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    315|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    315|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    315|    return Res2;
  222|    315|  }
_ZN4llvh8dyn_castIN6hermes20CheckHasInstanceInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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: 0, False: 1.21M]
  ------------------
  335|  1.21M|}
_ZN4llvh3isaIN6hermes20CheckHasInstanceInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  1.21M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.21M|  return isa_impl_wrap<X, const Y,
  144|  1.21M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.21M|}
_ZN4llvh13isa_impl_wrapIN6hermes20CheckHasInstanceInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  1.21M|  static bool doit(const From &Val) {
  123|  1.21M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.21M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.21M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.21M|  }
_ZN4llvh13isa_impl_wrapIN6hermes20CheckHasInstanceInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  1.21M|  static bool doit(const FromTy &Val) {
  133|  1.21M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.21M|  }
_ZN4llvh11isa_impl_clIN6hermes20CheckHasInstanceInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  1.21M|  static inline bool doit(const From *Val) {
  106|  1.21M|    assert(Val && "isa<> used on a null pointer");
  107|  1.21M|    return isa_impl<To, From>::doit(*Val);
  108|  1.21M|  }
_ZN4llvh8isa_implIN6hermes20CheckHasInstanceInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  1.21M|  static inline bool doit(const From &Val) {
   59|  1.21M|    return To::classof(&Val);
   60|  1.21M|  }
_ZN4llvh8dyn_castIN6hermes12TryStartInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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: 1.21M, False: 0]
  ------------------
  335|  1.21M|}
_ZN4llvh3isaIN6hermes12TryStartInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  2.43M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.43M|  return isa_impl_wrap<X, const Y,
  144|  2.43M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.43M|}
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  2.43M|  static bool doit(const From &Val) {
  123|  2.43M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.43M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.43M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.43M|  }
_ZN4llvh4castIN6hermes12TryStartInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.21M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.21M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.21M|  return cast_convert_val<X, Y*,
  257|  1.21M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.21M|}
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|  1.21M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.21M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.21M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.21M|    return Res2;
  222|  1.21M|  }
_ZN4llvh13simplify_typeIKPN6hermes4PassEE18getSimplifiedValueERS4_:
   48|   625k|  static RetType getSimplifiedValue(const From& Val) {
   49|   625k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   625k|  }
_ZN4llvh13simplify_typeIPN6hermes4PassEE18getSimplifiedValueERS3_:
   38|   625k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh8dyn_castIN6hermes12FunctionPassENS1_4PassEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   312k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   312k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 312k, False: 0]
  ------------------
  335|   312k|}
_ZN4llvh3isaIN6hermes12FunctionPassEPNS1_4PassEEEbRKT0_:
  142|   625k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   625k|  return isa_impl_wrap<X, const Y,
  144|   625k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   625k|}
_ZN4llvh13isa_impl_wrapIN6hermes12FunctionPassEKPNS1_4PassEPKS3_E4doitERS5_:
  122|   625k|  static bool doit(const From &Val) {
  123|   625k|    return isa_impl_wrap<To, SimpleFrom,
  124|   625k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   625k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   625k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12FunctionPassEPKNS1_4PassES5_E4doitERKS5_:
  132|   625k|  static bool doit(const FromTy &Val) {
  133|   625k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   625k|  }
_ZN4llvh11isa_impl_clIN6hermes12FunctionPassEPKNS1_4PassEE4doitES5_:
  105|   625k|  static inline bool doit(const From *Val) {
  106|   625k|    assert(Val && "isa<> used on a null pointer");
  107|   625k|    return isa_impl<To, From>::doit(*Val);
  108|   625k|  }
_ZN4llvh8isa_implIN6hermes12FunctionPassENS1_4PassEvE4doitERKS3_:
   58|   625k|  static inline bool doit(const From &Val) {
   59|   625k|    return To::classof(&Val);
   60|   625k|  }
_ZN4llvh4castIN6hermes12FunctionPassENS1_4PassEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   312k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   312k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   312k|  return cast_convert_val<X, Y*,
  257|   312k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   312k|}
_ZN4llvh16cast_convert_valIN6hermes12FunctionPassEPNS1_4PassES4_E4doitERKS4_:
  218|   312k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   312k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   312k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   312k|    return Res2;
  222|   312k|  }
_ZN4llvh8dyn_castIN6hermes22GeneratorInnerFunctionENS1_8FunctionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   103k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   103k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 103k]
  ------------------
  335|   103k|}
_ZN4llvh4castIN6hermes6ESTree23FunctionDeclarationNodeENS2_16FunctionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  5.44k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  5.44k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  5.44k|  return cast_convert_val<X, Y*,
  257|  5.44k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  5.44k|}
_ZN4llvh3isaIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_16FunctionLikeNodeEEEbRKT0_:
  142|  5.44k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.44k|  return isa_impl_wrap<X, const Y,
  144|  5.44k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.44k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEKPNS2_16FunctionLikeNodeEPKS4_E4doitERS6_:
  122|  5.44k|  static bool doit(const From &Val) {
  123|  5.44k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.44k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.44k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.44k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_16FunctionLikeNodeES6_E4doitERKS6_:
  132|  5.44k|  static bool doit(const FromTy &Val) {
  133|  5.44k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.44k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_16FunctionLikeNodeEE4doitES6_:
  105|  5.44k|  static inline bool doit(const From *Val) {
  106|  5.44k|    assert(Val && "isa<> used on a null pointer");
  107|  5.44k|    return isa_impl<To, From>::doit(*Val);
  108|  5.44k|  }
_ZN4llvh8isa_implIN6hermes6ESTree23FunctionDeclarationNodeENS2_16FunctionLikeNodeEvE4doitERKS4_:
   58|  5.44k|  static inline bool doit(const From &Val) {
   59|  5.44k|    return To::classof(&Val);
   60|  5.44k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_16FunctionLikeNodeES5_E4doitERKS5_:
  218|  5.44k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  5.44k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  5.44k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  5.44k|    return Res2;
  222|  5.44k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree24CoverTypedIdentifierNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|}
_ZN4llvh4castIN6hermes6ESTree22FunctionExpressionNodeENS2_16FunctionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    657|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    657|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    657|  return cast_convert_val<X, Y*,
  257|    657|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    657|}
_ZN4llvh3isaIN6hermes6ESTree22FunctionExpressionNodeEPNS2_16FunctionLikeNodeEEEbRKT0_:
  142|    657|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    657|  return isa_impl_wrap<X, const Y,
  144|    657|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    657|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22FunctionExpressionNodeEKPNS2_16FunctionLikeNodeEPKS4_E4doitERS6_:
  122|    657|  static bool doit(const From &Val) {
  123|    657|    return isa_impl_wrap<To, SimpleFrom,
  124|    657|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    657|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    657|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22FunctionExpressionNodeEPKNS2_16FunctionLikeNodeES6_E4doitERKS6_:
  132|    657|  static bool doit(const FromTy &Val) {
  133|    657|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    657|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22FunctionExpressionNodeEPKNS2_16FunctionLikeNodeEE4doitES6_:
  105|    657|  static inline bool doit(const From *Val) {
  106|    657|    assert(Val && "isa<> used on a null pointer");
  107|    657|    return isa_impl<To, From>::doit(*Val);
  108|    657|  }
_ZN4llvh8isa_implIN6hermes6ESTree22FunctionExpressionNodeENS2_16FunctionLikeNodeEvE4doitERKS4_:
   58|    657|  static inline bool doit(const From &Val) {
   59|    657|    return To::classof(&Val);
   60|    657|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree22FunctionExpressionNodeEPNS2_16FunctionLikeNodeES5_E4doitERKS5_:
  218|    657|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    657|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    657|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    657|    return Res2;
  222|    657|  }
_ZN4llvh8dyn_castIN6hermes6ESTree22TypeCastExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|}
_ZN4llvh4castIN6hermes6ESTree11ProgramNodeENS2_16FunctionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    588|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    588|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    588|  return cast_convert_val<X, Y*,
  257|    588|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    588|}
_ZN4llvh3isaIN6hermes6ESTree11ProgramNodeEPNS2_16FunctionLikeNodeEEEbRKT0_:
  142|    588|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    588|  return isa_impl_wrap<X, const Y,
  144|    588|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    588|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEKPNS2_16FunctionLikeNodeEPKS4_E4doitERS6_:
  122|    588|  static bool doit(const From &Val) {
  123|    588|    return isa_impl_wrap<To, SimpleFrom,
  124|    588|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    588|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    588|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEPKNS2_16FunctionLikeNodeES6_E4doitERKS6_:
  132|    588|  static bool doit(const FromTy &Val) {
  133|    588|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    588|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11ProgramNodeEPKNS2_16FunctionLikeNodeEE4doitES6_:
  105|    588|  static inline bool doit(const From *Val) {
  106|    588|    assert(Val && "isa<> used on a null pointer");
  107|    588|    return isa_impl<To, From>::doit(*Val);
  108|    588|  }
_ZN4llvh8isa_implIN6hermes6ESTree11ProgramNodeENS2_16FunctionLikeNodeEvE4doitERKS4_:
   58|    588|  static inline bool doit(const From &Val) {
   59|    588|    return To::classof(&Val);
   60|    588|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree11ProgramNodeEPNS2_16FunctionLikeNodeES5_E4doitERKS5_:
  218|    588|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    588|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    588|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    588|    return Res2;
  222|    588|  }
_ZN4llvh4castIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_16FunctionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   722k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   722k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|   722k|  return cast_convert_val<X, Y*,
  257|   722k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   722k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_16FunctionLikeNodeES5_E4doitERKS5_:
  218|   722k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   722k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   722k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   722k|    return Res2;
  222|   722k|  }
_ZN4llvh4castIN6hermes6ESTree20MemberExpressionNodeENS2_24MemberExpressionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  52.7k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  52.7k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  52.7k|  return cast_convert_val<X, Y*,
  257|  52.7k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  52.7k|}
_ZN4llvh3isaIN6hermes6ESTree20MemberExpressionNodeEPNS2_24MemberExpressionLikeNodeEEEbRKT0_:
  142|  52.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  52.7k|  return isa_impl_wrap<X, const Y,
  144|  52.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  52.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEKPNS2_24MemberExpressionLikeNodeEPKS4_E4doitERS6_:
  122|  52.7k|  static bool doit(const From &Val) {
  123|  52.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  52.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  52.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  52.7k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEPKNS2_24MemberExpressionLikeNodeES6_E4doitERKS6_:
  132|  52.7k|  static bool doit(const FromTy &Val) {
  133|  52.7k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  52.7k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20MemberExpressionNodeEPKNS2_24MemberExpressionLikeNodeEE4doitES6_:
  105|  52.7k|  static inline bool doit(const From *Val) {
  106|  52.7k|    assert(Val && "isa<> used on a null pointer");
  107|  52.7k|    return isa_impl<To, From>::doit(*Val);
  108|  52.7k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20MemberExpressionNodeENS2_24MemberExpressionLikeNodeEvE4doitERKS4_:
   58|  52.7k|  static inline bool doit(const From &Val) {
   59|  52.7k|    return To::classof(&Val);
   60|  52.7k|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree24MemberExpressionLikeNodeEE18getSimplifiedValueERS5_:
   48|   130k|  static RetType getSimplifiedValue(const From& Val) {
   49|   130k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   130k|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree24MemberExpressionLikeNodeEE18getSimplifiedValueERS4_:
   38|   130k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20MemberExpressionNodeEPNS2_24MemberExpressionLikeNodeES5_E4doitERKS5_:
  218|  52.7k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  52.7k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  52.7k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  52.7k|    return Res2;
  222|  52.7k|  }
_ZN4llvh4castIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_24MemberExpressionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  77.7k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  77.7k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  77.7k|  return cast_convert_val<X, Y*,
  257|  77.7k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  77.7k|}
_ZN4llvh3isaIN6hermes6ESTree28OptionalMemberExpressionNodeEPNS2_24MemberExpressionLikeNodeEEEbRKT0_:
  142|  77.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  77.7k|  return isa_impl_wrap<X, const Y,
  144|  77.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  77.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28OptionalMemberExpressionNodeEKPNS2_24MemberExpressionLikeNodeEPKS4_E4doitERS6_:
  122|  77.7k|  static bool doit(const From &Val) {
  123|  77.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  77.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  77.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  77.7k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28OptionalMemberExpressionNodeEPKNS2_24MemberExpressionLikeNodeES6_E4doitERKS6_:
  132|  77.7k|  static bool doit(const FromTy &Val) {
  133|  77.7k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  77.7k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree28OptionalMemberExpressionNodeEPKNS2_24MemberExpressionLikeNodeEE4doitES6_:
  105|  77.7k|  static inline bool doit(const From *Val) {
  106|  77.7k|    assert(Val && "isa<> used on a null pointer");
  107|  77.7k|    return isa_impl<To, From>::doit(*Val);
  108|  77.7k|  }
_ZN4llvh8isa_implIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_24MemberExpressionLikeNodeEvE4doitERKS4_:
   58|  77.7k|  static inline bool doit(const From &Val) {
   59|  77.7k|    return To::classof(&Val);
   60|  77.7k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree28OptionalMemberExpressionNodeEPNS2_24MemberExpressionLikeNodeES5_E4doitERKS5_:
  218|  77.7k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  77.7k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  77.7k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  77.7k|    return Res2;
  222|  77.7k|  }
_ZN4llvh4castIN6hermes6ESTree18CallExpressionNodeENS2_22CallExpressionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|      9|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      9|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      9|  return cast_convert_val<X, Y*,
  257|      9|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      9|}
_ZN4llvh3isaIN6hermes6ESTree18CallExpressionNodeEPNS2_22CallExpressionLikeNodeEEEbRKT0_:
  142|      9|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      9|  return isa_impl_wrap<X, const Y,
  144|      9|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      9|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEKPNS2_22CallExpressionLikeNodeEPKS4_E4doitERS6_:
  122|      9|  static bool doit(const From &Val) {
  123|      9|    return isa_impl_wrap<To, SimpleFrom,
  124|      9|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      9|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      9|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEPKNS2_22CallExpressionLikeNodeES6_E4doitERKS6_:
  132|      9|  static bool doit(const FromTy &Val) {
  133|      9|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      9|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18CallExpressionNodeEPKNS2_22CallExpressionLikeNodeEE4doitES6_:
  105|      9|  static inline bool doit(const From *Val) {
  106|      9|    assert(Val && "isa<> used on a null pointer");
  107|      9|    return isa_impl<To, From>::doit(*Val);
  108|      9|  }
_ZN4llvh8isa_implIN6hermes6ESTree18CallExpressionNodeENS2_22CallExpressionLikeNodeEvE4doitERKS4_:
   58|      9|  static inline bool doit(const From &Val) {
   59|      9|    return To::classof(&Val);
   60|      9|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree22CallExpressionLikeNodeEE18getSimplifiedValueERS5_:
   48|     57|  static RetType getSimplifiedValue(const From& Val) {
   49|     57|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|     57|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree22CallExpressionLikeNodeEE18getSimplifiedValueERS4_:
   38|     57|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18CallExpressionNodeEPNS2_22CallExpressionLikeNodeES5_E4doitERKS5_:
  218|      9|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      9|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      9|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      9|    return Res2;
  222|      9|  }
_ZN4llvh4castIN6hermes6ESTree26OptionalCallExpressionNodeENS2_22CallExpressionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  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|     48|  return cast_convert_val<X, Y*,
  257|     48|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     48|}
_ZN4llvh3isaIN6hermes6ESTree26OptionalCallExpressionNodeEPNS2_22CallExpressionLikeNodeEEEbRKT0_:
  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_wrapIN6hermes6ESTree26OptionalCallExpressionNodeEKPNS2_22CallExpressionLikeNodeEPKS4_E4doitERS6_:
  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_wrapIN6hermes6ESTree26OptionalCallExpressionNodeEPKNS2_22CallExpressionLikeNodeES6_E4doitERKS6_:
  132|     48|  static bool doit(const FromTy &Val) {
  133|     48|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     48|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree26OptionalCallExpressionNodeEPKNS2_22CallExpressionLikeNodeEE4doitES6_:
  105|     48|  static inline bool doit(const From *Val) {
  106|     48|    assert(Val && "isa<> used on a null pointer");
  107|     48|    return isa_impl<To, From>::doit(*Val);
  108|     48|  }
_ZN4llvh8isa_implIN6hermes6ESTree26OptionalCallExpressionNodeENS2_22CallExpressionLikeNodeEvE4doitERKS4_:
   58|     48|  static inline bool doit(const From &Val) {
   59|     48|    return To::classof(&Val);
   60|     48|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree26OptionalCallExpressionNodeEPNS2_22CallExpressionLikeNodeES5_E4doitERKS5_:
  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|  }
_ZN4llvh3isaIN6hermes6ESTree11PatternNodeENS2_4NodeEEEbRKT0_:
  142|   103k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   103k|  return isa_impl_wrap<X, const Y,
  144|   103k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   103k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11PatternNodeEKNS2_4NodeES5_E4doitERS5_:
  132|   103k|  static bool doit(const FromTy &Val) {
  133|   103k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   103k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11PatternNodeEKNS2_4NodeEE4doitERS5_:
   77|   103k|  static inline bool doit(const From &Val) {
   78|   103k|    return isa_impl<To, From>::doit(Val);
   79|   103k|  }
_ZN4llvh3isaIN6hermes6ESTree22ComponentParameterNodeENS2_4NodeEEEbRKT0_:
  142|   309k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   309k|  return isa_impl_wrap<X, const Y,
  144|   309k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   309k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22ComponentParameterNodeEKNS2_4NodeES5_E4doitERS5_:
  132|   309k|  static bool doit(const FromTy &Val) {
  133|   309k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   309k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22ComponentParameterNodeEKNS2_4NodeEE4doitERS5_:
   77|   309k|  static inline bool doit(const From &Val) {
   78|   309k|    return isa_impl<To, From>::doit(Val);
   79|   309k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree17LoopStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   256k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   256k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 256k]
  ------------------
  335|   256k|}
_ZN4llvh3isaIN6hermes6ESTree17LoopStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   256k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   256k|  return isa_impl_wrap<X, const Y,
  144|   256k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   256k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17LoopStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   256k|  static bool doit(const From &Val) {
  123|   256k|    return isa_impl_wrap<To, SimpleFrom,
  124|   256k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   256k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   256k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17LoopStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   256k|  static bool doit(const FromTy &Val) {
  133|   256k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   256k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17LoopStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   256k|  static inline bool doit(const From *Val) {
  106|   256k|    assert(Val && "isa<> used on a null pointer");
  107|   256k|    return isa_impl<To, From>::doit(*Val);
  108|   256k|  }
_ZN4llvh8isa_implIN6hermes6ESTree17LoopStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   256k|  static inline bool doit(const From &Val) {
   59|   256k|    return To::classof(&Val);
   60|   256k|  }
_ZN4llvh3isaIN6hermes6ESTree20MemberExpressionNodeEPKNS2_4NodeEEEbRKT0_:
  142|  24.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  24.8k|  return isa_impl_wrap<X, const Y,
  144|  24.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  24.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|  24.8k|  static bool doit(const From &Val) {
  123|  24.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  24.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  24.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  24.8k|  }
_ZN4llvh3isaIN6hermes6ESTree9EmptyNodeEPKNS2_4NodeEEEbRKT0_:
  142|  24.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  24.8k|  return isa_impl_wrap<X, const Y,
  144|  24.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  24.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9EmptyNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|  24.8k|  static bool doit(const From &Val) {
  123|  24.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  24.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  24.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  24.8k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree21AssignmentPatternNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|  22.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  22.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 22.3k]
  ------------------
  335|  22.3k|}
_ZN4llvh3isaIN6hermes6ESTree21AssignmentPatternNodeEPKNS2_4NodeEEEbRKT0_:
  142|  22.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  22.3k|  return isa_impl_wrap<X, const Y,
  144|  22.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  22.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|  22.3k|  static bool doit(const From &Val) {
  123|  22.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  22.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  22.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  22.3k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree16ArrayPatternNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|  22.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  22.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 22.3k, False: 1]
  ------------------
  335|  22.3k|}
_ZN4llvh3isaIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeEEEbRKT0_:
  142|  44.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  44.7k|  return isa_impl_wrap<X, const Y,
  144|  44.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  44.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|  44.7k|  static bool doit(const From &Val) {
  123|  44.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  44.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  44.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  44.7k|  }
_ZN4llvh4castIN6hermes6ESTree16ArrayPatternNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  22.3k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  22.3k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  22.3k|  return cast_convert_val<X, Y*,
  257|  22.3k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  22.3k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  218|  22.3k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  22.3k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  22.3k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  22.3k|    return Res2;
  222|  22.3k|  }
_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|  1.71k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.71k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|  1.71k|  return cast_convert_val<X, Y*,
  257|  1.71k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.71k|}
_ZN4llvh3isaIN6hermes5regex11BracketInsnEPNS2_4InsnEEEbRKT0_:
  142|  1.71k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.71k|  return isa_impl_wrap<X, const Y,
  144|  1.71k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.71k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex11BracketInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  1.71k|  static bool doit(const From &Val) {
  123|  1.71k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.71k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.71k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.71k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex11BracketInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  1.83k|  static bool doit(const FromTy &Val) {
  133|  1.83k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.83k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex11BracketInsnEPKNS2_4InsnEE4doitES6_:
  105|  1.83k|  static inline bool doit(const From *Val) {
  106|  1.83k|    assert(Val && "isa<> used on a null pointer");
  107|  1.83k|    return isa_impl<To, From>::doit(*Val);
  108|  1.83k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex11BracketInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  1.71k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.71k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.71k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.71k|    return Res2;
  222|  1.71k|  }
_ZN4llvh13simplify_typeIKPKN6hermes5regex4InsnEE18getSimplifiedValueERS6_:
   48|    330|  static RetType getSimplifiedValue(const From& Val) {
   49|    330|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|    330|  }
_ZN4llvh13simplify_typeIPKN6hermes5regex4InsnEE18getSimplifiedValueERS5_:
   38|    330|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes5regex15MatchNChar8InsnEKNS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|    122|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    122|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    122|  return cast_convert_val<X, Y*,
  257|    122|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    122|}
_ZN4llvh3isaIN6hermes5regex15MatchNChar8InsnEPKNS2_4InsnEEEbRKT0_:
  142|    122|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    122|  return isa_impl_wrap<X, const Y,
  144|    122|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    122|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchNChar8InsnEKPKNS2_4InsnES6_E4doitERS7_:
  122|    122|  static bool doit(const From &Val) {
  123|    122|    return isa_impl_wrap<To, SimpleFrom,
  124|    122|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    122|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    122|  }
_ZN4llvh16cast_convert_valIN6hermes5regex15MatchNChar8InsnEPKNS2_4InsnES6_E4doitERKS6_:
  218|    122|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    122|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    122|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    122|    return Res2;
  222|    122|  }
_ZN4llvh4castIN6hermes5regex11BracketInsnEKNS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|    122|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    122|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|    122|  return cast_convert_val<X, Y*,
  257|    122|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    122|}
_ZN4llvh3isaIN6hermes5regex11BracketInsnEPKNS2_4InsnEEEbRKT0_:
  142|    122|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    122|  return isa_impl_wrap<X, const Y,
  144|    122|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    122|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex11BracketInsnEKPKNS2_4InsnES6_E4doitERS7_:
  122|    122|  static bool doit(const From &Val) {
  123|    122|    return isa_impl_wrap<To, SimpleFrom,
  124|    122|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    122|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    122|  }
_ZN4llvh16cast_convert_valIN6hermes5regex11BracketInsnEPKNS2_4InsnES6_E4doitERKS6_:
  218|    122|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    122|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    122|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    122|    return Res2;
  222|    122|  }
_ZN4llvh4castIN6hermes5regex14Width1LoopInsnEKNS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|     86|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     86|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|     86|  return cast_convert_val<X, Y*,
  257|     86|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     86|}
_ZN4llvh3isaIN6hermes5regex14Width1LoopInsnEPKNS2_4InsnEEEbRKT0_:
  142|     86|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     86|  return isa_impl_wrap<X, const Y,
  144|     86|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     86|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex14Width1LoopInsnEKPKNS2_4InsnES6_E4doitERS7_:
  122|     86|  static bool doit(const From &Val) {
  123|     86|    return isa_impl_wrap<To, SimpleFrom,
  124|     86|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     86|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     86|  }
_ZN4llvh16cast_convert_valIN6hermes5regex14Width1LoopInsnEPKNS2_4InsnES6_E4doitERKS6_:
  218|     86|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     86|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     86|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     86|    return Res2;
  222|     86|  }

_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:
  325|     30|      : Occurrences(OccurrencesFlag), Value(0), HiddenFlag(Hidden),
  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|  1.19k|  operator DataType() const { return getValue(); }
_ZNK4llvh2cl11opt_storageIbLb0ELb0EE8getValueEv:
 1272|  1.19k|  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|     46|inline uint32_t djbHash(StringRef Buffer, uint32_t H = 5381) {
   23|     46|  for (unsigned char C : Buffer.bytes())
  ------------------
  |  Branch (23:24): [True: 502, False: 46]
  ------------------
   24|    502|    H = (H << 5) + H + C;
   25|     46|  return H;
   26|     46|}

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

_ZN4llvh7ErrorOrIPvE10getStorageEv:
  243|  3.84k|  storage_type *getStorage() {
  244|  3.84k|    assert(!HasError && "Cannot get value when an error exists!");
  245|  3.84k|    return reinterpret_cast<storage_type*>(TStorage.buffer);
  246|  3.84k|  }
_ZN4llvh7ErrorOrIPvED2Ev:
  147|  1.44k|  ~ErrorOr() {
  148|  1.44k|    if (!HasError)
  ------------------
  |  Branch (148:9): [True: 1.44k, False: 0]
  ------------------
  149|  1.44k|      getStorage()->~storage_type();
  150|  1.44k|  }
_ZN4llvh7ErrorOrIPvEdeEv:
  170|    800|  reference operator *() {
  171|    800|    return *getStorage();
  172|    800|  }
_ZNK4llvh7ErrorOrIPvEcvbEv:
  153|  2.40k|  explicit operator bool() const {
  154|  2.40k|    return !HasError;
  155|  2.40k|  }
_ZN4llvh7ErrorOrIPvE3getEv:
  157|    160|  reference get() { return *getStorage(); }
_ZN4llvh7ErrorOrIPvEC2IS1_EEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS4_S1_EE5valueEvE4typeE:
   91|  1.28k|      : HasError(false) {
   92|  1.28k|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|  1.28k|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEEC2IS3_EEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS6_S3_EE5valueEvE4typeE:
   91|    320|      : HasError(false) {
   92|    320|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|    320|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEE10getStorageEv:
  243|    960|  storage_type *getStorage() {
  244|    960|    assert(!HasError && "Cannot get value when an error exists!");
  245|    960|    return reinterpret_cast<storage_type*>(TStorage.buffer);
  246|    960|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEED2Ev:
  147|    320|  ~ErrorOr() {
  148|    320|    if (!HasError)
  ------------------
  |  Branch (148:9): [True: 320, False: 0]
  ------------------
  149|    320|      getStorage()->~storage_type();
  150|    320|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEE10getStorageEv:
  243|  1.28k|  storage_type *getStorage() {
  244|  1.28k|    assert(!HasError && "Cannot get value when an error exists!");
  245|  1.28k|    return reinterpret_cast<storage_type*>(TStorage.buffer);
  246|  1.28k|  }
_ZNK4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEEcvbEv:
  153|    320|  explicit operator bool() const {
  154|    320|    return !HasError;
  155|    320|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEE3getEv:
  157|    320|  reference get() { return *getStorage(); }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEEptEv:
  164|    320|  pointer operator ->() {
  165|    320|    return toPointer(getStorage());
  166|    320|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEE9toPointerEPS4_:
  231|    320|  pointer toPointer(pointer Val) {
  232|    320|    return Val;
  233|    320|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEED2Ev:
  147|    320|  ~ErrorOr() {
  148|    320|    if (!HasError)
  ------------------
  |  Branch (148:9): [True: 320, False: 0]
  ------------------
  149|    320|      getStorage()->~storage_type();
  150|    320|  }
_ZNK4llvh7ErrorOrIN6hermes2vm14AlignedStorageEEcvbEv:
  153|    320|  explicit operator bool() const {
  154|    320|    return !HasError;
  155|    320|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEE3getEv:
  157|    320|  reference get() { return *getStorage(); }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEEC2IS4_EEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS7_S4_EE5valueEvE4typeE:
   91|    320|      : HasError(false) {
   92|    320|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|    320|  }
_ZN4llvh7ErrorOrIPvEC2IPcEEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS5_S1_EE5valueEvE4typeE:
   91|    160|      : HasError(false) {
   92|    160|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|    160|  }
_ZN4llvh7ErrorOrINSt3__110unique_ptrINS_20WritableMemoryBufferENS1_14default_deleteIS3_EEEEEC2IS6_EEOT_PNS1_9enable_ifIXsr3std14is_convertibleIS9_S6_EE5valueEvE4typeE:
   91|     84|      : HasError(false) {
   92|     84|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|     84|  }
_ZN4llvh7ErrorOrINSt3__110unique_ptrINS_20WritableMemoryBufferENS1_14default_deleteIS3_EEEEE10getStorageEv:
  243|    252|  storage_type *getStorage() {
  244|    252|    assert(!HasError && "Cannot get value when an error exists!");
  245|    252|    return reinterpret_cast<storage_type*>(TStorage.buffer);
  246|    252|  }
_ZN4llvh7ErrorOrINSt3__110unique_ptrINS_20WritableMemoryBufferENS1_14default_deleteIS3_EEEEED2Ev:
  147|     84|  ~ErrorOr() {
  148|     84|    if (!HasError)
  ------------------
  |  Branch (148:9): [True: 84, False: 0]
  ------------------
  149|     84|      getStorage()->~storage_type();
  150|     84|  }
_ZNK4llvh7ErrorOrINSt3__110unique_ptrINS_20WritableMemoryBufferENS1_14default_deleteIS3_EEEEEcvbEv:
  153|     84|  explicit operator bool() const {
  154|     84|    return !HasError;
  155|     84|  }
_ZN4llvh7ErrorOrINSt3__110unique_ptrINS_20WritableMemoryBufferENS1_14default_deleteIS3_EEEEEdeEv:
  170|     84|  reference operator *() {
  171|     84|    return *getStorage();
  172|     84|  }

_ZNK4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE7getNodeEPKS2_:
  329|  1.08M|  DomTreeNodeBase<NodeT> *getNode(const NodeT *BB) const {
  330|  1.08M|    auto I = DomTreeNodes.find(BB);
  331|  1.08M|    if (I != DomTreeNodes.end())
  ------------------
  |  Branch (331:9): [True: 493k, False: 588k]
  ------------------
  332|   493k|      return I->second.get();
  333|   588k|    return nullptr;
  334|  1.08M|  }
_ZN4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE5resetEv:
  763|     13|  void reset() {
  764|     13|    DomTreeNodes.clear();
  765|     13|    Roots.clear();
  766|     13|    RootNode = nullptr;
  767|     13|    Parent = nullptr;
  768|     13|    DFSInfoValid = false;
  769|     13|    SlowQueries = 0;
  770|     13|  }
_ZNK4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEE8getBlockEv:
   82|     13|  NodeT *getBlock() const { return TheBB; }
_ZN4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EEC2Ev:
  255|     13|  DominatorTreeBase() {}
_ZNK4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE17properlyDominatesEPKS2_S5_:
  880|    161|    const NodeT *A, const NodeT *B) const {
  881|    161|  if (A == B)
  ------------------
  |  Branch (881:7): [True: 0, False: 161]
  ------------------
  882|      0|    return false;
  883|       |
  884|       |  // Cast away the const qualifiers here. This is ok since
  885|       |  // this function doesn't actually return the values returned
  886|       |  // from getNode.
  887|    161|  return dominates(getNode(const_cast<NodeT *>(A)),
  888|    161|                   getNode(const_cast<NodeT *>(B)));
  889|    161|}
_ZNK4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE20isReachableFromEntryEPKNS_15DomTreeNodeBaseIS2_EE:
  389|    644|  bool isReachableFromEntry(const DomTreeNodeBase<NodeT> *A) const { return A; }
_ZNK4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE9dominatesEPKNS_15DomTreeNodeBaseIS2_EES7_:
  395|    161|                 const DomTreeNodeBase<NodeT> *B) const {
  396|       |    // A node trivially dominates itself.
  397|    161|    if (B == A)
  ------------------
  |  Branch (397:9): [True: 0, False: 161]
  ------------------
  398|      0|      return true;
  399|       |
  400|       |    // An unreachable node is dominated by anything.
  401|    161|    if (!isReachableFromEntry(B))
  ------------------
  |  Branch (401:9): [True: 0, False: 161]
  ------------------
  402|      0|      return true;
  403|       |
  404|       |    // And dominates nothing.
  405|    161|    if (!isReachableFromEntry(A))
  ------------------
  |  Branch (405:9): [True: 0, False: 161]
  ------------------
  406|      0|      return false;
  407|       |
  408|    161|    if (B->getIDom() == A) return true;
  ------------------
  |  Branch (408:9): [True: 0, False: 161]
  ------------------
  409|       |
  410|    161|    if (A->getIDom() == B) return false;
  ------------------
  |  Branch (410:9): [True: 0, False: 161]
  ------------------
  411|       |
  412|       |    // A can only dominate B if it is higher in the tree.
  413|    161|    if (A->getLevel() >= B->getLevel()) return false;
  ------------------
  |  Branch (413:9): [True: 0, False: 161]
  ------------------
  414|       |
  415|       |    // Compare the result of the tree walk and the dfs numbers, if expensive
  416|       |    // checks are enabled.
  417|       |#ifdef EXPENSIVE_CHECKS
  418|       |    assert((!DFSInfoValid ||
  419|       |            (dominatedBySlowTreeWalk(A, B) == B->DominatedBy(A))) &&
  420|       |           "Tree walk disagrees with dfs numbers!");
  421|       |#endif
  422|       |
  423|    161|    if (DFSInfoValid)
  ------------------
  |  Branch (423:9): [True: 0, False: 161]
  ------------------
  424|      0|      return B->DominatedBy(A);
  425|       |
  426|       |    // If we end up with too many slow queries, just update the
  427|       |    // DFS numbers on the theory that we are going to keep querying.
  428|    161|    SlowQueries++;
  429|    161|    if (SlowQueries > 32) {
  ------------------
  |  Branch (429:9): [True: 0, False: 161]
  ------------------
  430|      0|      updateDFSNumbers();
  431|      0|      return B->DominatedBy(A);
  432|      0|    }
  433|       |
  434|    161|    return dominatedBySlowTreeWalk(A, B);
  435|    161|  }
_ZN4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE11recalculateERNS1_8FunctionE:
  732|     13|  void recalculate(ParentType &Func) {
  733|     13|    Parent = &Func;
  734|     13|    DomTreeBuilder::Calculate(*this);
  735|     13|  }
_ZNK4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE23dominatedBySlowTreeWalkEPKNS_15DomTreeNodeBaseIS2_EES7_:
  831|    161|                               const DomTreeNodeBase<NodeT> *B) const {
  832|    161|    assert(A != B);
  833|    161|    assert(isReachableFromEntry(B));
  834|    161|    assert(isReachableFromEntry(A));
  835|       |
  836|    161|    const unsigned ALevel = A->getLevel();
  837|    161|    const DomTreeNodeBase<NodeT> *IDom;
  838|       |
  839|       |    // Don't walk nodes above A's subtree. When we reach A's level, we must
  840|       |    // either find A or be in some other subtree not dominated by A.
  841|  2.14M|    while ((IDom = B->getIDom()) != nullptr && IDom->getLevel() >= ALevel)
  ------------------
  |  Branch (841:12): [True: 2.14M, False: 0]
  |  Branch (841:48): [True: 2.14M, False: 161]
  ------------------
  842|  2.14M|      B = IDom;  // Walk up the tree
  843|       |
  844|    161|    return B == A;
  845|    161|  }
_ZN4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEEC2EPS2_PS3_:
   71|   492k|      : TheBB(BB), IDom(iDom), Level(IDom ? IDom->Level + 1 : 0) {}
  ------------------
  |  Branch (71:38): [True: 492k, False: 13]
  ------------------
_ZNK4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEE7getIDomEv:
   83|  2.14M|  DomTreeNodeBase *getIDom() const { return IDom; }
_ZNK4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEE8getLevelEv:
   84|  2.14M|  unsigned getLevel() const { return Level; }
_ZN4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEE8addChildENSt3__110unique_ptrIS3_NS4_14default_deleteIS3_EEEE:
   89|   492k|      std::unique_ptr<DomTreeNodeBase> C) {
   90|   492k|    Children.push_back(C.get());
   91|   492k|    return C;
   92|   492k|  }

_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEEC2EPNS6_15BatchUpdateInfoE:
   97|     13|  SemiNCAInfo(BatchUpdatePtr BUI) : BatchUpdates(BUI) {}
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE14ChildrenGetterILb0EE3GetEPS4_PNS6_15BatchUpdateInfoE:
  126|   492k|    static ResultTy Get(NodePtr N, BatchUpdatePtr BUI) {
  127|   492k|      ResultTy Res = Get(N, Tag());
  128|       |      // If there's no batch update in progress, simply return node's children.
  129|   492k|      if (!BUI) return Res;
  ------------------
  |  Branch (129:11): [True: 492k, 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|   492k|    static ResultTy Get(NodePtr N, std::integral_constant<bool, false>) {
  111|   492k|      auto RChildren = reverse(children<NodePtr>(N));
  112|   492k|      return ResultTy(RChildren.begin(), RChildren.end());
  113|   492k|    }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE10runSemiNCAERS5_j:
  297|     13|  void runSemiNCA(DomTreeT &DT, const unsigned MinLevel = 0) {
  298|     13|    const unsigned NextDFSNum(NumToNode.size());
  299|       |    // Initialize IDoms to spanning tree parents.
  300|   492k|    for (unsigned i = 1; i < NextDFSNum; ++i) {
  ------------------
  |  Branch (300:26): [True: 492k, False: 13]
  ------------------
  301|   492k|      const NodePtr V = NumToNode[i];
  302|   492k|      auto &VInfo = NodeToInfo[V];
  303|   492k|      VInfo.IDom = NumToNode[VInfo.Parent];
  304|   492k|    }
  305|       |
  306|       |    // Step #1: Calculate the semidominators of all vertices.
  307|   492k|    for (unsigned i = NextDFSNum - 1; i >= 2; --i) {
  ------------------
  |  Branch (307:39): [True: 492k, False: 13]
  ------------------
  308|   492k|      NodePtr W = NumToNode[i];
  309|   492k|      auto &WInfo = NodeToInfo[W];
  310|       |
  311|       |      // Initialize the semi dominator to point to the parent node.
  312|   492k|      WInfo.Semi = WInfo.Parent;
  313|   588k|      for (const auto &N : WInfo.ReverseChildren) {
  ------------------
  |  Branch (313:26): [True: 588k, False: 492k]
  ------------------
  314|   588k|        if (NodeToInfo.count(N) == 0)  // Skip unreachable predecessors.
  ------------------
  |  Branch (314:13): [True: 0, False: 588k]
  ------------------
  315|      0|          continue;
  316|       |
  317|   588k|        const TreeNodePtr TN = DT.getNode(N);
  318|       |        // Skip predecessors whose level is above the subtree we are processing.
  319|   588k|        if (TN && TN->getLevel() < MinLevel)
  ------------------
  |  Branch (319:13): [True: 0, False: 588k]
  |  Branch (319:19): [True: 0, False: 0]
  ------------------
  320|      0|          continue;
  321|       |
  322|   588k|        unsigned SemiU = NodeToInfo[eval(N, i + 1)].Semi;
  323|   588k|        if (SemiU < WInfo.Semi) WInfo.Semi = SemiU;
  ------------------
  |  Branch (323:13): [True: 24.5k, False: 564k]
  ------------------
  324|   588k|      }
  325|   492k|    }
  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|   492k|    for (unsigned i = 2; i < NextDFSNum; ++i) {
  ------------------
  |  Branch (331:26): [True: 492k, False: 13]
  ------------------
  332|   492k|      const NodePtr W = NumToNode[i];
  333|   492k|      auto &WInfo = NodeToInfo[W];
  334|   492k|      const unsigned SDomNum = NodeToInfo[NumToNode[WInfo.Semi]].DFSNum;
  335|   492k|      NodePtr WIDomCandidate = WInfo.IDom;
  336|   517k|      while (NodeToInfo[WIDomCandidate].DFSNum > SDomNum)
  ------------------
  |  Branch (336:14): [True: 24.5k, False: 492k]
  ------------------
  337|  24.5k|        WIDomCandidate = NodeToInfo[WIDomCandidate].IDom;
  338|       |
  339|   492k|      WInfo.IDom = WIDomCandidate;
  340|   492k|    }
  341|     13|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE4evalEPS4_j:
  258|   588k|  NodePtr eval(NodePtr VIn, unsigned LastLinked) {
  259|   588k|    auto &VInInfo = NodeToInfo[VIn];
  260|   588k|    if (VInInfo.DFSNum < LastLinked)
  ------------------
  |  Branch (260:9): [True: 492k, False: 95.6k]
  ------------------
  261|   492k|      return VIn;
  262|       |
  263|  95.6k|    SmallVector<NodePtr, 32> Work;
  264|  95.6k|    SmallPtrSet<NodePtr, 32> Visited;
  265|       |
  266|  95.6k|    if (VInInfo.Parent >= LastLinked)
  ------------------
  |  Branch (266:9): [True: 20.4k, False: 75.1k]
  ------------------
  267|  20.4k|      Work.push_back(VIn);
  268|       |
  269|   319k|    while (!Work.empty()) {
  ------------------
  |  Branch (269:12): [True: 224k, False: 95.6k]
  ------------------
  270|   224k|      NodePtr V = Work.back();
  271|   224k|      auto &VInfo = NodeToInfo[V];
  272|   224k|      NodePtr VAncestor = NumToNode[VInfo.Parent];
  273|       |
  274|       |      // Process Ancestor first
  275|   224k|      if (Visited.insert(VAncestor).second && VInfo.Parent >= LastLinked) {
  ------------------
  |  Branch (275:11): [True: 122k, False: 101k]
  |  Branch (275:11): [True: 101k, False: 122k]
  |  Branch (275:47): [True: 101k, False: 20.4k]
  ------------------
  276|   101k|        Work.push_back(VAncestor);
  277|   101k|        continue;
  278|   101k|      }
  279|   122k|      Work.pop_back();
  280|       |
  281|       |      // Update VInfo based on Ancestor info
  282|   122k|      if (VInfo.Parent < LastLinked)
  ------------------
  |  Branch (282:11): [True: 20.4k, False: 101k]
  ------------------
  283|  20.4k|        continue;
  284|       |
  285|   101k|      auto &VAInfo = NodeToInfo[VAncestor];
  286|   101k|      NodePtr VAncestorLabel = VAInfo.Label;
  287|   101k|      NodePtr VLabel = VInfo.Label;
  288|   101k|      if (NodeToInfo[VAncestorLabel].Semi < NodeToInfo[VLabel].Semi)
  ------------------
  |  Branch (288:11): [True: 101k, False: 0]
  ------------------
  289|   101k|        VInfo.Label = VAncestorLabel;
  290|   101k|      VInfo.Parent = VAInfo.Parent;
  291|   101k|    }
  292|       |
  293|  95.6k|    return VInInfo.Label;
  294|   588k|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE16attachNewSubtreeERS5_PNS_15DomTreeNodeBaseIS4_EE:
  586|     13|  void attachNewSubtree(DomTreeT& DT, const TreeNodePtr AttachTo) {
  587|       |    // Attach the first unreachable block to AttachTo.
  588|     13|    NodeToInfo[NumToNode[1]].IDom = AttachTo->getBlock();
  589|       |    // Loop over all of the discovered blocks in the function...
  590|   492k|    for (size_t i = 1, e = NumToNode.size(); i != e; ++i) {
  ------------------
  |  Branch (590:46): [True: 492k, False: 13]
  ------------------
  591|   492k|      NodePtr W = NumToNode[i];
  592|   492k|      LLVM_DEBUG(dbgs() << "\tdiscovered a new reachable node "
  ------------------
  |  |  123|   492k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   492k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 492k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   492k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  593|   492k|                        << BlockNamePrinter(W) << "\n");
  594|       |
  595|       |      // Don't replace this with 'count', the insertion side effect is important
  596|   492k|      if (DT.DomTreeNodes[W]) continue;  // Haven't calculated this node yet?
  ------------------
  |  Branch (596:11): [True: 13, False: 492k]
  ------------------
  597|       |
  598|   492k|      NodePtr ImmDom = getIDom(W);
  599|       |
  600|       |      // Get or calculate the node for the immediate dominator.
  601|   492k|      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|   492k|      DT.DomTreeNodes[W] = IDomNode->addChild(
  606|   492k|          llvh::make_unique<DomTreeNodeBase<NodeT>>(W, IDomNode));
  607|   492k|    }
  608|     13|  }
_ZNK4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE7getIDomEPS4_:
  167|   492k|  NodePtr getIDom(NodePtr BB) const {
  168|   492k|    auto InfoIt = NodeToInfo.find(BB);
  169|   492k|    if (InfoIt == NodeToInfo.end()) return nullptr;
  ------------------
  |  Branch (169:9): [True: 0, False: 492k]
  ------------------
  170|       |
  171|   492k|    return InfoIt->second.IDom;
  172|   492k|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE15getNodeForBlockEPS4_RS5_:
  174|   492k|  TreeNodePtr getNodeForBlock(NodePtr BB, DomTreeT &DT) {
  175|   492k|    if (TreeNodePtr Node = DT.getNode(BB)) return Node;
  ------------------
  |  Branch (175:21): [True: 492k, 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|      0|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE20CalculateFromScratchERS5_PNS6_15BatchUpdateInfoE:
  554|     13|  static void CalculateFromScratch(DomTreeT &DT, BatchUpdatePtr BUI) {
  555|     13|    auto *Parent = DT.Parent;
  556|     13|    DT.reset();
  557|     13|    DT.Parent = Parent;
  558|     13|    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|     13|    DT.Roots = FindRoots(DT, nullptr);
  564|     13|    SNCA.doFullDFSWalk(DT, AlwaysDescend);
  565|       |
  566|     13|    SNCA.runSemiNCA(DT);
  567|     13|    if (BUI) {
  ------------------
  |  Branch (567:9): [True: 0, False: 13]
  ------------------
  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|     13|    if (DT.Roots.empty()) return;
  ------------------
  |  Branch (573:9): [True: 0, False: 13]
  ------------------
  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|     13|    NodePtr Root = IsPostDom ? nullptr : DT.Roots[0];
  ------------------
  |  Branch (578:20): [Folded - Ignored]
  ------------------
  579|       |
  580|     13|    DT.RootNode = (DT.DomTreeNodes[Root] =
  581|     13|                       llvh::make_unique<DomTreeNodeBase<NodeT>>(Root, nullptr))
  582|     13|        .get();
  583|     13|    SNCA.attachNewSubtree(DT, DT.RootNode);
  584|     13|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE9FindRootsERKS5_PNS6_15BatchUpdateInfoE:
  375|     13|  static RootsT FindRoots(const DomTreeT &DT, BatchUpdatePtr BUI) {
  376|     13|    assert(DT.Parent && "Parent pointer is not set");
  377|     13|    RootsT Roots;
  378|       |
  379|       |    // For dominators, function entry CFG node is always a tree root node.
  380|     13|    if (!IsPostDom) {
  ------------------
  |  Branch (380:9): [Folded - Ignored]
  ------------------
  381|     13|      Roots.push_back(GetEntryNode(DT));
  382|     13|      return Roots;
  383|     13|    }
  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|      0|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE12GetEntryNodeERKS5_:
  367|     13|  static NodePtr GetEntryNode(const DomTreeT &DT) {
  368|     13|    assert(DT.Parent && "Parent not set");
  369|     13|    return GraphTraits<typename DomTreeT::ParentPtr>::getEntryNode(DT.Parent);
  370|     13|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE13doFullDFSWalkIPFbPS4_S8_EEEvRKS5_T_:
  542|     13|  void doFullDFSWalk(const DomTreeT &DT, DescendCondition DC) {
  543|     13|    if (!IsPostDom) {
  ------------------
  |  Branch (543:9): [Folded - Ignored]
  ------------------
  544|     13|      assert(DT.Roots.size() == 1 && "Dominators should have a singe root");
  545|     13|      runDFS(DT.Roots[0], 0, DC, 0);
  546|     13|      return;
  547|     13|    }
  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|     13|                  unsigned AttachToNum) {
  219|     13|    assert(V);
  220|     13|    SmallVector<NodePtr, 64> WorkList = {V};
  221|     13|    if (NodeToInfo.count(V) != 0) NodeToInfo[V].Parent = AttachToNum;
  ------------------
  |  Branch (221:9): [True: 0, False: 13]
  ------------------
  222|       |
  223|   492k|    while (!WorkList.empty()) {
  ------------------
  |  Branch (223:12): [True: 492k, False: 13]
  ------------------
  224|   492k|      const NodePtr BB = WorkList.pop_back_val();
  225|   492k|      auto &BBInfo = NodeToInfo[BB];
  226|       |
  227|       |      // Visited nodes always have positive DFS numbers.
  228|   492k|      if (BBInfo.DFSNum != 0) continue;
  ------------------
  |  Branch (228:11): [True: 0, False: 492k]
  ------------------
  229|   492k|      BBInfo.DFSNum = BBInfo.Semi = ++LastNum;
  230|   492k|      BBInfo.Label = BB;
  231|   492k|      NumToNode.push_back(BB);
  232|       |
  233|   492k|      constexpr bool Direction = IsReverse != IsPostDom;  // XOR.
  234|   492k|      for (const NodePtr Succ :
  ------------------
  |  Branch (234:31): [True: 588k, False: 492k]
  ------------------
  235|   588k|           ChildrenGetter<Direction>::Get(BB, BatchUpdates)) {
  236|   588k|        const auto SIT = NodeToInfo.find(Succ);
  237|       |        // Don't visit nodes more than once but remember to collect
  238|       |        // ReverseChildren.
  239|   588k|        if (SIT != NodeToInfo.end() && SIT->second.DFSNum != 0) {
  ------------------
  |  Branch (239:13): [True: 95.6k, False: 492k]
  |  Branch (239:13): [True: 95.6k, False: 492k]
  |  Branch (239:40): [True: 95.6k, False: 0]
  ------------------
  240|  95.6k|          if (Succ != BB) SIT->second.ReverseChildren.push_back(BB);
  ------------------
  |  Branch (240:15): [True: 95.6k, False: 0]
  ------------------
  241|  95.6k|          continue;
  242|  95.6k|        }
  243|       |
  244|   492k|        if (!Condition(BB, Succ)) continue;
  ------------------
  |  Branch (244:13): [True: 0, False: 492k]
  ------------------
  245|       |
  246|       |        // It's fine to add Succ to the map, because we know that it will be
  247|       |        // visited later.
  248|   492k|        auto &SuccInfo = NodeToInfo[Succ];
  249|   492k|        WorkList.push_back(Succ);
  250|   492k|        SuccInfo.Parent = LastNum;
  251|   492k|        SuccInfo.ReverseChildren.push_back(BB);
  252|   492k|      }
  253|   492k|    }
  254|       |
  255|     13|    return LastNum;
  256|     13|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE13AlwaysDescendEPS4_S7_:
  191|   492k|  static bool AlwaysDescend(NodePtr, NodePtr) { return true; }
_ZN4llvh14DomTreeBuilder9CalculateINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEEEvRT_:
 1574|     13|void Calculate(DomTreeT &DT) {
 1575|     13|  SemiNCAInfo<DomTreeT>::CalculateFromScratch(DT, nullptr);
 1576|     13|}

_ZN4llvh13encodeSLEB128ElRNS_11raw_ostreamEj:
   25|  20.5M|                              unsigned PadTo = 0) {
   26|  20.5M|  bool More;
   27|  20.5M|  unsigned Count = 0;
   28|  21.8M|  do {
   29|  21.8M|    uint8_t Byte = Value & 0x7f;
   30|       |    // NOTE: this assumes that this signed shift is an arithmetic right shift.
   31|  21.8M|    Value >>= 7;
   32|  21.8M|    More = !((((Value == 0 ) && ((Byte & 0x40) == 0)) ||
  ------------------
  |  Branch (32:16): [True: 20.0M, False: 1.73M]
  |  Branch (32:33): [True: 19.9M, False: 116k]
  ------------------
   33|  21.8M|              ((Value == -1) && ((Byte & 0x40) != 0))));
  ------------------
  |  Branch (33:16): [True: 537k, False: 1.30M]
  |  Branch (33:33): [True: 527k, False: 9.24k]
  ------------------
   34|  21.8M|    Count++;
   35|  21.8M|    if (More || Count < PadTo)
  ------------------
  |  Branch (35:9): [True: 1.31M, False: 20.5M]
  |  Branch (35:17): [True: 0, False: 20.5M]
  ------------------
   36|  1.31M|      Byte |= 0x80; // Mark this byte to show that more bytes will follow.
   37|  21.8M|    OS << char(Byte);
   38|  21.8M|  } while (More);
  ------------------
  |  Branch (38:12): [True: 1.31M, False: 20.5M]
  ------------------
   39|       |
   40|       |  // Pad with 0x80 and emit a terminating byte at the end.
   41|  20.5M|  if (Count < PadTo) {
  ------------------
  |  Branch (41:7): [True: 0, False: 20.5M]
  ------------------
   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|  20.5M|  return Count;
   49|  20.5M|}
_ZN4llvh13decodeSLEB128EPKhPjS1_PPKc:
  164|   436k|                             const char **error = nullptr) {
  165|   436k|  const uint8_t *orig_p = p;
  166|   436k|  int64_t Value = 0;
  167|   436k|  unsigned Shift = 0;
  168|   436k|  uint8_t Byte;
  169|   437k|  do {
  170|   437k|    if (end && p == end) {
  ------------------
  |  Branch (170:9): [True: 0, False: 437k]
  |  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|   437k|    Byte = *p++;
  178|   437k|    Value |= (int64_t(Byte & 0x7f) << Shift);
  179|   437k|    Shift += 7;
  180|   437k|  } while (Byte >= 128);
  ------------------
  |  Branch (180:12): [True: 1.28k, False: 436k]
  ------------------
  181|       |  // Sign extend negative numbers.
  182|   436k|  if (Byte & 0x40)
  ------------------
  |  Branch (182:7): [True: 42, False: 436k]
  ------------------
  183|     42|    Value |= (-1ULL) << Shift;
  184|   436k|  if (n)
  ------------------
  |  Branch (184:7): [True: 436k, False: 0]
  ------------------
  185|   436k|    *n = (unsigned)(p - orig_p);
  186|   436k|  return Value;
  187|   436k|}

_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|     21|  C &operator*() {
   88|     21|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|     21|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 1, False: 20]
  ------------------
   90|      1|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|     21|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|     21|  }
_ZN4llvh14object_creatorINS_3sys10SmartMutexILb1EEEE4callEv:
   24|      1|  static void *call() { return new C(); }
Statistic.cpp:_ZN4llvh13ManagedStaticIN12_GLOBAL__N_113StatisticInfoENS_14object_creatorIS2_EENS_14object_deleterIS2_EEEdeEv:
   87|     21|  C &operator*() {
   88|     21|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|     21|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 1, False: 20]
  ------------------
   90|      1|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|     21|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|     21|  }
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|  28.9M|inline uint64_t DoubleToBits(double Double) {
  598|  28.9M|  uint64_t Bits;
  599|  28.9M|  static_assert(sizeof(uint64_t) == sizeof(double), "Unexpected type sizes");
  600|  28.9M|  memcpy(&Bits, &Double, sizeof(Double));
  601|  28.9M|  return Bits;
  602|  28.9M|}
_ZN4llvh12BitsToDoubleEm:
  579|  20.3M|inline double BitsToDouble(uint64_t Bits) {
  580|  20.3M|  double D;
  581|  20.3M|  static_assert(sizeof(uint64_t) == sizeof(double), "Unexpected type sizes");
  582|  20.3M|  memcpy(&D, &Bits, sizeof(Bits));
  583|  20.3M|  return D;
  584|  20.3M|}
_ZN4llvh16maskTrailingOnesIjEET_j:
  218|   118M|template <typename T> T maskTrailingOnes(unsigned N) {
  219|   118M|  static_assert(std::is_unsigned<T>::value, "Invalid type!");
  220|   118M|  const unsigned Bits = CHAR_BIT * sizeof(T);
  221|   118M|  assert(N <= Bits && "Invalid bit index");
  222|   118M|  return N == 0 ? 0 : (T(-1) >> (Bits - N));
  ------------------
  |  Branch (222:10): [True: 0, False: 118M]
  ------------------
  223|   118M|}
_ZN4llvh6isUIntILj32EEENSt3__19enable_ifIXltT_Li64EEbE4typeEm:
  355|  13.9M|template <> constexpr inline bool isUInt<32>(uint64_t x) {
  356|  13.9M|  return static_cast<uint32_t>(x) == x;
  357|  13.9M|}
_ZN4llvh15maskLeadingOnesIjEET_j:
  227|  12.9M|template <typename T> T maskLeadingOnes(unsigned N) {
  228|  12.9M|  return ~maskTrailingOnes<T>(CHAR_BIT * sizeof(T) - N);
  229|  12.9M|}
_ZN4llvh7alignToEmmm:
  691|  16.4M|inline uint64_t alignTo(uint64_t Value, uint64_t Align, uint64_t Skew = 0) {
  692|  16.4M|  assert(Align != 0u && "Align can't be 0.");
  693|  16.4M|  Skew %= Align;
  694|  16.4M|  return (Value + Align - 1 - Skew) / Align * Align + Skew;
  695|  16.4M|}
_ZN4llvh7alignToILm8EEEmm:
  699|  30.3M|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|  30.3M|  static_assert(Align != 0u, "Align must be non-zero");
  701|  30.3M|  return (Value + Align - 1) / Align * Align;
  702|  30.3M|}
_ZN4llvh12NextPowerOf2Em:
  646|   994k|inline uint64_t NextPowerOf2(uint64_t A) {
  647|   994k|  A |= (A >> 1);
  648|   994k|  A |= (A >> 2);
  649|   994k|  A |= (A >> 4);
  650|   994k|  A |= (A >> 8);
  651|   994k|  A |= (A >> 16);
  652|   994k|  A |= (A >> 32);
  653|   994k|  return A + 1;
  654|   994k|}
_ZN4llvh13isPowerOf2_32Ej:
  435|  2.90M|constexpr inline bool isPowerOf2_32(uint32_t Value) {
  436|  2.90M|  return Value && !(Value & (Value - 1));
  ------------------
  |  Branch (436:10): [True: 2.90M, False: 0]
  |  Branch (436:19): [True: 2.90M, False: 294]
  ------------------
  437|  2.90M|}
_ZN4llvh13isPowerOf2_64Em:
  440|  10.8k|constexpr inline bool isPowerOf2_64(uint64_t Value) {
  441|  10.8k|  return Value && !(Value & (Value - 1));
  ------------------
  |  Branch (441:10): [True: 10.8k, False: 0]
  |  Branch (441:19): [True: 10.8k, False: 0]
  ------------------
  442|  10.8k|}
_ZN4llvh7Log2_32Ej:
  545|  1.17M|inline unsigned Log2_32(uint32_t Value) {
  546|  1.17M|  return 31 - countLeadingZeros(Value);
  547|  1.17M|}
_ZN4llvh12Log2_32_CeilEj:
  558|   103k|inline unsigned Log2_32_Ceil(uint32_t Value) {
  559|   103k|  return 32 - countLeadingZeros(Value - 1);
  560|   103k|}
_ZN4llvh9alignAddrEPKvm:
  629|  10.8k|inline uintptr_t alignAddr(const void *Addr, size_t Alignment) {
  630|  10.8k|  assert(Alignment && isPowerOf2_64((uint64_t)Alignment) &&
  631|  10.8k|         "Alignment is not a power of two!");
  632|       |
  633|  10.8k|  assert((uintptr_t)Addr + Alignment - 1 >= (uintptr_t)Addr);
  634|       |
  635|  10.8k|  return (((uintptr_t)Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1));
  636|  10.8k|}
_ZN4llvh19alignmentAdjustmentEPKvm:
  640|    640|inline size_t alignmentAdjustment(const void *Ptr, size_t Alignment) {
  641|    640|  return alignAddr(Ptr, Alignment) - (uintptr_t)Ptr;
  642|    640|}
_ZN4llvh12PowerOf2CeilEm:
  665|   209k|inline uint64_t PowerOf2Ceil(uint64_t A) {
  666|   209k|  if (!A)
  ------------------
  |  Branch (666:7): [True: 0, False: 209k]
  ------------------
  667|      0|    return 0;
  668|   209k|  return NextPowerOf2(A - 1);
  669|   209k|}
_ZN4llvh6isUIntILj29EEENSt3__19enable_ifIXltT_Li64EEbE4typeEm:
  338|  4.71M|isUInt(uint64_t X) {
  339|  4.71M|  static_assert(N > 0, "isUInt<0> doesn't make sense");
  340|  4.71M|  return X < (UINT64_C(1) << (N));
  341|  4.71M|}
_ZN4llvh6isUIntILj28EEENSt3__19enable_ifIXltT_Li64EEbE4typeEm:
  338|  7.70M|isUInt(uint64_t X) {
  339|  7.70M|  static_assert(N > 0, "isUInt<0> doesn't make sense");
  340|  7.70M|  return X < (UINT64_C(1) << (N));
  341|  7.70M|}
_ZN4llvh12SignExtend32ILj29EEEij:
  739|  5.52M|template <unsigned B> constexpr inline int32_t SignExtend32(uint32_t X) {
  740|  5.52M|  static_assert(B > 0, "Bit width can't be 0.");
  741|  5.52M|  static_assert(B <= 32, "Bit width out of range.");
  742|  5.52M|  return int32_t(X << (32 - B)) >> (32 - B);
  743|  5.52M|}
_ZN4llvh7alignToILm4EEEmm:
  699|  6.01M|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|  6.01M|  static_assert(Align != 0u, "Align must be non-zero");
  701|  6.01M|  return (Value + Align - 1) / Align * Align;
  702|  6.01M|}
_ZN4llvh7alignToILm1024EEEmm:
  699|  2.25k|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|  2.25k|  static_assert(Align != 0u, "Align must be non-zero");
  701|  2.25k|  return (Value + Align - 1) / Align * Align;
  702|  2.25k|}
_ZN4llvh17countLeadingZerosIjEEmT_NS_12ZeroBehaviorE:
  195|  1.27M|std::size_t countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  196|  1.27M|  static_assert(std::numeric_limits<T>::is_integer &&
  197|  1.27M|                    !std::numeric_limits<T>::is_signed,
  198|  1.27M|                "Only unsigned integral types are allowed.");
  199|  1.27M|  return llvh::detail::LeadingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  200|  1.27M|}
_ZN4llvh6detail19LeadingZerosCounterIjLm4EE5countEjNS_12ZeroBehaviorE:
  154|  1.27M|  static std::size_t count(T Val, ZeroBehavior ZB) {
  155|  1.27M|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (155:9): [True: 1.27M, False: 0]
  |  Branch (155:31): [True: 103k, False: 1.17M]
  ------------------
  156|   103k|      return 32;
  157|       |
  158|  1.17M|#if __has_builtin(__builtin_clz) || LLVM_GNUC_PREREQ(4, 0, 0)
  159|  1.17M|    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.27M|  }
_ZN4llvh17countLeadingZerosImEEmT_NS_12ZeroBehaviorE:
  195|      6|std::size_t countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  196|      6|  static_assert(std::numeric_limits<T>::is_integer &&
  197|      6|                    !std::numeric_limits<T>::is_signed,
  198|      6|                "Only unsigned integral types are allowed.");
  199|      6|  return llvh::detail::LeadingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  200|      6|}
_ZN4llvh6detail19LeadingZerosCounterImLm8EE5countEmNS_12ZeroBehaviorE:
  170|      6|  static std::size_t count(T Val, ZeroBehavior ZB) {
  171|      6|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (171:9): [True: 6, False: 0]
  |  Branch (171:31): [True: 0, False: 6]
  ------------------
  172|      0|      return 64;
  173|       |
  174|      6|#if __has_builtin(__builtin_clzll) || LLVM_GNUC_PREREQ(4, 0, 0)
  175|      6|    return __builtin_clzll(Val);
  176|       |#elif defined(_MSC_VER)
  177|       |    unsigned long Index;
  178|       |    _BitScanReverse64(&Index, Val);
  179|       |    return Index ^ 63;
  180|       |#endif
  181|      6|  }
_ZN4llvh17maskTrailingZerosImEET_j:
  233|  2.50M|template <typename T> T maskTrailingZeros(unsigned N) {
  234|  2.50M|  return maskLeadingOnes<T>(CHAR_BIT * sizeof(T) - N);
  235|  2.50M|}
_ZN4llvh16maskTrailingOnesImEET_j:
  218|  4.64M|template <typename T> T maskTrailingOnes(unsigned N) {
  219|  4.64M|  static_assert(std::is_unsigned<T>::value, "Invalid type!");
  220|  4.64M|  const unsigned Bits = CHAR_BIT * sizeof(T);
  221|  4.64M|  assert(N <= Bits && "Invalid bit index");
  222|  4.64M|  return N == 0 ? 0 : (T(-1) >> (Bits - N));
  ------------------
  |  Branch (222:10): [True: 2.50M, False: 2.13M]
  ------------------
  223|  4.64M|}
_ZN4llvh18countTrailingZerosImEEmT_NS_12ZeroBehaviorE:
  126|  3.09M|std::size_t countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  127|  3.09M|  static_assert(std::numeric_limits<T>::is_integer &&
  128|  3.09M|                    !std::numeric_limits<T>::is_signed,
  129|  3.09M|                "Only unsigned integral types are allowed.");
  130|  3.09M|  return llvh::detail::TrailingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  131|  3.09M|}
_ZN4llvh6detail20TrailingZerosCounterImLm8EE5countEmNS_12ZeroBehaviorE:
  101|  3.09M|  static std::size_t count(T Val, ZeroBehavior ZB) {
  102|  3.09M|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (102:9): [True: 3.09M, False: 0]
  |  Branch (102:31): [True: 386, False: 3.09M]
  ------------------
  103|    386|      return 64;
  104|       |
  105|  3.09M|#if __has_builtin(__builtin_ctzll) || LLVM_GNUC_PREREQ(4, 0, 0)
  106|  3.09M|    return __builtin_ctzll(Val);
  107|       |#elif defined(_MSC_VER)
  108|       |    unsigned long Index;
  109|       |    _BitScanForward64(&Index, Val);
  110|       |    return Index;
  111|       |#endif
  112|  3.09M|  }
_ZN4llvh15maskLeadingOnesImEET_j:
  227|  2.50M|template <typename T> T maskLeadingOnes(unsigned N) {
  228|  2.50M|  return ~maskTrailingOnes<T>(CHAR_BIT * sizeof(T) - N);
  229|  2.50M|}
_ZN4llvh17maskTrailingZerosIjEET_j:
  233|   644k|template <typename T> T maskTrailingZeros(unsigned N) {
  234|   644k|  return maskLeadingOnes<T>(CHAR_BIT * sizeof(T) - N);
  235|   644k|}
_ZN4llvh16maskLeadingZerosImEET_j:
  239|  1.04k|template <typename T> T maskLeadingZeros(unsigned N) {
  240|  1.04k|  return maskTrailingOnes<T>(CHAR_BIT * sizeof(T) - N);
  241|  1.04k|}
_ZN4llvh18countTrailingZerosIjEEmT_NS_12ZeroBehaviorE:
  126|  3.99M|std::size_t countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  127|  3.99M|  static_assert(std::numeric_limits<T>::is_integer &&
  128|  3.99M|                    !std::numeric_limits<T>::is_signed,
  129|  3.99M|                "Only unsigned integral types are allowed.");
  130|  3.99M|  return llvh::detail::TrailingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  131|  3.99M|}
_ZN4llvh6detail20TrailingZerosCounterIjLm4EE5countEjNS_12ZeroBehaviorE:
   85|  3.99M|  static std::size_t count(T Val, ZeroBehavior ZB) {
   86|  3.99M|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (86:9): [True: 3.99M, False: 0]
  |  Branch (86:31): [True: 0, False: 3.99M]
  ------------------
   87|      0|      return 32;
   88|       |
   89|  3.99M|#if __has_builtin(__builtin_ctz) || LLVM_GNUC_PREREQ(4, 0, 0)
   90|  3.99M|    return __builtin_ctz(Val);
   91|       |#elif defined(_MSC_VER)
   92|       |    unsigned long Index;
   93|       |    _BitScanForward(&Index, Val);
   94|       |    return Index;
   95|       |#endif
   96|  3.99M|  }
_ZN4llvh7alignToILm4194304EEEmm:
  699|    160|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|    160|  static_assert(Align != 0u, "Align must be non-zero");
  701|    160|  return (Value + Align - 1) / Align * Align;
  702|    160|}

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

_ZNK4llvh12MemoryBuffer14getBufferStartEv:
   60|   294k|  const char *getBufferStart() const { return BufferStart; }
_ZNK4llvh12MemoryBuffer12getBufferEndEv:
   61|   105k|  const char *getBufferEnd() const   { return BufferEnd; }
_ZNK4llvh12MemoryBuffer13getBufferSizeEv:
   62|   242k|  size_t getBufferSize() const { return BufferEnd-BufferStart; }
_ZNK4llvh12MemoryBuffer9getBufferEv:
   64|    247|  StringRef getBuffer() const {
   65|    247|    return StringRef(BufferStart, getBufferSize());
   66|    247|  }
_ZN4llvh20WritableMemoryBuffer14getBufferStartEv:
  170|     84|  char *getBufferStart() {
  171|     84|    return const_cast<char *>(MemoryBuffer::getBufferStart());
  172|     84|  }
_ZN4llvh12MemoryBufferC2Ev:
   47|    494|  MemoryBuffer() = default;
_ZN4llvh20WritableMemoryBufferC2Ev:
  158|     84|  WritableMemoryBuffer() = 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|     21|      SmartScopedLock(SmartMutex<mt_only>& m) : mtx(m) {
  147|     21|        mtx.lock();
  148|     21|      }
_ZN4llvh3sys10SmartMutexILb1EE4lockEv:
  100|     21|      bool lock() {
  101|     21|        if (!mt_only || llvm_is_multithreaded()) {
  ------------------
  |  Branch (101:13): [Folded - Ignored]
  |  Branch (101:25): [True: 21, False: 0]
  ------------------
  102|     21|          return impl.acquire();
  103|     21|        } 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|     21|      }
_ZN4llvh3sys15SmartScopedLockILb1EED2Ev:
  150|     21|      ~SmartScopedLock() {
  151|     21|        mtx.unlock();
  152|     21|      }
_ZN4llvh3sys10SmartMutexILb1EE6unlockEv:
  113|     21|      bool unlock() {
  114|     21|        if (!mt_only || llvm_is_multithreaded()) {
  ------------------
  |  Branch (114:13): [Folded - Ignored]
  |  Branch (114:25): [True: 21, False: 0]
  ------------------
  115|     21|          return impl.release();
  116|     21|        } 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|     21|      }

_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|   685k|  static inline const void *getAsVoidPointer(const T *P) {
   95|   685k|    return NonConst::getAsVoidPointer(const_cast<T *>(P));
   96|   685k|  }
_ZN4llvh21PointerLikeTypeTraitsIPN6hermes10BasicBlockEE16getAsVoidPointerES3_:
   57|  4.48M|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPN6hermes10BasicBlockEE18getFromVoidPointerEPv:
   58|  40.6k|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPN6hermes12UniqueStringEE16getAsVoidPointerES3_:
   57|   103k|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorIhNS1_9allocatorIhEEEEE18getFromVoidPointerEPv:
   58|   242k|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorItNS1_9allocatorItEEEEE18getFromVoidPointerEPv:
   58|      2|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEE18getFromVoidPointerEPv:
   58|   241k|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorIhNS1_9allocatorIhEEEEE16getAsVoidPointerES6_:
   57|      1|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorItNS1_9allocatorItEEEEE16getAsVoidPointerES6_:
   57|      2|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEE16getAsVoidPointerES6_:
   57|    244|  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|    309|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|    309|  return false;
   15|    309|#endif
   16|    309|}
_ZN4llvh20shouldReverseIterateINS_8ArrayRefIhEEEEbv:
   10|     10|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|     10|  return false;
   15|     10|#endif
   16|     10|}
_ZN4llvh20shouldReverseIterateINS_9StringRefEEEbv:
   10|  27.9M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  27.9M|  return false;
   15|  27.9M|#endif
   16|  27.9M|}
_ZN4llvh20shouldReverseIterateIjEEbv:
   10|  13.3M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  13.3M|  return false;
   15|  13.3M|#endif
   16|  13.3M|}
_ZN4llvh20shouldReverseIterateIPvEEbv:
   10|  10.8M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  10.8M|  return false;
   15|  10.8M|#endif
   16|  10.8M|}
_ZN4llvh20shouldReverseIterateIN6hermes10IdentifierEEEbv:
   10|  2.14M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  2.14M|  return false;
   15|  2.14M|#endif
   16|  2.14M|}
_ZN4llvh20shouldReverseIterateIPN6hermes8FunctionEEEbv:
   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|}
_ZN4llvh20shouldReverseIterateIN6hermes2vm6detail10TransitionEEEbv:
   10|  1.44M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  1.44M|  return false;
   15|  1.44M|#endif
   16|  1.44M|}
_ZN4llvh20shouldReverseIterateINS_8ArrayRefIDsEEEEbv:
   10|      8|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|      8|  return false;
   15|      8|#endif
   16|      8|}
_ZN4llvh20shouldReverseIterateIPN6hermes2vm6DomainEEEbv:
   10|    678|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|    678|  return false;
   15|    678|#endif
   16|    678|}
_ZN4llvh20shouldReverseIterateIPN6hermes2vm7RuntimeEEEbv:
   10|  1.12k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  1.12k|  return false;
   15|  1.12k|#endif
   16|  1.12k|}
_ZN4llvh20shouldReverseIterateIPN6hermes10BasicBlockEEEbv:
   10|  39.2M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  39.2M|  return false;
   15|  39.2M|#endif
   16|  39.2M|}
_ZN4llvh20shouldReverseIterateIPKN6hermes10BasicBlockEEEbv:
   10|   843k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   843k|  return false;
   15|   843k|#endif
   16|   843k|}
_ZN4llvh20shouldReverseIterateIPN6hermes9ScopeDescEEEbv:
   10|  31.2M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  31.2M|  return false;
   15|  31.2M|#endif
   16|  31.2M|}
_ZN4llvh20shouldReverseIterateIPN6hermes12UniqueStringEEEbv:
   10|   452k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   452k|  return false;
   15|   452k|#endif
   16|   452k|}
_ZN4llvh20shouldReverseIterateIPN6hermes11InstructionEEEbv:
   10|  50.2M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  50.2M|  return false;
   15|  50.2M|#endif
   16|  50.2M|}
_ZN4llvh20shouldReverseIterateIPN6hermes5ValueEEEbv:
   10|  1.93M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  1.93M|  return false;
   15|  1.93M|#endif
   16|  1.93M|}
_ZN4llvh20shouldReverseIterateIPN6hermes9CatchInstEEEbv:
   10|  81.2k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  81.2k|  return false;
   15|  81.2k|#endif
   16|  81.2k|}
_ZN4llvh20shouldReverseIterateIPN6hermes6ESTree4NodeEEEbv:
   10|  1.55M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  1.55M|  return false;
   15|  1.55M|#endif
   16|  1.55M|}
_ZN4llvh20shouldReverseIterateIPKN6hermes9ScopeDescEEEbv:
   10|    784|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|    784|  return false;
   15|    784|#endif
   16|    784|}

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

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

_ZN4llvh14SaveAndRestoreIPN6hermes5irgen15FunctionContextEEC2ERS4_RKS4_:
   24|    196|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|    196|    X = NewValue;
   26|    196|  }
_ZN4llvh14SaveAndRestoreIPN6hermes5irgen15FunctionContextEED2Ev:
   27|    196|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIbEC2ERbRKb:
   24|  1.05M|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|  1.05M|    X = NewValue;
   26|  1.05M|  }
_ZN4llvh14SaveAndRestoreIbED2Ev:
   27|  1.05M|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIbE3getEv:
   28|  11.2k|  T get() { return OldValue; }
_ZN4llvh14SaveAndRestoreIjEC2ERjRKj:
   24|  8.90M|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|  8.90M|    X = NewValue;
   26|  8.90M|  }
_ZN4llvh14SaveAndRestoreIjED2Ev:
   27|  8.90M|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree17LoopStatementNodeEEC2ERS4_RKS4_:
   24|     15|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|     15|    X = NewValue;
   26|     15|  }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree17LoopStatementNodeEED2Ev:
   27|     15|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree13StatementNodeEEC2ERS4_RKS4_:
   24|     15|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|     15|    X = NewValue;
   26|     15|  }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree13StatementNodeEED2Ev:
   27|     15|  ~SaveAndRestore() { X = OldValue; }

_ZN4llvh12SMDiagnosticC2Ev:
  304|    247|  SMDiagnostic() = default;
_ZN4llvh9SourceMgrD2Ev:
  128|    247|  ~SourceMgr() = default;
_ZNK4llvh9SourceMgr15isValidBufferIDEj:
  122|   243k|  bool isValidBufferID(unsigned i) const { return i && i <= Buffers.size(); }
  ------------------
  |  Branch (122:51): [True: 243k, False: 0]
  |  Branch (122:56): [True: 243k, False: 0]
  ------------------
_ZN4llvh9SourceMgr14setDiagHandlerEPFvRKNS_12SMDiagnosticEPvES4_:
  136|    741|  void setDiagHandler(DiagHandlerTy DH, void *Ctx = nullptr) {
  137|    741|    DiagHandler = DH;
  138|    741|    DiagContext = Ctx;
  139|    741|  }
_ZNK4llvh9SourceMgr14getDiagHandlerEv:
  141|    247|  DiagHandlerTy getDiagHandler() const { return DiagHandler; }
_ZNK4llvh9SourceMgr14getDiagContextEv:
  142|    247|  void *getDiagContext() const { return DiagContext; }
_ZNK4llvh9SourceMgr13getBufferInfoEj:
  144|   241k|  const SrcBuffer &getBufferInfo(unsigned i) const {
  145|   241k|    assert(isValidBufferID(i));
  146|   241k|    return Buffers[i - 1];
  147|   241k|  }
_ZNK4llvh9SourceMgr15getMemoryBufferEj:
  149|  1.52k|  const MemoryBuffer *getMemoryBuffer(unsigned i) const {
  150|  1.52k|    assert(isValidBufferID(i));
  151|  1.52k|    return Buffers[i - 1].Buffer.get();
  152|  1.52k|  }
_ZN4llvh9SourceMgr18AddNewSourceBufferENSt3__110unique_ptrINS_12MemoryBufferENS1_14default_deleteIS3_EEEENS_5SMLocE:
  171|    407|                              SMLoc IncludeLoc) {
  172|    407|    const char * End = F->getBufferEnd();
  173|    407|    SrcBuffer NB;
  174|    407|    NB.Buffer = std::move(F);
  175|    407|    NB.IncludeLoc = IncludeLoc;
  176|    407|    Buffers.push_back(std::move(NB));
  177|    407|    unsigned BufId = Buffers.size();
  178|    407|    BufferEnds.emplace(End, BufId);
  179|    407|    return BufId;
  180|    407|  }
_ZNK4llvh12SMDiagnostic9getLineNoEv:
  319|     51|  int getLineNo() const { return LineNo; }
_ZNK4llvh12SMDiagnostic11getColumnNoEv:
  320|     51|  int getColumnNo() const { return ColumnNo; }
_ZNK4llvh12SMDiagnostic7getKindEv:
  321|    772|  SourceMgr::DiagKind getKind() const { return Kind; }
_ZNK4llvh12SMDiagnostic10getMessageEv:
  322|    204|  StringRef getMessage() const { return Message; }
_ZN4llvh9SourceMgrC2Ev:
  125|    247|  SourceMgr() = default;
_ZN4llvh9SourceMgr9SrcBufferC2Ev:
  100|    407|    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|  3.52k|  ~TimeRegion() {
  153|  3.52k|    if (T) T->stopTimer();
  ------------------
  |  Branch (153:9): [True: 0, False: 3.52k]
  ------------------
  154|  3.52k|  }
_ZN4llvh10TimeRegionC2EPNS_5TimerE:
  149|  3.52k|  explicit TimeRegion(Timer *t) : T(t) {
  150|  3.52k|    if (T) T->startTimer();
  ------------------
  |  Branch (150:9): [True: 0, False: 3.52k]
  ------------------
  151|  3.52k|  }

_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE18getTrailingObjectsIcEEPKT_v:
  309|  9.64M|  template <typename T> const T *getTrailingObjects() const {
  310|  9.64M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  9.64M|    return this->getTrailingObjectsImpl(
  314|  9.64M|        static_cast<const BaseTy *>(this),
  315|  9.64M|        TrailingObjectsBase::OverloadToken<T>());
  316|  9.64M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE31verifyTrailingObjectsAssertionsEv:
  257|  10.0M|  static void verifyTrailingObjectsAssertions() {
  258|  10.0M|#ifdef LLVM_IS_FINAL
  259|  10.0M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  10.0M|#endif
  261|  10.0M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  168|  9.64M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  9.64M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  9.64M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  9.64M|                TopTrailingObj::callNumTrailingObjects(
  172|  9.64M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  9.64M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  9.64M|    else
  178|  9.64M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  9.64M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|  9.64M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  9.64M|    return Obj;
  268|  9.64M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|  10.0M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  10.0M|    return 1;
  287|  10.0M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE18getTrailingObjectsIcEEPKT_v:
  309|  3.19M|  template <typename T> const T *getTrailingObjects() const {
  310|  3.19M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  3.19M|    return this->getTrailingObjectsImpl(
  314|  3.19M|        static_cast<const BaseTy *>(this),
  315|  3.19M|        TrailingObjectsBase::OverloadToken<T>());
  316|  3.19M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE31verifyTrailingObjectsAssertionsEv:
  257|  7.66M|  static void verifyTrailingObjectsAssertions() {
  258|  7.66M|#ifdef LLVM_IS_FINAL
  259|  7.66M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  7.66M|#endif
  261|  7.66M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  168|  3.19M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  3.19M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  3.19M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  3.19M|                TopTrailingObj::callNumTrailingObjects(
  172|  3.19M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  3.19M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  3.19M|    else
  178|  3.19M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  3.19M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|  3.19M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  3.19M|    return Obj;
  268|  3.19M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|  7.66M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  7.66M|    return 1;
  287|  7.66M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE18getTrailingObjectsIDsEEPKT_v:
  309|   391k|  template <typename T> const T *getTrailingObjects() const {
  310|   391k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|   391k|    return this->getTrailingObjectsImpl(
  314|   391k|        static_cast<const BaseTy *>(this),
  315|   391k|        TrailingObjectsBase::OverloadToken<T>());
  316|   391k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE31verifyTrailingObjectsAssertionsEv:
  257|   391k|  static void verifyTrailingObjectsAssertions() {
  258|   391k|#ifdef LLVM_IS_FINAL
  259|   391k|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|   391k|#endif
  261|   391k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  168|   391k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|   391k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|   391k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|   391k|                TopTrailingObj::callNumTrailingObjects(
  172|   391k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|   391k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|   391k|    else
  178|   391k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|   391k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|   391k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|   391k|    return Obj;
  268|   391k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|   391k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|   391k|    return 1;
  287|   391k|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE18getTrailingObjectsIDsEEPKT_v:
  309|   781k|  template <typename T> const T *getTrailingObjects() const {
  310|   781k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|   781k|    return this->getTrailingObjectsImpl(
  314|   781k|        static_cast<const BaseTy *>(this),
  315|   781k|        TrailingObjectsBase::OverloadToken<T>());
  316|   781k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE31verifyTrailingObjectsAssertionsEv:
  257|  1.80M|  static void verifyTrailingObjectsAssertions() {
  258|  1.80M|#ifdef LLVM_IS_FINAL
  259|  1.80M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  1.80M|#endif
  261|  1.80M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  168|   781k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|   781k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|   781k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|   781k|                TopTrailingObj::callNumTrailingObjects(
  172|   781k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|   781k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|   781k|    else
  178|   781k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|   781k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|   781k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|   781k|    return Obj;
  268|   781k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|  1.80M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  1.80M|    return 1;
  287|  1.80M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm15BigIntPrimitiveEJmEE18getTrailingObjectsImEEPKT_v:
  309|   781k|  template <typename T> const T *getTrailingObjects() const {
  310|   781k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|   781k|    return this->getTrailingObjectsImpl(
  314|   781k|        static_cast<const BaseTy *>(this),
  315|   781k|        TrailingObjectsBase::OverloadToken<T>());
  316|   781k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15BigIntPrimitiveEJmEE31verifyTrailingObjectsAssertionsEv:
  257|  1.17M|  static void verifyTrailingObjectsAssertions() {
  258|  1.17M|#ifdef LLVM_IS_FINAL
  259|  1.17M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  1.17M|#endif
  261|  1.17M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm15BigIntPrimitiveENS_15TrailingObjectsIS4_JmEEES4_JmEE22getTrailingObjectsImplEPKS4_NS0_19TrailingObjectsBase13OverloadTokenImEE:
  168|   781k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|   781k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|   781k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|   781k|                TopTrailingObj::callNumTrailingObjects(
  172|   781k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|   781k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|   781k|    else
  178|   781k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|   781k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15BigIntPrimitiveEJmEE22getTrailingObjectsImplEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  266|   781k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|   781k|    return Obj;
  268|   781k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15BigIntPrimitiveEJmEE22callNumTrailingObjectsEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  285|  1.17M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  1.17M|    return 1;
  287|  1.17M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPKT_v:
  309|  2.09M|  template <typename T> const T *getTrailingObjects() const {
  310|  2.09M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  2.09M|    return this->getTrailingObjectsImpl(
  314|  2.09M|        static_cast<const BaseTy *>(this),
  315|  2.09M|        TrailingObjectsBase::OverloadToken<T>());
  316|  2.09M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE31verifyTrailingObjectsAssertionsEv:
  257|  5.78M|  static void verifyTrailingObjectsAssertions() {
  258|  5.78M|#ifdef LLVM_IS_FINAL
  259|  5.78M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  5.78M|#endif
  261|  5.78M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPKS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  168|  2.09M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  2.09M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  2.09M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  2.09M|                TopTrailingObj::callNumTrailingObjects(
  172|  2.09M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  2.09M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  2.09M|    else
  178|  2.09M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  2.09M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  266|  2.09M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  2.09M|    return Obj;
  268|  2.09M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22callNumTrailingObjectsEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  285|  5.78M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  5.78M|    return 1;
  287|  5.78M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15BigIntPrimitiveEJmEE18getTrailingObjectsImEEPT_v:
  321|   390k|  template <typename T> T *getTrailingObjects() {
  322|   390k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|   390k|    return this->getTrailingObjectsImpl(
  326|   390k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|   390k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm15BigIntPrimitiveENS_15TrailingObjectsIS4_JmEEES4_JmEE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenImEE:
  183|   390k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|   390k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|   390k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|   390k|                TopTrailingObj::callNumTrailingObjects(
  187|   390k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|   390k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|   390k|    else
  192|   390k|      return reinterpret_cast<NextTy *>(Ptr);
  193|   390k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15BigIntPrimitiveEJmEE22getTrailingObjectsImplEPS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  272|   390k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|   390k|    return Obj;
  274|   390k|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPKT_v:
  309|  9.02M|  template <typename T> const T *getTrailingObjects() const {
  310|  9.02M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  9.02M|    return this->getTrailingObjectsImpl(
  314|  9.02M|        static_cast<const BaseTy *>(this),
  315|  9.02M|        TrailingObjectsBase::OverloadToken<T>());
  316|  9.02M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE31verifyTrailingObjectsAssertionsEv:
  257|  9.10M|  static void verifyTrailingObjectsAssertions() {
  258|  9.10M|#ifdef LLVM_IS_FINAL
  259|  9.10M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  9.10M|#endif
  261|  9.10M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm18SegmentedArrayBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPKS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  168|  9.02M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  9.02M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  9.02M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  9.02M|                TopTrailingObj::callNumTrailingObjects(
  172|  9.02M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  9.02M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  9.02M|    else
  178|  9.02M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  9.02M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  266|  9.02M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  9.02M|    return Obj;
  268|  9.02M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22callNumTrailingObjectsEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  285|  9.10M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  9.10M|    return 1;
  287|  9.10M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE16totalSizeToAllocIJS7_EEENSt3__19enable_ifIXsr3std7is_sameINS8_3FooIJS7_EEENSC_IJDpT_EEEEE5valueEmE4typeEm:
  351|  9.88M|                   TrailingTys, size_t>::type... Counts) {
  352|  9.88M|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  9.88M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm18SegmentedArrayBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE25additionalSizeToAllocImplEmm:
  200|  9.88M|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  9.88M|    return ParentType::additionalSizeToAllocImpl(
  202|  9.88M|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  9.88M|                               : SizeSoFar) +
  204|  9.88M|            sizeof(NextTy) * Count1,
  205|  9.88M|        MoreCounts...);
  206|  9.88M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm18SegmentedArrayBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES9_JEE25additionalSizeToAllocImplEm:
  220|  9.88M|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  9.88M|    return SizeSoFar;
  222|  9.88M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm9CodeBlockENS_15TrailingObjectsIS4_JNS3_18PropertyCacheEntryEEEES6_JEE25additionalSizeToAllocImplEm:
  220|  6.51k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  6.51k|    return SizeSoFar;
  222|  6.51k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm9CodeBlockENS_15TrailingObjectsIS4_JNS3_18PropertyCacheEntryEEEES4_JS6_EE25additionalSizeToAllocImplEmm:
  200|  6.51k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  6.51k|    return ParentType::additionalSizeToAllocImpl(
  202|  6.51k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  6.51k|                               : SizeSoFar) +
  204|  6.51k|            sizeof(NextTy) * Count1,
  205|  6.51k|        MoreCounts...);
  206|  6.51k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE16totalSizeToAllocIJS4_EEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJS4_EEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|  6.51k|                   TrailingTys, size_t>::type... Counts) {
  352|  6.51k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  6.51k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm16ArrayStorageBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES9_JEE25additionalSizeToAllocImplEm:
  220|    480|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|    480|    return SizeSoFar;
  222|    480|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm16ArrayStorageBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE25additionalSizeToAllocImplEmm:
  200|    480|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|    480|    return ParentType::additionalSizeToAllocImpl(
  202|    480|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|    480|                               : SizeSoFar) +
  204|    480|            sizeof(NextTy) * Count1,
  205|    480|        MoreCounts...);
  206|    480|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE16totalSizeToAllocIJS7_EEENSt3__19enable_ifIXsr3std7is_sameINS8_3FooIJS7_EEENSC_IJDpT_EEEEE5valueEmE4typeEm:
  351|    480|                   TrailingTys, size_t>::type... Counts) {
  352|    480|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|    480|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES9_JEE25additionalSizeToAllocImplEm:
  220|  2.02M|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  2.02M|    return SizeSoFar;
  222|  2.02M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE25additionalSizeToAllocImplEmm:
  200|  2.02M|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  2.02M|    return ParentType::additionalSizeToAllocImpl(
  202|  2.02M|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  2.02M|                               : SizeSoFar) +
  204|  2.02M|            sizeof(NextTy) * Count1,
  205|  2.02M|        MoreCounts...);
  206|  2.02M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE16totalSizeToAllocIJS7_EEENSt3__19enable_ifIXsr3std7is_sameINS8_3FooIJS7_EEENSC_IJDpT_EEEEE5valueEmE4typeEm:
  351|  2.02M|                   TrailingTys, size_t>::type... Counts) {
  352|  2.02M|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  2.02M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEESC_JEE25additionalSizeToAllocImplEm:
  220|   209k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|   209k|    return SizeSoFar;
  222|   209k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEESA_JSC_EE25additionalSizeToAllocImplEmm:
  200|   209k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|   209k|    return ParentType::additionalSizeToAllocImpl(
  202|   209k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|   209k|                               : SizeSoFar) +
  204|   209k|            sizeof(NextTy) * Count1,
  205|   209k|        MoreCounts...);
  206|   209k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEES4_JSA_SC_EE25additionalSizeToAllocImplEmmm:
  200|   209k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|   209k|    return ParentType::additionalSizeToAllocImpl(
  202|   209k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|   209k|                               : SizeSoFar) +
  204|   209k|            sizeof(NextTy) * Count1,
  205|   209k|        MoreCounts...);
  206|   209k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE16totalSizeToAllocIJS8_SA_EEENS4_9enable_ifIXsr3std7is_sameINSB_3FooIJS8_SA_EEENSE_IJDpT_EEEEE5valueEmE4typeEmm:
  351|   209k|                   TrailingTys, size_t>::type... Counts) {
  352|   209k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|   209k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES9_JEE25additionalSizeToAllocImplEm:
  220|  19.9M|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  19.9M|    return SizeSoFar;
  222|  19.9M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE25additionalSizeToAllocImplEmm:
  200|  19.9M|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  19.9M|    return ParentType::additionalSizeToAllocImpl(
  202|  19.9M|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  19.9M|                               : SizeSoFar) +
  204|  19.9M|            sizeof(NextTy) * Count1,
  205|  19.9M|        MoreCounts...);
  206|  19.9M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE16totalSizeToAllocIJS7_EEENSt3__19enable_ifIXsr3std7is_sameINS8_3FooIJS7_EEENSC_IJDpT_EEEEE5valueEmE4typeEm:
  351|  19.9M|                   TrailingTys, size_t>::type... Counts) {
  352|  19.9M|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  19.9M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm11EnvironmentENS_15TrailingObjectsIS4_JNS3_17GCHermesValueBaseINS3_11HermesValueEEEEEES8_JEE25additionalSizeToAllocImplEm:
  220|    836|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|    836|    return SizeSoFar;
  222|    836|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm11EnvironmentENS_15TrailingObjectsIS4_JNS3_17GCHermesValueBaseINS3_11HermesValueEEEEEES4_JS8_EE25additionalSizeToAllocImplEmm:
  200|    836|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|    836|    return ParentType::additionalSizeToAllocImpl(
  202|    836|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|    836|                               : SizeSoFar) +
  204|    836|            sizeof(NextTy) * Count1,
  205|    836|        MoreCounts...);
  206|    836|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE16totalSizeToAllocIJS6_EEENSt3__19enable_ifIXsr3std7is_sameINS7_3FooIJS6_EEENSB_IJDpT_EEEEE5valueEmE4typeEm:
  351|    836|                   TrailingTys, size_t>::type... Counts) {
  352|    836|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|    836|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE18getTrailingObjectsIS4_EEPT_v:
  321|  2.10M|  template <typename T> T *getTrailingObjects() {
  322|  2.10M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  2.10M|    return this->getTrailingObjectsImpl(
  326|  2.10M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  2.10M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE31verifyTrailingObjectsAssertionsEv:
  257|  2.10M|  static void verifyTrailingObjectsAssertions() {
  258|  2.10M|#ifdef LLVM_IS_FINAL
  259|  2.10M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  2.10M|#endif
  261|  2.10M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm9CodeBlockENS_15TrailingObjectsIS4_JNS3_18PropertyCacheEntryEEEES4_JS6_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenIS6_EE:
  183|  2.10M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  2.10M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  2.10M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  2.10M|                TopTrailingObj::callNumTrailingObjects(
  187|  2.10M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  2.10M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  2.10M|    else
  192|  2.10M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  2.10M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE22getTrailingObjectsImplEPS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  272|  2.10M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  2.10M|    return Obj;
  274|  2.10M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE22callNumTrailingObjectsEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  285|  2.10M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  2.10M|    return 1;
  287|  2.10M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE18getTrailingObjectsIcEEPT_v:
  321|   415k|  template <typename T> T *getTrailingObjects() {
  322|   415k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|   415k|    return this->getTrailingObjectsImpl(
  326|   415k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|   415k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  183|   415k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|   415k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|   415k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|   415k|                TopTrailingObj::callNumTrailingObjects(
  187|   415k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|   415k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|   415k|    else
  192|   415k|      return reinterpret_cast<NextTy *>(Ptr);
  193|   415k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|   415k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|   415k|    return Obj;
  274|   415k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE18getTrailingObjectsIcEEPT_v:
  321|  4.47M|  template <typename T> T *getTrailingObjects() {
  322|  4.47M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  4.47M|    return this->getTrailingObjectsImpl(
  326|  4.47M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  4.47M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  183|  4.47M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  4.47M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  4.47M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  4.47M|                TopTrailingObj::callNumTrailingObjects(
  187|  4.47M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  4.47M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  4.47M|    else
  192|  4.47M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  4.47M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|  4.47M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  4.47M|    return Obj;
  274|  4.47M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE18getTrailingObjectsIDsEEPT_v:
  321|    216|  template <typename T> T *getTrailingObjects() {
  322|    216|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|    216|    return this->getTrailingObjectsImpl(
  326|    216|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|    216|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  183|    216|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|    216|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|    216|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|    216|                TopTrailingObj::callNumTrailingObjects(
  187|    216|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|    216|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|    216|    else
  192|    216|      return reinterpret_cast<NextTy *>(Ptr);
  193|    216|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|    216|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|    216|    return Obj;
  274|    216|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE18getTrailingObjectsIDsEEPT_v:
  321|  1.02M|  template <typename T> T *getTrailingObjects() {
  322|  1.02M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  1.02M|    return this->getTrailingObjectsImpl(
  326|  1.02M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  1.02M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  183|  1.02M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  1.02M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  1.02M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  1.02M|                TopTrailingObj::callNumTrailingObjects(
  187|  1.02M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  1.02M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  1.02M|    else
  192|  1.02M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  1.02M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|  1.02M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  1.02M|    return Obj;
  274|  1.02M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE18getTrailingObjectsIS8_EEPT_v:
  321|  7.70M|  template <typename T> T *getTrailingObjects() {
  322|  7.70M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  7.70M|    return this->getTrailingObjectsImpl(
  326|  7.70M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  7.70M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE31verifyTrailingObjectsAssertionsEv:
  257|  47.1M|  static void verifyTrailingObjectsAssertions() {
  258|  47.1M|#ifdef LLVM_IS_FINAL
  259|  47.1M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  47.1M|#endif
  261|  47.1M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEES4_JSA_SC_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenISA_EE:
  183|  38.7M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  38.7M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  38.7M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  38.7M|                TopTrailingObj::callNumTrailingObjects(
  187|  38.7M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  38.7M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  38.7M|    else
  192|  38.7M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  38.7M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22getTrailingObjectsImplEPS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  272|  38.7M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  38.7M|    return Obj;
  274|  38.7M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22callNumTrailingObjectsEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  285|  47.1M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  47.1M|    return 1;
  287|  47.1M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE18getTrailingObjectsIS8_EEPKT_v:
  309|  8.48M|  template <typename T> const T *getTrailingObjects() const {
  310|  8.48M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  8.48M|    return this->getTrailingObjectsImpl(
  314|  8.48M|        static_cast<const BaseTy *>(this),
  315|  8.48M|        TrailingObjectsBase::OverloadToken<T>());
  316|  8.48M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEES4_JSA_SC_EE22getTrailingObjectsImplEPKS4_NS0_19TrailingObjectsBase13OverloadTokenISA_EE:
  168|  8.48M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  8.48M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  8.48M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  8.48M|                TopTrailingObj::callNumTrailingObjects(
  172|  8.48M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  8.48M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  8.48M|    else
  178|  8.48M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  8.48M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22getTrailingObjectsImplEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  266|  8.48M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  8.48M|    return Obj;
  268|  8.48M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE18getTrailingObjectsISA_EEPT_v:
  321|  30.9M|  template <typename T> T *getTrailingObjects() {
  322|  30.9M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  30.9M|    return this->getTrailingObjectsImpl(
  326|  30.9M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  30.9M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEESA_JSC_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenISC_EE:
  183|  30.9M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  30.9M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  30.9M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  30.9M|                TopTrailingObj::callNumTrailingObjects(
  187|  30.9M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  30.9M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  30.9M|    else
  192|  30.9M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  30.9M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22callNumTrailingObjectsIS8_EEmPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIT_EE:
  291|  30.9M|                                       TrailingObjectsBase::OverloadToken<T>) {
  292|  30.9M|    return Obj->numTrailingObjects(TrailingObjectsBase::OverloadToken<T>());
  293|  30.9M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPT_v:
  321|  3.69M|  template <typename T> T *getTrailingObjects() {
  322|  3.69M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  3.69M|    return this->getTrailingObjectsImpl(
  326|  3.69M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  3.69M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  183|  3.69M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  3.69M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  3.69M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  3.69M|                TopTrailingObj::callNumTrailingObjects(
  187|  3.69M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  3.69M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  3.69M|    else
  192|  3.69M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  3.69M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  272|  3.69M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  3.69M|    return Obj;
  274|  3.69M|  }
_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|    161|  static void verifyTrailingObjectsAssertions() {
  258|    161|#ifdef LLVM_IS_FINAL
  259|    161|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|    161|#endif
  261|    161|  }
_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|    161|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|    161|    return 1;
  287|    161|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPT_v:
  321|    160|  template <typename T> T *getTrailingObjects() {
  322|    160|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|    160|    return this->getTrailingObjectsImpl(
  326|    160|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|    160|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm16ArrayStorageBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  183|    160|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|    160|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|    160|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|    160|                TopTrailingObj::callNumTrailingObjects(
  187|    160|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|    160|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|    160|    else
  192|    160|      return reinterpret_cast<NextTy *>(Ptr);
  193|    160|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  272|    160|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|    160|    return Obj;
  274|    160|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE18getTrailingObjectsIS6_EEPT_v:
  321|  9.69k|  template <typename T> T *getTrailingObjects() {
  322|  9.69k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  9.69k|    return this->getTrailingObjectsImpl(
  326|  9.69k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  9.69k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE31verifyTrailingObjectsAssertionsEv:
  257|  9.69k|  static void verifyTrailingObjectsAssertions() {
  258|  9.69k|#ifdef LLVM_IS_FINAL
  259|  9.69k|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  9.69k|#endif
  261|  9.69k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm11EnvironmentENS_15TrailingObjectsIS4_JNS3_17GCHermesValueBaseINS3_11HermesValueEEEEEES4_JS8_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenIS8_EE:
  183|  9.69k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  9.69k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  9.69k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  9.69k|                TopTrailingObj::callNumTrailingObjects(
  187|  9.69k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  9.69k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  9.69k|    else
  192|  9.69k|      return reinterpret_cast<NextTy *>(Ptr);
  193|  9.69k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE22getTrailingObjectsImplEPS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  272|  9.69k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  9.69k|    return Obj;
  274|  9.69k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE22callNumTrailingObjectsEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  285|  9.69k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  9.69k|    return 1;
  287|  9.69k|  }
_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|  17.2M|  template <typename T> const T *getTrailingObjects() const {
  310|  17.2M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  17.2M|    return this->getTrailingObjectsImpl(
  314|  17.2M|        static_cast<const BaseTy *>(this),
  315|  17.2M|        TrailingObjectsBase::OverloadToken<T>());
  316|  17.2M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE31verifyTrailingObjectsAssertionsEv:
  257|  19.5M|  static void verifyTrailingObjectsAssertions() {
  258|  19.5M|#ifdef LLVM_IS_FINAL
  259|  19.5M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  19.5M|#endif
  261|  19.5M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPKS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  168|  17.2M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  17.2M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  17.2M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  17.2M|                TopTrailingObj::callNumTrailingObjects(
  172|  17.2M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  17.2M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  17.2M|    else
  178|  17.2M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  17.2M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  266|  17.2M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  17.2M|    return Obj;
  268|  17.2M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22callNumTrailingObjectsEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  285|  19.5M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  19.5M|    return 1;
  287|  19.5M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPT_v:
  321|  2.35M|  template <typename T> T *getTrailingObjects() {
  322|  2.35M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  2.35M|    return this->getTrailingObjectsImpl(
  326|  2.35M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  2.35M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  183|  2.35M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  2.35M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  2.35M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  2.35M|                TopTrailingObj::callNumTrailingObjects(
  187|  2.35M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  2.35M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  2.35M|    else
  192|  2.35M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  2.35M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  272|  2.35M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  2.35M|    return Obj;
  274|  2.35M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE16totalSizeToAllocIJcEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJcEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|   415k|                   TrailingTys, size_t>::type... Counts) {
  352|   415k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|   415k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEES5_JcEE25additionalSizeToAllocImplEmm:
  200|   415k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|   415k|    return ParentType::additionalSizeToAllocImpl(
  202|   415k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|   415k|                               : SizeSoFar) +
  204|   415k|            sizeof(NextTy) * Count1,
  205|   415k|        MoreCounts...);
  206|   415k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEEcJEE25additionalSizeToAllocImplEm:
  220|   415k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|   415k|    return SizeSoFar;
  222|   415k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE16totalSizeToAllocIJDsEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJDsEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|    216|                   TrailingTys, size_t>::type... Counts) {
  352|    216|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|    216|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE25additionalSizeToAllocImplEmm:
  200|    216|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|    216|    return ParentType::additionalSizeToAllocImpl(
  202|    216|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|    216|                               : SizeSoFar) +
  204|    216|            sizeof(NextTy) * Count1,
  205|    216|        MoreCounts...);
  206|    216|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEEDsJEE25additionalSizeToAllocImplEm:
  220|    216|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|    216|    return SizeSoFar;
  222|    216|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE16totalSizeToAllocIJcEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJcEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|  4.08M|                   TrailingTys, size_t>::type... Counts) {
  352|  4.08M|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  4.08M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEES5_JcEE25additionalSizeToAllocImplEmm:
  200|  4.08M|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  4.08M|    return ParentType::additionalSizeToAllocImpl(
  202|  4.08M|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  4.08M|                               : SizeSoFar) +
  204|  4.08M|            sizeof(NextTy) * Count1,
  205|  4.08M|        MoreCounts...);
  206|  4.08M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEEcJEE25additionalSizeToAllocImplEm:
  220|  4.08M|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  4.08M|    return SizeSoFar;
  222|  4.08M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE16totalSizeToAllocIJDsEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJDsEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|   411k|                   TrailingTys, size_t>::type... Counts) {
  352|   411k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|   411k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE25additionalSizeToAllocImplEmm:
  200|   411k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|   411k|    return ParentType::additionalSizeToAllocImpl(
  202|   411k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|   411k|                               : SizeSoFar) +
  204|   411k|            sizeof(NextTy) * Count1,
  205|   411k|        MoreCounts...);
  206|   411k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEEDsJEE25additionalSizeToAllocImplEm:
  220|   411k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|   411k|    return SizeSoFar;
  222|   411k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPT_v:
  321|  77.0k|  template <typename T> T *getTrailingObjects() {
  322|  77.0k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  77.0k|    return this->getTrailingObjectsImpl(
  326|  77.0k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  77.0k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm18SegmentedArrayBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  183|  77.0k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  77.0k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  77.0k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  77.0k|                TopTrailingObj::callNumTrailingObjects(
  187|  77.0k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  77.0k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  77.0k|    else
  192|  77.0k|      return reinterpret_cast<NextTy *>(Ptr);
  193|  77.0k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  272|  77.0k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  77.0k|    return Obj;
  274|  77.0k|  }

_ZN4llvh11raw_ostreamC2Eb:
   89|  20.6M|      : BufferMode(unbuffered ? Unbuffered : InternalBuffer) {
  ------------------
  |  Branch (89:20): [True: 1, False: 20.6M]
  ------------------
   90|       |    // Start out ready to flush.
   91|  20.6M|    OutBufStart = OutBufEnd = OutBufCur = nullptr;
   92|  20.6M|  }
_ZN4llvh11raw_ostream5flushEv:
  142|  20.6M|  void flush() {
  143|  20.6M|    if (OutBufCur != OutBufStart)
  ------------------
  |  Branch (143:9): [True: 17, False: 20.6M]
  ------------------
  144|     17|      flush_nonempty();
  145|  20.6M|  }
_ZN4llvh11raw_ostreamlsEPKc:
  183|   599k|  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|   599k|    return this->operator<<(StringRef(Str));
  188|   599k|  }
_ZN4llvh11raw_ostreamlsENS_9StringRefE:
  168|   743k|  raw_ostream &operator<<(StringRef Str) {
  169|       |    // Inline fast path, particularly for strings with a known length.
  170|   743k|    size_t Size = Str.size();
  171|       |
  172|       |    // Make sure we can use the fast path.
  173|   743k|    if (Size > (size_t)(OutBufEnd - OutBufCur))
  ------------------
  |  Branch (173:9): [True: 418k, False: 325k]
  ------------------
  174|   418k|      return write(Str.data(), Size);
  175|       |
  176|   325k|    if (Size) {
  ------------------
  |  Branch (176:9): [True: 325k, False: 0]
  ------------------
  177|   325k|      memcpy(OutBufCur, Str.data(), Size);
  178|   325k|      OutBufCur += Size;
  179|   325k|    }
  180|   325k|    return *this;
  181|   743k|  }
_ZN4llvh11raw_ostreamlsEi:
  209|    102|  raw_ostream &operator<<(int N) {
  210|    102|    return this->operator<<(static_cast<long>(N));
  211|    102|  }
_ZN4llvh11raw_ostream13SetBufferSizeEm:
  111|      1|  void SetBufferSize(size_t Size) {
  112|      1|    flush();
  113|      1|    SetBufferAndMode(new char[Size], Size, InternalBuffer);
  114|      1|  }
_ZN4llvh11raw_ostream13SetUnbufferedEv:
  129|  20.6M|  void SetUnbuffered() {
  130|  20.6M|    flush();
  131|  20.6M|    SetBufferAndMode(nullptr, 0, Unbuffered);
  132|  20.6M|  }
_ZNK4llvh11raw_ostream19GetNumBytesInBufferEv:
  134|  20.6M|  size_t GetNumBytesInBuffer() const {
  135|  20.6M|    return OutBufCur - OutBufStart;
  136|  20.6M|  }
_ZN4llvh11raw_ostreamlsEc:
  147|  21.8M|  raw_ostream &operator<<(char C) {
  148|  21.8M|    if (OutBufCur >= OutBufEnd)
  ------------------
  |  Branch (148:9): [True: 21.8M, False: 0]
  ------------------
  149|  21.8M|      return write(C);
  150|      0|    *OutBufCur++ = C;
  151|      0|    return *this;
  152|  21.8M|  }
_ZN4llvh11raw_ostreamlsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  190|   325k|  raw_ostream &operator<<(const std::string &Str) {
  191|       |    // Avoid the fast path, it would only increase code size for a marginal win.
  192|   325k|    return write(Str.data(), Str.length());
  193|   325k|  }
_ZN4llvh17raw_pwrite_streamC2Eb:
  347|  20.6M|      : raw_ostream(Unbuffered) {}
_ZNK4llvh14raw_fd_ostream9has_errorEv:
  452|      2|  bool has_error() const { return bool(EC); }
_ZN4llvh19raw_svector_ostreamC2ERNS_15SmallVectorImplIcEE:
  526|  20.6M|  explicit raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) {
  527|  20.6M|    SetUnbuffered();
  528|  20.6M|  }
_ZN4llvh19raw_svector_ostream3strEv:
  535|   136k|  StringRef str() { return StringRef(OS.data(), OS.size()); }

_ZN4llvh5APInt13initFromArrayENS_8ArrayRefImEE:
   92|   781k|void APInt::initFromArray(ArrayRef<uint64_t> bigVal) {
   93|   781k|  assert(BitWidth && "Bitwidth too small");
   94|   781k|  assert(bigVal.data() && "Null pointer detected!");
   95|   781k|  if (isSingleWord())
  ------------------
  |  Branch (95:7): [True: 781k, False: 0]
  ------------------
   96|   781k|    U.VAL = bigVal[0];
   97|      0|  else {
   98|       |    // Get memory, cleared to 0
   99|      0|    U.pVal = getClearedMemory(getNumWords());
  100|       |    // Calculate the number of words to copy
  101|      0|    unsigned words = std::min<unsigned>(bigVal.size(), getNumWords());
  102|       |    // Copy the words from bigVal to pVal
  103|      0|    memcpy(U.pVal, bigVal.data(), words * APINT_WORD_SIZE);
  104|      0|  }
  105|       |  // Make sure unused high bits are cleared
  106|   781k|  clearUnusedBits();
  107|   781k|}
_ZN4llvh5APIntC2EjNS_8ArrayRefImEE:
  110|   781k|  : BitWidth(numBits) {
  111|   781k|  initFromArray(bigVal);
  112|   781k|}
_ZN4llvh5APIntC2EjNS_9StringRefEh:
  120|      5|  : BitWidth(numbits) {
  121|      5|  assert(BitWidth && "Bitwidth too small");
  122|      5|  fromString(numbits, Str, radix);
  123|      5|}
_ZN4llvh5APIntpLEm:
  203|     19|APInt& APInt::operator+=(uint64_t RHS) {
  204|     19|  if (isSingleWord())
  ------------------
  |  Branch (204:7): [True: 19, False: 0]
  ------------------
  205|     19|    U.VAL += RHS;
  206|      0|  else
  207|      0|    tcAddPart(U.pVal, RHS, getNumWords());
  208|     19|  return clearUnusedBits();
  209|     19|}
_ZN4llvh5APIntmLEm:
  262|     19|APInt& APInt::operator*=(uint64_t RHS) {
  263|     19|  if (isSingleWord()) {
  ------------------
  |  Branch (263:7): [True: 19, False: 0]
  ------------------
  264|     19|    U.VAL *= RHS;
  265|     19|  } else {
  266|      0|    unsigned NumWords = getNumWords();
  267|      0|    tcMultiplyPart(U.pVal, U.pVal, RHS, 0, NumWords, NumWords, false);
  268|      0|  }
  269|     19|  return clearUnusedBits();
  270|     19|}
_ZN4llvh5APInt7udivremERKS0_mRS0_Rm:
 1777|  1.56M|                    uint64_t &Remainder) {
 1778|  1.56M|  assert(RHS != 0 && "Divide by zero?");
 1779|  1.56M|  unsigned BitWidth = LHS.BitWidth;
 1780|       |
 1781|       |  // First, deal with the easy case
 1782|  1.56M|  if (LHS.isSingleWord()) {
  ------------------
  |  Branch (1782:7): [True: 1.56M, False: 0]
  ------------------
 1783|  1.56M|    uint64_t QuotVal = LHS.U.VAL / RHS;
 1784|  1.56M|    Remainder = LHS.U.VAL % RHS;
 1785|  1.56M|    Quotient = APInt(BitWidth, QuotVal);
 1786|  1.56M|    return;
 1787|  1.56M|  }
 1788|       |
 1789|       |  // Get some size facts about the dividend and divisor
 1790|      0|  unsigned lhsWords = getNumWords(LHS.getActiveBits());
 1791|       |
 1792|       |  // Check the degenerate cases
 1793|      0|  if (lhsWords == 0) {
  ------------------
  |  Branch (1793:7): [True: 0, False: 0]
  ------------------
 1794|      0|    Quotient = APInt(BitWidth, 0);    // 0 / Y ===> 0
 1795|      0|    Remainder = 0;                    // 0 % Y ===> 0
 1796|      0|    return;
 1797|      0|  }
 1798|       |
 1799|      0|  if (RHS == 1) {
  ------------------
  |  Branch (1799:7): [True: 0, False: 0]
  ------------------
 1800|      0|    Quotient = LHS;                   // X / 1 ===> X
 1801|      0|    Remainder = 0;                    // X % 1 ===> 0
 1802|      0|    return;
 1803|      0|  }
 1804|       |
 1805|      0|  if (LHS.ult(RHS)) {
  ------------------
  |  Branch (1805:7): [True: 0, False: 0]
  ------------------
 1806|      0|    Remainder = LHS.getZExtValue();   // X % Y ===> X, iff X < Y
 1807|      0|    Quotient = APInt(BitWidth, 0);    // X / Y ===> 0, iff X < Y
 1808|      0|    return;
 1809|      0|  }
 1810|       |
 1811|      0|  if (LHS == RHS) {
  ------------------
  |  Branch (1811:7): [True: 0, False: 0]
  ------------------
 1812|      0|    Quotient  = APInt(BitWidth, 1);   // X / X ===> 1
 1813|      0|    Remainder = 0;                    // X % X ===> 0;
 1814|      0|    return;
 1815|      0|  }
 1816|       |
 1817|       |  // Make sure there is enough space to hold the results.
 1818|       |  // NOTE: This assumes that reallocate won't affect any bits if it doesn't
 1819|       |  // change the size. This is necessary if Quotient is aliased with LHS.
 1820|      0|  Quotient.reallocate(BitWidth);
 1821|       |
 1822|      0|  if (lhsWords == 1) { // rhsWords is 1 if lhsWords is 1.
  ------------------
  |  Branch (1822:7): [True: 0, False: 0]
  ------------------
 1823|       |    // There is only one word to consider so use the native versions.
 1824|      0|    uint64_t lhsValue = LHS.U.pVal[0];
 1825|      0|    Quotient = lhsValue / RHS;
 1826|      0|    Remainder = lhsValue % RHS;
 1827|      0|    return;
 1828|      0|  }
 1829|       |
 1830|       |  // Okay, lets do it the long way
 1831|      0|  divide(LHS.U.pVal, lhsWords, &RHS, 1, Quotient.U.pVal, &Remainder);
 1832|       |  // Clear the rest of the Quotient.
 1833|      0|  std::memset(Quotient.U.pVal + lhsWords, 0,
 1834|      0|              (getNumWords(BitWidth) - lhsWords) * APINT_WORD_SIZE);
 1835|      0|}
_ZN4llvh5APInt10fromStringEjNS_9StringRefEh:
 1953|      5|void APInt::fromString(unsigned numbits, StringRef str, uint8_t radix) {
 1954|       |  // Check our assumptions here
 1955|      5|  assert(!str.empty() && "Invalid string length");
 1956|      5|  assert((radix == 10 || radix == 8 || radix == 16 || radix == 2 ||
 1957|      5|          radix == 36) &&
 1958|      5|         "Radix should be 2, 8, 10, 16, or 36!");
 1959|       |
 1960|      5|  StringRef::iterator p = str.begin();
 1961|      5|  size_t slen = str.size();
 1962|      5|  bool isNeg = *p == '-';
 1963|      5|  if (*p == '-' || *p == '+') {
  ------------------
  |  Branch (1963:7): [True: 0, False: 5]
  |  Branch (1963:20): [True: 0, False: 5]
  ------------------
 1964|      0|    p++;
 1965|      0|    slen--;
 1966|      0|    assert(slen && "String is only a sign, needs a value.");
 1967|      0|  }
 1968|      5|  assert((slen <= numbits || radix != 2) && "Insufficient bit width");
 1969|      5|  assert(((slen-1)*3 <= numbits || radix != 8) && "Insufficient bit width");
 1970|      5|  assert(((slen-1)*4 <= numbits || radix != 16) && "Insufficient bit width");
 1971|      5|  assert((((slen-1)*64)/22 <= numbits || radix != 10) &&
 1972|      5|         "Insufficient bit width");
 1973|       |
 1974|       |  // Allocate memory if needed
 1975|      5|  if (isSingleWord())
  ------------------
  |  Branch (1975:7): [True: 5, False: 0]
  ------------------
 1976|      5|    U.VAL = 0;
 1977|      0|  else
 1978|      0|    U.pVal = getClearedMemory(getNumWords());
 1979|       |
 1980|       |  // Figure out if we can shift instead of multiply
 1981|      5|  unsigned shift = (radix == 16 ? 4 : radix == 8 ? 3 : radix == 2 ? 1 : 0);
  ------------------
  |  Branch (1981:21): [True: 0, False: 5]
  |  Branch (1981:39): [True: 0, False: 5]
  |  Branch (1981:56): [True: 0, False: 5]
  ------------------
 1982|       |
 1983|       |  // Enter digit traversal loop
 1984|     24|  for (StringRef::iterator e = str.end(); p != e; ++p) {
  ------------------
  |  Branch (1984:43): [True: 19, False: 5]
  ------------------
 1985|     19|    unsigned digit = getDigit(*p, radix);
 1986|     19|    assert(digit < radix && "Invalid character in digit string");
 1987|       |
 1988|       |    // Shift or multiply the value by the radix
 1989|     19|    if (slen > 1) {
  ------------------
  |  Branch (1989:9): [True: 19, False: 0]
  ------------------
 1990|     19|      if (shift)
  ------------------
  |  Branch (1990:11): [True: 0, False: 19]
  ------------------
 1991|      0|        *this <<= shift;
 1992|     19|      else
 1993|     19|        *this *= radix;
 1994|     19|    }
 1995|       |
 1996|       |    // Add in the digit we just interpreted
 1997|     19|    *this += digit;
 1998|     19|  }
 1999|       |  // If its negative, put it in two's complement form
 2000|      5|  if (isNeg)
  ------------------
  |  Branch (2000:7): [True: 0, False: 5]
  ------------------
 2001|      0|    this->negate();
 2002|      5|}
_ZN4llvh5APInt9tcAddPartEPmmj:
 2309|      1|                                 unsigned parts) {
 2310|      1|  for (unsigned i = 0; i < parts; ++i) {
  ------------------
  |  Branch (2310:24): [True: 1, False: 0]
  ------------------
 2311|      1|    dst[i] += src;
 2312|      1|    if (dst[i] >= src)
  ------------------
  |  Branch (2312:9): [True: 1, False: 0]
  ------------------
 2313|      1|      return 0; // No need to carry so exit early.
 2314|      0|    src = 1; // Carry one to next digit.
 2315|      0|  }
 2316|       |
 2317|      0|  return 1;
 2318|      1|}
_ZN4llvh5APInt8tcNegateEPmj:
 2360|      1|void APInt::tcNegate(WordType *dst, unsigned parts) {
 2361|      1|  tcComplement(dst, parts);
 2362|      1|  tcIncrement(dst, parts);
 2363|      1|}
_ZN4llvh5APInt12tcComplementEPmj:
 2619|      1|void APInt::tcComplement(WordType *dst, unsigned parts) {
 2620|      2|  for (unsigned i = 0; i < parts; i++)
  ------------------
  |  Branch (2620:24): [True: 1, False: 1]
  ------------------
 2621|      1|    dst[i] = ~dst[i];
 2622|      1|}
APInt.cpp:_ZL8getDigitch:
   51|     19|inline static unsigned getDigit(char cdigit, uint8_t radix) {
   52|     19|  unsigned r;
   53|       |
   54|     19|  if (radix == 16 || radix == 36) {
  ------------------
  |  Branch (54:7): [True: 0, False: 19]
  |  Branch (54:22): [True: 0, False: 19]
  ------------------
   55|      0|    r = cdigit - '0';
   56|      0|    if (r <= 9)
  ------------------
  |  Branch (56:9): [True: 0, False: 0]
  ------------------
   57|      0|      return r;
   58|       |
   59|      0|    r = cdigit - 'A';
   60|      0|    if (r <= radix - 11U)
  ------------------
  |  Branch (60:9): [True: 0, False: 0]
  ------------------
   61|      0|      return r + 10;
   62|       |
   63|      0|    r = cdigit - 'a';
   64|      0|    if (r <= radix - 11U)
  ------------------
  |  Branch (64:9): [True: 0, False: 0]
  ------------------
   65|      0|      return r + 10;
   66|       |
   67|      0|    radix = 10;
   68|      0|  }
   69|       |
   70|     19|  r = cdigit - '0';
   71|     19|  if (r < radix)
  ------------------
  |  Branch (71:7): [True: 19, False: 0]
  ------------------
   72|     19|    return r;
   73|       |
   74|      0|  return -1U;
   75|     19|}

_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|     30|  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|      4|    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|      4|    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:
 2010|      4|      : UncategorizedPrinter(UncategorizedPrinter),
 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|      1|  ErrorHandler = handler;
   71|      1|  ErrorHandlerUserData = user_data;
   72|      1|}

_ZNK4llvh19FoldingSetNodeIDRef11ComputeHashEv:
   30|  4.68M|unsigned FoldingSetNodeIDRef::ComputeHash() const {
   31|  4.68M|  return static_cast<unsigned>(hash_combine_range(Data, Data+Size));
   32|  4.68M|}
_ZNK4llvh19FoldingSetNodeIDRefeqES0_:
   34|  4.84M|bool FoldingSetNodeIDRef::operator==(FoldingSetNodeIDRef RHS) const {
   35|  4.84M|  if (Size != RHS.Size) return false;
  ------------------
  |  Branch (35:7): [True: 0, False: 4.84M]
  ------------------
   36|  4.84M|  return memcmp(Data, RHS.Data, Size*sizeof(*Data)) == 0;
   37|  4.84M|}
_ZN4llvh16FoldingSetNodeID10AddPointerEPKv:
   52|  2.42M|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|  2.42M|  static_assert(sizeof(uintptr_t) <= sizeof(unsigned long long),
   58|  2.42M|                "unexpected pointer size");
   59|  2.42M|  AddInteger(reinterpret_cast<uintptr_t>(Ptr));
   60|  2.42M|}
_ZN4llvh16FoldingSetNodeID10AddIntegerEj:
   64|  19.0M|void FoldingSetNodeID::AddInteger(unsigned I) {
   65|  19.0M|  Bits.push_back(I);
   66|  19.0M|}
_ZN4llvh16FoldingSetNodeID10AddIntegerEm:
   70|  9.52M|void FoldingSetNodeID::AddInteger(unsigned long I) {
   71|  9.52M|  if (sizeof(long) == sizeof(int))
  ------------------
  |  Branch (71:7): [Folded - Ignored]
  ------------------
   72|      0|    AddInteger(unsigned(I));
   73|  9.52M|  else if (sizeof(long) == sizeof(long long)) {
  ------------------
  |  Branch (73:12): [Folded - Ignored]
  ------------------
   74|  9.52M|    AddInteger((unsigned long long)I);
   75|  9.52M|  } else {
   76|      0|    llvm_unreachable("unexpected sizeof(long)");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   77|      0|  }
   78|  9.52M|}
_ZN4llvh16FoldingSetNodeID10AddIntegerEy:
   82|  9.52M|void FoldingSetNodeID::AddInteger(unsigned long long I) {
   83|  9.52M|  AddInteger(unsigned(I));
   84|  9.52M|  AddInteger(unsigned(I >> 32));
   85|  9.52M|}
_ZNK4llvh16FoldingSetNodeID11ComputeHashEv:
  146|  4.68M|unsigned FoldingSetNodeID::ComputeHash() const {
  147|  4.68M|  return FoldingSetNodeIDRef(Bits.data(), Bits.size()).ComputeHash();
  148|  4.68M|}
_ZNK4llvh16FoldingSetNodeIDeqERKS0_:
  152|  4.84M|bool FoldingSetNodeID::operator==(const FoldingSetNodeID &RHS) const {
  153|  4.84M|  return *this == FoldingSetNodeIDRef(RHS.Bits.data(), RHS.Bits.size());
  154|  4.84M|}
_ZNK4llvh16FoldingSetNodeIDeqENS_19FoldingSetNodeIDRefE:
  158|  4.84M|bool FoldingSetNodeID::operator==(FoldingSetNodeIDRef RHS) const {
  159|  4.84M|  return FoldingSetNodeIDRef(Bits.data(), Bits.size()) == RHS;
  160|  4.84M|}
_ZN4llvh14FoldingSetBaseC2Ej:
  229|    588|FoldingSetBase::FoldingSetBase(unsigned Log2InitSize) {
  230|    588|  assert(5 < Log2InitSize && Log2InitSize < 32 &&
  231|    588|         "Initial hash table size out of range");
  232|    588|  NumBuckets = 1 << Log2InitSize;
  233|    588|  Buckets = AllocateBuckets(NumBuckets);
  234|    588|  NumNodes = 0;
  235|    588|}
_ZN4llvh14FoldingSetBaseD2Ev:
  255|    588|FoldingSetBase::~FoldingSetBase() {
  256|    588|  free(Buckets);
  257|    588|}
_ZN4llvh14FoldingSetBase15GrowBucketCountEj:
  270|    151|void FoldingSetBase::GrowBucketCount(unsigned NewBucketCount) {
  271|    151|  assert((NewBucketCount > NumBuckets) && "Can't shrink a folding set with GrowBucketCount");
  272|    151|  assert(isPowerOf2_32(NewBucketCount) && "Bad bucket count!");
  273|    151|  void **OldBuckets = Buckets;
  274|    151|  unsigned OldNumBuckets = NumBuckets;
  275|       |
  276|       |  // Clear out new buckets.
  277|    151|  Buckets = AllocateBuckets(NewBucketCount);
  278|       |  // Set NumBuckets only if allocation of new buckets was successful.
  279|    151|  NumBuckets = NewBucketCount;
  280|    151|  NumNodes = 0;
  281|       |
  282|       |  // Walk the old buckets, rehashing nodes into their new place.
  283|    151|  FoldingSetNodeID TempID;
  284|   624k|  for (unsigned i = 0; i != OldNumBuckets; ++i) {
  ------------------
  |  Branch (284:24): [True: 623k, False: 151]
  ------------------
  285|   623k|    void *Probe = OldBuckets[i];
  286|   623k|    if (!Probe) continue;
  ------------------
  |  Branch (286:9): [True: 84.0k, False: 539k]
  ------------------
  287|  1.78M|    while (Node *NodeInBucket = GetNextPtr(Probe)) {
  ------------------
  |  Branch (287:18): [True: 1.24M, False: 539k]
  ------------------
  288|       |      // Figure out the next link, remove NodeInBucket from the old link.
  289|  1.24M|      Probe = NodeInBucket->getNextInBucket();
  290|  1.24M|      NodeInBucket->SetNextInBucket(nullptr);
  291|       |
  292|       |      // Insert the node into the new bucket, after recomputing the hash.
  293|  1.24M|      InsertNode(NodeInBucket,
  294|  1.24M|                 GetBucketFor(ComputeNodeHash(NodeInBucket, TempID),
  295|  1.24M|                              Buckets, NumBuckets));
  296|  1.24M|      TempID.clear();
  297|  1.24M|    }
  298|   539k|  }
  299|       |
  300|    151|  free(OldBuckets);
  301|    151|}
_ZN4llvh14FoldingSetBase13GrowHashTableEv:
  305|    151|void FoldingSetBase::GrowHashTable() {
  306|    151|  GrowBucketCount(NumBuckets * 2);
  307|    151|}
_ZN4llvh14FoldingSetBase19FindNodeOrInsertPosERKNS_16FoldingSetNodeIDERPv:
  323|  3.43M|                                    void *&InsertPos) {
  324|  3.43M|  unsigned IDHash = ID.ComputeHash();
  325|  3.43M|  void **Bucket = GetBucketFor(IDHash, Buckets, NumBuckets);
  326|  3.43M|  void *Probe = *Bucket;
  327|       |
  328|  3.43M|  InsertPos = nullptr;
  329|       |
  330|  3.43M|  FoldingSetNodeID TempID;
  331|  5.68M|  while (Node *NodeInBucket = GetNextPtr(Probe)) {
  ------------------
  |  Branch (331:16): [True: 4.84M, False: 839k]
  ------------------
  332|  4.84M|    if (NodeEquals(NodeInBucket, ID, IDHash, TempID))
  ------------------
  |  Branch (332:9): [True: 2.59M, False: 2.24M]
  ------------------
  333|  2.59M|      return NodeInBucket;
  334|  2.24M|    TempID.clear();
  335|       |
  336|  2.24M|    Probe = NodeInBucket->getNextInBucket();
  337|  2.24M|  }
  338|       |
  339|       |  // Didn't find the node, return null with the bucket as the InsertPos.
  340|   839k|  InsertPos = Bucket;
  341|   839k|  return nullptr;
  342|  3.43M|}
_ZN4llvh14FoldingSetBase10InsertNodeEPNS0_4NodeEPv:
  347|  2.08M|void FoldingSetBase::InsertNode(Node *N, void *InsertPos) {
  348|  2.08M|  assert(!N->getNextInBucket());
  349|       |  // Do we need to grow the hashtable?
  350|  2.08M|  if (NumNodes+1 > capacity()) {
  ------------------
  |  Branch (350:7): [True: 151, False: 2.08M]
  ------------------
  351|    151|    GrowHashTable();
  352|    151|    FoldingSetNodeID TempID;
  353|    151|    InsertPos = GetBucketFor(ComputeNodeHash(N, TempID), Buckets, NumBuckets);
  354|    151|  }
  355|       |
  356|  2.08M|  ++NumNodes;
  357|       |
  358|       |  /// The insert position is actually a bucket pointer.
  359|  2.08M|  void **Bucket = static_cast<void**>(InsertPos);
  360|       |
  361|  2.08M|  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|  2.08M|  if (!Next)
  ------------------
  |  Branch (366:7): [True: 996k, False: 1.09M]
  ------------------
  367|   996k|    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|  2.08M|  N->SetNextInBucket(Next);
  371|  2.08M|  *Bucket = N;
  372|  2.08M|}
_ZN4llvh22FoldingSetIteratorImplC2EPPv:
  430|  1.17k|FoldingSetIteratorImpl::FoldingSetIteratorImpl(void **Bucket) {
  431|       |  // Skip to the first non-null non-self-cycle bucket.
  432|  23.9k|  while (*Bucket != reinterpret_cast<void*>(-1) &&
  ------------------
  |  Branch (432:10): [True: 23.0k, False: 897]
  ------------------
  433|  23.9k|         (!*Bucket || !GetNextPtr(*Bucket)))
  ------------------
  |  Branch (433:11): [True: 22.7k, False: 279]
  |  Branch (433:23): [True: 0, False: 279]
  ------------------
  434|  22.7k|    ++Bucket;
  435|       |
  436|  1.17k|  NodePtr = static_cast<FoldingSetNode*>(*Bucket);
  437|  1.17k|}
_ZN4llvh22FoldingSetIteratorImpl7advanceEv:
  439|   839k|void FoldingSetIteratorImpl::advance() {
  440|       |  // If there is another link within this bucket, go to it.
  441|   839k|  void *Probe = NodePtr->getNextInBucket();
  442|       |
  443|   839k|  if (FoldingSetNode *NextNodeInBucket = GetNextPtr(Probe))
  ------------------
  |  Branch (443:23): [True: 382k, False: 457k]
  ------------------
  444|   382k|    NodePtr = NextNodeInBucket;
  445|   457k|  else {
  446|       |    // Otherwise, this is the last link in this bucket.
  447|   457k|    void **Bucket = GetBucketPtr(Probe);
  448|       |
  449|       |    // Skip to the next non-null non-self-cycle bucket.
  450|   638k|    do {
  451|   638k|      ++Bucket;
  452|   638k|    } while (*Bucket != reinterpret_cast<void*>(-1) &&
  ------------------
  |  Branch (452:14): [True: 638k, False: 279]
  ------------------
  453|   638k|             (!*Bucket || !GetNextPtr(*Bucket)));
  ------------------
  |  Branch (453:15): [True: 181k, False: 456k]
  |  Branch (453:27): [True: 0, False: 456k]
  ------------------
  454|       |
  455|   457k|    NodePtr = static_cast<FoldingSetNode*>(*Bucket);
  456|   457k|  }
  457|   839k|}
FoldingSet.cpp:_ZL15AllocateBucketsj:
  216|    739|static void **AllocateBuckets(unsigned NumBuckets) {
  217|    739|  void **Buckets = static_cast<void**>(safe_calloc(NumBuckets + 1,
  218|    739|                                                   sizeof(void*)));
  219|       |  // Set the very last bucket to be a non-null "pointer".
  220|    739|  Buckets[NumBuckets] = reinterpret_cast<void*>(-1);
  221|    739|  return Buckets;
  222|    739|}
FoldingSet.cpp:_ZL10GetNextPtrPv:
  191|  8.76M|static FoldingSetBase::Node *GetNextPtr(void *NextInBucketPtr) {
  192|       |  // The low bit is set if this is the pointer back to the bucket.
  193|  8.76M|  if (reinterpret_cast<intptr_t>(NextInBucketPtr) & 1)
  ------------------
  |  Branch (193:7): [True: 1.62M, False: 7.13M]
  ------------------
  194|  1.62M|    return nullptr;
  195|       |
  196|  7.13M|  return static_cast<FoldingSetBase::Node*>(NextInBucketPtr);
  197|  8.76M|}
FoldingSet.cpp:_ZL12GetBucketForjPPvj:
  209|  4.68M|static void **GetBucketFor(unsigned Hash, void **Buckets, unsigned NumBuckets) {
  210|       |  // NumBuckets is always a power of 2.
  211|  4.68M|  unsigned BucketNum = Hash & (NumBuckets-1);
  212|  4.68M|  return Buckets + BucketNum;
  213|  4.68M|}
FoldingSet.cpp:_ZL12GetBucketPtrPv:
  201|   457k|static void **GetBucketPtr(void *NextInBucketPtr) {
  202|   457k|  intptr_t Ptr = reinterpret_cast<intptr_t>(NextInBucketPtr);
  203|   457k|  assert((Ptr & 1) && "Not a bucket pointer");
  204|   457k|  return reinterpret_cast<void**>(Ptr & ~intptr_t(1));
  205|   457k|}

_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|    494|MemoryBuffer::~MemoryBuffer() { }
_ZN4llvh12MemoryBuffer4initEPKcS2_b:
   47|    494|                        bool RequiresNullTerminator) {
   48|    494|  assert((!RequiresNullTerminator || BufEnd[0] == 0) &&
   49|    494|         "Buffer is not null terminated!");
   50|    494|  BufferStart = BufStart;
   51|    494|  BufferEnd = BufEnd;
   52|    494|}
_ZN4llvh12MemoryBuffer12getMemBufferENS_9StringRefES1_b:
  114|    163|                           bool RequiresNullTerminator) {
  115|    163|  auto *Ret = new (NamedBufferAlloc(BufferName))
  116|    163|      MemoryBufferMem<MemoryBuffer>(InputData, RequiresNullTerminator);
  117|    163|  return std::unique_ptr<MemoryBuffer>(Ret);
  118|    163|}
_ZN4llvh12MemoryBuffer16getMemBufferCopyENS_9StringRefERKNS_5TwineE:
  136|     84|MemoryBuffer::getMemBufferCopy(StringRef InputData, const Twine &BufferName) {
  137|     84|  auto Buf = getMemBufferCopyImpl(InputData, BufferName);
  138|     84|  if (Buf)
  ------------------
  |  Branch (138:7): [True: 84, False: 0]
  ------------------
  139|     84|    return std::move(*Buf);
  140|      0|  return nullptr;
  141|     84|}
_ZN4llvh20WritableMemoryBuffer21getNewUninitMemBufferEmRKNS_5TwineE:
  274|     84|WritableMemoryBuffer::getNewUninitMemBuffer(size_t Size, const Twine &BufferName) {
  275|     84|  using MemBuffer = MemoryBufferMem<WritableMemoryBuffer>;
  276|       |  // Allocate space for the MemoryBuffer, the data and the name. It is important
  277|       |  // that MemoryBuffer and data are aligned so PointerIntPair works with them.
  278|       |  // TODO: Is 16-byte alignment enough?  We copy small object files with large
  279|       |  // alignment expectations into this buffer.
  280|     84|  SmallString<256> NameBuf;
  281|     84|  StringRef NameRef = BufferName.toStringRef(NameBuf);
  282|     84|  size_t AlignedStringLen = alignTo(sizeof(MemBuffer) + NameRef.size() + 1, 16);
  283|     84|  size_t RealLen = AlignedStringLen + Size + 1;
  284|     84|  char *Mem = static_cast<char*>(operator new(RealLen, std::nothrow));
  285|     84|  if (!Mem)
  ------------------
  |  Branch (285:7): [True: 0, False: 84]
  ------------------
  286|      0|    return nullptr;
  287|       |
  288|       |  // The name is stored after the class itself.
  289|     84|  CopyStringRef(Mem + sizeof(MemBuffer), NameRef);
  290|       |
  291|       |  // The buffer begins after the name and must be aligned.
  292|     84|  char *Buf = Mem + AlignedStringLen;
  293|     84|  Buf[Size] = 0; // Null terminate buffer.
  294|       |
  295|     84|  auto *Ret = new (Mem) MemBuffer(StringRef(Buf, Size), true);
  296|     84|  return std::unique_ptr<WritableMemoryBuffer>(Ret);
  297|     84|}
MemoryBuffer.cpp:_ZN12_GLOBAL__N_116NamedBufferAllocC2ERKN4llvh5TwineE:
   69|    163|  NamedBufferAlloc(const Twine &Name) : Name(Name) {}
MemoryBuffer.cpp:_ZnwmRKN12_GLOBAL__N_116NamedBufferAllocE:
   73|    163|void *operator new(size_t N, const NamedBufferAlloc &Alloc) {
   74|    163|  SmallString<256> NameBuf;
   75|    163|  StringRef NameRef = Alloc.Name.toStringRef(NameBuf);
   76|       |
   77|    163|  char *Mem = static_cast<char *>(operator new(N + NameRef.size() + 1));
   78|    163|  CopyStringRef(Mem + N, NameRef);
   79|    163|  return Mem;
   80|    163|}
MemoryBuffer.cpp:_ZL20getMemBufferCopyImplN4llvh9StringRefERKNS_5TwineE:
  127|     84|getMemBufferCopyImpl(StringRef InputData, const Twine &BufferName) {
  128|     84|  auto Buf = WritableMemoryBuffer::getNewUninitMemBuffer(InputData.size(), BufferName);
  129|     84|  if (!Buf)
  ------------------
  |  Branch (129:7): [True: 0, False: 84]
  ------------------
  130|      0|    return make_error_code(errc::not_enough_memory);
  131|     84|  memcpy(Buf->getBufferStart(), InputData.data(), InputData.size());
  132|     84|  return std::move(Buf);
  133|     84|}
MemoryBuffer.cpp:_ZL13CopyStringRefPcN4llvh9StringRefE:
   60|    247|static void CopyStringRef(char *Memory, StringRef Data) {
   61|    247|  if (!Data.empty())
  ------------------
  |  Branch (61:7): [True: 0, False: 247]
  ------------------
   62|      0|    memcpy(Memory, Data.data(), Data.size());
   63|    247|  Memory[Data.size()] = 0; // Null terminate string.
   64|    247|}
MemoryBuffer.cpp:_ZN12_GLOBAL__N_115MemoryBufferMemIN4llvh12MemoryBufferEEC2ENS1_9StringRefEb:
   87|    163|  MemoryBufferMem(StringRef InputData, bool RequiresNullTerminator) {
   88|    163|    MemoryBuffer::init(InputData.begin(), InputData.end(),
   89|    163|                       RequiresNullTerminator);
   90|    163|  }
MemoryBuffer.cpp:_ZN12_GLOBAL__N_115MemoryBufferMemIN4llvh12MemoryBufferEEdlEPv:
   94|    163|  void operator delete(void *p) { ::operator delete(p); }
MemoryBuffer.cpp:_ZN12_GLOBAL__N_115MemoryBufferMemIN4llvh20WritableMemoryBufferEEC2ENS1_9StringRefEb:
   87|     84|  MemoryBufferMem(StringRef InputData, bool RequiresNullTerminator) {
   88|     84|    MemoryBuffer::init(InputData.begin(), InputData.end(),
   89|     84|                       RequiresNullTerminator);
   90|     84|  }
MemoryBuffer.cpp:_ZN12_GLOBAL__N_115MemoryBufferMemIN4llvh20WritableMemoryBufferEEdlEPv:
   94|     84|  void operator delete(void *p) { ::operator delete(p); }

_ZN4llvh3sys9MutexImplC2Eb:
   46|      3|  : data_(nullptr)
   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|      3|  errorcode = pthread_mutex_init(mutex, &attr);
   66|      3|  assert(errorcode == 0);
   67|       |
   68|       |  // Destroy the attributes
   69|      3|  errorcode = pthread_mutexattr_destroy(&attr);
   70|      3|  assert(errorcode == 0);
   71|       |
   72|       |  // Assign the data member
   73|      3|  data_ = mutex;
   74|      3|}
_ZN4llvh3sys9MutexImpl7acquireEv:
   87|     32|{
   88|     32|  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
   89|     32|  assert(mutex != nullptr);
   90|       |
   91|     32|  int errorcode = pthread_mutex_lock(mutex);
   92|     32|  return errorcode == 0;
   93|     32|}
_ZN4llvh3sys9MutexImpl7releaseEv:
   97|     32|{
   98|     32|  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
   99|     32|  assert(mutex != nullptr);
  100|       |
  101|     32|  int errorcode = pthread_mutex_unlock(mutex);
  102|     32|  return errorcode == 0;
  103|     32|}

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

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

_ZN4llvh19SmallPtrSetImplBase14insert_imp_bigEPKv:
   41|  3.52M|SmallPtrSetImplBase::insert_imp_big(const void *Ptr) {
   42|  3.52M|  if (LLVM_UNLIKELY(size() * 4 >= CurArraySize * 3)) {
  ------------------
  |  |  189|  3.52M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2.50k, False: 3.51M]
  |  |  ------------------
  ------------------
   43|       |    // If more than 3/4 of the array is full, grow.
   44|  2.50k|    Grow(CurArraySize < 64 ? 128 : CurArraySize * 2);
  ------------------
  |  Branch (44:10): [True: 1.02k, False: 1.48k]
  ------------------
   45|  3.51M|  } else if (LLVM_UNLIKELY(CurArraySize - NumNonEmpty < CurArraySize / 8)) {
  ------------------
  |  |  189|  3.51M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.51M]
  |  |  ------------------
  ------------------
   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|  3.52M|  const void **Bucket = const_cast<const void**>(FindBucketFor(Ptr));
   53|  3.52M|  if (*Bucket == Ptr)
  ------------------
  |  Branch (53:7): [True: 528k, False: 2.99M]
  ------------------
   54|   528k|    return std::make_pair(Bucket, false); // Already inserted, good.
   55|       |
   56|       |  // Otherwise, insert it!
   57|  2.99M|  if (*Bucket == getTombstoneMarker())
  ------------------
  |  Branch (57:7): [True: 0, False: 2.99M]
  ------------------
   58|      0|    --NumTombstones;
   59|  2.99M|  else
   60|  2.99M|    ++NumNonEmpty; // Track density.
   61|  2.99M|  *Bucket = Ptr;
   62|  2.99M|  incrementEpoch();
   63|  2.99M|  return std::make_pair(Bucket, true);
   64|  3.52M|}
_ZNK4llvh19SmallPtrSetImplBase13FindBucketForEPKv:
   66|  8.92M|const void * const *SmallPtrSetImplBase::FindBucketFor(const void *Ptr) const {
   67|  8.92M|  unsigned Bucket = DenseMapInfo<void *>::getHashValue(Ptr) & (CurArraySize-1);
   68|  8.92M|  unsigned ArraySize = CurArraySize;
   69|  8.92M|  unsigned ProbeAmt = 1;
   70|  8.92M|  const void *const *Array = CurArray;
   71|  8.92M|  const void *const *Tombstone = nullptr;
   72|  16.6M|  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|  16.6M|    if (LLVM_LIKELY(Array[Bucket] == getEmptyMarker()))
  ------------------
  |  |  188|  16.6M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7.79M, False: 8.80M]
  |  |  ------------------
  ------------------
   77|  7.79M|      return Tombstone ? Tombstone : Array+Bucket;
  ------------------
  |  Branch (77:14): [True: 0, False: 7.79M]
  ------------------
   78|       |
   79|       |    // Found Ptr's bucket?
   80|  8.80M|    if (LLVM_LIKELY(Array[Bucket] == Ptr))
  ------------------
  |  |  188|  8.80M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.13M, False: 7.67M]
  |  |  ------------------
  ------------------
   81|  1.13M|      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|  7.67M|    if (Array[Bucket] == getTombstoneMarker() && !Tombstone)
  ------------------
  |  Branch (85:9): [True: 0, False: 7.67M]
  |  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|  7.67M|    Bucket = (Bucket + ProbeAmt++) & (ArraySize-1);
   90|  7.67M|  }
   91|  8.92M|}
_ZN4llvh19SmallPtrSetImplBase4GrowEj:
   95|  2.50k|void SmallPtrSetImplBase::Grow(unsigned NewSize) {
   96|  2.50k|  const void **OldBuckets = CurArray;
   97|  2.50k|  const void **OldEnd = EndPointer();
   98|  2.50k|  bool WasSmall = isSmall();
   99|       |
  100|       |  // Install the new array.  Clear all the buckets to empty.
  101|  2.50k|  const void **NewBuckets = (const void**) safe_malloc(sizeof(void*) * NewSize);
  102|       |
  103|       |  // Reset member only if memory was allocated successfully
  104|  2.50k|  CurArray = NewBuckets;
  105|  2.50k|  CurArraySize = NewSize;
  106|  2.50k|  memset(CurArray, -1, NewSize*sizeof(void*));
  107|       |
  108|       |  // Copy over all valid entries.
  109|  6.29M|  for (const void **BucketPtr = OldBuckets; BucketPtr != OldEnd; ++BucketPtr) {
  ------------------
  |  Branch (109:45): [True: 6.29M, False: 2.50k]
  ------------------
  110|       |    // Copy over the element if it is valid.
  111|  6.29M|    const void *Elt = *BucketPtr;
  112|  6.29M|    if (Elt != getTombstoneMarker() && Elt != getEmptyMarker())
  ------------------
  |  Branch (112:9): [True: 6.29M, False: 0]
  |  Branch (112:40): [True: 4.72M, False: 1.56M]
  ------------------
  113|  4.72M|      *const_cast<void**>(FindBucketFor(Elt)) = const_cast<void*>(Elt);
  114|  6.29M|  }
  115|       |
  116|  2.50k|  if (!WasSmall)
  ------------------
  |  Branch (116:7): [True: 1.48k, False: 1.02k]
  ------------------
  117|  1.48k|    free(OldBuckets);
  118|  2.50k|  NumNonEmpty -= NumTombstones;
  119|  2.50k|  NumTombstones = 0;
  120|  2.50k|}
_ZN4llvh19SmallPtrSetImplBaseC2EPPKvjOS0_:
  140|  40.6k|                                         SmallPtrSetImplBase &&that) {
  141|  40.6k|  SmallArray = SmallStorage;
  142|  40.6k|  MoveHelper(SmallSize, std::move(that));
  143|  40.6k|}
_ZN4llvh19SmallPtrSetImplBase10MoveHelperEjOS0_:
  190|  40.6k|                                     SmallPtrSetImplBase &&RHS) {
  191|  40.6k|  assert(&RHS != this && "Self-move should be handled by the caller.");
  192|       |
  193|  40.6k|  if (RHS.isSmall()) {
  ------------------
  |  Branch (193:7): [True: 40.6k, False: 0]
  ------------------
  194|       |    // Copy a small RHS rather than moving.
  195|  40.6k|    CurArray = SmallArray;
  196|  40.6k|    std::copy(RHS.CurArray, RHS.CurArray + RHS.NumNonEmpty, CurArray);
  197|  40.6k|  } else {
  198|      0|    CurArray = RHS.CurArray;
  199|      0|    RHS.CurArray = RHS.SmallArray;
  200|      0|  }
  201|       |
  202|       |  // Copy the rest of the trivial members.
  203|  40.6k|  CurArraySize = RHS.CurArraySize;
  204|  40.6k|  NumNonEmpty = RHS.NumNonEmpty;
  205|  40.6k|  NumTombstones = RHS.NumTombstones;
  206|       |
  207|       |  // Make the RHS small and empty.
  208|  40.6k|  RHS.CurArraySize = SmallSize;
  209|  40.6k|  assert(RHS.CurArray == RHS.SmallArray);
  210|  40.6k|  RHS.NumNonEmpty = 0;
  211|  40.6k|  RHS.NumTombstones = 0;
  212|  40.6k|}

_ZN4llvh15SmallVectorBase8grow_podEPvmm:
   44|  1.90M|                               size_t TSize) {
   45|  1.90M|  constexpr size_t MinGrowth = 1;
   46|  1.90M|  size_t NewCapacity = 2 * capacity() + MinGrowth; // Always grow.
   47|  1.90M|  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|  1.90M|  if (NewCapacity <= this->capacity() ||
  ------------------
  |  Branch (51:7): [True: 0, False: 1.90M]
  ------------------
   52|  1.90M|      NewCapacity < MinCapacity ||
  ------------------
  |  Branch (52:7): [True: 0, False: 1.90M]
  ------------------
   53|  1.90M|      NewCapacity > size_t(-1) / TSize)
  ------------------
  |  Branch (53:7): [True: 0, False: 1.90M]
  ------------------
   54|      0|    report_bad_alloc_error("SmallVector capacity overflow during allocation");
   55|       |
   56|  1.90M|  void *NewElts;
   57|  1.90M|  if (BeginX == FirstEl) {
  ------------------
  |  Branch (57:7): [True: 1.65M, False: 247k]
  ------------------
   58|  1.65M|    NewElts = safe_malloc(NewCapacity * TSize);
   59|       |
   60|       |    // Copy the elements over.  No need to run dtors on PODs.
   61|  1.65M|    memcpy(NewElts, this->BeginX, size() * TSize);
   62|  1.65M|  } else {
   63|       |    // If this wasn't grown from the inline copy, grow the allocated space.
   64|   247k|    NewElts = safe_realloc(this->BeginX, NewCapacity * TSize);
   65|   247k|  }
   66|       |
   67|  1.90M|  this->BeginX = NewElts;
   68|  1.90M|  this->Capacity = NewCapacity;
   69|  1.90M|}

_ZNK4llvh9SourceMgr23FindBufferContainingLocENS_5SMLocE:
   61|  51.6k|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|  51.6k|  if (LLVM_LIKELY(
  ------------------
  |  |  188|   205k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 51.3k, False: 247]
  |  |  |  Branch (188:51): [True: 51.3k, False: 247]
  |  |  |  Branch (188:51): [True: 51.3k, False: 0]
  |  |  |  Branch (188:51): [True: 51.3k, False: 0]
  |  |  ------------------
  ------------------
   65|  51.6k|          LastFoundBufId &&
   66|  51.6k|          Loc.getPointer() >=
   67|  51.6k|              Buffers[LastFoundBufId - 1].Buffer->getBufferStart() &&
   68|  51.6k|          Loc.getPointer() <=
   69|  51.6k|              Buffers[LastFoundBufId - 1].Buffer->getBufferEnd())) {
   70|  51.3k|    return LastFoundBufId;
   71|  51.3k|  }
   72|       |
   73|    247|  auto it = BufferEnds.lower_bound(Loc.getPointer());
   74|    247|  if (it != BufferEnds.end() &&
  ------------------
  |  Branch (74:7): [True: 247, False: 0]
  |  Branch (74:7): [True: 247, False: 0]
  ------------------
   75|    247|      Loc.getPointer() >= Buffers[it->second - 1].Buffer->getBufferStart()) {
  ------------------
  |  Branch (75:7): [True: 247, False: 0]
  ------------------
   76|    247|    return LastFoundBufId = it->second;
   77|    247|  }
   78|       |
   79|      0|  return 0;
   80|    247|}
_ZN4llvh9SourceMgr9SrcBufferC2EOS1_:
  165|    567|  : Buffer(std::move(Other.Buffer)),
  166|    567|    OffsetCache(Other.OffsetCache),
  167|    567|    IncludeLoc(Other.IncludeLoc) {
  168|    567|  Other.OffsetCache = nullptr;
  169|    567|}
_ZN4llvh9SourceMgr9SrcBufferD2Ev:
  171|    974|SourceMgr::SrcBuffer::~SrcBuffer() {
  172|    974|  if (!OffsetCache.isNull()) {
  ------------------
  |  Branch (172:7): [True: 247, False: 727]
  ------------------
  173|    247|    if (OffsetCache.is<std::vector<uint8_t>*>())
  ------------------
  |  Branch (173:9): [True: 1, False: 246]
  ------------------
  174|      1|      delete OffsetCache.get<std::vector<uint8_t>*>();
  175|    246|    else if (OffsetCache.is<std::vector<uint16_t>*>())
  ------------------
  |  Branch (175:14): [True: 2, False: 244]
  ------------------
  176|      2|      delete OffsetCache.get<std::vector<uint16_t>*>();
  177|    244|    else if (OffsetCache.is<std::vector<uint32_t>*>())
  ------------------
  |  Branch (177:14): [True: 244, False: 0]
  ------------------
  178|    244|      delete OffsetCache.get<std::vector<uint32_t>*>();
  179|      0|    else
  180|      0|      delete OffsetCache.get<std::vector<uint64_t>*>();
  181|    247|    OffsetCache = nullptr;
  182|    247|  }
  183|    974|}
_ZNK4llvh9SourceMgr8FindLineENS_5SMLocEj:
  185|  51.6k|std::pair<StringRef, unsigned> SourceMgr::FindLine(SMLoc Loc, unsigned int BufferID) const {
  186|  51.6k|  if (!BufferID)
  ------------------
  |  Branch (186:7): [True: 0, False: 51.6k]
  ------------------
  187|      0|    BufferID = FindBufferContainingLoc(Loc);
  188|  51.6k|  assert(BufferID && "Invalid Location!");
  189|       |
  190|  51.6k|  auto &SB = getBufferInfo(BufferID);
  191|  51.6k|  const char *Ptr = Loc.getPointer();
  192|       |
  193|  51.6k|  size_t Sz = SB.Buffer->getBufferSize();
  194|  51.6k|  if (Sz <= std::numeric_limits<uint8_t>::max())
  ------------------
  |  Branch (194:7): [True: 3, False: 51.6k]
  ------------------
  195|      3|    return SB.getLineNumber<uint8_t>(Ptr);
  196|  51.6k|  else if (Sz <= std::numeric_limits<uint16_t>::max())
  ------------------
  |  Branch (196:12): [True: 2, False: 51.6k]
  ------------------
  197|      2|    return SB.getLineNumber<uint16_t>(Ptr);
  198|  51.6k|  else if (Sz <= std::numeric_limits<uint32_t>::max())
  ------------------
  |  Branch (198:12): [True: 51.6k, False: 0]
  ------------------
  199|  51.6k|    return SB.getLineNumber<uint32_t>(Ptr);
  200|      0|  else
  201|      0|    return SB.getLineNumber<uint64_t>(Ptr);
  202|  51.6k|}
_ZNK4llvh9SourceMgr10getLineRefEjj:
  204|   190k|StringRef SourceMgr::getLineRef(unsigned line, unsigned BufferID) const {
  205|   190k|  assert(BufferID != 0 && "BufferID must be specified");
  206|   190k|  auto &SB = getBufferInfo(BufferID);
  207|   190k|  size_t Sz = SB.Buffer->getBufferSize();
  208|   190k|  if (Sz <= std::numeric_limits<uint8_t>::max())
  ------------------
  |  Branch (208:7): [True: 5, False: 190k]
  ------------------
  209|      5|    return SB.getLineRef<uint8_t>(line);
  210|   190k|  else if (Sz <= std::numeric_limits<uint16_t>::max())
  ------------------
  |  Branch (210:12): [True: 0, False: 190k]
  ------------------
  211|      0|    return SB.getLineRef<uint16_t>(line);
  212|   190k|  else if (Sz <= std::numeric_limits<uint32_t>::max())
  ------------------
  |  Branch (212:12): [True: 190k, False: 0]
  ------------------
  213|   190k|    return SB.getLineRef<uint32_t>(line);
  214|      0|  else
  215|      0|    return SB.getLineRef<uint64_t>(line);
  216|   190k|}
_ZNK4llvh9SourceMgr16getLineAndColumnENS_5SMLocEj:
  219|    721|SourceMgr::getLineAndColumn(SMLoc Loc, unsigned BufferID) const {
  220|    721|  auto LineRefAndNo = FindLine(Loc, BufferID);
  221|    721|  return std::make_pair(LineRefAndNo.second,
  222|    721|                        static_cast<unsigned>(Loc.getPointer() - LineRefAndNo.first.data() + 1));
  223|    721|}
_ZNK4llvh9SourceMgr10GetMessageENS_5SMLocENS0_8DiagKindERKNS_5TwineENS_8ArrayRefINS_7SMRangeEEENS6_INS_7SMFixItEEE:
  241|    772|                                   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|    772|  SmallVector<std::pair<unsigned, unsigned>, 4> ColRanges;
  245|    772|  std::pair<unsigned, unsigned> LineAndCol;
  246|    772|  StringRef BufferID = "<unknown>";
  247|    772|  std::string LineStr;
  248|       |
  249|    772|  if (Loc.isValid()) {
  ------------------
  |  Branch (249:7): [True: 721, False: 51]
  ------------------
  250|    721|    unsigned CurBuf = FindBufferContainingLoc(Loc);
  251|    721|    assert(CurBuf && "Invalid or unspecified location!");
  252|       |
  253|    721|    const MemoryBuffer *CurMB = getMemoryBuffer(CurBuf);
  254|    721|    BufferID = CurMB->getBufferIdentifier();
  255|       |
  256|       |    // Scan backward to find the start of the line.
  257|    721|    const char *LineStart = Loc.getPointer();
  258|    721|    const char *BufStart = CurMB->getBufferStart();
  259|  37.1M|    while (LineStart != BufStart && LineStart[-1] != '\n' &&
  ------------------
  |  Branch (259:12): [True: 37.1M, False: 364]
  |  Branch (259:37): [True: 37.1M, False: 345]
  ------------------
  260|  37.1M|           LineStart[-1] != '\r')
  ------------------
  |  Branch (260:12): [True: 37.1M, False: 12]
  ------------------
  261|  37.1M|      --LineStart;
  262|       |
  263|       |    // Get the end of the line.
  264|    721|    const char *LineEnd = Loc.getPointer();
  265|    721|    const char *BufEnd = CurMB->getBufferEnd();
  266|  30.6M|    while (LineEnd != BufEnd && LineEnd[0] != '\n' && LineEnd[0] != '\r')
  ------------------
  |  Branch (266:12): [True: 30.6M, False: 393]
  |  Branch (266:33): [True: 30.6M, False: 316]
  |  Branch (266:55): [True: 30.6M, False: 12]
  ------------------
  267|  30.6M|      ++LineEnd;
  268|    721|    LineStr = std::string(LineStart, LineEnd);
  269|       |
  270|       |    // Convert any ranges to column ranges that only intersect the line of the
  271|       |    // location.
  272|  1.40k|    for (unsigned i = 0, e = Ranges.size(); i != e; ++i) {
  ------------------
  |  Branch (272:45): [True: 686, False: 721]
  ------------------
  273|    686|      SMRange R = Ranges[i];
  274|    686|      if (!R.isValid()) continue;
  ------------------
  |  Branch (274:11): [True: 0, False: 686]
  ------------------
  275|       |
  276|       |      // If the line doesn't contain any part of the range, then ignore it.
  277|    686|      if (R.Start.getPointer() > LineEnd || R.End.getPointer() < LineStart)
  ------------------
  |  Branch (277:11): [True: 0, False: 686]
  |  Branch (277:45): [True: 0, False: 686]
  ------------------
  278|      0|        continue;
  279|       |
  280|       |      // Ignore pieces of the range that go onto other lines.
  281|    686|      if (R.Start.getPointer() < LineStart)
  ------------------
  |  Branch (281:11): [True: 0, False: 686]
  ------------------
  282|      0|        R.Start = SMLoc::getFromPointer(LineStart);
  283|    686|      if (R.End.getPointer() > LineEnd)
  ------------------
  |  Branch (283:11): [True: 10, False: 676]
  ------------------
  284|     10|        R.End = SMLoc::getFromPointer(LineEnd);
  285|       |
  286|       |      // Translate from SMLoc ranges to column ranges.
  287|       |      // FIXME: Handle multibyte characters.
  288|    686|      ColRanges.push_back(std::make_pair(static_cast<unsigned>(R.Start.getPointer()-LineStart),
  289|    686|                                         static_cast<unsigned>(R.End.getPointer()-LineStart)));
  290|    686|    }
  291|       |
  292|    721|    LineAndCol = getLineAndColumn(Loc, CurBuf);
  293|    721|  }
  294|       |
  295|    772|  return SMDiagnostic(*this, Loc, BufferID, LineAndCol.first,
  296|    772|                      LineAndCol.second-1, Kind, Msg.str(),
  297|    772|                      LineStr, ColRanges, FixIts);
  298|    772|}
_ZNK4llvh9SourceMgr12PrintMessageERNS_11raw_ostreamERKNS_12SMDiagnosticEb:
  301|    772|                             bool ShowColors) const {
  302|       |  // Report the message with the diagnostic handler if present.
  303|    772|  if (DiagHandler) {
  ------------------
  |  Branch (303:7): [True: 772, False: 0]
  ------------------
  304|    772|    DiagHandler(Diagnostic, DiagContext);
  305|    772|    return;
  306|    772|  }
  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|    772|                             ArrayRef<SMFixIt> FixIts, bool ShowColors) const {
  321|    772|  PrintMessage(OS, GetMessage(Loc, Kind, Msg, Ranges, FixIts), ShowColors);
  322|    772|}
_ZNK4llvh9SourceMgr12PrintMessageENS_5SMLocENS0_8DiagKindERKNS_5TwineENS_8ArrayRefINS_7SMRangeEEENS6_INS_7SMFixItEEEb:
  326|    772|                             ArrayRef<SMFixIt> FixIts, bool ShowColors) const {
  327|    772|  PrintMessage(errs(), Loc, Kind, Msg, Ranges, FixIts, ShowColors);
  328|    772|}
_ZN4llvh12SMDiagnosticC2ERKNS_9SourceMgrENS_5SMLocENS_9StringRefEiiNS1_8DiagKindES5_S5_NS_8ArrayRefINSt3__14pairIjjEEEENS7_INS_7SMFixItEEE:
  339|    772|  : SM(&sm), Loc(L), Filename(FN), LineNo(Line), ColumnNo(Col), Kind(Kind),
  340|    772|    Message(Msg), LineContents(LineStr), Ranges(Ranges.vec()),
  341|    772|    FixIts(Hints.begin(), Hints.end()) {
  342|    772|  llvh::sort(FixIts);
  343|    772|}
_ZNK4llvh9SourceMgr9SrcBuffer13getLineNumberIhEENSt3__14pairINS_9StringRefEjEEPKc:
  105|      3|    const char *Ptr) const {
  106|      3|  std::vector<T> *Offsets = getOffsets<T>();
  107|       |
  108|      3|  const char *BufStart = Buffer->getBufferStart();
  109|      3|  assert(Ptr >= BufStart && Ptr <= Buffer->getBufferEnd());
  110|      3|  ptrdiff_t PtrDiff = Ptr - BufStart;
  111|      3|  assert(PtrDiff >= 0 && static_cast<size_t>(PtrDiff) <= std::numeric_limits<T>::max());
  112|      3|  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|      3|  auto EOL = std::lower_bound(Offsets->begin(), Offsets->end(), PtrOffset);
  119|       |
  120|       |  // The start of the line is the previous line end + 1.
  121|      3|  const char *LineStart =
  122|      3|      EOL != Offsets->begin() ? BufStart + EOL[-1] + 1 : BufStart;
  ------------------
  |  Branch (122:7): [True: 0, False: 3]
  ------------------
  123|       |
  124|       |  // The end of the line is the EOL inclusive or the end of the buffer exclusive.
  125|      3|  const char *LineEnd =
  126|      3|      EOL != Offsets->end() ? BufStart + *EOL + 1 : Buffer->getBufferEnd();
  ------------------
  |  Branch (126:7): [True: 3, False: 0]
  ------------------
  127|       |
  128|       |  // Lines count from 1, so add 1 to the distance from the 0th line.
  129|      3|  return {StringRef(LineStart, LineEnd - LineStart), static_cast<unsigned>((1 + (EOL - Offsets->begin())))};
  130|      3|}
_ZNK4llvh9SourceMgr9SrcBuffer10getOffsetsIhEEPNSt3__16vectorIT_NS3_9allocatorIS5_EEEEv:
   83|      8|std::vector<T> *SourceMgr::SrcBuffer::getOffsets() const {
   84|       |  // Ensure OffsetCache is allocated and populated with offsets of all the
   85|       |  // '\n' bytes.
   86|      8|  if (!OffsetCache.isNull())
  ------------------
  |  Branch (86:7): [True: 7, False: 1]
  ------------------
   87|      7|    return OffsetCache.get<std::vector<T> *>();
   88|       |
   89|      1|  std::vector<T> *Offsets = new std::vector<T>();
   90|      1|  OffsetCache = Offsets;
   91|      1|  size_t Sz = Buffer->getBufferSize();
   92|      1|  assert(Sz <= std::numeric_limits<T>::max());
   93|      1|  StringRef S = Buffer->getBuffer();
   94|     19|  for (size_t N = 0; N < Sz; ++N) {
  ------------------
  |  Branch (94:22): [True: 18, False: 1]
  ------------------
   95|     18|    if (S[N] == '\n') {
  ------------------
  |  Branch (95:9): [True: 1, False: 17]
  ------------------
   96|      1|      Offsets->push_back(static_cast<T>(N));
   97|      1|    }
   98|     18|  }
   99|       |
  100|      1|  return Offsets;
  101|      1|}
_ZNK4llvh9SourceMgr9SrcBuffer13getLineNumberItEENSt3__14pairINS_9StringRefEjEEPKc:
  105|      2|    const char *Ptr) const {
  106|      2|  std::vector<T> *Offsets = getOffsets<T>();
  107|       |
  108|      2|  const char *BufStart = Buffer->getBufferStart();
  109|      2|  assert(Ptr >= BufStart && Ptr <= Buffer->getBufferEnd());
  110|      2|  ptrdiff_t PtrDiff = Ptr - BufStart;
  111|      2|  assert(PtrDiff >= 0 && static_cast<size_t>(PtrDiff) <= std::numeric_limits<T>::max());
  112|      2|  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|      2|  auto EOL = std::lower_bound(Offsets->begin(), Offsets->end(), PtrOffset);
  119|       |
  120|       |  // The start of the line is the previous line end + 1.
  121|      2|  const char *LineStart =
  122|      2|      EOL != Offsets->begin() ? BufStart + EOL[-1] + 1 : BufStart;
  ------------------
  |  Branch (122:7): [True: 0, False: 2]
  ------------------
  123|       |
  124|       |  // The end of the line is the EOL inclusive or the end of the buffer exclusive.
  125|      2|  const char *LineEnd =
  126|      2|      EOL != Offsets->end() ? BufStart + *EOL + 1 : Buffer->getBufferEnd();
  ------------------
  |  Branch (126:7): [True: 2, False: 0]
  ------------------
  127|       |
  128|       |  // Lines count from 1, so add 1 to the distance from the 0th line.
  129|      2|  return {StringRef(LineStart, LineEnd - LineStart), static_cast<unsigned>((1 + (EOL - Offsets->begin())))};
  130|      2|}
_ZNK4llvh9SourceMgr9SrcBuffer10getOffsetsItEEPNSt3__16vectorIT_NS3_9allocatorIS5_EEEEv:
   83|      2|std::vector<T> *SourceMgr::SrcBuffer::getOffsets() const {
   84|       |  // Ensure OffsetCache is allocated and populated with offsets of all the
   85|       |  // '\n' bytes.
   86|      2|  if (!OffsetCache.isNull())
  ------------------
  |  Branch (86:7): [True: 0, False: 2]
  ------------------
   87|      0|    return OffsetCache.get<std::vector<T> *>();
   88|       |
   89|      2|  std::vector<T> *Offsets = new std::vector<T>();
   90|      2|  OffsetCache = Offsets;
   91|      2|  size_t Sz = Buffer->getBufferSize();
   92|      2|  assert(Sz <= std::numeric_limits<T>::max());
   93|      2|  StringRef S = Buffer->getBuffer();
   94|   123k|  for (size_t N = 0; N < Sz; ++N) {
  ------------------
  |  Branch (94:22): [True: 123k, False: 2]
  ------------------
   95|   123k|    if (S[N] == '\n') {
  ------------------
  |  Branch (95:9): [True: 2, False: 123k]
  ------------------
   96|      2|      Offsets->push_back(static_cast<T>(N));
   97|      2|    }
   98|   123k|  }
   99|       |
  100|      2|  return Offsets;
  101|      2|}
_ZNK4llvh9SourceMgr9SrcBuffer13getLineNumberIjEENSt3__14pairINS_9StringRefEjEEPKc:
  105|  51.6k|    const char *Ptr) const {
  106|  51.6k|  std::vector<T> *Offsets = getOffsets<T>();
  107|       |
  108|  51.6k|  const char *BufStart = Buffer->getBufferStart();
  109|  51.6k|  assert(Ptr >= BufStart && Ptr <= Buffer->getBufferEnd());
  110|  51.6k|  ptrdiff_t PtrDiff = Ptr - BufStart;
  111|  51.6k|  assert(PtrDiff >= 0 && static_cast<size_t>(PtrDiff) <= std::numeric_limits<T>::max());
  112|  51.6k|  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|  51.6k|  auto EOL = std::lower_bound(Offsets->begin(), Offsets->end(), PtrOffset);
  119|       |
  120|       |  // The start of the line is the previous line end + 1.
  121|  51.6k|  const char *LineStart =
  122|  51.6k|      EOL != Offsets->begin() ? BufStart + EOL[-1] + 1 : BufStart;
  ------------------
  |  Branch (122:7): [True: 50.8k, False: 749]
  ------------------
  123|       |
  124|       |  // The end of the line is the EOL inclusive or the end of the buffer exclusive.
  125|  51.6k|  const char *LineEnd =
  126|  51.6k|      EOL != Offsets->end() ? BufStart + *EOL + 1 : Buffer->getBufferEnd();
  ------------------
  |  Branch (126:7): [True: 50.9k, False: 610]
  ------------------
  127|       |
  128|       |  // Lines count from 1, so add 1 to the distance from the 0th line.
  129|  51.6k|  return {StringRef(LineStart, LineEnd - LineStart), static_cast<unsigned>((1 + (EOL - Offsets->begin())))};
  130|  51.6k|}
_ZNK4llvh9SourceMgr9SrcBuffer10getOffsetsIjEEPNSt3__16vectorIT_NS3_9allocatorIS5_EEEEv:
   83|   241k|std::vector<T> *SourceMgr::SrcBuffer::getOffsets() const {
   84|       |  // Ensure OffsetCache is allocated and populated with offsets of all the
   85|       |  // '\n' bytes.
   86|   241k|  if (!OffsetCache.isNull())
  ------------------
  |  Branch (86:7): [True: 241k, False: 244]
  ------------------
   87|   241k|    return OffsetCache.get<std::vector<T> *>();
   88|       |
   89|    244|  std::vector<T> *Offsets = new std::vector<T>();
   90|    244|  OffsetCache = Offsets;
   91|    244|  size_t Sz = Buffer->getBufferSize();
   92|    244|  assert(Sz <= std::numeric_limits<T>::max());
   93|    244|  StringRef S = Buffer->getBuffer();
   94|  67.2M|  for (size_t N = 0; N < Sz; ++N) {
  ------------------
  |  Branch (94:22): [True: 67.2M, False: 244]
  ------------------
   95|  67.2M|    if (S[N] == '\n') {
  ------------------
  |  Branch (95:9): [True: 1.72M, False: 65.5M]
  ------------------
   96|  1.72M|      Offsets->push_back(static_cast<T>(N));
   97|  1.72M|    }
   98|  67.2M|  }
   99|       |
  100|    244|  return Offsets;
  101|    244|}
_ZNK4llvh9SourceMgr9SrcBuffer10getLineRefIhEENS_9StringRefEj:
  133|      5|StringRef SourceMgr::SrcBuffer::getLineRef(unsigned line) const {
  134|      5|  assert(line >= 1 && "line number must be 1-based");
  135|      5|  --line;
  136|       |
  137|      5|  const char *BufStart = Buffer->getBufferStart();
  138|      5|  std::vector<T> *Offsets = getOffsets<T>();
  139|      5|  size_t size = Offsets->size();
  140|      5|  if (line < size) {
  ------------------
  |  Branch (140:7): [True: 0, False: 5]
  ------------------
  141|      0|    auto EOL = Offsets->begin() + line;
  142|       |
  143|       |    // The start of the line is the previous line end + 1.
  144|      0|    const char *LineStart =
  145|      0|        EOL != Offsets->begin() ? BufStart + EOL[-1] + 1 : BufStart;
  ------------------
  |  Branch (145:9): [True: 0, False: 0]
  ------------------
  146|       |
  147|       |    // The end of the line is the EOL inclusive.
  148|      0|    const char *LineEnd = BufStart + *EOL + 1;
  149|       |
  150|      0|    return StringRef(LineStart, LineEnd - LineStart);
  151|      5|  } else {
  152|       |    // Asking for the last line?
  153|      5|    if (line == size) {
  ------------------
  |  Branch (153:9): [True: 3, False: 2]
  ------------------
  154|      3|      const char *LineStart =
  155|      3|          size != 0 ? BufStart + Offsets->back() + 1 : BufStart;
  ------------------
  |  Branch (155:11): [True: 3, False: 0]
  ------------------
  156|      3|      const char *LineEnd = Buffer->getBufferEnd();
  157|      3|      return StringRef(LineStart, LineEnd - LineStart);
  158|      3|    } else {
  159|      2|      return StringRef(Buffer->getBufferEnd(), 0);
  160|      2|    }
  161|      5|  }
  162|      5|}
_ZNK4llvh9SourceMgr9SrcBuffer10getLineRefIjEENS_9StringRefEj:
  133|   190k|StringRef SourceMgr::SrcBuffer::getLineRef(unsigned line) const {
  134|   190k|  assert(line >= 1 && "line number must be 1-based");
  135|   190k|  --line;
  136|       |
  137|   190k|  const char *BufStart = Buffer->getBufferStart();
  138|   190k|  std::vector<T> *Offsets = getOffsets<T>();
  139|   190k|  size_t size = Offsets->size();
  140|   190k|  if (line < size) {
  ------------------
  |  Branch (140:7): [True: 189k, False: 290]
  ------------------
  141|   189k|    auto EOL = Offsets->begin() + line;
  142|       |
  143|       |    // The start of the line is the previous line end + 1.
  144|   189k|    const char *LineStart =
  145|   189k|        EOL != Offsets->begin() ? BufStart + EOL[-1] + 1 : BufStart;
  ------------------
  |  Branch (145:9): [True: 189k, False: 0]
  ------------------
  146|       |
  147|       |    // The end of the line is the EOL inclusive.
  148|   189k|    const char *LineEnd = BufStart + *EOL + 1;
  149|       |
  150|   189k|    return StringRef(LineStart, LineEnd - LineStart);
  151|   189k|  } else {
  152|       |    // Asking for the last line?
  153|    290|    if (line == size) {
  ------------------
  |  Branch (153:9): [True: 67, False: 223]
  ------------------
  154|     67|      const char *LineStart =
  155|     67|          size != 0 ? BufStart + Offsets->back() + 1 : BufStart;
  ------------------
  |  Branch (155:11): [True: 67, False: 0]
  ------------------
  156|     67|      const char *LineEnd = Buffer->getBufferEnd();
  157|     67|      return StringRef(LineStart, LineEnd - LineStart);
  158|    223|    } else {
  159|    223|      return StringRef(Buffer->getBufferEnd(), 0);
  160|    223|    }
  161|    290|  }
  162|   190k|}

_ZN4llvh9Statistic17RegisterStatisticEv:
   94|     21|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|     21|  if (!Initialized.load(std::memory_order_relaxed)) {
  ------------------
  |  Branch (103:7): [True: 21, False: 0]
  ------------------
  104|     21|    sys::SmartMutex<true> &Lock = *StatLock;
  105|     21|    StatisticInfo &SI = *StatInfo;
  106|     21|    sys::SmartScopedLock<true> Writer(Lock);
  107|       |    // Check Initialized again after acquiring the lock.
  108|     21|    if (Initialized.load(std::memory_order_relaxed))
  ------------------
  |  Branch (108:9): [True: 0, False: 21]
  ------------------
  109|      0|      return;
  110|     21|    if (Stats || Enabled)
  ------------------
  |  Branch (110:9): [True: 0, False: 21]
  |  Branch (110:18): [True: 0, False: 21]
  ------------------
  111|      0|      SI.addStatistic(this);
  112|       |
  113|       |    // Remember we have been registered.
  114|     21|    Initialized.store(true, std::memory_order_release);
  115|     21|  }
  116|     21|}
_ZN4llvh20AreStatisticsEnabledEv:
  134|  1.17k|bool llvh::AreStatisticsEnabled() {
  135|  1.17k|  return Enabled || Stats;
  ------------------
  |  Branch (135:10): [True: 0, False: 1.17k]
  |  Branch (135:21): [True: 0, False: 1.17k]
  ------------------
  136|  1.17k|}
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|      6|void StringMapImpl::init(unsigned InitSize) {
   54|      6|  assert((InitSize & (InitSize-1)) == 0 &&
   55|      6|         "Init Size must be a power of 2 or zero!");
   56|       |
   57|      6|  unsigned NewNumBuckets = InitSize ? InitSize : 16;
  ------------------
  |  Branch (57:28): [True: 6, False: 0]
  ------------------
   58|      6|  NumItems = 0;
   59|      6|  NumTombstones = 0;
   60|       |
   61|      6|  TheTable = static_cast<StringMapEntryBase **>(
   62|      6|      safe_calloc(NewNumBuckets+1,
   63|      6|                  sizeof(StringMapEntryBase **) + sizeof(unsigned)));
   64|       |
   65|       |  // Set the member only if TheTable was successfully allocated
   66|      6|  NumBuckets = NewNumBuckets;
   67|       |
   68|       |  // Allocate one extra bucket, set it to look filled so the iterators stop at
   69|       |  // end.
   70|      6|  TheTable[NumBuckets] = (StringMapEntryBase*)2;
   71|      6|}
_ZN4llvh13StringMapImpl15LookupBucketForENS_9StringRefE:
   78|     46|unsigned StringMapImpl::LookupBucketFor(StringRef Name) {
   79|     46|  unsigned HTSize = NumBuckets;
   80|     46|  if (HTSize == 0) {  // Hash table unallocated so far?
  ------------------
  |  Branch (80:7): [True: 6, False: 40]
  ------------------
   81|      6|    init(16);
   82|      6|    HTSize = NumBuckets;
   83|      6|  }
   84|     46|  unsigned FullHashValue = djbHash(Name, 0);
   85|     46|  unsigned BucketNo = FullHashValue & (HTSize-1);
   86|     46|  unsigned *HashTable = (unsigned *)(TheTable + NumBuckets + 1);
   87|       |
   88|     46|  unsigned ProbeAmt = 1;
   89|     46|  int FirstTombstone = -1;
   90|     94|  while (true) {
  ------------------
  |  Branch (90:10): [Folded - Ignored]
  ------------------
   91|     94|    StringMapEntryBase *BucketItem = TheTable[BucketNo];
   92|       |    // If we found an empty bucket, this key isn't in the table yet, return it.
   93|     94|    if (LLVM_LIKELY(!BucketItem)) {
  ------------------
  |  |  188|     94|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 44, False: 50]
  |  |  ------------------
  ------------------
   94|       |      // If we found a tombstone, we want to reuse the tombstone instead of an
   95|       |      // empty bucket.  This reduces probing.
   96|     44|      if (FirstTombstone != -1) {
  ------------------
  |  Branch (96:11): [True: 0, False: 44]
  ------------------
   97|      0|        HashTable[FirstTombstone] = FullHashValue;
   98|      0|        return FirstTombstone;
   99|      0|      }
  100|       |
  101|     44|      HashTable[BucketNo] = FullHashValue;
  102|     44|      return BucketNo;
  103|     44|    }
  104|       |
  105|     50|    if (BucketItem == getTombstoneVal()) {
  ------------------
  |  Branch (105:9): [True: 0, False: 50]
  ------------------
  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|     50|    } else if (LLVM_LIKELY(HashTable[BucketNo] == FullHashValue)) {
  ------------------
  |  |  188|     50|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2, False: 48]
  |  |  ------------------
  ------------------
  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|      2|      char *ItemStr = (char*)BucketItem+ItemSize;
  117|      2|      if (Name == StringRef(ItemStr, BucketItem->getKeyLength())) {
  ------------------
  |  Branch (117:11): [True: 2, False: 0]
  ------------------
  118|       |        // We found a match!
  119|      2|        return BucketNo;
  120|      2|      }
  121|      2|    }
  122|       |
  123|       |    // Okay, we didn't find the item.  Probe to the next bucket.
  124|     48|    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|     48|    ++ProbeAmt;
  129|     48|  }
  130|     46|}
_ZN4llvh13StringMapImpl11RehashTableEj:
  201|     44|unsigned StringMapImpl::RehashTable(unsigned BucketNo) {
  202|     44|  unsigned NewSize;
  203|     44|  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|     44|  if (LLVM_UNLIKELY(NumItems * 4 > NumBuckets * 3)) {
  ------------------
  |  |  189|     44|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 42]
  |  |  ------------------
  ------------------
  209|      2|    NewSize = NumBuckets*2;
  210|     42|  } else if (LLVM_UNLIKELY(NumBuckets - (NumItems + NumTombstones) <=
  ------------------
  |  |  189|     42|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 42]
  |  |  ------------------
  ------------------
  211|     42|                           NumBuckets / 8)) {
  212|      0|    NewSize = NumBuckets;
  213|     42|  } else {
  214|     42|    return BucketNo;
  215|     42|  }
  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|     44|}

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

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

_ZN4llvh16NamedRegionTimerC2ENS_9StringRefES1_S1_S1_b:
  215|    980|  : TimeRegion(!Enabled ? nullptr
  ------------------
  |  Branch (215:16): [True: 980, False: 0]
  ------------------
  216|    980|                 : &NamedGroupedTimers->get(Name, Description, GroupName,
  217|    980|                                            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|    840|std::string Twine::str() const {
   19|       |  // If we're storing only a std::string, just return it.
   20|    840|  if (LHSKind == StdStringKind && RHSKind == EmptyKind)
  ------------------
  |  Branch (20:7): [True: 16, False: 824]
  |  Branch (20:35): [True: 16, False: 0]
  ------------------
   21|     16|    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|    824|  if (LHSKind == FormatvObjectKind && RHSKind == EmptyKind)
  ------------------
  |  Branch (25:7): [True: 0, False: 824]
  |  Branch (25:39): [True: 0, False: 0]
  ------------------
   26|      0|    return LHS.formatvObject->str();
   27|       |
   28|       |  // Otherwise, flatten and copy the contents first.
   29|    824|  SmallString<256> Vec;
   30|    824|  return toStringRef(Vec).str();
   31|    824|}
_ZNK4llvh5Twine8toVectorERNS_15SmallVectorImplIcEE:
   33|     59|void Twine::toVector(SmallVectorImpl<char> &Out) const {
   34|     59|  raw_svector_ostream OS(Out);
   35|     59|  print(OS);
   36|     59|}
_ZNK4llvh5Twine13printOneChildERNS_11raw_ostreamENS0_5ChildENS0_8NodeKindE:
   59|    424|                          NodeKind Kind) const {
   60|    424|  switch (Kind) {
  ------------------
  |  Branch (60:11): [True: 0, False: 424]
  ------------------
   61|      0|  case Twine::NullKind: break;
  ------------------
  |  Branch (61:3): [True: 0, False: 424]
  ------------------
   62|      0|  case Twine::EmptyKind: break;
  ------------------
  |  Branch (62:3): [True: 0, False: 424]
  ------------------
   63|    153|  case Twine::TwineKind:
  ------------------
  |  Branch (63:3): [True: 153, False: 271]
  ------------------
   64|    153|    Ptr.twine->print(OS);
   65|    153|    break;
   66|    109|  case Twine::CStringKind:
  ------------------
  |  Branch (66:3): [True: 109, False: 315]
  ------------------
   67|    109|    OS << Ptr.cString;
   68|    109|    break;
   69|      0|  case Twine::StdStringKind:
  ------------------
  |  Branch (69:3): [True: 0, False: 424]
  ------------------
   70|      0|    OS << *Ptr.stdString;
   71|      0|    break;
   72|     54|  case Twine::StringRefKind:
  ------------------
  |  Branch (72:3): [True: 54, False: 370]
  ------------------
   73|     54|    OS << *Ptr.stringRef;
   74|     54|    break;
   75|      0|  case Twine::SmallStringKind:
  ------------------
  |  Branch (75:3): [True: 0, False: 424]
  ------------------
   76|      0|    OS << *Ptr.smallString;
   77|      0|    break;
   78|      0|  case Twine::FormatvObjectKind:
  ------------------
  |  Branch (78:3): [True: 0, False: 424]
  ------------------
   79|      0|    OS << *Ptr.formatvObject;
   80|      0|    break;
   81|      0|  case Twine::CharKind:
  ------------------
  |  Branch (81:3): [True: 0, False: 424]
  ------------------
   82|      0|    OS << Ptr.character;
   83|      0|    break;
   84|      0|  case Twine::DecUIKind:
  ------------------
  |  Branch (84:3): [True: 0, False: 424]
  ------------------
   85|      0|    OS << Ptr.decUI;
   86|      0|    break;
   87|    102|  case Twine::DecIKind:
  ------------------
  |  Branch (87:3): [True: 102, False: 322]
  ------------------
   88|    102|    OS << Ptr.decI;
   89|    102|    break;
   90|      0|  case Twine::DecULKind:
  ------------------
  |  Branch (90:3): [True: 0, False: 424]
  ------------------
   91|      0|    OS << *Ptr.decUL;
   92|      0|    break;
   93|      0|  case Twine::DecLKind:
  ------------------
  |  Branch (93:3): [True: 0, False: 424]
  ------------------
   94|      0|    OS << *Ptr.decL;
   95|      0|    break;
   96|      0|  case Twine::DecULLKind:
  ------------------
  |  Branch (96:3): [True: 0, False: 424]
  ------------------
   97|      0|    OS << *Ptr.decULL;
   98|      0|    break;
   99|      0|  case Twine::DecLLKind:
  ------------------
  |  Branch (99:3): [True: 0, False: 424]
  ------------------
  100|      0|    OS << *Ptr.decLL;
  101|      0|    break;
  102|      6|  case Twine::UHexKind:
  ------------------
  |  Branch (102:3): [True: 6, False: 418]
  ------------------
  103|      6|    OS.write_hex(*Ptr.uHex);
  104|      6|    break;
  105|    424|  }
  106|    424|}
_ZNK4llvh5Twine5printERNS_11raw_ostreamE:
  164|    212|void Twine::print(raw_ostream &OS) const {
  165|    212|  printOneChild(OS, LHS, getLHSKind());
  166|    212|  printOneChild(OS, RHS, getRHSKind());
  167|    212|}

_ZN4llvh3sys20ChangeStdoutToBinaryEv:
  442|      1|std::error_code sys::ChangeStdoutToBinary() {
  443|       |  // Do nothing, as Unix doesn't differentiate between text and binary.
  444|      1|  return std::error_code();
  445|      1|}

_ZN4llvh11raw_ostreamD2Ev:
   69|  20.6M|raw_ostream::~raw_ostream() {
   70|       |  // raw_ostream's subclasses should take care to flush the buffer
   71|       |  // in their destructors.
   72|  20.6M|  assert(OutBufCur == OutBufStart &&
   73|  20.6M|         "raw_ostream destructor called with non-empty buffer!");
   74|       |
   75|  20.6M|  if (BufferMode == InternalBuffer)
  ------------------
  |  Branch (75:7): [True: 1, False: 20.6M]
  ------------------
   76|      1|    delete [] OutBufStart;
   77|  20.6M|}
_ZN4llvh11raw_ostream11SetBufferedEv:
   84|      1|void raw_ostream::SetBuffered() {
   85|       |  // Ask the subclass to determine an appropriate buffer size.
   86|      1|  if (size_t Size = preferred_buffer_size())
  ------------------
  |  Branch (86:14): [True: 1, False: 0]
  ------------------
   87|      1|    SetBufferSize(Size);
   88|      0|  else
   89|       |    // It may return 0, meaning this stream should be unbuffered.
   90|      0|    SetUnbuffered();
   91|      1|}
_ZN4llvh11raw_ostream16SetBufferAndModeEPcmNS0_10BufferKindE:
   94|  20.6M|                                   BufferKind Mode) {
   95|  20.6M|  assert(((Mode == Unbuffered && !BufferStart && Size == 0) ||
   96|  20.6M|          (Mode != Unbuffered && BufferStart && Size != 0)) &&
   97|  20.6M|         "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|  20.6M|  assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!");
  101|       |
  102|  20.6M|  if (BufferMode == InternalBuffer)
  ------------------
  |  Branch (102:7): [True: 20.6M, False: 0]
  ------------------
  103|  20.6M|    delete [] OutBufStart;
  104|  20.6M|  OutBufStart = BufferStart;
  105|  20.6M|  OutBufEnd = OutBufStart+Size;
  106|  20.6M|  OutBufCur = OutBufStart;
  107|  20.6M|  BufferMode = Mode;
  108|       |
  109|  20.6M|  assert(OutBufStart <= OutBufEnd && "Invalid size!");
  110|  20.6M|}
_ZN4llvh11raw_ostreamlsEm:
  112|   136k|raw_ostream &raw_ostream::operator<<(unsigned long N) {
  113|   136k|  write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
  114|   136k|  return *this;
  115|   136k|}
_ZN4llvh11raw_ostreamlsEl:
  117|    102|raw_ostream &raw_ostream::operator<<(long N) {
  118|    102|  write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
  119|    102|  return *this;
  120|    102|}
_ZN4llvh11raw_ostream9write_hexEy:
  132|      6|raw_ostream &raw_ostream::write_hex(unsigned long long N) {
  133|      6|  llvh::write_hex(*this, N, HexPrintStyle::Lower);
  134|      6|  return *this;
  135|      6|}
_ZN4llvh11raw_ostream14flush_nonemptyEv:
  197|    301|void raw_ostream::flush_nonempty() {
  198|    301|  assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty.");
  199|    301|  size_t Length = OutBufCur - OutBufStart;
  200|    301|  OutBufCur = OutBufStart;
  201|    301|  write_impl(OutBufStart, Length);
  202|    301|}
_ZN4llvh11raw_ostream5writeEh:
  204|  21.8M|raw_ostream &raw_ostream::write(unsigned char C) {
  205|       |  // Group exceptional cases into a single branch.
  206|  21.8M|  if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) {
  ------------------
  |  |  189|  21.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 21.8M, False: 0]
  |  |  ------------------
  ------------------
  207|  21.8M|    if (LLVM_UNLIKELY(!OutBufStart)) {
  ------------------
  |  |  189|  21.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 21.8M, False: 0]
  |  |  ------------------
  ------------------
  208|  21.8M|      if (BufferMode == Unbuffered) {
  ------------------
  |  Branch (208:11): [True: 21.8M, False: 0]
  ------------------
  209|  21.8M|        write_impl(reinterpret_cast<char*>(&C), 1);
  210|  21.8M|        return *this;
  211|  21.8M|      }
  212|       |      // Set up a buffer and start over.
  213|      0|      SetBuffered();
  214|      0|      return write(C);
  215|  21.8M|    }
  216|       |
  217|      0|    flush_nonempty();
  218|      0|  }
  219|       |
  220|      0|  *OutBufCur++ = C;
  221|      0|  return *this;
  222|  21.8M|}
_ZN4llvh11raw_ostream5writeEPKcm:
  224|   880k|raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
  225|       |  // Group exceptional cases into a single branch.
  226|   880k|  if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) {
  ------------------
  |  |  189|   880k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 555k, False: 325k]
  |  |  ------------------
  ------------------
  227|   555k|    if (LLVM_UNLIKELY(!OutBufStart)) {
  ------------------
  |  |  189|   555k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 554k, False: 301]
  |  |  ------------------
  ------------------
  228|   554k|      if (BufferMode == Unbuffered) {
  ------------------
  |  Branch (228:11): [True: 554k, False: 1]
  ------------------
  229|   554k|        write_impl(Ptr, Size);
  230|   554k|        return *this;
  231|   554k|      }
  232|       |      // Set up a buffer and start over.
  233|      1|      SetBuffered();
  234|      1|      return write(Ptr, Size);
  235|   554k|    }
  236|       |
  237|    301|    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|    301|    if (LLVM_UNLIKELY(OutBufCur == OutBufStart)) {
  ------------------
  |  |  189|    301|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 17, False: 284]
  |  |  ------------------
  ------------------
  243|     17|      assert(NumBytes != 0 && "undefined behavior");
  244|     17|      size_t BytesToWrite = Size - (Size % NumBytes);
  245|     17|      write_impl(Ptr, BytesToWrite);
  246|     17|      size_t BytesRemaining = Size - BytesToWrite;
  247|     17|      if (BytesRemaining > size_t(OutBufEnd - OutBufCur)) {
  ------------------
  |  Branch (247:11): [True: 0, False: 17]
  ------------------
  248|       |        // Too much left over to copy into our buffer.
  249|      0|        return write(Ptr + BytesToWrite, BytesRemaining);
  250|      0|      }
  251|     17|      copy_to_buffer(Ptr + BytesToWrite, BytesRemaining);
  252|     17|      return *this;
  253|     17|    }
  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|    284|    copy_to_buffer(Ptr, NumBytes);
  258|    284|    flush_nonempty();
  259|    284|    return write(Ptr + NumBytes, Size - NumBytes);
  260|    301|  }
  261|       |
  262|   325k|  copy_to_buffer(Ptr, Size);
  263|       |
  264|   325k|  return *this;
  265|   880k|}
_ZN4llvh11raw_ostream14copy_to_bufferEPKcm:
  267|   326k|void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
  268|   326k|  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|   326k|  switch (Size) {
  273|     19|  case 4: OutBufCur[3] = Ptr[3]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|     19|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (273:3): [True: 19, False: 326k]
  ------------------
  274|  76.2k|  case 3: OutBufCur[2] = Ptr[2]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|  76.2k|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (274:3): [True: 76.2k, False: 249k]
  ------------------
  275|  76.6k|  case 2: OutBufCur[1] = Ptr[1]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|  76.6k|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (275:3): [True: 443, False: 325k]
  ------------------
  276|   305k|  case 1: OutBufCur[0] = Ptr[0]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|   305k|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (276:3): [True: 228k, False: 97.5k]
  ------------------
  277|   305k|  case 0: break;
  ------------------
  |  Branch (277:3): [True: 149, False: 325k]
  ------------------
  278|  20.7k|  default:
  ------------------
  |  Branch (278:3): [True: 20.7k, False: 305k]
  ------------------
  279|  20.7k|    memcpy(OutBufCur, Ptr, Size);
  280|  20.7k|    break;
  281|   326k|  }
  282|       |
  283|   326k|  OutBufCur += Size;
  284|   326k|}
_ZN4llvh14raw_fd_ostreamC2ENS_9StringRefERNSt3__110error_codeENS_3sys2fs9OpenFlagsE:
  544|      1|    : raw_fd_ostream(Filename, EC, sys::fs::CD_CreateAlways, sys::fs::FA_Write,
  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|    318|void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
  670|    318|  assert(FD >= 0 && "File already closed.");
  671|    318|  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|    318|  size_t MaxWriteSize = INT32_MAX;
  685|       |
  686|    318|#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|    318|  MaxWriteSize = 1024 * 1024 * 1024;
  690|    318|#endif
  691|       |
  692|    318|  do {
  693|    318|    size_t ChunkSize = std::min(Size, MaxWriteSize);
  694|    318|    ssize_t ret = ::write(FD, Ptr, ChunkSize);
  695|       |
  696|    318|    if (ret < 0) {
  ------------------
  |  Branch (696:9): [True: 0, False: 318]
  ------------------
  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|    318|    Ptr += ret;
  721|    318|    Size -= ret;
  722|    318|  } while (Size > 0);
  ------------------
  |  Branch (722:12): [True: 0, False: 318]
  ------------------
  723|    318|}
_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) && !(defined(__APPLE__) && defined(HERMES_IS_MOBILE_BUILD)) && !defined(__EMSCRIPTEN__)
  768|       |  // Minix has no st_blksize.
  769|      1|  assert(FD >= 0 && "File not yet open!");
  770|      1|  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|   651k|raw_ostream &llvh::outs() {
  845|       |  // Set buffer settings to model stdout behavior.
  846|   651k|  std::error_code EC;
  847|   651k|  static raw_fd_ostream S("-", EC, sys::fs::F_None);
  848|   651k|  assert(!EC);
  849|   651k|  return S;
  850|   651k|}
_ZN4llvh4errsEv:
  854|    772|raw_ostream &llvh::errs() {
  855|       |  // Set standard error to be unbuffered by default.
  856|    772|  static raw_fd_ostream S(STDERR_FILENO, false, true);
  857|    772|  return S;
  858|    772|}
_ZN4llvh19raw_svector_ostream10write_implEPKcm:
  884|  22.3M|void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
  885|  22.3M|  OS.append(Ptr, Ptr + Size);
  886|  22.3M|}
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|   178k|  inline bool at(size_t idx) const {
  152|   178k|    assert(idx < N && "Index must be within the bitset");
  153|   178k|    const uintptr_t mask = 1ULL << (idx % kBitsPerWord);
  154|   178k|    const auto wordIdx = idx / kBitsPerWord;
  155|   178k|    return allBits_[wordIdx] & mask;
  156|   178k|  }
_ZN6hermes8BitArrayILm524288ELm8EE3setEmb:
  136|   585k|  inline void set(size_t idx, bool val) {
  137|   585k|    const uintptr_t mask = 1ULL << (idx % kBitsPerWord);
  138|   585k|    const size_t wordIdx = idx / kBitsPerWord;
  139|   585k|    if (val)
  ------------------
  |  Branch (139:9): [True: 585k, False: 0]
  ------------------
  140|   585k|      allBits_[wordIdx] |= mask;
  141|      0|    else
  142|      0|      allBits_[wordIdx] &= ~mask;
  143|   585k|  }
_ZN6hermes8BitArrayILm524288ELm8EE3setEv:
  131|    320|  inline void set() {
  132|    320|    std::fill_n(
  133|    320|        allBits_.begin(), kNumWords, std::numeric_limits<uintptr_t>::max());
  134|    320|  }
_ZNK6hermes8BitArrayILm524288ELm8EE19findNextZeroBitFromEm:
  163|    226|  size_t findNextZeroBitFrom(size_t idx) const {
  164|    226|    return findNextBitImpl<false>(idx);
  165|    226|  }
_ZNK6hermes8BitArrayILm524288ELm8EE15findNextBitImplILb0EEEmm:
   44|    226|  size_t findNextBitImpl(size_t idx) const {
   45|    226|    assert(
   46|    226|        idx <= N &&
   47|    226|        "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|    226|    if (N % kBitsPerWord == 0 && idx == N) {
  ------------------
  |  Branch (50:9): [Folded - Ignored]
  |  Branch (50:34): [True: 0, False: 226]
  ------------------
   51|      0|      return N;
   52|      0|    }
   53|    226|    size_t wordIdx = idx / kBitsPerWord;
   54|    226|    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|    226|    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|    226|    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|    226|    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|    226|    ++wordIdx;
   68|  1.85M|    while (!currentWord && (noBoundsCheck || wordIdx < kNumWords)) {
  ------------------
  |  Branch (68:12): [True: 1.85M, False: 0]
  |  Branch (68:29): [Folded - Ignored]
  |  Branch (68:46): [True: 1.85M, False: 226]
  ------------------
   69|  1.85M|      currentWord = V ? allBits_[wordIdx] : ~allBits_[wordIdx];
  ------------------
  |  Branch (69:21): [Folded - Ignored]
  ------------------
   70|  1.85M|      ++wordIdx;
   71|  1.85M|    }
   72|    226|    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|    226|    if (N % kBitsPerWord) {
  ------------------
  |  Branch (76:9): [Folded - Ignored]
  ------------------
   77|      0|      idx = std::min(idx, N);
   78|      0|    }
   79|    226|    return idx;
   80|    226|  }
_ZN6hermes8BitArrayILm524288ELm8EEC2Ev:
  120|    320|  BitArray() {
  121|    320|    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|    320|    std::fill_n(
  125|    320|        allBits_.begin() + kNumWords,
  126|    320|        kPaddedWords - kNumWords,
  127|    320|        std::numeric_limits<uintptr_t>::max());
  128|    320|  }
_ZN6hermes8BitArrayILm267ELm8EE3setEmb:
  136|    190|  inline void set(size_t idx, bool val) {
  137|    190|    const uintptr_t mask = 1ULL << (idx % kBitsPerWord);
  138|    190|    const size_t wordIdx = idx / kBitsPerWord;
  139|    190|    if (val)
  ------------------
  |  Branch (139:9): [True: 175, False: 15]
  ------------------
  140|    175|      allBits_[wordIdx] |= mask;
  141|     15|    else
  142|     15|      allBits_[wordIdx] &= ~mask;
  143|    190|  }
_ZN6hermes8BitArrayILm267ELm8EEC2Ev:
  120|    160|  BitArray() {
  121|    160|    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|    160|    std::fill_n(
  125|    160|        allBits_.begin() + kNumWords,
  126|    160|        kPaddedWords - kNumWords,
  127|    160|        std::numeric_limits<uintptr_t>::max());
  128|    160|  }
_ZNK6hermes8BitArrayILm267ELm8EE18findNextSetBitFromEm:
  159|   585k|  size_t findNextSetBitFrom(size_t idx) const {
  160|   585k|    return findNextBitImpl<true>(idx);
  161|   585k|  }
_ZNK6hermes8BitArrayILm267ELm8EE15findNextBitImplILb1EEEmm:
   44|   585k|  size_t findNextBitImpl(size_t idx) const {
   45|   585k|    assert(
   46|   585k|        idx <= N &&
   47|   585k|        "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|   585k|    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|   585k|    size_t wordIdx = idx / kBitsPerWord;
   54|   585k|    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|   585k|    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|   585k|    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|   585k|    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|   585k|    ++wordIdx;
   68|  2.92M|    while (!currentWord && (noBoundsCheck || wordIdx < kNumWords)) {
  ------------------
  |  Branch (68:12): [True: 2.33M, False: 585k]
  |  Branch (68:29): [Folded - Ignored]
  |  Branch (68:46): [True: 2.33M, False: 160]
  ------------------
   69|  2.33M|      currentWord = V ? allBits_[wordIdx] : ~allBits_[wordIdx];
  ------------------
  |  Branch (69:21): [Folded - Ignored]
  ------------------
   70|  2.33M|      ++wordIdx;
   71|  2.33M|    }
   72|   585k|    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|   585k|    if (N % kBitsPerWord) {
  ------------------
  |  Branch (76:9): [Folded - Ignored]
  ------------------
   77|   585k|      idx = std::min(idx, N);
   78|   585k|    }
   79|   585k|    return idx;
   80|   585k|  }

_ZN6hermes12CompactArrayC2EjNS0_5ScaleE:
   39|    559|      : size_(count),
   40|    559|        scale_(initScale),
   41|    559|        raw_(static_cast<char *>(checkedCalloc(count, 1ULL << initScale))) {}
_ZN6hermes12CompactArrayD2Ev:
   42|    559|  ~CompactArray() {
   43|    559|    ::free(raw_);
   44|    559|  }
_ZN6hermes12CompactArray4swapERS0_:
   48|    399|  void swap(CompactArray &other) {
   49|    399|    std::swap(size_, other.size_);
   50|    399|    std::swap(scale_, other.scale_);
   51|    399|    std::swap(raw_, other.raw_);
   52|    399|  }
_ZNK6hermes12CompactArray3getEj:
   53|  21.2M|  uint32_t get(uint32_t idx) const {
   54|  21.2M|    assert(idx < size_);
   55|  21.2M|    switch (scale_) {
  ------------------
  |  Branch (55:13): [True: 0, False: 21.2M]
  ------------------
   56|   655k|      case UINT8:
  ------------------
  |  Branch (56:7): [True: 655k, False: 20.5M]
  ------------------
   57|   655k|        return Fixed<uint8_t>::get(raw_, idx);
   58|  20.5M|      case UINT16:
  ------------------
  |  Branch (58:7): [True: 20.5M, False: 655k]
  ------------------
   59|  20.5M|        return Fixed<uint16_t>::get(raw_, idx);
   60|      0|      case UINT32:
  ------------------
  |  Branch (60:7): [True: 0, False: 21.2M]
  ------------------
   61|      0|        return Fixed<uint32_t>::get(raw_, idx);
   62|  21.2M|    }
   63|      0|    llvm_unreachable("impossible scale");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   64|  21.2M|  }
_ZN6hermes12CompactArray3setEjj:
   66|   969k|  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|   969k|    while (!trySet(idx, value))
  ------------------
  |  Branch (69:12): [True: 160, False: 969k]
  ------------------
   70|    160|      scaleUp();
   71|   969k|  }
_ZNK6hermes12CompactArray4sizeEv:
   72|  3.75M|  uint32_t size() const {
   73|  3.75M|    return size_;
   74|  3.75M|  }
_ZNK6hermes12CompactArray15getCurrentScaleEv:
   75|    239|  Scale getCurrentScale() const {
   76|    239|    return scale_;
   77|    239|  }
_ZN6hermes12CompactArray6trySetEjj:
   99|  1.29M|  bool trySet(uint32_t idx, uint32_t value) {
  100|  1.29M|    assert(idx < size_);
  101|  1.29M|    switch (scale_) {
  ------------------
  |  Branch (101:13): [True: 0, False: 1.29M]
  ------------------
  102|  38.5k|      case UINT8:
  ------------------
  |  Branch (102:7): [True: 38.5k, False: 1.25M]
  ------------------
  103|  38.5k|        return Fixed<uint8_t>::trySet(raw_, idx, value);
  104|  1.25M|      case UINT16:
  ------------------
  |  Branch (104:7): [True: 1.25M, False: 38.5k]
  ------------------
  105|  1.25M|        return Fixed<uint16_t>::trySet(raw_, idx, value);
  106|      0|      case UINT32:
  ------------------
  |  Branch (106:7): [True: 0, False: 1.29M]
  ------------------
  107|      0|        return Fixed<uint32_t>::trySet(raw_, idx, value);
  108|  1.29M|    }
  109|      0|    llvm_unreachable("impossible scale");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  110|  1.29M|  }
_ZN6hermes12CompactTable4swapERS0_:
  128|    239|  void swap(CompactTable &other) {
  129|    239|    CompactArray::swap(other);
  130|    239|  }
_ZNK6hermes12CompactTable7isEmptyEj:
  131|  3.84M|  bool isEmpty(uint32_t idx) const {
  132|  3.84M|    return CompactArray::get(idx) == EMPTY;
  133|  3.84M|  }
_ZNK6hermes12CompactTable9isDeletedEj:
  134|  2.87M|  bool isDeleted(uint32_t idx) const {
  135|  2.87M|    return CompactArray::get(idx) == DELETED;
  136|  2.87M|  }
_ZNK6hermes12CompactTable7isValidEj:
  137|  9.44M|  bool isValid(uint32_t idx) const {
  138|  9.44M|    return CompactArray::get(idx) >= FIRST_VALID;
  139|  9.44M|  }
_ZNK6hermes12CompactTable3getEj:
  140|  4.72M|  uint32_t get(uint32_t idx) const {
  141|  4.72M|    assert(isValid(idx));
  142|  4.72M|    return CompactArray::get(idx) - FIRST_VALID;
  143|  4.72M|  }
_ZN6hermes12CompactTable3setEjj:
  144|   969k|  void set(uint32_t idx, uint32_t value) {
  145|   969k|    assert(!isValid(idx));
  146|   969k|    CompactArray::set(idx, value + FIRST_VALID);
  147|       |    /// Checks for overflow.
  148|   969k|    assert(isValid(idx));
  149|   969k|  }
_ZN6hermes12CompactArray5FixedIhE3getEPcj:
   85|   655k|    static uint32_t get(char *raw, uint32_t idx) {
   86|   655k|      return reinterpret_cast<T *>(raw)[idx];
   87|   655k|    }
_ZN6hermes12CompactArray5FixedItE3getEPcj:
   85|  20.5M|    static uint32_t get(char *raw, uint32_t idx) {
   86|  20.5M|      return reinterpret_cast<T *>(raw)[idx];
   87|  20.5M|    }
_ZN6hermes12CompactArray5FixedIhE6trySetEPcjj:
   89|  38.5k|    static bool trySet(char *raw, uint32_t idx, uint32_t value) {
   90|  38.5k|      if (value > std::numeric_limits<T>::max())
  ------------------
  |  Branch (90:11): [True: 160, False: 38.4k]
  ------------------
   91|    160|        return false;
   92|  38.4k|      reinterpret_cast<T *>(raw)[idx] = static_cast<T>(value);
   93|  38.4k|      return true;
   94|  38.5k|    }
_ZN6hermes12CompactArray5FixedItE6trySetEPcjj:
   89|  1.25M|    static bool trySet(char *raw, uint32_t idx, uint32_t value) {
   90|  1.25M|      if (value > std::numeric_limits<T>::max())
  ------------------
  |  Branch (90:11): [True: 0, False: 1.25M]
  ------------------
   91|      0|        return false;
   92|  1.25M|      reinterpret_cast<T *>(raw)[idx] = static_cast<T>(value);
   93|  1.25M|      return true;
   94|  1.25M|    }

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

_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE3addIJRNS5_11HermesValueEEEERS7_DpOT_:
   70|   782k|  Element &add(Args &&...args) {
   71|       |    // Check to see if the list is out of free elements.
   72|   782k|    if (LLVM_UNLIKELY(!freeList_)) {
  ------------------
  |  |  189|   782k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 49.0k, False: 733k]
  |  |  ------------------
  ------------------
   73|       |      // There are no free elements; need to either garbage collect or allocate
   74|       |      // a new chunk.
   75|  49.0k|      if (chunkCount_ < targetChunkCount_) {
  ------------------
  |  Branch (75:11): [True: 0, False: 49.0k]
  ------------------
   76|       |        // Garbage collection is scheduled to happen at a larger chunk count;
   77|       |        // just allocate a new chunk of unoccpied elements.
   78|      0|        allocateChunk();
   79|  49.0k|      } else {
   80|       |        // Reached the garbage collection threshold; collect.
   81|  49.0k|        collect();
   82|       |
   83|       |        // A new chunk may still be required (e.g. if nothing was collected).
   84|  49.0k|        if (!freeList_) {
  ------------------
  |  Branch (84:13): [True: 44.7k, False: 4.28k]
  ------------------
   85|  44.7k|          allocateChunk();
   86|  44.7k|        }
   87|  49.0k|      }
   88|  49.0k|    }
   89|   782k|    assert(freeList_ && "Freelist must be populated before inserting");
   90|       |
   91|       |    // Emplace the new value at the first location in the free list.
   92|   782k|    Element &element = *freeList_;
   93|   782k|    freeList_ = freeList_->getNextFree();
   94|   782k|    assert(element.isFree() && "Premature element reuse");
   95|   782k|    element.emplace(std::forward<Args>(args)...);
   96|   782k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|   782k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
   97|   782k|    return element;
   98|   782k|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE13allocateChunkEv:
  189|  44.7k|  void allocateChunk() {
  190|  44.7k|    assert(!freeList_ && "Freelist must be empty before allocating a chunk");
  191|       |
  192|  44.7k|    Chunk *chunk = new Chunk;
  193|       |
  194|       |    // Create a linked list of free elements, going from high address
  195|       |    // to low.
  196|  44.7k|    Element *next = nullptr;
  197|   715k|    for (Element &current : chunk->elements) {
  ------------------
  |  Branch (197:27): [True: 715k, False: 44.7k]
  ------------------
  198|   715k|      assert(current.isFree());
  199|   715k|      current.setNextFree(next);
  200|   715k|      next = &current;
  201|   715k|    }
  202|       |
  203|       |    // Insert into the chunk list
  204|  44.7k|    chunk->nextChunk = chunks_;
  205|  44.7k|    chunks_ = chunk;
  206|       |
  207|       |    // Chunks are only allocated when the free list is empty. Just start the
  208|       |    // free list at this chunk.
  209|  44.7k|    freeList_ = next;
  210|       |
  211|  44.7k|    chunkCount_++;
  212|       |
  213|  44.7k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|  44.7k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  214|  44.7k|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE7collectEv:
  130|  49.1k|  void collect() {
  131|  49.1k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|  49.1k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  132|       |
  133|  49.1k|    freeList_ = nullptr;
  134|  49.1k|    size_t occupiedElementCount = 0;
  135|       |
  136|       |    // Delete chunks based on the target number of chunks from the previous
  137|       |    // collection. This can make deletion lag by one collection cycle, but
  138|       |    // simplifies the collection logic by allowing chunks to be deleted as they
  139|       |    // are encountered, before knowing the number of surviving values.
  140|  49.1k|    size_t targetChunkCount = ceil(targetChunkCount_);
  141|  49.1k|    Chunk **chunkListEndLoc = &chunks_;
  142|  98.1k|    for (Chunk *chunk = chunks_; chunk;) {
  ------------------
  |  Branch (142:34): [True: 49.0k, False: 49.1k]
  ------------------
  143|  49.0k|      size_t chunkOccupiedElementCount = 0;
  144|  49.0k|      Element *newFreeList = freeList_;
  145|       |
  146|       |      // Rebuild free list and count elements.
  147|   784k|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (147:29): [True: 784k, False: 49.0k]
  ------------------
  148|   784k|        if (element.isFree()) {
  ------------------
  |  Branch (148:13): [True: 784k, False: 4]
  ------------------
  149|   784k|          element.setNextFree(newFreeList);
  150|   784k|          newFreeList = &element;
  151|   784k|        } else {
  152|      4|          chunkOccupiedElementCount++;
  153|      4|        }
  154|   784k|      }
  155|       |
  156|  49.0k|      Chunk *nextChunk = chunk->nextChunk;
  157|  49.0k|      if (chunkOccupiedElementCount == 0 && chunkCount_ > targetChunkCount) {
  ------------------
  |  Branch (157:11): [True: 48.9k, False: 4]
  |  Branch (157:45): [True: 44.7k, False: 4.28k]
  ------------------
  158|       |        // This chunk is empty, and there are more chunks than desired;
  159|       |        // remove the chunk.
  160|  44.7k|        *chunkListEndLoc = nextChunk;
  161|  44.7k|        chunkCount_--;
  162|  44.7k|        delete chunk;
  163|  44.7k|      } else {
  164|  4.28k|        freeList_ = newFreeList;
  165|  4.28k|        occupiedElementCount += chunkOccupiedElementCount;
  166|  4.28k|        chunkListEndLoc = &chunk->nextChunk;
  167|  4.28k|      }
  168|  49.0k|      chunk = nextChunk;
  169|  49.0k|    }
  170|       |
  171|       |    // Schedule the next collection at a multiple of the the number of suviving
  172|       |    // elements (using the occupancy ratio), averaged with previous target to
  173|       |    // avoid drastic jumps.
  174|  49.1k|    targetChunkCount_.update(
  175|  49.1k|        occupiedElementCount / occupancyRatio_ / kElementsPerChunk);
  176|       |
  177|  49.1k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|  49.1k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  178|  49.1k|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE15checkWellFormedEv:
  216|   925k|  bool checkWellFormed() {
  217|  7.58M|    for (Element *freeElement = freeList_; freeElement;
  ------------------
  |  Branch (217:44): [True: 6.65M, False: 925k]
  ------------------
  218|  6.65M|         freeElement = freeElement->getNextFree()) {
  219|  6.65M|      if (!freeElement->isFree()) {
  ------------------
  |  Branch (219:11): [True: 0, False: 6.65M]
  ------------------
  220|      0|        return false;
  221|      0|      }
  222|  6.65M|    }
  223|       |
  224|   925k|    size_t chunkCount = 0;
  225|  1.80M|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (225:34): [True: 880k, False: 925k]
  ------------------
  226|   880k|      chunkCount++;
  227|   880k|    }
  228|   925k|    if (chunkCount != chunkCount_) {
  ------------------
  |  Branch (228:9): [True: 0, False: 925k]
  ------------------
  229|      0|      return false;
  230|      0|    }
  231|       |
  232|   925k|    return true;
  233|   925k|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE7collectEv:
  130|    160|  void collect() {
  131|    160|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|    160|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  132|       |
  133|    160|    freeList_ = nullptr;
  134|    160|    size_t occupiedElementCount = 0;
  135|       |
  136|       |    // Delete chunks based on the target number of chunks from the previous
  137|       |    // collection. This can make deletion lag by one collection cycle, but
  138|       |    // simplifies the collection logic by allowing chunks to be deleted as they
  139|       |    // are encountered, before knowing the number of surviving values.
  140|    160|    size_t targetChunkCount = ceil(targetChunkCount_);
  141|    160|    Chunk **chunkListEndLoc = &chunks_;
  142|    160|    for (Chunk *chunk = chunks_; chunk;) {
  ------------------
  |  Branch (142:34): [True: 0, False: 160]
  ------------------
  143|      0|      size_t chunkOccupiedElementCount = 0;
  144|      0|      Element *newFreeList = freeList_;
  145|       |
  146|       |      // Rebuild free list and count elements.
  147|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (147:29): [True: 0, False: 0]
  ------------------
  148|      0|        if (element.isFree()) {
  ------------------
  |  Branch (148:13): [True: 0, False: 0]
  ------------------
  149|      0|          element.setNextFree(newFreeList);
  150|      0|          newFreeList = &element;
  151|      0|        } else {
  152|      0|          chunkOccupiedElementCount++;
  153|      0|        }
  154|      0|      }
  155|       |
  156|      0|      Chunk *nextChunk = chunk->nextChunk;
  157|      0|      if (chunkOccupiedElementCount == 0 && chunkCount_ > targetChunkCount) {
  ------------------
  |  Branch (157:11): [True: 0, False: 0]
  |  Branch (157:45): [True: 0, False: 0]
  ------------------
  158|       |        // This chunk is empty, and there are more chunks than desired;
  159|       |        // remove the chunk.
  160|      0|        *chunkListEndLoc = nextChunk;
  161|      0|        chunkCount_--;
  162|      0|        delete chunk;
  163|      0|      } else {
  164|      0|        freeList_ = newFreeList;
  165|      0|        occupiedElementCount += chunkOccupiedElementCount;
  166|      0|        chunkListEndLoc = &chunk->nextChunk;
  167|      0|      }
  168|      0|      chunk = nextChunk;
  169|      0|    }
  170|       |
  171|       |    // Schedule the next collection at a multiple of the the number of suviving
  172|       |    // elements (using the occupancy ratio), averaged with previous target to
  173|       |    // avoid drastic jumps.
  174|    160|    targetChunkCount_.update(
  175|    160|        occupiedElementCount / occupancyRatio_ / kElementsPerChunk);
  176|       |
  177|    160|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|    160|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  178|    160|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE15checkWellFormedEv:
  216|    320|  bool checkWellFormed() {
  217|    320|    for (Element *freeElement = freeList_; freeElement;
  ------------------
  |  Branch (217:44): [True: 0, False: 320]
  ------------------
  218|    320|         freeElement = freeElement->getNextFree()) {
  219|      0|      if (!freeElement->isFree()) {
  ------------------
  |  Branch (219:11): [True: 0, False: 0]
  ------------------
  220|      0|        return false;
  221|      0|      }
  222|      0|    }
  223|       |
  224|    320|    size_t chunkCount = 0;
  225|    320|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (225:34): [True: 0, False: 320]
  ------------------
  226|      0|      chunkCount++;
  227|      0|    }
  228|    320|    if (chunkCount != chunkCount_) {
  ------------------
  |  Branch (228:9): [True: 0, False: 320]
  ------------------
  229|      0|      return false;
  230|      0|    }
  231|       |
  232|    320|    return true;
  233|    320|  }
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE7forEachIZNS3_13ManagedValuesIS8_ED1EvEUlRS9_E_EEvT_:
  104|    160|  void forEach(Func accept) const {
  105|    160|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 0, False: 160]
  ------------------
  106|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 0, False: 0]
  ------------------
  107|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 0]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|      0|      }
  111|      0|    }
  112|    160|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EED2Ev:
   60|    160|  ~ManagedChunkedList() {
   61|    160|    while (Chunk *chunk = chunks_) {
  ------------------
  |  Branch (61:19): [True: 0, False: 160]
  ------------------
   62|      0|      chunks_ = chunk->nextChunk;
   63|      0|      delete chunk;
   64|      0|    }
   65|    160|  }
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE7forEachIZNS3_13ManagedValuesIS6_ED1EvEUlRS7_E_EEvT_:
  104|    160|  void forEach(Func accept) const {
  105|    160|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 0, False: 160]
  ------------------
  106|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 0, False: 0]
  ------------------
  107|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 0]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|      0|      }
  111|      0|    }
  112|    160|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EED2Ev:
   60|    160|  ~ManagedChunkedList() {
   61|    160|    while (Chunk *chunk = chunks_) {
  ------------------
  |  Branch (61:19): [True: 0, False: 160]
  ------------------
   62|      0|      chunks_ = chunk->nextChunk;
   63|      0|      delete chunk;
   64|      0|    }
   65|    160|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EEC2Edd:
   43|    160|      : targetChunkCount_(sizingWeight, 0.0), occupancyRatio_{occupancyRatio} {}
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EEC2Edd:
   43|    160|      : targetChunkCount_(sizingWeight, 0.0), occupancyRatio_{occupancyRatio} {}
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE7forEachIZZNS3_C1ERKNS5_13RuntimeConfigEENKUlPNS5_7HadesGCERNS5_12RootAcceptorEE_clESE_SG_EUlRS7_E_EEvT_:
  104|    339|  void forEach(Func accept) const {
  105|    678|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 339, False: 339]
  ------------------
  106|  5.42k|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 5.42k, False: 339]
  ------------------
  107|  5.42k|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 15, False: 5.40k]
  ------------------
  108|     15|          accept(element);
  109|     15|        }
  110|  5.42k|      }
  111|    339|    }
  112|    339|  }
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE7forEachIZZNS3_C1ERKNS5_13RuntimeConfigEENKUlPNS5_7HadesGCERNS5_16WeakRootAcceptorEE_clESG_SI_EUlRS9_E_EEvT_:
  104|    339|  void forEach(Func accept) const {
  105|    339|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 0, False: 339]
  ------------------
  106|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 0, False: 0]
  ------------------
  107|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 0]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|      0|      }
  111|      0|    }
  112|    339|  }
_ZNK6hermes18ManagedChunkedListINS_2vm16WeakMapEntrySlotELm16EE12sizeForTestsEv:
  122|    160|  size_t sizeForTests() const {
  123|    160|    size_t size = 0;
  124|    160|    forEach([&size](Element &) { size++; });
  125|    160|    return size;
  126|    160|  }
_ZNK6hermes18ManagedChunkedListINS_2vm16WeakMapEntrySlotELm16EE7forEachIZNKS3_12sizeForTestsEvEUlRS2_E_EEvT_:
  104|    160|  void forEach(Func accept) const {
  105|    160|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 0, False: 160]
  ------------------
  106|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 0, False: 0]
  ------------------
  107|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 0]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|      0|      }
  111|      0|    }
  112|    160|  }
_ZNK6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EE12sizeForTestsEv:
  122|    160|  size_t sizeForTests() const {
  123|    160|    size_t size = 0;
  124|    160|    forEach([&size](Element &) { size++; });
  125|    160|    return size;
  126|    160|  }
_ZNK6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EE7forEachIZNKS3_12sizeForTestsEvEUlRS2_E_EEvT_:
  104|    160|  void forEach(Func accept) const {
  105|  6.13k|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 5.97k, False: 160]
  ------------------
  106|  95.6k|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 95.6k, False: 5.97k]
  ------------------
  107|  95.6k|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 95.6k]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|  95.6k|      }
  111|  5.97k|    }
  112|    160|  }
_ZNK6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EE7forEachIZNS1_6GCBase13markWeakRootsERNS1_16WeakRootAcceptorEbEUlRS2_E_EEvT_:
  104|    339|  void forEach(Func accept) const {
  105|  13.0k|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 12.6k, False: 339]
  ------------------
  106|   202k|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 202k, False: 12.6k]
  ------------------
  107|   202k|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 199k, False: 3.08k]
  ------------------
  108|   199k|          accept(element);
  109|   199k|        }
  110|   202k|      }
  111|  12.6k|    }
  112|    339|  }
_ZNK6hermes18ManagedChunkedListINS_2vm16WeakMapEntrySlotELm16EE7forEachIZNS1_6GCBase13markWeakRootsERNS1_16WeakRootAcceptorEbEUlRS2_E_EEvT_:
  104|    339|  void forEach(Func accept) const {
  105|    339|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 0, False: 339]
  ------------------
  106|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 0, False: 0]
  ------------------
  107|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 0]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|      0|      }
  111|      0|    }
  112|    339|  }
_ZN6hermes18ManagedChunkedListINS_2vm16WeakMapEntrySlotELm16EED2Ev:
   60|    160|  ~ManagedChunkedList() {
   61|    160|    while (Chunk *chunk = chunks_) {
  ------------------
  |  Branch (61:19): [True: 0, False: 160]
  ------------------
   62|      0|      chunks_ = chunk->nextChunk;
   63|      0|      delete chunk;
   64|      0|    }
   65|    160|  }
_ZN6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EED2Ev:
   60|    160|  ~ManagedChunkedList() {
   61|  6.13k|    while (Chunk *chunk = chunks_) {
  ------------------
  |  Branch (61:19): [True: 5.97k, False: 160]
  ------------------
   62|  5.97k|      chunks_ = chunk->nextChunk;
   63|  5.97k|      delete chunk;
   64|  5.97k|    }
   65|    160|  }
_ZN6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EEC2Edd:
   43|    160|      : targetChunkCount_(sizingWeight, 0.0), occupancyRatio_{occupancyRatio} {}
_ZN6hermes18ManagedChunkedListINS_2vm16WeakMapEntrySlotELm16EEC2Edd:
   43|    160|      : targetChunkCount_(sizingWeight, 0.0), occupancyRatio_{occupancyRatio} {}
_ZN6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EE3addIJRNS1_17CompressedPointerEEEERS2_DpOT_:
   70|  95.9k|  Element &add(Args &&...args) {
   71|       |    // Check to see if the list is out of free elements.
   72|  95.9k|    if (LLVM_UNLIKELY(!freeList_)) {
  ------------------
  |  |  189|  95.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 7.09k, False: 88.8k]
  |  |  ------------------
  ------------------
   73|       |      // There are no free elements; need to either garbage collect or allocate
   74|       |      // a new chunk.
   75|  7.09k|      if (chunkCount_ < targetChunkCount_) {
  ------------------
  |  Branch (75:11): [True: 5.49k, False: 1.60k]
  ------------------
   76|       |        // Garbage collection is scheduled to happen at a larger chunk count;
   77|       |        // just allocate a new chunk of unoccpied elements.
   78|  5.49k|        allocateChunk();
   79|  5.49k|      } else {
   80|       |        // Reached the garbage collection threshold; collect.
   81|  1.60k|        collect();
   82|       |
   83|       |        // A new chunk may still be required (e.g. if nothing was collected).
   84|  1.60k|        if (!freeList_) {
  ------------------
  |  Branch (84:13): [True: 480, False: 1.12k]
  ------------------
   85|    480|          allocateChunk();
   86|    480|        }
   87|  1.60k|      }
   88|  7.09k|    }
   89|  95.9k|    assert(freeList_ && "Freelist must be populated before inserting");
   90|       |
   91|       |    // Emplace the new value at the first location in the free list.
   92|  95.9k|    Element &element = *freeList_;
   93|  95.9k|    freeList_ = freeList_->getNextFree();
   94|  95.9k|    assert(element.isFree() && "Premature element reuse");
   95|  95.9k|    element.emplace(std::forward<Args>(args)...);
   96|  95.9k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|  95.9k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
   97|  95.9k|    return element;
   98|  95.9k|  }
_ZN6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EE13allocateChunkEv:
  189|  5.97k|  void allocateChunk() {
  190|  5.97k|    assert(!freeList_ && "Freelist must be empty before allocating a chunk");
  191|       |
  192|  5.97k|    Chunk *chunk = new Chunk;
  193|       |
  194|       |    // Create a linked list of free elements, going from high address
  195|       |    // to low.
  196|  5.97k|    Element *next = nullptr;
  197|  95.6k|    for (Element &current : chunk->elements) {
  ------------------
  |  Branch (197:27): [True: 95.6k, False: 5.97k]
  ------------------
  198|  95.6k|      assert(current.isFree());
  199|  95.6k|      current.setNextFree(next);
  200|  95.6k|      next = &current;
  201|  95.6k|    }
  202|       |
  203|       |    // Insert into the chunk list
  204|  5.97k|    chunk->nextChunk = chunks_;
  205|  5.97k|    chunks_ = chunk;
  206|       |
  207|       |    // Chunks are only allocated when the free list is empty. Just start the
  208|       |    // free list at this chunk.
  209|  5.97k|    freeList_ = next;
  210|       |
  211|  5.97k|    chunkCount_++;
  212|       |
  213|  5.97k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|  5.97k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  214|  5.97k|  }
_ZN6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EE7collectEv:
  130|  1.60k|  void collect() {
  131|  1.60k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|  1.60k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  132|       |
  133|  1.60k|    freeList_ = nullptr;
  134|  1.60k|    size_t occupiedElementCount = 0;
  135|       |
  136|       |    // Delete chunks based on the target number of chunks from the previous
  137|       |    // collection. This can make deletion lag by one collection cycle, but
  138|       |    // simplifies the collection logic by allowing chunks to be deleted as they
  139|       |    // are encountered, before knowing the number of surviving values.
  140|  1.60k|    size_t targetChunkCount = ceil(targetChunkCount_);
  141|  1.60k|    Chunk **chunkListEndLoc = &chunks_;
  142|  13.9k|    for (Chunk *chunk = chunks_; chunk;) {
  ------------------
  |  Branch (142:34): [True: 12.3k, False: 1.60k]
  ------------------
  143|  12.3k|      size_t chunkOccupiedElementCount = 0;
  144|  12.3k|      Element *newFreeList = freeList_;
  145|       |
  146|       |      // Rebuild free list and count elements.
  147|   197k|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (147:29): [True: 197k, False: 12.3k]
  ------------------
  148|   197k|        if (element.isFree()) {
  ------------------
  |  Branch (148:13): [True: 1.76k, False: 195k]
  ------------------
  149|  1.76k|          element.setNextFree(newFreeList);
  150|  1.76k|          newFreeList = &element;
  151|   195k|        } else {
  152|   195k|          chunkOccupiedElementCount++;
  153|   195k|        }
  154|   197k|      }
  155|       |
  156|  12.3k|      Chunk *nextChunk = chunk->nextChunk;
  157|  12.3k|      if (chunkOccupiedElementCount == 0 && chunkCount_ > targetChunkCount) {
  ------------------
  |  Branch (157:11): [True: 0, False: 12.3k]
  |  Branch (157:45): [True: 0, False: 0]
  ------------------
  158|       |        // This chunk is empty, and there are more chunks than desired;
  159|       |        // remove the chunk.
  160|      0|        *chunkListEndLoc = nextChunk;
  161|      0|        chunkCount_--;
  162|      0|        delete chunk;
  163|  12.3k|      } else {
  164|  12.3k|        freeList_ = newFreeList;
  165|  12.3k|        occupiedElementCount += chunkOccupiedElementCount;
  166|  12.3k|        chunkListEndLoc = &chunk->nextChunk;
  167|  12.3k|      }
  168|  12.3k|      chunk = nextChunk;
  169|  12.3k|    }
  170|       |
  171|       |    // Schedule the next collection at a multiple of the the number of suviving
  172|       |    // elements (using the occupancy ratio), averaged with previous target to
  173|       |    // avoid drastic jumps.
  174|  1.60k|    targetChunkCount_.update(
  175|  1.60k|        occupiedElementCount / occupancyRatio_ / kElementsPerChunk);
  176|       |
  177|  1.60k|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|  1.60k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  178|  1.60k|  }
_ZN6hermes18ManagedChunkedListINS_2vm11WeakRefSlotELm16EE15checkWellFormedEv:
  216|   105k|  bool checkWellFormed() {
  217|   913k|    for (Element *freeElement = freeList_; freeElement;
  ------------------
  |  Branch (217:44): [True: 808k, False: 105k]
  ------------------
  218|   808k|         freeElement = freeElement->getNextFree()) {
  219|   808k|      if (!freeElement->isFree()) {
  ------------------
  |  Branch (219:11): [True: 0, False: 808k]
  ------------------
  220|      0|        return false;
  221|      0|      }
  222|   808k|    }
  223|       |
  224|   105k|    size_t chunkCount = 0;
  225|  2.04M|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (225:34): [True: 1.93M, False: 105k]
  ------------------
  226|  1.93M|      chunkCount++;
  227|  1.93M|    }
  228|   105k|    if (chunkCount != chunkCount_) {
  ------------------
  |  Branch (228:9): [True: 0, False: 105k]
  ------------------
  229|      0|      return false;
  230|      0|    }
  231|       |
  232|   105k|    return true;
  233|   105k|  }
_ZNK6hermes18ManagedChunkedListINS_2vm16WeakMapEntrySlotELm16EE7forEachIZNS1_7HadesGC20youngGenEvacuateImplINS5_12EvacAcceptorILb0EEEEEvRT_bEUlRS2_E_EEvS9_:
  104|    113|  void forEach(Func accept) const {
  105|    113|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 0, False: 113]
  ------------------
  106|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 0, False: 0]
  ------------------
  107|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 0]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|      0|      }
  111|      0|    }
  112|    113|  }
HadesGC.cpp:_ZNK6hermes18ManagedChunkedListINS_2vm16WeakMapEntrySlotELm16EE7forEachIZNS1_7HadesGC15checkWellFormedEvE3$_1EEvT_:
  104|    226|  void forEach(Func accept) const {
  105|    226|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (105:34): [True: 0, False: 226]
  ------------------
  106|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (106:29): [True: 0, False: 0]
  ------------------
  107|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (107:13): [True: 0, False: 0]
  ------------------
  108|      0|          accept(element);
  109|      0|        }
  110|      0|      }
  111|      0|    }
  112|    226|  }

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

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

_ZN6hermes10WordBitSetIjE3setEj:
   38|  62.9k|  WordBitSet &set(unsigned pos) {
   39|  62.9k|    value_ |= (T)1 << pos;
   40|  62.9k|    return *this;
   41|  62.9k|  }
_ZNK6hermes10WordBitSetIjE2atEj:
   50|   723k|  bool at(unsigned pos) const {
   51|   723k|    assert(pos < NUM_BITS && "Invalid index");
   52|   723k|    return (value_ & ((T)1 << pos));
   53|   723k|  }
_ZN6hermes10WordBitSetIjEC2Ev:
   27|   723k|  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:
  285|    247|      : ownSm_(new SourceErrorManager()),
  286|    247|        sm_(*ownSm_),
  287|    247|        resolutionTable_(std::move(resolutionTable)),
  288|    247|        segments_(std::move(segments)),
  289|    247|        codeGenerationSettings_(std::move(codeGenOpts)),
  290|    247|        optimizationSettings_(std::move(optimizationOpts)) {}
_ZN6hermes7Context12getAllocatorEv:
  295|    937|  Allocator &getAllocator() {
  296|    937|    return allocator_;
  297|    937|  }
_ZN6hermes7Context14getStringTableEv:
  299|   413k|  StringTable &getStringTable() {
  300|   413k|    return stringTable_;
  301|   413k|  }
_ZN6hermes7Context17addCompiledRegExpEPNS_12UniqueStringES2_ONS_14CompiledRegExpE:
  306|    119|      CompiledRegExp &&compiled) {
  307|    119|    compiledRegExps_.emplace(
  308|    119|        std::make_pair(pattern, flags), std::move(compiled));
  309|    119|  }
_ZN6hermes7Context17getCompiledRegExpEPNS_12UniqueStringES2_:
  313|    238|      UniqueString *flags) {
  314|    238|    auto it = compiledRegExps_.find(std::make_pair(pattern, flags));
  315|    238|    assert(it != compiledRegExps_.end() && "Regex hasn't been compiled");
  316|    238|    return it->second;
  317|    238|  }
_ZN6hermes7Context22getPreParsedBufferInfoEj:
  319|    450|  parser::PreParsedBufferInfo *getPreParsedBufferInfo(uint32_t bufferId) {
  320|    450|    if (!preParsed_)
  ------------------
  |  Branch (320:9): [True: 247, False: 203]
  ------------------
  321|    247|      preParsed_ = std::make_unique<parser::PreParsedData>();
  322|    450|    return preParsed_->getBufferInfo(bufferId);
  323|    450|  }
_ZN6hermes7Context21getSourceErrorManagerEv:
  325|   105k|  SourceErrorManager &getSourceErrorManager() {
  326|   105k|    return sm_;
  327|   105k|  }
_ZN6hermes7Context13getIdentifierEN4llvh9StringRefE:
  345|  1.26M|  Identifier getIdentifier(llvh::StringRef str) {
  346|  1.26M|    return stringTable_.getIdentifier(str);
  347|  1.26M|  }
_ZN6hermes7Context13setStrictModeEb:
  354|    247|  void setStrictMode(bool strictMode) {
  355|    247|    strictMode_ = strictMode;
  356|    247|  }
_ZNK6hermes7Context12isStrictModeEv:
  357|    814|  bool isStrictMode() const {
  358|    814|    return strictMode_;
  359|    814|  }
_ZN6hermes7Context13setEnableEvalEb:
  364|    247|  void setEnableEval(bool enableEval) {
  365|    247|    enableEval_ = enableEval;
  366|    247|  }
_ZN6hermes7Context19setDebugInfoSettingENS_16DebugInfoSettingE:
  368|    247|  void setDebugInfoSetting(DebugInfoSetting debugInfoSetting) {
  369|    247|    debugInfoSetting_ = debugInfoSetting;
  370|    247|  }
_ZNK6hermes7Context19getDebugInfoSettingEv:
  371|  18.3M|  DebugInfoSetting getDebugInfoSetting() const {
  372|  18.3M|    return debugInfoSetting_;
  373|  18.3M|  }
_ZN6hermes7Context22setEmitAsyncBreakCheckEb:
  375|    247|  void setEmitAsyncBreakCheck(bool check) {
  376|    247|    emitAsyncBreakCheck_ = check;
  377|    247|  }
_ZNK6hermes7Context12getParseFlowEv:
  407|  26.2M|  bool getParseFlow() const {
  408|  26.2M|    return parseFlow_ != ParseFlowSetting::NONE;
  409|  26.2M|  }
_ZNK6hermes7Context21getParseFlowAmbiguousEv:
  410|  8.96M|  bool getParseFlowAmbiguous() const {
  411|  8.96M|    return parseFlow_ == ParseFlowSetting::ALL;
  412|  8.96M|  }
_ZNK6hermes7Context10getParseTSEv:
  431|  23.1M|  bool getParseTS() const {
  432|  23.1M|    return parseTS_;
  433|  23.1M|  }
_ZN6hermes7Context20setConvertES6ClassesEb:
  435|    247|  void setConvertES6Classes(bool convertES6Classes) {
  436|    247|    convertES6Classes_ = convertES6Classes;
  437|    247|  }
_ZNK6hermes7Context20getConvertES6ClassesEv:
  439|    204|  bool getConvertES6Classes() const {
  440|    204|#ifndef HERMES_FACEBOOK_BUILD
  441|    204|    return convertES6Classes_;
  442|       |#else
  443|       |    return false;
  444|       |#endif
  445|    204|  }
_ZNK6hermes7Context13getParseTypesEv:
  448|  6.83M|  bool getParseTypes() const {
  449|  6.83M|    return getParseFlow() || getParseTS();
  ------------------
  |  Branch (449:12): [True: 0, False: 6.83M]
  |  Branch (449:30): [True: 0, False: 6.83M]
  ------------------
  450|  6.83M|  }
_ZNK6hermes7Context17isLazyCompilationEv:
  452|    247|  bool isLazyCompilation() const {
  453|    247|    return lazyCompilation_;
  454|    247|  }
_ZN6hermes7Context18setLazyCompilationEb:
  456|    244|  void setLazyCompilation(bool lazyCompilation) {
  457|    244|    lazyCompilation_ = lazyCompilation;
  458|    244|  }
_ZN6hermes7Context41getPreemptiveFunctionCompilationThresholdEv:
  460|     81|  unsigned getPreemptiveFunctionCompilationThreshold() {
  461|     81|    return preemptiveFunctionCompilationThreshold_;
  462|     81|  }
_ZN6hermes7Context41setPreemptiveFunctionCompilationThresholdEj:
  464|    247|  void setPreemptiveFunctionCompilationThreshold(unsigned byteCount) {
  465|    247|    preemptiveFunctionCompilationThreshold_ = byteCount;
  466|    247|  };
_ZN6hermes7Context37getPreemptiveFileCompilationThresholdEv:
  468|    247|  unsigned getPreemptiveFileCompilationThreshold() {
  469|    247|    return preemptiveFileCompilationThreshold_;
  470|    247|  }
_ZN6hermes7Context37setPreemptiveFileCompilationThresholdEj:
  472|    247|  void setPreemptiveFileCompilationThreshold(unsigned byteCount) {
  473|    247|    preemptiveFileCompilationThreshold_ = byteCount;
  474|    247|  };
_ZN6hermes7Context19setGeneratorEnabledEb:
  488|    247|  void setGeneratorEnabled(bool v) {
  489|    247|    generatorEnabled_ = v;
  490|    247|  }
_ZN6hermes7Context28setStaticBuiltinOptimizationEb:
  492|    196|  void setStaticBuiltinOptimization(bool staticBuiltins) {
  493|    196|    optimizationSettings_.staticBuiltins = staticBuiltins;
  494|    196|  }
_ZNK6hermes7Context25getCodeGenerationSettingsEv:
  504|   928k|  const CodeGenerationSettings &getCodeGenerationSettings() const {
  505|   928k|    return codeGenerationSettings_;
  506|   928k|  }
_ZNK6hermes7Context23getOptimizationSettingsEv:
  508|   571k|  const OptimizationSettings &getOptimizationSettings() const {
  509|   571k|    return optimizationSettings_;
  510|   571k|  }
_ZN6hermes7Context12allocateNodeEmm:
  518|  14.3M|  void *allocateNode(size_t size, size_t alignment) {
  519|  14.3M|    return allocator_.Allocate(size, alignment);
  520|  14.3M|  }
_ZN6hermes7Context20getHBCBackendContextEv:
  522|   206k|  hbc::BackendContext *getHBCBackendContext() {
  523|   206k|    return hbcBackendContext_.get();
  524|   206k|  }
_ZN6hermes7Context20setHBCBackendContextENSt3__110shared_ptrINS_3hbc14BackendContextEEE:
  527|    196|      std::shared_ptr<hbc::BackendContext> hbcBackendContext) {
  528|    196|    hbcBackendContext_ = std::move(hbcBackendContext);
  529|    196|  }

_ZN6hermes6ESTree4NodeC2ENS0_8NodeKindE:
   85|  14.3M|  explicit Node(NodeKind kind) : kind_(kind) {}
_ZN6hermes6ESTree4Node14setSourceRangeEN4llvh7SMRangeE:
   87|   206k|  void setSourceRange(SMRange rng) {
   88|   206k|    sourceRange_ = rng;
   89|   206k|  }
_ZNK6hermes6ESTree4Node14getSourceRangeEv:
   90|   516k|  SMRange getSourceRange() const {
   91|   516k|    return sourceRange_;
   92|   516k|  }
_ZN6hermes6ESTree4Node11setStartLocEN4llvh5SMLocE:
   93|  14.1M|  void setStartLoc(SMLoc loc) {
   94|  14.1M|    sourceRange_.Start = loc;
   95|  14.1M|  }
_ZNK6hermes6ESTree4Node11getStartLocEv:
   96|  3.30M|  SMLoc getStartLoc() const {
   97|  3.30M|    return sourceRange_.Start;
   98|  3.30M|  }
_ZN6hermes6ESTree4Node9setEndLocEN4llvh5SMLocE:
   99|  14.1M|  void setEndLoc(SMLoc loc) {
  100|  14.1M|    sourceRange_.End = loc;
  101|  14.1M|  }
_ZNK6hermes6ESTree4Node9getEndLocEv:
  102|   635k|  SMLoc getEndLoc() const {
  103|   635k|    return sourceRange_.End;
  104|   635k|  }
_ZN6hermes6ESTree4Node11setDebugLocEN4llvh5SMLocE:
  105|  14.3M|  void setDebugLoc(SMLoc loc) {
  106|  14.3M|    debugLoc_ = loc;
  107|  14.3M|  }
_ZNK6hermes6ESTree4Node11getDebugLocEv:
  108|  3.51M|  SMLoc getDebugLoc() const {
  109|  3.51M|    return debugLoc_;
  110|  3.51M|  }
_ZNK6hermes6ESTree4Node9getParensEv:
  112|  9.40M|  unsigned getParens() const {
  113|  9.40M|    return parens_;
  114|  9.40M|  }
_ZN6hermes6ESTree4Node9incParensEv:
  115|    163|  void incParens() {
  116|    163|    parens_ = parens_ < 2 ? parens_ + 1 : 2;
  ------------------
  |  Branch (116:15): [True: 163, False: 0]
  ------------------
  117|    163|  }
_ZN6hermes6ESTree4Node16copyLocationFromEPKS1_:
  123|   206k|  void copyLocationFrom(const Node *src) {
  124|   206k|    setSourceRange(src->getSourceRange());
  125|   206k|    setDebugLoc(src->getDebugLoc());
  126|   206k|  }
_ZNK6hermes6ESTree4Node7getKindEv:
  175|  71.2M|  NodeKind getKind() const {
  176|  71.2M|    return kind_;
  177|  71.2M|  }
_ZN6hermes6ESTree4NodenwEmRNS_7ContextEm:
  186|  14.3M|  operator new(size_t size, Context &ctx, size_t alignment = alignof(double)) {
  187|  14.3M|    return ctx.allocateNode(size, alignment);
  188|  14.3M|  }
_ZN6hermes6ESTree22FunctionLikeDecoration10setSemInfoEPNS_3sem12FunctionInfoE:
  273|   103k|  void setSemInfo(sem::FunctionInfo *semInfo) {
  274|   103k|    assert(semInfo && "setting semInfo to null");
  275|   103k|    assert(!semInfo_ && "semInfo is already set");
  276|   103k|    semInfo_ = semInfo;
  277|   103k|  }
_ZNK6hermes6ESTree22FunctionLikeDecoration10getSemInfoEv:
  279|   412k|  sem::FunctionInfo *getSemInfo() const {
  280|   412k|    assert(semInfo_ && "semInfo is not set!");
  281|   412k|    return semInfo_;
  282|   412k|  }
_ZNK6hermes6ESTree19LabelDecorationBase15isLabelIndexSetEv:
  297|   492k|  bool isLabelIndexSet() const {
  298|   492k|    return labelIndex_ != INVALID_LABEL;
  299|   492k|  }
_ZNK6hermes6ESTree19LabelDecorationBase13getLabelIndexEv:
  301|   246k|  unsigned getLabelIndex() const {
  302|   246k|    assert(isLabelIndexSet() && "labelIndex is not set");
  303|   246k|    return labelIndex_;
  304|   246k|  }
_ZN6hermes6ESTree19LabelDecorationBase13setLabelIndexEj:
  306|   246k|  void setLabelIndex(unsigned labelIndex) {
  307|   246k|    assert(labelIndex != INVALID_LABEL && "setting labelIndex to invalid");
  308|   246k|    assert(!isLabelIndexSet() && "labelIndex is already set");
  309|   246k|    labelIndex_ = labelIndex;
  310|   246k|  }
_ZN6hermes6ESTree9EmptyNodeC2Ev:
  429|     82|    explicit NAME##Node() : BASE##Node(NodeKind::NAME) {}              \
_ZN6hermes6ESTree9EmptyNode7classofEPKNS0_4NodeE:
  430|  1.43M|    static bool classof(const Node *V) {                               \
  431|  1.43M|      return V->getKind() == NodeKind::NAME;                           \
  432|  1.43M|    }                                                                  \
_ZN6hermes6ESTree16FunctionLikeNodeC2ENS0_8NodeKindE:
  417|   212k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree11ProgramNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  449|    581|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree11ProgramNode7classofEPKNS0_4NodeE:
  459|  1.57k|    static bool classof(const Node *V) {                                 \
  460|  1.57k|      return V->getKind() == NodeKind::NAME;                             \
  461|  1.57k|    }                                                                    \
_ZN6hermes6ESTree22FunctionExpressionNodeC2EPNS0_4NodeEON4llvh12simple_ilistIS2_JEEES3_S3_S3_S3_bb:
  823|    165|        : BASE##Node(NodeKind::NAME),                                  \
  824|    165|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  825|    165|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  826|    165|          _##ARG2NM(std::move(ARG2NM##_)),                             \
  827|    165|          _##ARG3NM(std::move(ARG3NM##_)),                             \
  828|    165|          _##ARG4NM(std::move(ARG4NM##_)),                             \
  829|    165|          _##ARG5NM(std::move(ARG5NM##_)),                             \
  830|    165|          _##ARG6NM(std::move(ARG6NM##_)),                             \
  831|    165|          _##ARG7NM(std::move(ARG7NM##_)) {}                           \
_ZN6hermes6ESTree22FunctionExpressionNode7classofEPKNS0_4NodeE:
  849|   139k|    static bool classof(const Node *V) {                               \
  850|   139k|      return V->getKind() == NodeKind::NAME;                           \
  851|   139k|    }                                                                  \
_ZN6hermes6ESTree27ArrowFunctionExpressionNodeC2EPNS0_4NodeEON4llvh12simple_ilistIS2_JEEES3_S3_S3_S3_bb:
  823|   206k|        : BASE##Node(NodeKind::NAME),                                  \
  824|   206k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  825|   206k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  826|   206k|          _##ARG2NM(std::move(ARG2NM##_)),                             \
  827|   206k|          _##ARG3NM(std::move(ARG3NM##_)),                             \
  828|   206k|          _##ARG4NM(std::move(ARG4NM##_)),                             \
  829|   206k|          _##ARG5NM(std::move(ARG5NM##_)),                             \
  830|   206k|          _##ARG6NM(std::move(ARG6NM##_)),                             \
  831|   206k|          _##ARG7NM(std::move(ARG7NM##_)) {}                           \
_ZN6hermes6ESTree27ArrowFunctionExpressionNode7classofEPKNS0_4NodeE:
  849|  1.27M|    static bool classof(const Node *V) {                               \
  850|  1.27M|      return V->getKind() == NodeKind::NAME;                           \
  851|  1.27M|    }                                                                  \
_ZN6hermes6ESTree23FunctionDeclarationNodeC2EPNS0_4NodeEON4llvh12simple_ilistIS2_JEEES3_S3_S3_S3_bb:
  823|  5.44k|        : BASE##Node(NodeKind::NAME),                                  \
  824|  5.44k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  825|  5.44k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  826|  5.44k|          _##ARG2NM(std::move(ARG2NM##_)),                             \
  827|  5.44k|          _##ARG3NM(std::move(ARG3NM##_)),                             \
  828|  5.44k|          _##ARG4NM(std::move(ARG4NM##_)),                             \
  829|  5.44k|          _##ARG5NM(std::move(ARG5NM##_)),                             \
  830|  5.44k|          _##ARG6NM(std::move(ARG6NM##_)),                             \
  831|  5.44k|          _##ARG7NM(std::move(ARG7NM##_)) {}                           \
_ZN6hermes6ESTree23FunctionDeclarationNode7classofEPKNS0_4NodeE:
  849|   748k|    static bool classof(const Node *V) {                               \
  850|   748k|      return V->getKind() == NodeKind::NAME;                           \
  851|   748k|    }                                                                  \
_ZN6hermes6ESTree13StatementNodeC2ENS0_8NodeKindE:
  417|  1.43M|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree17LoopStatementNodeC2ENS0_8NodeKindE:
  417|     31|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree17LoopStatementNode7classofEPKNS0_4NodeE:
  418|   256k|    static bool classof(const Node *V) {                          \
  419|   256k|      auto kind = V->getKind();                                   \
  420|   256k|      return NodeKind::_##NAME##_First < kind &&                  \
  ------------------
  |  Branch (420:14): [True: 256k, False: 0]
  ------------------
  421|   256k|          kind < NodeKind::_##NAME##_Last;                        \
  ------------------
  |  Branch (421:11): [True: 0, False: 256k]
  ------------------
  422|   256k|    }                                                             \
_ZN6hermes6ESTree18WhileStatementNode7classofEPKNS0_4NodeE:
  487|  5.34k|    static bool classof(const Node *V) {                               \
  488|  5.34k|      return V->getKind() == NodeKind::NAME;                           \
  489|  5.34k|    }                                                                  \
_ZN6hermes6ESTree20DoWhileStatementNode7classofEPKNS0_4NodeE:
  487|  5.34k|    static bool classof(const Node *V) {                               \
  488|  5.34k|      return V->getKind() == NodeKind::NAME;                           \
  489|  5.34k|    }                                                                  \
_ZN6hermes6ESTree18ForInStatementNodeC2EPNS0_4NodeES3_S3_:
  514|     31|        : BASE##Node(NodeKind::NAME),                                  \
  515|     31|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|     31|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|     31|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree18ForInStatementNode7classofEPKNS0_4NodeE:
  529|   713k|    static bool classof(const Node *V) {                               \
  530|   713k|      return V->getKind() == NodeKind::NAME;                           \
  531|   713k|    }                                                                  \
_ZN6hermes6ESTree18ForOfStatementNode7classofEPKNS0_4NodeE:
  579|   713k|    static bool classof(const Node *V) {                               \
  580|   713k|      return V->getKind() == NodeKind::NAME;                           \
  581|   713k|    }                                                                  \
_ZN6hermes6ESTree16ForStatementNode7classofEPKNS0_4NodeE:
  579|  5.34k|    static bool classof(const Node *V) {                               \
  580|  5.34k|      return V->getKind() == NodeKind::NAME;                           \
  581|  5.34k|    }                                                                  \
_ZN6hermes6ESTree18EmptyStatementNodeC2Ev:
  429|  10.6k|    explicit NAME##Node() : BASE##Node(NodeKind::NAME) {}              \
_ZN6hermes6ESTree18EmptyStatementNode7classofEPKNS0_4NodeE:
  430|  16.0k|    static bool classof(const Node *V) {                               \
  431|  16.0k|      return V->getKind() == NodeKind::NAME;                           \
  432|  16.0k|    }                                                                  \
_ZN6hermes6ESTree18BlockStatementNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  449|   108k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree18BlockStatementNode7classofEPKNS0_4NodeE:
  459|   870k|    static bool classof(const Node *V) {                                 \
  460|   870k|      return V->getKind() == NodeKind::NAME;                             \
  461|   870k|    }                                                                    \
_ZN6hermes6ESTree18BreakStatementNodeC2EPNS0_4NodeE:
  449|      1|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree18BreakStatementNode7classofEPKNS0_4NodeE:
  459|  5.34k|    static bool classof(const Node *V) {                                 \
  460|  5.34k|      return V->getKind() == NodeKind::NAME;                             \
  461|  5.34k|    }                                                                    \
_ZN6hermes6ESTree21ContinueStatementNode7classofEPKNS0_4NodeE:
  459|  5.34k|    static bool classof(const Node *V) {                                 \
  460|  5.34k|      return V->getKind() == NodeKind::NAME;                             \
  461|  5.34k|    }                                                                    \
_ZN6hermes6ESTree18ThrowStatementNode7classofEPKNS0_4NodeE:
  459|  5.34k|    static bool classof(const Node *V) {                                 \
  460|  5.34k|      return V->getKind() == NodeKind::NAME;                             \
  461|  5.34k|    }                                                                    \
_ZN6hermes6ESTree19ReturnStatementNodeC2EPNS0_4NodeE:
  449|   103k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree19ReturnStatementNode7classofEPKNS0_4NodeE:
  459|   919k|    static bool classof(const Node *V) {                                 \
  460|   919k|      return V->getKind() == NodeKind::NAME;                             \
  461|   919k|    }                                                                    \
_ZN6hermes6ESTree19SwitchStatementNode7classofEPKNS0_4NodeE:
  487|   251k|    static bool classof(const Node *V) {                               \
  488|   251k|      return V->getKind() == NodeKind::NAME;                           \
  489|   251k|    }                                                                  \
_ZN6hermes6ESTree20LabeledStatementNodeC2EPNS0_4NodeES3_:
  474|   492k|        : BASE##Node(NodeKind::NAME),                                  \
  475|   492k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|   492k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree20LabeledStatementNode7classofEPKNS0_4NodeE:
  487|  1.00M|    static bool classof(const Node *V) {                               \
  488|  1.00M|      return V->getKind() == NodeKind::NAME;                           \
  489|  1.00M|    }                                                                  \
_ZN6hermes6ESTree23ExpressionStatementNodeC2EPNS0_4NodeEPNS_12UniqueStringE:
  474|   719k|        : BASE##Node(NodeKind::NAME),                                  \
  475|   719k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|   719k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree23ExpressionStatementNode7classofEPKNS0_4NodeE:
  487|  1.79M|    static bool classof(const Node *V) {                               \
  488|  1.79M|      return V->getKind() == NodeKind::NAME;                           \
  489|  1.79M|    }                                                                  \
_ZN6hermes6ESTree16TryStatementNode7classofEPKNS0_4NodeE:
  529|  5.34k|    static bool classof(const Node *V) {                               \
  530|  5.34k|      return V->getKind() == NodeKind::NAME;                           \
  531|  5.34k|    }                                                                  \
_ZN6hermes6ESTree15IfStatementNode7classofEPKNS0_4NodeE:
  529|   713k|    static bool classof(const Node *V) {                               \
  530|   713k|      return V->getKind() == NodeKind::NAME;                           \
  531|   713k|    }                                                                  \
_ZN6hermes6ESTree15NullLiteralNode7classofEPKNS0_4NodeE:
  430|  1.92M|    static bool classof(const Node *V) {                               \
  431|  1.92M|      return V->getKind() == NodeKind::NAME;                           \
  432|  1.92M|    }                                                                  \
_ZN6hermes6ESTree18BooleanLiteralNode7classofEPKNS0_4NodeE:
  459|  1.92M|    static bool classof(const Node *V) {                                 \
  460|  1.92M|      return V->getKind() == NodeKind::NAME;                             \
  461|  1.92M|    }                                                                    \
_ZN6hermes6ESTree17StringLiteralNodeC2EPNS_12UniqueStringE:
  449|     49|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree17StringLiteralNode7classofEPKNS0_4NodeE:
  459|  1.92M|    static bool classof(const Node *V) {                                 \
  460|  1.92M|      return V->getKind() == NodeKind::NAME;                             \
  461|  1.92M|    }                                                                    \
_ZN6hermes6ESTree18NumericLiteralNodeC2Ed:
  449|  5.13M|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree18NumericLiteralNode7classofEPKNS0_4NodeE:
  459|  6.74M|    static bool classof(const Node *V) {                                 \
  460|  6.74M|      return V->getKind() == NodeKind::NAME;                             \
  461|  6.74M|    }                                                                    \
_ZN6hermes6ESTree17RegExpLiteralNodeC2EPNS_12UniqueStringES3_:
  474|    240|        : BASE##Node(NodeKind::NAME),                                  \
  475|    240|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|    240|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree17RegExpLiteralNode7classofEPKNS0_4NodeE:
  487|  1.92M|    static bool classof(const Node *V) {                               \
  488|  1.92M|      return V->getKind() == NodeKind::NAME;                           \
  489|  1.92M|    }                                                                  \
_ZN6hermes6ESTree17BigIntLiteralNodeC2EPNS_12UniqueStringE:
  449|     54|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree17BigIntLiteralNode7classofEPKNS0_4NodeE:
  459|   332k|    static bool classof(const Node *V) {                                 \
  460|   332k|      return V->getKind() == NodeKind::NAME;                             \
  461|   332k|    }                                                                    \
_ZN6hermes6ESTree18ThisExpressionNodeC2Ev:
  429|      4|    explicit NAME##Node() : BASE##Node(NodeKind::NAME) {}              \
_ZN6hermes6ESTree18ThisExpressionNode7classofEPKNS0_4NodeE:
  430|   130k|    static bool classof(const Node *V) {                               \
  431|   130k|      return V->getKind() == NodeKind::NAME;                           \
  432|   130k|    }                                                                  \
_ZN6hermes6ESTree9SuperNode7classofEPKNS0_4NodeE:
  430|  5.70k|    static bool classof(const Node *V) {                               \
  431|  5.70k|      return V->getKind() == NodeKind::NAME;                           \
  432|  5.70k|    }                                                                  \
_ZN6hermes6ESTree22SequenceExpressionNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  449|    400|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree22SequenceExpressionNode7classofEPKNS0_4NodeE:
  459|  23.6k|    static bool classof(const Node *V) {                                 \
  460|  23.6k|      return V->getKind() == NodeKind::NAME;                             \
  461|  23.6k|    }                                                                    \
_ZN6hermes6ESTree20ObjectExpressionNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  449|      4|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree20ObjectExpressionNode7classofEPKNS0_4NodeE:
  459|   289k|    static bool classof(const Node *V) {                                 \
  460|   289k|      return V->getKind() == NodeKind::NAME;                             \
  461|   289k|    }                                                                    \
_ZN6hermes6ESTree19ArrayExpressionNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEEb:
  474|  45.0k|        : BASE##Node(NodeKind::NAME),                                  \
  475|  45.0k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|  45.0k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree19ArrayExpressionNode7classofEPKNS0_4NodeE:
  487|   383k|    static bool classof(const Node *V) {                               \
  488|   383k|      return V->getKind() == NodeKind::NAME;                           \
  489|   383k|    }                                                                  \
_ZN6hermes6ESTree17SpreadElementNode7classofEPKNS0_4NodeE:
  459|  2.51M|    static bool classof(const Node *V) {                                 \
  460|  2.51M|      return V->getKind() == NodeKind::NAME;                             \
  461|  2.51M|    }                                                                    \
_ZN6hermes6ESTree17NewExpressionNodeC2EPNS0_4NodeES3_ON4llvh12simple_ilistIS2_JEEE:
  514|  50.6k|        : BASE##Node(NodeKind::NAME),                                  \
  515|  50.6k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  50.6k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  50.6k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree17NewExpressionNode7classofEPKNS0_4NodeE:
  529|   402k|    static bool classof(const Node *V) {                               \
  530|   402k|      return V->getKind() == NodeKind::NAME;                           \
  531|   402k|    }                                                                  \
_ZN6hermes6ESTree22CallExpressionLikeNodeC2ENS0_8NodeKindE:
  417|  2.08k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree18CallExpressionNodeC2EPNS0_4NodeES3_ON4llvh12simple_ilistIS2_JEEE:
  514|  2.04k|        : BASE##Node(NodeKind::NAME),                                  \
  515|  2.04k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  2.04k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  2.04k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree18CallExpressionNode7classofEPKNS0_4NodeE:
  529|   333k|    static bool classof(const Node *V) {                               \
  530|   333k|      return V->getKind() == NodeKind::NAME;                           \
  531|   333k|    }                                                                  \
_ZN6hermes6ESTree26OptionalCallExpressionNodeC2EPNS0_4NodeES3_ON4llvh12simple_ilistIS2_JEEEb:
  561|     38|        : BASE##Node(NodeKind::NAME),                                  \
  562|     38|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  563|     38|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  564|     38|          _##ARG2NM(std::move(ARG2NM##_)),                             \
  565|     38|          _##ARG3NM(std::move(ARG3NM##_)) {}                           \
_ZN6hermes6ESTree26OptionalCallExpressionNode7classofEPKNS0_4NodeE:
  579|  9.23M|    static bool classof(const Node *V) {                               \
  580|  9.23M|      return V->getKind() == NodeKind::NAME;                           \
  581|  9.23M|    }                                                                  \
_ZN6hermes6ESTree24AssignmentExpressionNodeC2EPNS_12UniqueStringEPNS0_4NodeES5_:
  514|  9.27k|        : BASE##Node(NodeKind::NAME),                                  \
  515|  9.27k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  9.27k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  9.27k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree24AssignmentExpressionNode7classofEPKNS0_4NodeE:
  529|   391k|    static bool classof(const Node *V) {                               \
  530|   391k|      return V->getKind() == NodeKind::NAME;                           \
  531|   391k|    }                                                                  \
_ZN6hermes6ESTree19UnaryExpressionNodeC2EPNS_12UniqueStringEPNS0_4NodeEb:
  514|  51.8k|        : BASE##Node(NodeKind::NAME),                                  \
  515|  51.8k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  51.8k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  51.8k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree19UnaryExpressionNode7classofEPKNS0_4NodeE:
  529|   211k|    static bool classof(const Node *V) {                               \
  530|   211k|      return V->getKind() == NodeKind::NAME;                           \
  531|   211k|    }                                                                  \
_ZN6hermes6ESTree20UpdateExpressionNodeC2EPNS_12UniqueStringEPNS0_4NodeEb:
  514|      2|        : BASE##Node(NodeKind::NAME),                                  \
  515|      2|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|      2|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|      2|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree20UpdateExpressionNode7classofEPKNS0_4NodeE:
  529|  27.0k|    static bool classof(const Node *V) {                               \
  530|  27.0k|      return V->getKind() == NodeKind::NAME;                           \
  531|  27.0k|    }                                                                  \
_ZN6hermes6ESTree24MemberExpressionLikeNodeC2ENS0_8NodeKindE:
  417|  87.1k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree20MemberExpressionNodeC2EPNS0_4NodeES3_b:
  514|  35.2k|        : BASE##Node(NodeKind::NAME),                                  \
  515|  35.2k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  35.2k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  35.2k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree20MemberExpressionNode7classofEPKNS0_4NodeE:
  529|   564k|    static bool classof(const Node *V) {                               \
  530|   564k|      return V->getKind() == NodeKind::NAME;                           \
  531|   564k|    }                                                                  \
_ZN6hermes6ESTree28OptionalMemberExpressionNodeC2EPNS0_4NodeES3_bb:
  561|  51.9k|        : BASE##Node(NodeKind::NAME),                                  \
  562|  51.9k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  563|  51.9k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  564|  51.9k|          _##ARG2NM(std::move(ARG2NM##_)),                             \
  565|  51.9k|          _##ARG3NM(std::move(ARG3NM##_)) {}                           \
_ZN6hermes6ESTree28OptionalMemberExpressionNode7classofEPKNS0_4NodeE:
  579|  9.37M|    static bool classof(const Node *V) {                               \
  580|  9.37M|      return V->getKind() == NodeKind::NAME;                           \
  581|  9.37M|    }                                                                  \
_ZN6hermes6ESTree21LogicalExpressionNodeC2EPNS0_4NodeES3_PNS_12UniqueStringE:
  514|  70.7k|        : BASE##Node(NodeKind::NAME),                                  \
  515|  70.7k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  70.7k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  70.7k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree21LogicalExpressionNode7classofEPKNS0_4NodeE:
  529|   359k|    static bool classof(const Node *V) {                               \
  530|   359k|      return V->getKind() == NodeKind::NAME;                           \
  531|   359k|    }                                                                  \
_ZN6hermes6ESTree25ConditionalExpressionNodeC2EPNS0_4NodeES3_S3_:
  514|  7.33k|        : BASE##Node(NodeKind::NAME),                                  \
  515|  7.33k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  7.33k|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  7.33k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree25ConditionalExpressionNode7classofEPKNS0_4NodeE:
  529|  38.0k|    static bool classof(const Node *V) {                               \
  530|  38.0k|      return V->getKind() == NodeKind::NAME;                           \
  531|  38.0k|    }                                                                  \
_ZN6hermes6ESTree20BinaryExpressionNodeC2EPNS0_4NodeES3_PNS_12UniqueStringE:
  514|  2.22M|        : BASE##Node(NodeKind::NAME),                                  \
  515|  2.22M|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  2.22M|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  2.22M|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree20BinaryExpressionNode7classofEPKNS0_4NodeE:
  529|  1.75M|    static bool classof(const Node *V) {                               \
  530|  1.75M|      return V->getKind() == NodeKind::NAME;                           \
  531|  1.75M|    }                                                                  \
_ZN6hermes6ESTree14IdentifierNodeC2EPNS_12UniqueStringEPNS0_4NodeEb:
  514|  3.43M|        : BASE##Node(NodeKind::NAME),                                  \
  515|  3.43M|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  3.43M|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  3.43M|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree14IdentifierNode7classofEPKNS0_4NodeE:
  529|  8.19M|    static bool classof(const Node *V) {                               \
  530|  8.19M|      return V->getKind() == NodeKind::NAME;                           \
  531|  8.19M|    }                                                                  \
_ZN6hermes6ESTree16MetaPropertyNode7classofEPKNS0_4NodeE:
  487|   130k|    static bool classof(const Node *V) {                               \
  488|   130k|      return V->getKind() == NodeKind::NAME;                           \
  489|   130k|    }                                                                  \
_ZN6hermes6ESTree22VariableDeclaratorNodeC2EPNS0_4NodeES3_:
  474|  3.89k|        : BASE##Node(NodeKind::NAME),                                  \
  475|  3.89k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|  3.89k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree22VariableDeclaratorNode7classofEPKNS0_4NodeE:
  487|  21.5k|    static bool classof(const Node *V) {                               \
  488|  21.5k|      return V->getKind() == NodeKind::NAME;                           \
  489|  21.5k|    }                                                                  \
_ZN6hermes6ESTree23VariableDeclarationNodeC2EPNS_12UniqueStringEON4llvh12simple_ilistINS0_4NodeEJEEE:
  474|  3.89k|        : BASE##Node(NodeKind::NAME),                                  \
  475|  3.89k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|  3.89k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree23VariableDeclarationNode7classofEPKNS0_4NodeE:
  487|   276k|    static bool classof(const Node *V) {                               \
  488|   276k|      return V->getKind() == NodeKind::NAME;                           \
  489|   276k|    }                                                                  \
_ZN6hermes6ESTree19TemplateLiteralNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEES6_:
  474|   388k|        : BASE##Node(NodeKind::NAME),                                  \
  475|   388k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|   388k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree19TemplateLiteralNode7classofEPKNS0_4NodeE:
  487|  93.1k|    static bool classof(const Node *V) {                               \
  488|  93.1k|      return V->getKind() == NodeKind::NAME;                           \
  489|  93.1k|    }                                                                  \
_ZN6hermes6ESTree28TaggedTemplateExpressionNodeC2EPNS0_4NodeES3_:
  474|  5.71k|        : BASE##Node(NodeKind::NAME),                                  \
  475|  5.71k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|  5.71k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree28TaggedTemplateExpressionNode7classofEPKNS0_4NodeE:
  487|  11.2k|    static bool classof(const Node *V) {                               \
  488|  11.2k|      return V->getKind() == NodeKind::NAME;                           \
  489|  11.2k|    }                                                                  \
_ZN6hermes6ESTree19TemplateElementNodeC2EbPNS_12UniqueStringES3_:
  514|  1.09M|        : BASE##Node(NodeKind::NAME),                                  \
  515|  1.09M|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  516|  1.09M|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  517|  1.09M|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree19TemplateElementNode7classofEPKNS0_4NodeE:
  529|  1.49M|    static bool classof(const Node *V) {                               \
  530|  1.49M|      return V->getKind() == NodeKind::NAME;                           \
  531|  1.49M|    }                                                                  \
_ZN6hermes6ESTree12PropertyNodeC2EPNS0_4NodeES3_PNS_12UniqueStringEbbb:
  678|      2|        : BASE##Node(NodeKind::NAME),                                  \
  679|      2|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  680|      2|          _##ARG1NM(std::move(ARG1NM##_)),                             \
  681|      2|          _##ARG2NM(std::move(ARG2NM##_)),                             \
  682|      2|          _##ARG3NM(std::move(ARG3NM##_)),                             \
  683|      2|          _##ARG4NM(std::move(ARG4NM##_)),                             \
  684|      2|          _##ARG5NM(std::move(ARG5NM##_)) {}                           \
_ZN6hermes6ESTree12PropertyNode7classofEPKNS0_4NodeE:
  700|      4|    static bool classof(const Node *V) {                               \
  701|      4|      return V->getKind() == NodeKind::NAME;                           \
  702|      4|    }                                                                  \
_ZN6hermes6ESTree21ImportDeclarationNode7classofEPKNS0_4NodeE:
  579|   713k|    static bool classof(const Node *V) {                               \
  580|   713k|      return V->getKind() == NodeKind::NAME;                           \
  581|   713k|    }                                                                  \
_ZN6hermes6ESTree11PatternNodeC2ENS0_8NodeKindE:
  417|  44.7k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree11PatternNode7classofEPKNS0_4NodeE:
  418|   151k|    static bool classof(const Node *V) {                          \
  419|   151k|      auto kind = V->getKind();                                   \
  420|   151k|      return NodeKind::_##NAME##_First < kind &&                  \
  ------------------
  |  Branch (420:14): [True: 44.7k, False: 107k]
  ------------------
  421|   151k|          kind < NodeKind::_##NAME##_Last;                        \
  ------------------
  |  Branch (421:11): [True: 44.7k, False: 0]
  ------------------
  422|   151k|    }                                                             \
_ZN6hermes6ESTree17ObjectPatternNode7classofEPKNS0_4NodeE:
  487|      1|    static bool classof(const Node *V) {                               \
  488|      1|      return V->getKind() == NodeKind::NAME;                           \
  489|      1|    }                                                                  \
_ZN6hermes6ESTree16ArrayPatternNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEEPS4_:
  474|  44.7k|        : BASE##Node(NodeKind::NAME),                                  \
  475|  44.7k|          _##ARG0NM(std::move(ARG0NM##_)),                             \
  476|  44.7k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree16ArrayPatternNode7classofEPKNS0_4NodeE:
  487|   111k|    static bool classof(const Node *V) {                               \
  488|   111k|      return V->getKind() == NodeKind::NAME;                           \
  489|   111k|    }                                                                  \
_ZN6hermes6ESTree15RestElementNode7classofEPKNS0_4NodeE:
  459|   123k|    static bool classof(const Node *V) {                                 \
  460|   123k|      return V->getKind() == NodeKind::NAME;                             \
  461|   123k|    }                                                                    \
_ZN6hermes6ESTree21AssignmentPatternNode7classofEPKNS0_4NodeE:
  487|   352k|    static bool classof(const Node *V) {                               \
  488|   352k|      return V->getKind() == NodeKind::NAME;                           \
  489|   352k|    }                                                                  \
_ZN6hermes6ESTree22TypeCastExpressionNode7classofEPKNS0_4NodeE:
  487|      1|    static bool classof(const Node *V) {                               \
  488|      1|      return V->getKind() == NodeKind::NAME;                           \
  489|      1|    }                                                                  \
_ZN6hermes6ESTree22ComponentParameterNode7classofEPKNS0_4NodeE:
  529|   309k|    static bool classof(const Node *V) {                               \
  530|   309k|      return V->getKind() == NodeKind::NAME;                           \
  531|   309k|    }                                                                  \
_ZN6hermes6ESTree9CoverNodeC2ENS0_8NodeKindE:
  417|    292|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree18CoverEmptyArgsNodeC2Ev:
  429|    292|    explicit NAME##Node() : BASE##Node(NodeKind::NAME) {}              \
_ZN6hermes6ESTree18CoverEmptyArgsNode7classofEPKNS0_4NodeE:
  430|   206k|    static bool classof(const Node *V) {                               \
  431|   206k|      return V->getKind() == NodeKind::NAME;                           \
  432|   206k|    }                                                                  \
_ZN6hermes6ESTree24CoverTypedIdentifierNode7classofEPKNS0_4NodeE:
  529|      1|    static bool classof(const Node *V) {                               \
  530|      1|      return V->getKind() == NodeKind::NAME;                           \
  531|      1|    }                                                                  \
_ZN6hermes6ESTree8isStrictENS0_10StrictnessE:
  248|   206k|inline bool isStrict(Strictness strictness) {
  249|   206k|  assert(strictness != Strictness::NotSet && "strictness hasn't been set");
  250|   206k|  return strictness == Strictness::StrictMode;
  251|   206k|}
_ZN6hermes6ESTree14makeStrictnessEb:
  255|   103k|inline Strictness makeStrictness(bool strictMode) {
  256|   103k|  return strictMode ? Strictness::StrictMode : Strictness::NonStrictMode;
  ------------------
  |  Branch (256:10): [True: 0, False: 103k]
  ------------------
  257|   103k|}
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ProgramNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  451|    114|    void visit(Visitor &V) {                                             \
  452|    114|      if (!V.shouldVisit(this)) {                                        \
  ------------------
  |  Branch (452:11): [True: 0, False: 114]
  ------------------
  453|      0|        return;                                                          \
  454|      0|      }                                                                  \
  455|    114|      V.enter(this);                                                     \
  456|    114|      ESTreeVisit(V, _##ARG0NM);                                         \
  457|    114|      V.leave(this);                                                     \
  458|    114|    }                                                                    \
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_RN4llvh12simple_ilistINS0_4NodeEJEEE:
  217|  2.85k|void ESTreeVisit(Visitor &V, NodeList &Lst) {
  218|  9.34k|  for (auto &Elem : Lst) {
  ------------------
  |  Branch (218:19): [True: 9.34k, False: 2.85k]
  ------------------
  219|  9.34k|    ESTreeVisit(V, &Elem);
  220|  9.34k|  }
  221|  2.85k|}
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_PNS0_4NodeE:
  943|  17.5k|void ESTreeVisit(Visitor &V, NodePtr Node) {
  944|  17.5k|  if (!Node) {
  ------------------
  |  Branch (944:7): [True: 5.47k, False: 12.0k]
  ------------------
  945|  5.47k|    return;
  946|  5.47k|  }
  947|       |
  948|  12.0k|  switch (Node->getKind()) {
  949|      0|    default:
  ------------------
  |  Branch (949:5): [True: 0, False: 12.0k]
  ------------------
  950|      0|      llvm_unreachable("invalid node kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  951|       |
  952|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) \
  953|      0|  case NodeKind::NAME:                \
  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  955|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) \
  956|      0|  case NodeKind::NAME:                \
  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  958|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) \
  959|      0|  case NodeKind::NAME:                \
  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  961|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) \
  962|      0|  case NodeKind::NAME:                \
  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  964|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) \
  965|      0|  case NodeKind::NAME:                \
  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  967|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) \
  968|      0|  case NodeKind::NAME:                \
  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  970|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) \
  971|      0|  case NodeKind::NAME:                \
  972|      0|    return cast<NAME##Node>(Node)->visit(V);
  973|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) \
  974|      0|  case NodeKind::NAME:                \
  975|      0|    return cast<NAME##Node>(Node)->visit(V);
  976|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) \
  977|      0|  case NodeKind::NAME:                \
  978|      0|    return cast<NAME##Node>(Node)->visit(V);
  979|      0|#define ESTREE_NODE_9_ARGS(NAME, ...) \
  980|      0|  case NodeKind::NAME:                \
  981|      0|    return cast<NAME##Node>(Node)->visit(V);
  982|       |
  983|      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)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   33|      0|ESTREE_NODE_0_ARGS(Metadata, Base)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   34|       |
  |  |   35|      0|ESTREE_FIRST(FunctionLike, Base)
  |  |   36|      0|ESTREE_NODE_1_ARGS(Program, FunctionLike,
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   37|      0|    NodeList, body, false)
  |  |   38|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  977|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (977:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  978|      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(
  |  |  ------------------
  |  |  |  |  977|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (977:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  978|      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|  3.87k|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  977|  3.87k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (977:3): [True: 3.87k, False: 8.20k]
  |  |  |  |  ------------------
  |  |  |  |  978|  3.87k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   65|  3.87k|    FunctionDeclaration, FunctionLike,
  |  |   66|  3.87k|    NodePtr, id, true,
  |  |   67|  3.87k|    NodeList, params, false,
  |  |   68|  3.87k|    NodePtr, body, false,
  |  |   69|  3.87k|    NodePtr, typeParameters, true,
  |  |   70|  3.87k|    NodePtr, returnType, true,
  |  |   71|  3.87k|    NodePtr, predicate, true,
  |  |   72|  3.87k|    NodeBoolean, generator, false,
  |  |   73|  3.87k|    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|       |
  |  |   78|      0|#if HERMES_PARSE_FLOW
  |  |   79|       |
  |  |   80|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   81|      0|    ComponentDeclaration, FunctionLike,
  |  |   82|      0|    NodePtr, id, false,
  |  |   83|      0|    NodeList, params, false,
  |  |   84|      0|    NodePtr, body, false,
  |  |   85|      0|    NodePtr, typeParameters, true,
  |  |   86|      0|    NodePtr, rendersType, true)
  |  |   87|      0|ESTREE_IGNORE_IF_EMPTY(ComponentDeclaration, typeParameters)
  |  |   88|      0|ESTREE_IGNORE_IF_EMPTY(ComponentDeclaration, rendersType)
  |  |   89|       |
  |  |   90|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   91|      0|    HookDeclaration, FunctionLike,
  |  |   92|      0|    NodePtr, id, false,
  |  |   93|      0|    NodeList, params, false,
  |  |   94|      0|    NodePtr, body, false,
  |  |   95|      0|    NodePtr, typeParameters, true,
  |  |   96|      0|    NodePtr, returnType, true)
  |  |   97|      0|ESTREE_IGNORE_IF_EMPTY(HookDeclaration, typeParameters)
  |  |   98|      0|ESTREE_IGNORE_IF_EMPTY(HookDeclaration, returnType)
  |  |   99|       |
  |  |  100|      0|#endif
  |  |  101|       |
  |  |  102|      0|ESTREE_LAST(FunctionLike)
  |  |  103|       |
  |  |  104|      0|ESTREE_FIRST(Statement, Base)
  |  |  105|       |
  |  |  106|      0|#if HERMES_PARSE_FLOW
  |  |  107|       |
  |  |  108|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  109|      0|    MatchStatement, Statement,
  |  |  110|      0|    NodePtr, argument, false, // Expression
  |  |  111|      0|    NodeList, cases, false // [ MatchStatementCase ]
  |  |  112|      0|)
  |  |  113|       |
  |  |  114|      0|#endif
  |  |  115|       |
  |  |  116|      0|ESTREE_FIRST(LoopStatement, Statement)
  |  |  117|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  118|      0|    WhileStatement,
  |  |  119|      0|    LoopStatement,
  |  |  120|      0|    NodePtr,
  |  |  121|      0|    body,
  |  |  122|      0|    false,
  |  |  123|      0|    NodePtr,
  |  |  124|      0|    test,
  |  |  125|      0|    false)
  |  |  126|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  127|      0|    DoWhileStatement,
  |  |  128|      0|    LoopStatement,
  |  |  129|      0|    NodePtr,
  |  |  130|      0|    body,
  |  |  131|      0|    false,
  |  |  132|      0|    NodePtr,
  |  |  133|      0|    test,
  |  |  134|      0|    false)
  |  |  135|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  136|      0|    ForInStatement,
  |  |  137|      0|    LoopStatement,
  |  |  138|      0|    NodePtr,
  |  |  139|      0|    left,
  |  |  140|      0|    false,
  |  |  141|      0|    NodePtr,
  |  |  142|      0|    right,
  |  |  143|      0|    false,
  |  |  144|      0|    NodePtr,
  |  |  145|      0|    body,
  |  |  146|      0|    false)
  |  |  147|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  148|      0|    ForOfStatement, LoopStatement,
  |  |  149|      0|    NodePtr, left, false,
  |  |  150|      0|    NodePtr, right, false,
  |  |  151|      0|    NodePtr, body, false,
  |  |  152|      0|    NodeBoolean, await, false)
  |  |  153|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  154|      0|    ForStatement,
  |  |  155|      0|    LoopStatement,
  |  |  156|      0|    NodePtr,
  |  |  157|      0|    init,
  |  |  158|      0|    true,
  |  |  159|      0|    NodePtr,
  |  |  160|      0|    test,
  |  |  161|      0|    true,
  |  |  162|      0|    NodePtr,
  |  |  163|      0|    update,
  |  |  164|      0|    true,
  |  |  165|      0|    NodePtr,
  |  |  166|      0|    body,
  |  |  167|      0|    false)
  |  |  168|      0|ESTREE_LAST(LoopStatement)
  |  |  169|       |
  |  |  170|      0|ESTREE_NODE_0_ARGS(DebuggerStatement, Statement)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  171|      0|ESTREE_NODE_0_ARGS(EmptyStatement, Statement)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  172|      0|ESTREE_NODE_1_ARGS(BlockStatement, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  173|      0|ESTREE_NODE_1_ARGS(StaticBlock, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  174|      0|ESTREE_NODE_1_ARGS(BreakStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  175|      0|ESTREE_NODE_1_ARGS(ContinueStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  176|      0|ESTREE_NODE_1_ARGS(ThrowStatement, Statement, NodePtr, argument, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  177|      0|ESTREE_NODE_1_ARGS(ReturnStatement, Statement, NodePtr, argument, true)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  178|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  179|      0|    WithStatement,
  |  |  180|      0|    Statement,
  |  |  181|      0|    NodePtr,
  |  |  182|      0|    object,
  |  |  183|      0|    false,
  |  |  184|      0|    NodePtr,
  |  |  185|      0|    body,
  |  |  186|      0|    false)
  |  |  187|       |
  |  |  188|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  189|      0|    SwitchStatement,
  |  |  190|      0|    Statement,
  |  |  191|      0|    NodePtr,
  |  |  192|      0|    discriminant,
  |  |  193|      0|    false,
  |  |  194|      0|    NodeList,
  |  |  195|      0|    cases,
  |  |  196|      0|    false)
  |  |  197|       |
  |  |  198|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  199|      0|    LabeledStatement,
  |  |  200|      0|    Statement,
  |  |  201|      0|    NodePtr,
  |  |  202|      0|    label,
  |  |  203|      0|    false,
  |  |  204|      0|    NodePtr,
  |  |  205|      0|    body,
  |  |  206|      0|    false)
  |  |  207|       |
  |  |  208|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  209|      0|    ExpressionStatement,
  |  |  210|      0|    Statement,
  |  |  211|      0|    NodePtr,
  |  |  212|      0|    expression,
  |  |  213|      0|    false,
  |  |  214|      0|    NodeString,
  |  |  215|      0|    directive,
  |  |  216|      0|    true)
  |  |  217|       |
  |  |  218|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  219|      0|    TryStatement,
  |  |  220|      0|    Statement,
  |  |  221|      0|    NodePtr,
  |  |  222|      0|    block,
  |  |  223|      0|    false,
  |  |  224|      0|    NodePtr,
  |  |  225|      0|    handler,
  |  |  226|      0|    true,
  |  |  227|      0|    NodePtr,
  |  |  228|      0|    finalizer,
  |  |  229|      0|    true)
  |  |  230|       |
  |  |  231|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  232|      0|    IfStatement,
  |  |  233|      0|    Statement,
  |  |  234|      0|    NodePtr,
  |  |  235|      0|    test,
  |  |  236|      0|    false,
  |  |  237|      0|    NodePtr,
  |  |  238|      0|    consequent,
  |  |  239|      0|    false,
  |  |  240|      0|    NodePtr,
  |  |  241|      0|    alternate,
  |  |  242|      0|    true)
  |  |  243|       |
  |  |  244|      0|ESTREE_LAST(Statement)
  |  |  245|       |
  |  |  246|      0|ESTREE_NODE_0_ARGS(NullLiteral, Base)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  247|      0|ESTREE_NODE_1_ARGS(BooleanLiteral, Base, NodeBoolean, value, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  248|      0|ESTREE_NODE_1_ARGS(StringLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  249|      0|ESTREE_NODE_1_ARGS(NumericLiteral, Base, NodeNumber, value, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  250|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  251|      0|    RegExpLiteral,
  |  |  252|      0|    Base,
  |  |  253|      0|    NodeLabel,
  |  |  254|      0|    pattern,
  |  |  255|      0|    false,
  |  |  256|      0|    NodeLabel,
  |  |  257|      0|    flags,
  |  |  258|      0|    false)
  |  |  259|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  260|      0|    BigIntLiteral, Base,
  |  |  261|      0|    NodeLabel, bigint, false)
  |  |  262|       |
  |  |  263|      0|ESTREE_NODE_0_ARGS(ThisExpression, Base)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  264|      0|ESTREE_NODE_0_ARGS(Super, Base)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  265|      0|ESTREE_NODE_1_ARGS(SequenceExpression, Base, NodeList, expressions, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  266|      0|ESTREE_NODE_1_ARGS(ObjectExpression, Base, NodeList, properties, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  267|      0|ESTREE_NODE_2_ARGS(ArrayExpression, Base,
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  268|      0|    NodeList, elements, false,
  |  |  269|      0|    NodeBoolean, trailingComma, false)
  |  |  270|       |
  |  |  271|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  272|      0|    SpreadElement, Base,
  |  |  273|      0|    NodePtr, argument, false)
  |  |  274|       |
  |  |  275|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  276|      0|    NewExpression, Base,
  |  |  277|      0|    NodePtr, callee, false,
  |  |  278|      0|    NodePtr, typeArguments, true,
  |  |  279|      0|    NodeList, arguments, false)
  |  |  280|      0|ESTREE_IGNORE_IF_EMPTY(NewExpression, typeArguments)
  |  |  281|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  282|      0|    YieldExpression, Base,
  |  |  283|      0|    NodePtr, argument, true,
  |  |  284|      0|    NodeBoolean, delegate, true)
  |  |  285|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  286|      0|    AwaitExpression, Base,
  |  |  287|      0|    NodePtr, argument, false)
  |  |  288|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  289|      0|    ImportExpression, Base,
  |  |  290|      0|    NodePtr, source, false,
  |  |  291|      0|    NodePtr, attributes, true)
  |  |  292|       |
  |  |  293|      0|ESTREE_FIRST(CallExpressionLike, Base)
  |  |  294|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  295|      0|    CallExpression, CallExpressionLike,
  |  |  296|      0|    NodePtr, callee, false,
  |  |  297|      0|    NodePtr, typeArguments, true,
  |  |  298|      0|    NodeList, arguments, false)
  |  |  299|      0|ESTREE_IGNORE_IF_EMPTY(CallExpression, typeArguments)
  |  |  300|       |
  |  |  301|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  302|      0|    OptionalCallExpression, CallExpressionLike,
  |  |  303|      0|    NodePtr, callee, false,
  |  |  304|      0|    NodePtr, typeArguments, true,
  |  |  305|      0|    NodeList, arguments, false,
  |  |  306|      0|    NodeBoolean, optional, false)
  |  |  307|      0|ESTREE_IGNORE_IF_EMPTY(OptionalCallExpression, typeArguments)
  |  |  308|      0|ESTREE_LAST(CallExpressionLike)
  |  |  309|       |
  |  |  310|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  311|      0|    AssignmentExpression,
  |  |  312|      0|    Base,
  |  |  313|      0|    NodeLabel,
  |  |  314|      0|    operator,
  |  |  315|      0|    false,
  |  |  316|      0|    NodePtr,
  |  |  317|      0|    left,
  |  |  318|      0|    false,
  |  |  319|      0|    NodePtr,
  |  |  320|      0|    right,
  |  |  321|      0|    false)
  |  |  322|       |
  |  |  323|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  324|      0|    UnaryExpression,
  |  |  325|      0|    Base,
  |  |  326|      0|    NodeLabel,
  |  |  327|      0|    operator,
  |  |  328|      0|    false,
  |  |  329|      0|    NodePtr,
  |  |  330|      0|    argument,
  |  |  331|      0|    false,
  |  |  332|      0|    NodeBoolean,
  |  |  333|      0|    prefix,
  |  |  334|      0|    false)
  |  |  335|       |
  |  |  336|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  337|      0|    UpdateExpression,
  |  |  338|      0|    Base,
  |  |  339|      0|    NodeLabel,
  |  |  340|      0|    operator,
  |  |  341|      0|    false,
  |  |  342|      0|    NodePtr,
  |  |  343|      0|    argument,
  |  |  344|      0|    false,
  |  |  345|      0|    NodeBoolean,
  |  |  346|      0|    prefix,
  |  |  347|      0|    false)
  |  |  348|       |
  |  |  349|      0|ESTREE_FIRST(MemberExpressionLike, Base)
  |  |  350|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  351|      0|    MemberExpression, MemberExpressionLike,
  |  |  352|      0|    NodePtr, object, false,
  |  |  353|      0|    NodePtr, property, false,
  |  |  354|      0|    NodeBoolean, computed, false)
  |  |  355|       |
  |  |  356|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  357|      0|    OptionalMemberExpression, MemberExpressionLike,
  |  |  358|      0|    NodePtr, object, false,
  |  |  359|      0|    NodePtr, property, false,
  |  |  360|      0|    NodeBoolean, computed, false,
  |  |  361|      0|    NodeBoolean, optional, false)
  |  |  362|      0|ESTREE_LAST(MemberExpressionLike)
  |  |  363|       |
  |  |  364|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  365|      0|    LogicalExpression,
  |  |  366|      0|    Base,
  |  |  367|      0|    NodePtr,
  |  |  368|      0|    left,
  |  |  369|      0|    false,
  |  |  370|      0|    NodePtr,
  |  |  371|      0|    right,
  |  |  372|      0|    false,
  |  |  373|      0|    NodeLabel,
  |  |  374|      0|    operator,
  |  |  375|      0|    false)
  |  |  376|       |
  |  |  377|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  378|      0|    ConditionalExpression,
  |  |  379|      0|    Base,
  |  |  380|      0|    NodePtr,
  |  |  381|      0|    test,
  |  |  382|      0|    false,
  |  |  383|      0|    NodePtr,
  |  |  384|      0|    alternate,
  |  |  385|      0|    false,
  |  |  386|      0|    NodePtr,
  |  |  387|      0|    consequent,
  |  |  388|      0|    false)
  |  |  389|       |
  |  |  390|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  391|      0|    BinaryExpression,
  |  |  392|      0|    Base,
  |  |  393|      0|    NodePtr,
  |  |  394|      0|    left,
  |  |  395|      0|    false,
  |  |  396|      0|    NodePtr,
  |  |  397|      0|    right,
  |  |  398|      0|    false,
  |  |  399|      0|    NodeLabel,
  |  |  400|      0|    operator,
  |  |  401|      0|    false)
  |  |  402|       |
  |  |  403|      0|ESTREE_NODE_1_ARGS(Directive, Base, NodePtr, value, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  404|      0|ESTREE_NODE_1_ARGS(DirectiveLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  405|       |
  |  |  406|  2.73k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|  2.73k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 2.73k, False: 9.34k]
  |  |  |  |  ------------------
  |  |  |  |  963|  2.73k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  407|  2.73k|    Identifier, Base,
  |  |  408|  2.73k|    NodeLabel, name, false,
  |  |  409|  2.73k|    NodePtr, typeAnnotation, true,
  |  |  410|  2.73k|    NodeBoolean, optional, false)
  |  |  411|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, typeAnnotation)
  |  |  412|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, optional)
  |  |  413|       |
  |  |  414|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  415|      0|    PrivateName, Base,
  |  |  416|      0|    NodePtr, id, false)
  |  |  417|       |
  |  |  418|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  419|      0|    MetaProperty,
  |  |  420|      0|    Base,
  |  |  421|      0|    NodePtr,
  |  |  422|      0|    meta,
  |  |  423|      0|    false,
  |  |  424|      0|    NodePtr,
  |  |  425|      0|    property,
  |  |  426|      0|    false)
  |  |  427|       |
  |  |  428|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  429|      0|    SwitchCase,
  |  |  430|      0|    Base,
  |  |  431|      0|    NodePtr,
  |  |  432|      0|    test,
  |  |  433|      0|    true,
  |  |  434|      0|    NodeList,
  |  |  435|      0|    consequent,
  |  |  436|      0|    false)
  |  |  437|       |
  |  |  438|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  439|      0|    CatchClause,
  |  |  440|      0|    Base,
  |  |  441|      0|    NodePtr,
  |  |  442|      0|    param,
  |  |  443|      0|    true,
  |  |  444|      0|    NodePtr,
  |  |  445|      0|    body,
  |  |  446|      0|    false)
  |  |  447|       |
  |  |  448|  2.73k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|  2.73k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 2.73k, False: 9.34k]
  |  |  |  |  ------------------
  |  |  |  |  960|  2.73k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  449|  2.73k|    VariableDeclarator,
  |  |  450|  2.73k|    Base,
  |  |  451|  2.73k|    NodePtr,
  |  |  452|  2.73k|    init,
  |  |  453|  2.73k|    true,
  |  |  454|  2.73k|    NodePtr,
  |  |  455|  2.73k|    id,
  |  |  456|  2.73k|    false)
  |  |  457|       |
  |  |  458|  2.73k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|  2.73k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 2.73k, False: 9.34k]
  |  |  |  |  ------------------
  |  |  |  |  960|  2.73k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  459|  2.73k|    VariableDeclaration,
  |  |  460|  2.73k|    Base,
  |  |  461|  2.73k|    NodeLabel,
  |  |  462|  2.73k|    kind,
  |  |  463|  2.73k|    false,
  |  |  464|  2.73k|    NodeList,
  |  |  465|  2.73k|    declarations,
  |  |  466|  2.73k|    false)
  |  |  467|       |
  |  |  468|      0|ESTREE_NODE_2_ARGS(TemplateLiteral, Base,
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  469|      0|                   NodeList, quasis, false,
  |  |  470|      0|                   NodeList, expressions, false)
  |  |  471|       |
  |  |  472|      0|ESTREE_NODE_2_ARGS(TaggedTemplateExpression, Base,
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  473|      0|                   NodePtr, tag, false,
  |  |  474|      0|                   NodePtr, quasi, false)
  |  |  475|       |
  |  |  476|       |// In ESTree, it is defined as {tail : boolean,
  |  |  477|       |//                              value : {cooked : string, raw : string}},
  |  |  478|       |// we flatten the value field.
  |  |  479|       |// If the template literal is tagged and the text has an invalid escape,
  |  |  480|       |// cooked will be null.
  |  |  481|      0|ESTREE_NODE_3_ARGS(TemplateElement, Base,
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  482|      0|                   NodeBoolean, tail, false,
  |  |  483|      0|                   NodeString, cooked, true,
  |  |  484|      0|                   NodeLabel, raw, false)
  |  |  485|       |
  |  |  486|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  971|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (971:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  972|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  487|      0|    Property, Base,
  |  |  488|      0|    NodePtr, key, false,
  |  |  489|      0|    NodePtr, value, false,
  |  |  490|      0|    NodeLabel, kind, false,
  |  |  491|      0|    NodeBoolean, computed, false,
  |  |  492|      0|    NodeBoolean, method, false,
  |  |  493|      0|    NodeBoolean, shorthand, false)
  |  |  494|       |
  |  |  495|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  974|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (974:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  975|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  496|      0|    ClassDeclaration, Base,
  |  |  497|      0|    NodePtr, id, true,
  |  |  498|      0|    NodePtr, typeParameters, true,
  |  |  499|      0|    NodePtr, superClass, true,
  |  |  500|      0|    NodePtr, superTypeParameters, true,
  |  |  501|      0|    NodeList, implements, false,
  |  |  502|      0|    NodeList, decorators, false,
  |  |  503|      0|    NodePtr, body, false)
  |  |  504|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, typeParameters)
  |  |  505|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, superTypeParameters)
  |  |  506|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, implements)
  |  |  507|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, decorators)
  |  |  508|       |
  |  |  509|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  974|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (974:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  975|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  510|      0|    ClassExpression, Base,
  |  |  511|      0|    NodePtr, id, true,
  |  |  512|      0|    NodePtr, typeParameters, true,
  |  |  513|      0|    NodePtr, superClass, true,
  |  |  514|      0|    NodePtr, superTypeParameters, true,
  |  |  515|      0|    NodeList, implements, false,
  |  |  516|      0|    NodeList, decorators, false,
  |  |  517|      0|    NodePtr, body, false)
  |  |  518|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, typeParameters)
  |  |  519|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, superTypeParameters)
  |  |  520|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, implements)
  |  |  521|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, decorators)
  |  |  522|       |
  |  |  523|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  524|      0|    ClassBody, Base,
  |  |  525|      0|    NodeList, body, false)
  |  |  526|       |
  |  |  527|      0|ESTREE_NODE_9_ARGS(
  |  |  ------------------
  |  |  |  |  980|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (980:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  981|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  528|      0|    ClassProperty, Base,
  |  |  529|      0|    NodePtr, key, false,
  |  |  530|      0|    NodePtr, value, true,
  |  |  531|      0|    NodeBoolean, computed, false,
  |  |  532|      0|    NodeBoolean, static, false,
  |  |  533|      0|    NodeBoolean, declare, false,
  |  |  534|      0|    NodeBoolean, optional, false,
  |  |  535|      0|    NodePtr, variance, true,
  |  |  536|      0|    NodePtr, typeAnnotation, true,
  |  |  537|      0|    NodePtr, tsModifiers, true)
  |  |  538|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, variance)
  |  |  539|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, optional)
  |  |  540|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, typeAnnotation)
  |  |  541|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, tsModifiers)
  |  |  542|       |
  |  |  543|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  977|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (977:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  978|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  544|      0|    ClassPrivateProperty, Base,
  |  |  545|      0|    NodePtr, key, false,
  |  |  546|      0|    NodePtr, value, true,
  |  |  547|      0|    NodeBoolean, static, false,
  |  |  548|      0|    NodeBoolean, declare, false,
  |  |  549|      0|    NodeBoolean, optional, false,
  |  |  550|      0|    NodePtr, variance, true,
  |  |  551|      0|    NodePtr, typeAnnotation, true,
  |  |  552|      0|    NodePtr, tsModifiers, true)
  |  |  553|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, variance)
  |  |  554|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, optional)
  |  |  555|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, typeAnnotation)
  |  |  556|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, tsModifiers)
  |  |  557|       |
  |  |  558|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  559|      0|    MethodDefinition, Base,
  |  |  560|      0|    NodePtr, key, false,
  |  |  561|      0|    NodePtr, value, false,
  |  |  562|      0|    NodeLabel, kind, false,
  |  |  563|      0|    NodeBoolean, computed, false,
  |  |  564|      0|    NodeBoolean, static, false)
  |  |  565|       |
  |  |  566|       |// Imports ========================================
  |  |  567|       |
  |  |  568|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  569|      0|    ImportDeclaration, Base,
  |  |  570|      0|    NodeList, specifiers, false,
  |  |  571|      0|    NodePtr, source, false,
  |  |  572|      0|    NodeList, assertions, true,
  |  |  573|      0|    NodeLabel, importKind, false)
  |  |  574|       |
  |  |  575|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  576|      0|    ImportSpecifier, Base,
  |  |  577|      0|    NodePtr, imported, false,
  |  |  578|      0|    NodePtr, local, false,
  |  |  579|      0|    NodeLabel, importKind, false)
  |  |  580|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  581|      0|    ImportDefaultSpecifier, Base,
  |  |  582|      0|    NodePtr, local, false)
  |  |  583|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  584|      0|    ImportNamespaceSpecifier, Base,
  |  |  585|      0|    NodePtr, local, false)
  |  |  586|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  587|      0|    ImportAttribute, Base,
  |  |  588|      0|    NodePtr, key, false,
  |  |  589|      0|    NodePtr, value, false)
  |  |  590|       |
  |  |  591|       |
  |  |  592|       |// ================================================
  |  |  593|       |
  |  |  594|       |// Exports ========================================
  |  |  595|       |
  |  |  596|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  597|      0|    ExportNamedDeclaration, Base,
  |  |  598|      0|    NodePtr, declaration, true,
  |  |  599|      0|    NodeList, specifiers, false,
  |  |  600|      0|    NodePtr, source, true,
  |  |  601|      0|    NodeLabel, exportKind, false)
  |  |  602|       |
  |  |  603|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  604|      0|    ExportSpecifier, Base,
  |  |  605|      0|    NodePtr, exported, false,
  |  |  606|      0|    NodePtr, local, false)
  |  |  607|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  608|      0|    ExportNamespaceSpecifier, Base,
  |  |  609|      0|    NodePtr, exported, false)
  |  |  610|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  611|      0|    ExportDefaultDeclaration, Base,
  |  |  612|      0|    NodePtr, declaration, false)
  |  |  613|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  614|      0|    ExportAllDeclaration, Base,
  |  |  615|      0|    NodePtr, source, false,
  |  |  616|      0|    NodeLabel, exportKind, false)
  |  |  617|       |
  |  |  618|       |// ================================================
  |  |  619|       |
  |  |  620|       |// Patterns =======================================
  |  |  621|      0|ESTREE_FIRST(Pattern, Base)
  |  |  622|       |
  |  |  623|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  624|      0|    ObjectPattern, Pattern,
  |  |  625|      0|    NodeList, properties, false,
  |  |  626|      0|    NodePtr, typeAnnotation, true)
  |  |  627|      0|ESTREE_IGNORE_IF_EMPTY(ObjectPattern, typeAnnotation)
  |  |  628|       |
  |  |  629|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  630|      0|    ArrayPattern, Pattern,
  |  |  631|      0|    NodeList, elements, false,
  |  |  632|      0|    NodePtr, typeAnnotation, true)
  |  |  633|      0|ESTREE_IGNORE_IF_EMPTY(ArrayPattern, typeAnnotation)
  |  |  634|       |
  |  |  635|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  636|      0|    RestElement, Pattern,
  |  |  637|      0|    NodePtr, argument, false)
  |  |  638|       |
  |  |  639|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  640|      0|    AssignmentPattern, Pattern,
  |  |  641|      0|    NodePtr, left, false,          // Pattern
  |  |  642|       |    NodePtr, right, false)         // Expression
  |  |  643|      0|
  |  |  644|      0|ESTREE_LAST(Pattern)
  |  |  645|       |
  |  |  646|       |// ================================================
  |  |  647|       |
  |  |  648|       |// Flow match =====================================
  |  |  649|       |
  |  |  650|      0|#if HERMES_PARSE_FLOW
  |  |  651|       |
  |  |  652|       |// Match statement
  |  |  653|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  654|      0|    MatchStatementCase, Base,
  |  |  655|      0|    NodePtr, pattern, false, // MatchPattern
  |  |  656|      0|    NodePtr, body, false, // BlockStatement
  |  |  657|      0|    NodePtr, guard, true // Expression | null
  |  |  658|      0|)
  |  |  659|       |
  |  |  660|       |// Match expression
  |  |  661|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  662|      0|    MatchExpression, Base,
  |  |  663|      0|    NodePtr, argument, false, // Expression
  |  |  664|      0|    NodeList, cases, false // [ MatchExpressionCase ]
  |  |  665|      0|)
  |  |  666|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  667|      0|    MatchExpressionCase, Base,
  |  |  668|      0|    NodePtr, pattern, false, // MatchPattern
  |  |  669|      0|    NodePtr, body, false, // Expression
  |  |  670|      0|    NodePtr, guard, true // Expression | null
  |  |  671|      0|)
  |  |  672|       |
  |  |  673|       |// Match patterns
  |  |  674|      0|ESTREE_FIRST(MatchPattern, Base)
  |  |  675|       |
  |  |  676|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  677|      0|  MatchWildcardPattern, MatchPattern
  |  |  678|      0|)
  |  |  679|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  680|      0|  MatchLiteralPattern, MatchPattern,
  |  |  681|      0|  NodePtr, literal, false // Literal
  |  |  682|      0|)
  |  |  683|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  684|      0|  MatchUnaryPattern, MatchPattern,
  |  |  685|      0|  NodePtr, argument, false, // Literal
  |  |  686|      0|  NodeLabel, operator, false // "-" | "+"
  |  |  687|      0|)
  |  |  688|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  689|      0|  MatchIdentifierPattern, MatchPattern,
  |  |  690|      0|  NodePtr, id, false // Identifier
  |  |  691|      0|)
  |  |  692|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  693|      0|  MatchBindingPattern, MatchPattern,
  |  |  694|      0|  NodePtr, id, false, // Identifier
  |  |  695|      0|  NodeLabel, kind, false // "let" | "const"
  |  |  696|      0|)
  |  |  697|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  698|      0|  MatchObjectPattern, MatchPattern,
  |  |  699|      0|  NodeList, properties, false, // [ MatchObjectPatternProperty ]
  |  |  700|      0|  NodePtr, rest, true // MatchRestPattern | null
  |  |  701|      0|)
  |  |  702|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  703|      0|  MatchArrayPattern, MatchPattern,
  |  |  704|      0|  NodeList, elements, false, // [ MatchPattern ]
  |  |  705|      0|  NodePtr, rest, true // MatchRestPattern | null
  |  |  706|      0|)
  |  |  707|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  708|      0|  MatchOrPattern, MatchPattern,
  |  |  709|      0|  NodeList, patterns, false // [ MatchPattern ]
  |  |  710|      0|)
  |  |  711|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  712|      0|  MatchAsPattern, MatchPattern,
  |  |  713|      0|  NodePtr, pattern, false, // MatchPattern
  |  |  714|      0|  NodePtr, target, false // Identifier | MatchBindingPattern
  |  |  715|      0|)
  |  |  716|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  717|      0|  MatchMemberPattern, MatchPattern,
  |  |  718|      0|  NodePtr, base, false, // MatchIdentifierPattern | MatchMemberPattern
  |  |  719|      0|  NodePtr, property, false // Identifier | Literal
  |  |  720|      0|)
  |  |  721|       |
  |  |  722|      0|ESTREE_LAST(MatchPattern)
  |  |  723|       |
  |  |  724|       |// Match pattern auxiliary nodes
  |  |  725|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  726|      0|  MatchObjectPatternProperty, Base,
  |  |  727|      0|  NodePtr, key, false, // Identifier | Literal
  |  |  728|      0|  NodePtr, pattern, false, // MatchPattern
  |  |  729|      0|  NodeBoolean, shorthand, false // boolean
  |  |  730|      0|)
  |  |  731|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  732|      0|  MatchRestPattern, Base,
  |  |  733|      0|  NodePtr, argument, true // MatchBindingPattern | null
  |  |  734|      0|)
  |  |  735|       |
  |  |  736|      0|#endif
  |  |  737|       |
  |  |  738|       |// ================================================
  |  |  739|       |
  |  |  740|       |// JSX ============================================
  |  |  741|       |
  |  |  742|      0|#if HERMES_PARSE_JSX
  |  |  743|       |
  |  |  744|      0|ESTREE_FIRST(JSX, Base)
  |  |  745|       |
  |  |  746|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  747|      0|    JSXIdentifier, JSX,
  |  |  748|      0|    NodeLabel, name, false)
  |  |  749|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  750|      0|    JSXMemberExpression, JSX,
  |  |  751|      0|    NodePtr, object, false,
  |  |  752|      0|    NodePtr, property, false)
  |  |  753|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  754|      0|    JSXNamespacedName, JSX,
  |  |  755|      0|    NodePtr, namespace, false,
  |  |  756|      0|    NodePtr, name, false)
  |  |  757|       |
  |  |  758|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  759|      0|    JSXEmptyExpression, JSX)
  |  |  760|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  761|      0|    JSXExpressionContainer, JSX,
  |  |  762|      0|    NodePtr, expression, false)
  |  |  763|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  764|      0|    JSXSpreadChild, JSX,
  |  |  765|      0|    NodePtr, expression, false)
  |  |  766|       |
  |  |  767|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  768|      0|    JSXOpeningElement, JSX,
  |  |  769|      0|    NodePtr, name, false,
  |  |  770|      0|    NodeList, attributes, false,
  |  |  771|      0|    NodeBoolean, selfClosing, false,
  |  |  772|      0|    NodePtr, typeArguments, true)
  |  |  773|      0|ESTREE_IGNORE_IF_EMPTY(JSXOpeningElement, typeArguments)
  |  |  774|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  775|      0|    JSXClosingElement, JSX,
  |  |  776|      0|    NodePtr, name, false)
  |  |  777|       |
  |  |  778|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  779|      0|    JSXAttribute, JSX,
  |  |  780|      0|    NodePtr, name, false,
  |  |  781|      0|    NodePtr, value, true)
  |  |  782|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  783|      0|    JSXSpreadAttribute, JSX,
  |  |  784|      0|    NodePtr, argument, false)
  |  |  785|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  786|      0|    JSXStringLiteral, JSX,
  |  |  787|      0|    NodeString, value, false,
  |  |  788|      0|    NodeLabel, raw, false)
  |  |  789|       |
  |  |  790|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  791|      0|    JSXText, JSX,
  |  |  792|      0|    NodeString, value, false,
  |  |  793|      0|    NodeLabel, raw, false)
  |  |  794|       |
  |  |  795|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  796|      0|    JSXElement, JSX,
  |  |  797|      0|    NodePtr, openingElement, false,
  |  |  798|      0|    NodeList, children, false,
  |  |  799|      0|    NodePtr, closingElement, true)
  |  |  800|       |
  |  |  801|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  802|      0|    JSXFragment, JSX,
  |  |  803|      0|    NodePtr, openingFragment, false,
  |  |  804|      0|    NodeList, children, false,
  |  |  805|      0|    NodePtr, closingFragment, false)
  |  |  806|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  807|      0|    JSXOpeningFragment, JSX)
  |  |  808|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  809|      0|    JSXClosingFragment, JSX)
  |  |  810|       |
  |  |  811|      0|ESTREE_LAST(JSX)
  |  |  812|       |
  |  |  813|      0|#endif
  |  |  814|       |
  |  |  815|       |// ================================================
  |  |  816|       |
  |  |  817|       |// Types ==========================================
  |  |  818|       |
  |  |  819|      0|#if HERMES_PARSE_FLOW
  |  |  820|       |
  |  |  821|      0|ESTREE_FIRST(Flow, Base)
  |  |  822|       |
  |  |  823|      0|ESTREE_NODE_0_ARGS(ExistsTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  824|      0|ESTREE_NODE_0_ARGS(EmptyTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  825|      0|ESTREE_NODE_0_ARGS(StringTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  826|      0|ESTREE_NODE_0_ARGS(NumberTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  827|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  828|      0|    StringLiteralTypeAnnotation, Flow,
  |  |  829|      0|    NodeString, value, false,
  |  |  830|      0|    NodeString, raw, false)
  |  |  831|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  832|      0|    NumberLiteralTypeAnnotation, Flow,
  |  |  833|      0|    NodeNumber, value, false,
  |  |  834|      0|    NodeLabel, raw, false)
  |  |  835|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  836|      0|    BigIntLiteralTypeAnnotation, Flow,
  |  |  837|      0|    NodeLabel, raw, false)
  |  |  838|      0|ESTREE_NODE_0_ARGS(BooleanTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  839|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  840|      0|    BooleanLiteralTypeAnnotation, Flow,
  |  |  841|      0|    NodeBoolean, value, false,
  |  |  842|      0|    NodeLabel, raw, false)
  |  |  843|      0|ESTREE_NODE_0_ARGS(NullLiteralTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  844|      0|ESTREE_NODE_0_ARGS(SymbolTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  845|      0|ESTREE_NODE_0_ARGS(AnyTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  846|      0|ESTREE_NODE_0_ARGS(MixedTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  847|      0|ESTREE_NODE_0_ARGS(BigIntTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  848|      0|ESTREE_NODE_0_ARGS(VoidTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  849|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  850|      0|    FunctionTypeAnnotation, Flow,
  |  |  851|      0|    NodeList, params, false,
  |  |  852|      0|    NodePtr, this, true,
  |  |  853|      0|    NodePtr, returnType, false,
  |  |  854|      0|    NodePtr, rest, true,
  |  |  855|      0|    NodePtr, typeParameters, true)
  |  |  856|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  857|      0|    HookTypeAnnotation, Flow,
  |  |  858|      0|    NodeList, params, false,
  |  |  859|      0|    NodePtr, returnType, false,
  |  |  860|      0|    NodePtr, rest, true,
  |  |  861|      0|    NodePtr, typeParameters, true)
  |  |  862|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  863|      0|    FunctionTypeParam, Flow,
  |  |  864|      0|    NodePtr, name, true,
  |  |  865|      0|    NodePtr, typeAnnotation, false,
  |  |  866|      0|    NodeBoolean, optional, false)
  |  |  867|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  868|      0|    ComponentTypeAnnotation, Flow,
  |  |  869|      0|    NodeList, params, false,
  |  |  870|      0|    NodePtr, rest, true,
  |  |  871|      0|    NodePtr, typeParameters, true,
  |  |  872|      0|    NodePtr, rendersType, true)
  |  |  873|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  874|      0|    ComponentTypeParameter, Flow,
  |  |  875|      0|    NodePtr, name, true,
  |  |  876|      0|    NodePtr, typeAnnotation, false,
  |  |  877|      0|    NodeBoolean, optional, false)
  |  |  878|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  879|      0|    NullableTypeAnnotation, Flow,
  |  |  880|      0|    NodePtr, typeAnnotation, false)
  |  |  881|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  882|      0|    QualifiedTypeIdentifier, Flow,
  |  |  883|      0|    NodePtr, qualification, false,
  |  |  884|      0|    NodePtr, id, false)
  |  |  885|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  886|      0|    TypeofTypeAnnotation, Flow,
  |  |  887|      0|    NodePtr, argument, false,
  |  |  888|      0|    NodePtr, typeArguments, true)
  |  |  889|      0|ESTREE_IGNORE_IF_EMPTY(TypeofTypeAnnotation, typeArguments)
  |  |  890|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  891|      0|    KeyofTypeAnnotation, Flow,
  |  |  892|      0|    NodePtr, argument, false)
  |  |  893|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  894|      0|    TypeOperator, Flow,
  |  |  895|      0|    NodeLabel, operator, false,
  |  |  896|      0|    NodePtr, typeAnnotation, false)
  |  |  897|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  898|      0|    QualifiedTypeofIdentifier, Flow,
  |  |  899|      0|    NodePtr, qualification, false,
  |  |  900|      0|    NodePtr, id, false)
  |  |  901|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  902|      0|    TupleTypeAnnotation, Flow,
  |  |  903|      0|    NodeList, types, false,
  |  |  904|      0|    NodeBoolean, inexact, false)
  |  |  905|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  906|      0|    TupleTypeSpreadElement, Flow,
  |  |  907|      0|    NodePtr, label, true,
  |  |  908|      0|    NodePtr, typeAnnotation, false)
  |  |  909|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  910|      0|    TupleTypeLabeledElement, Flow,
  |  |  911|      0|    NodePtr, label, false,
  |  |  912|      0|    NodePtr, elementType, false,
  |  |  913|      0|    NodeBoolean, optional, false,
  |  |  914|      0|    NodePtr, variance, true)
  |  |  915|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  916|      0|    ArrayTypeAnnotation, Flow,
  |  |  917|      0|    NodePtr, elementType, false)
  |  |  918|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  919|      0|    InferTypeAnnotation, Flow,
  |  |  920|      0|    NodePtr, typeParameter, false)
  |  |  921|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  922|      0|    UnionTypeAnnotation, Flow,
  |  |  923|      0|    NodeList, types, false)
  |  |  924|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  925|      0|    IntersectionTypeAnnotation, Flow,
  |  |  926|      0|    NodeList, types, false)
  |  |  927|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  928|      0|    GenericTypeAnnotation, Flow,
  |  |  929|      0|    NodePtr, id, false,
  |  |  930|      0|    NodePtr, typeParameters, true)
  |  |  931|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  932|      0|    IndexedAccessType, Flow,
  |  |  933|      0|    NodePtr, objectType, false,
  |  |  934|      0|    NodePtr, indexType, false)
  |  |  935|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  936|      0|    OptionalIndexedAccessType, Flow,
  |  |  937|      0|    NodePtr, objectType, false,
  |  |  938|      0|    NodePtr, indexType, false,
  |  |  939|      0|    NodeBoolean, optional, false)
  |  |  940|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  941|      0|    ConditionalTypeAnnotation, Flow,
  |  |  942|      0|    NodePtr, checkType, false,
  |  |  943|      0|    NodePtr, extendsType, false,
  |  |  944|      0|    NodePtr, trueType, false,
  |  |  945|      0|    NodePtr, falseType, false)
  |  |  946|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  947|      0|    TypePredicate, Flow,
  |  |  948|      0|    NodePtr, parameterName, false,
  |  |  949|      0|    NodePtr, typeAnnotation, true,
  |  |  950|      0|    NodeString, kind, true)
  |  |  951|       |
  |  |  952|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  953|      0|    InterfaceTypeAnnotation, Flow,
  |  |  954|      0|    NodeList, extends, false,
  |  |  955|      0|    NodePtr, body, true)
  |  |  956|       |
  |  |  957|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  958|      0|    TypeAlias, Flow,
  |  |  959|      0|    NodePtr, id, false,
  |  |  960|      0|    NodePtr, typeParameters, true,
  |  |  961|      0|    NodePtr, right, false)
  |  |  962|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  963|      0|    OpaqueType, Flow,
  |  |  964|      0|    NodePtr, id, false,
  |  |  965|      0|    NodePtr, typeParameters, true,
  |  |  966|      0|    NodePtr, impltype, false,
  |  |  967|      0|    NodePtr, supertype, true)
  |  |  968|       |
  |  |  969|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  970|      0|    InterfaceDeclaration, Flow,
  |  |  971|      0|    NodePtr, id, false,
  |  |  972|      0|    NodePtr, typeParameters, true,
  |  |  973|      0|    NodeList, extends, false,
  |  |  974|      0|    NodePtr, body, false)
  |  |  975|       |
  |  |  976|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  977|      0|    DeclareTypeAlias, Flow,
  |  |  978|      0|    NodePtr, id, false,
  |  |  979|      0|    NodePtr, typeParameters, true,
  |  |  980|      0|    NodePtr, right, false)
  |  |  981|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  982|      0|    DeclareOpaqueType, Flow,
  |  |  983|      0|    NodePtr, id, false,
  |  |  984|      0|    NodePtr, typeParameters, true,
  |  |  985|      0|    NodePtr, impltype, true,
  |  |  986|      0|    NodePtr, supertype, true)
  |  |  987|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  988|      0|    DeclareInterface, Flow,
  |  |  989|      0|    NodePtr, id, false,
  |  |  990|      0|    NodePtr, typeParameters, true,
  |  |  991|      0|    NodeList, extends, false,
  |  |  992|      0|    NodePtr, body, false)
  |  |  993|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  971|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (971:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  972|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  994|      0|    DeclareClass, Flow,
  |  |  995|      0|    NodePtr, id, false,
  |  |  996|      0|    NodePtr, typeParameters, true,
  |  |  997|      0|    NodeList, extends, false,
  |  |  998|      0|    NodeList, implements, false,
  |  |  999|      0|    NodeList, mixins, false,
  |  | 1000|      0|    NodePtr, body, false)
  |  | 1001|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1002|      0|    DeclareFunction, Flow,
  |  | 1003|      0|    NodePtr, id, false,
  |  | 1004|      0|    NodePtr, predicate, true)
  |  | 1005|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1006|      0|    DeclareHook, Flow,
  |  | 1007|      0|    NodePtr, id, false)
  |  | 1008|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1009|      0|    DeclareComponent, Flow,
  |  | 1010|      0|    NodePtr, id, false,
  |  | 1011|      0|    NodeList, params, false,
  |  | 1012|      0|    NodePtr, rest, true,
  |  | 1013|      0|    NodePtr, typeParameters, true,
  |  | 1014|      0|    NodePtr, rendersType, true)
  |  | 1015|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1016|      0|    DeclareVariable, Flow,
  |  | 1017|      0|    NodePtr, id, false,
  |  | 1018|      0|    NodeLabel, kind, false)
  |  | 1019|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1020|      0|    DeclareEnum, Flow,
  |  | 1021|      0|    NodePtr, id, false,
  |  | 1022|      0|    NodePtr, body, false)
  |  | 1023|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1024|      0|    DeclareExportDeclaration, Flow,
  |  | 1025|      0|    NodePtr, declaration, true,
  |  | 1026|      0|    NodeList, specifiers, false,
  |  | 1027|      0|    NodePtr, source, true,
  |  | 1028|      0|    NodeBoolean, default, false)
  |  | 1029|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1030|      0|    DeclareExportAllDeclaration, Flow,
  |  | 1031|      0|    NodePtr, source, false)
  |  | 1032|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1033|      0|    DeclareModule, Flow,
  |  | 1034|      0|    NodePtr, id, false,
  |  | 1035|      0|    NodePtr, body, false)
  |  | 1036|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1037|      0|    DeclareNamespace, Flow,
  |  | 1038|      0|    NodePtr, id, false,
  |  | 1039|      0|    NodePtr, body, false)
  |  | 1040|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1041|      0|    DeclareModuleExports, Flow,
  |  | 1042|      0|    NodePtr, typeAnnotation, false)
  |  | 1043|       |
  |  | 1044|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1045|      0|    InterfaceExtends, Flow,
  |  | 1046|      0|    NodePtr, id, false,
  |  | 1047|      0|    NodePtr, typeParameters, true)
  |  | 1048|       |
  |  | 1049|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1050|      0|    ClassImplements, Flow,
  |  | 1051|      0|    NodePtr, id, false,
  |  | 1052|      0|    NodePtr, typeParameters, true)
  |  | 1053|       |
  |  | 1054|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1055|      0|    TypeAnnotation, Flow,
  |  | 1056|      0|    NodePtr, typeAnnotation, false)
  |  | 1057|       |
  |  | 1058|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  971|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (971:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  972|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1059|      0|    ObjectTypeAnnotation, Flow,
  |  | 1060|      0|    NodeList, properties, false,
  |  | 1061|      0|    NodeList, indexers, false,
  |  | 1062|      0|    NodeList, callProperties, false,
  |  | 1063|      0|    NodeList, internalSlots, false,
  |  | 1064|      0|    NodeBoolean, inexact, false,
  |  | 1065|      0|    NodeBoolean, exact, false)
  |  | 1066|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  977|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (977:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  978|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1067|      0|    ObjectTypeProperty, Flow,
  |  | 1068|      0|    NodePtr, key, false,
  |  | 1069|      0|    NodePtr, value, false,
  |  | 1070|      0|    NodeBoolean, method, false,
  |  | 1071|      0|    NodeBoolean, optional, false,
  |  | 1072|      0|    NodeBoolean, static, false,
  |  | 1073|      0|    NodeBoolean, proto, false,
  |  | 1074|      0|    NodePtr, variance, true,
  |  | 1075|      0|    NodeLabel, kind, false)
  |  | 1076|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1077|      0|    ObjectTypeSpreadProperty, Flow,
  |  | 1078|      0|    NodePtr, argument, false)
  |  | 1079|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1080|      0|    ObjectTypeInternalSlot, Flow,
  |  | 1081|      0|    NodePtr, id, false,
  |  | 1082|      0|    NodePtr, value, false,
  |  | 1083|      0|    NodeBoolean, optional, false,
  |  | 1084|      0|    NodeBoolean, static, false,
  |  | 1085|      0|    NodeBoolean, method, false)
  |  | 1086|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1087|      0|    ObjectTypeCallProperty, Flow,
  |  | 1088|      0|    NodePtr, value, false,
  |  | 1089|      0|    NodeBoolean, static, false)
  |  | 1090|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1091|      0|    ObjectTypeIndexer, Flow,
  |  | 1092|      0|    NodePtr, id, true,
  |  | 1093|      0|    NodePtr, key, false,
  |  | 1094|      0|    NodePtr, value, false,
  |  | 1095|      0|    NodeBoolean, static, false,
  |  | 1096|      0|    NodePtr, variance, true)
  |  | 1097|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1098|      0|    ObjectTypeMappedTypeProperty, Flow,
  |  | 1099|      0|    NodePtr, keyTparam, false,
  |  | 1100|      0|    NodePtr, propType, false,
  |  | 1101|      0|    NodePtr, sourceType, false,
  |  | 1102|      0|    NodePtr, variance, true,
  |  | 1103|      0|    NodeString, optional, true)
  |  | 1104|       |
  |  | 1105|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1106|      0|    Variance, Flow,
  |  | 1107|      0|    NodeLabel, kind, false)
  |  | 1108|       |
  |  | 1109|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1110|      0|    TypeParameterDeclaration, Flow,
  |  | 1111|      0|    NodeList, params, false)
  |  | 1112|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  971|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (971:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  972|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1113|      0|    TypeParameter, Flow,
  |  | 1114|      0|    NodeLabel, name, false,
  |  | 1115|      0|    NodeBoolean, const, false,
  |  | 1116|      0|    NodePtr, bound, true,
  |  | 1117|      0|    NodePtr, variance, true,
  |  | 1118|      0|    NodePtr, default, true,
  |  | 1119|      0|    NodeBoolean, usesExtendsBound, false)
  |  | 1120|      0|ESTREE_IGNORE_IF_EMPTY(TypeParameter, usesExtendsBound)
  |  | 1121|      0|ESTREE_IGNORE_IF_EMPTY(TypeParameter, const)
  |  | 1122|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1123|      0|    TypeParameterInstantiation, Flow,
  |  | 1124|      0|    NodeList, params, false)
  |  | 1125|       |
  |  | 1126|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1127|      0|    TypeCastExpression, Flow,
  |  | 1128|      0|    NodePtr, expression, false,
  |  | 1129|      0|    NodePtr, typeAnnotation, false)
  |  | 1130|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1131|      0|    AsExpression, Flow,
  |  | 1132|      0|    NodePtr, expression, false,
  |  | 1133|      0|    NodePtr, typeAnnotation, false)
  |  | 1134|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1135|      0|    AsConstExpression, Flow,
  |  | 1136|      0|    NodePtr, expression, false)
  |  | 1137|       |
  |  | 1138|      0|ESTREE_NODE_0_ARGS(InferredPredicate, Flow)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1139|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1140|      0|    DeclaredPredicate, Flow,
  |  | 1141|      0|    NodePtr, value, false)
  |  | 1142|       |
  |  | 1143|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1144|      0|    EnumDeclaration, Flow,
  |  | 1145|      0|    NodePtr, id, false,
  |  | 1146|      0|    NodePtr, body, false)
  |  | 1147|       |
  |  | 1148|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1149|      0|    EnumStringBody, Flow,
  |  | 1150|      0|    NodeList, members, false,
  |  | 1151|      0|    NodeBoolean, explicitType, false,
  |  | 1152|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1153|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1154|      0|    EnumNumberBody, Flow,
  |  | 1155|      0|    NodeList, members, false,
  |  | 1156|      0|    NodeBoolean, explicitType, false,
  |  | 1157|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1158|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1159|      0|    EnumBigIntBody, Flow,
  |  | 1160|      0|    NodeList, members, false,
  |  | 1161|      0|    NodeBoolean, explicitType, false,
  |  | 1162|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1163|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1164|      0|    EnumBooleanBody, Flow,
  |  | 1165|      0|    NodeList, members, false,
  |  | 1166|      0|    NodeBoolean, explicitType, false,
  |  | 1167|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1168|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1169|      0|    EnumSymbolBody, Flow,
  |  | 1170|      0|    NodeList, members, false,
  |  | 1171|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1172|       |
  |  | 1173|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1174|      0|    EnumDefaultedMember, Flow,
  |  | 1175|      0|    NodePtr, id, false)
  |  | 1176|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1177|      0|    EnumStringMember, Flow,
  |  | 1178|      0|    NodePtr, id, false,
  |  | 1179|      0|    NodePtr, init, false)
  |  | 1180|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1181|      0|    EnumNumberMember, Flow,
  |  | 1182|      0|    NodePtr, id, false,
  |  | 1183|      0|    NodePtr, init, false)
  |  | 1184|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1185|      0|    EnumBigIntMember, Flow,
  |  | 1186|      0|    NodePtr, id, false,
  |  | 1187|      0|    NodePtr, init, false)
  |  | 1188|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1189|      0|    EnumBooleanMember, Flow,
  |  | 1190|      0|    NodePtr, id, false,
  |  | 1191|      0|    NodePtr, init, false)
  |  | 1192|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1193|      0|    ComponentParameter, Flow,
  |  | 1194|      0|    NodePtr, name, false,
  |  | 1195|      0|    NodePtr, local, false,
  |  | 1196|      0|    NodeBoolean, shorthand, false)
  |  | 1197|       |
  |  | 1198|      0|ESTREE_LAST(Flow)
  |  | 1199|       |
  |  | 1200|      0|#endif
  |  | 1201|       |
  |  | 1202|      0|#if HERMES_PARSE_TS
  |  | 1203|       |
  |  | 1204|      0|ESTREE_FIRST(TS, Base)
  |  | 1205|       |
  |  | 1206|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1207|      0|    TSTypeAnnotation, TS,
  |  | 1208|      0|    NodePtr, typeAnnotation, false)
  |  | 1209|       |
  |  | 1210|      0|ESTREE_NODE_0_ARGS(TSAnyKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1211|      0|ESTREE_NODE_0_ARGS(TSNumberKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1212|      0|ESTREE_NODE_0_ARGS(TSBooleanKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1213|      0|ESTREE_NODE_0_ARGS(TSStringKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1214|      0|ESTREE_NODE_0_ARGS(TSSymbolKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1215|      0|ESTREE_NODE_0_ARGS(TSVoidKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1216|      0|ESTREE_NODE_0_ARGS(TSUndefinedKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1217|      0|ESTREE_NODE_0_ARGS(TSUnknownKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1218|      0|ESTREE_NODE_0_ARGS(TSNeverKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1219|      0|ESTREE_NODE_0_ARGS(TSBigIntKeyword, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1220|      0|ESTREE_NODE_0_ARGS(TSThisType, TS)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1221|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1222|      0|    TSLiteralType, TS,
  |  | 1223|      0|    NodePtr, literal, false)
  |  | 1224|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1225|      0|    TSIndexedAccessType, TS,
  |  | 1226|      0|    NodePtr, objectType, false,
  |  | 1227|      0|    NodePtr, indexType, false)
  |  | 1228|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1229|      0|    TSArrayType, TS,
  |  | 1230|      0|    NodePtr, elementType, false)
  |  | 1231|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1232|      0|    TSTypeReference, TS,
  |  | 1233|      0|    NodePtr, typeName, false,
  |  | 1234|      0|    NodePtr, typeParameters, true)
  |  | 1235|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1236|      0|    TSQualifiedName, TS,
  |  | 1237|      0|    NodePtr, left, false,
  |  | 1238|      0|    NodePtr, right, true)
  |  | 1239|       |
  |  | 1240|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1241|      0|    TSFunctionType, TS,
  |  | 1242|      0|    NodeList, params, false,
  |  | 1243|      0|    NodePtr, returnType, false,
  |  | 1244|      0|    NodePtr, typeParameters, true)
  |  | 1245|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1246|      0|    TSConstructorType, TS,
  |  | 1247|      0|    NodeList, params, false,
  |  | 1248|      0|    NodePtr, returnType, false,
  |  | 1249|      0|    NodePtr, typeParameters, true)
  |  | 1250|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1251|      0|    TSTypePredicate, TS,
  |  | 1252|      0|    NodePtr, parameterName, false,
  |  | 1253|      0|    NodePtr, typeAnnotation, false)
  |  | 1254|       |
  |  | 1255|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1256|      0|    TSTupleType, TS,
  |  | 1257|      0|    NodeList, elementTypes, false)
  |  | 1258|       |
  |  | 1259|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1260|      0|    TSTypeAssertion, TS,
  |  | 1261|      0|    NodePtr, typeAnnotation, false,
  |  | 1262|      0|    NodePtr, expression, false)
  |  | 1263|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1264|      0|    TSAsExpression, TS,
  |  | 1265|      0|    NodePtr, expression, false,
  |  | 1266|      0|    NodePtr, typeAnnotation, false)
  |  | 1267|       |
  |  | 1268|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  968|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (968:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  969|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1269|      0|    TSParameterProperty, TS,
  |  | 1270|      0|    NodePtr, parameter, false,
  |  | 1271|      0|    NodeLabel, accessibility, true,
  |  | 1272|      0|    NodeBoolean, readonly, false,
  |  | 1273|      0|    NodeBoolean, static, false,
  |  | 1274|      0|    NodeBoolean, export, false)
  |  | 1275|       |
  |  | 1276|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1277|      0|    TSTypeAliasDeclaration, TS,
  |  | 1278|      0|    NodePtr, id, false,
  |  | 1279|      0|    NodePtr, typeParameters, true,
  |  | 1280|      0|    NodePtr, typeAnnotation, false)
  |  | 1281|       |
  |  | 1282|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1283|      0|    TSInterfaceDeclaration, TS,
  |  | 1284|      0|    NodePtr, id, false,
  |  | 1285|      0|    NodePtr, body, false,
  |  | 1286|      0|    NodeList, extends, false,
  |  | 1287|      0|    NodePtr, typeParameters, true)
  |  | 1288|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1289|      0|    TSInterfaceHeritage, TS,
  |  | 1290|      0|    NodePtr, expression, false,
  |  | 1291|      0|    NodePtr, typeParameters, true)
  |  | 1292|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1293|      0|    TSInterfaceBody, TS,
  |  | 1294|      0|    NodeList, body, false)
  |  | 1295|       |
  |  | 1296|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1297|      0|    TSEnumDeclaration, TS,
  |  | 1298|      0|    NodePtr, id, false,
  |  | 1299|      0|    NodeList, members, false)
  |  | 1300|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1301|      0|    TSEnumMember, TS,
  |  | 1302|      0|    NodePtr, id, false,
  |  | 1303|      0|    NodePtr, initializer, true)
  |  | 1304|       |
  |  | 1305|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1306|      0|    TSModuleDeclaration, TS,
  |  | 1307|      0|    NodePtr, id, false,
  |  | 1308|      0|    NodePtr, body, false)
  |  | 1309|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1310|      0|    TSModuleBlock, TS,
  |  | 1311|      0|    NodeList, body, false)
  |  | 1312|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1313|      0|    TSModuleMember, TS,
  |  | 1314|      0|    NodePtr, id, false,
  |  | 1315|      0|    NodePtr, initializer, true)
  |  | 1316|       |
  |  | 1317|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1318|      0|    TSTypeParameterDeclaration, TS,
  |  | 1319|      0|    NodeList, params, false)
  |  | 1320|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1321|      0|    TSTypeParameter, TS,
  |  | 1322|      0|    NodePtr, name, false,
  |  | 1323|      0|    NodePtr, constraint, true,
  |  | 1324|      0|    NodePtr, default, true)
  |  | 1325|       |
  |  | 1326|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1327|      0|    TSTypeParameterInstantiation, TS,
  |  | 1328|      0|    NodeList, params, false)
  |  | 1329|       |
  |  | 1330|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1331|      0|    TSUnionType, TS,
  |  | 1332|      0|    NodeList, types, false)
  |  | 1333|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1334|      0|    TSIntersectionType, TS,
  |  | 1335|      0|    NodeList, types, false)
  |  | 1336|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1337|      0|    TSTypeQuery, TS,
  |  | 1338|      0|    NodePtr, exprName, false)
  |  | 1339|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1340|      0|    TSConditionalType, TS,
  |  | 1341|      0|    NodePtr, checkType, false,
  |  | 1342|      0|    NodePtr, extendsType, false,
  |  | 1343|      0|    NodePtr, trueType, false,
  |  | 1344|      0|    NodePtr, falseType, false)
  |  | 1345|       |
  |  | 1346|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1347|      0|    TSTypeLiteral, TS,
  |  | 1348|      0|    NodeList, members, false)
  |  | 1349|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  977|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (977:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  978|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1350|      0|    TSPropertySignature, TS,
  |  | 1351|      0|    NodePtr, key, false,
  |  | 1352|      0|    NodePtr, typeAnnotation, true,
  |  | 1353|      0|    NodePtr, initializer, true,
  |  | 1354|      0|    NodeBoolean, optional, false,
  |  | 1355|      0|    NodeBoolean, computed, false,
  |  | 1356|      0|    NodeBoolean, readonly, false,
  |  | 1357|      0|    NodeBoolean, static, false,
  |  | 1358|      0|    NodeBoolean, export, false)
  |  | 1359|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  965|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (965:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  966|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1360|      0|    TSMethodSignature, TS,
  |  | 1361|      0|    NodePtr, key, false,
  |  | 1362|      0|    NodeList, params, false,
  |  | 1363|      0|    NodePtr, returnType, true,
  |  | 1364|      0|    NodeBoolean, computed, false)
  |  | 1365|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1366|      0|    TSIndexSignature, TS,
  |  | 1367|      0|    NodeList, parameters, false,
  |  | 1368|      0|    NodePtr, typeAnnotation, true)
  |  | 1369|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1370|      0|    TSCallSignatureDeclaration, TS,
  |  | 1371|      0|    NodeList, params, false,
  |  | 1372|      0|    NodePtr, returnType, true)
  |  | 1373|       |
  |  | 1374|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  959|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (959:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  960|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1375|      0|    TSModifiers, TS,
  |  | 1376|      0|    NodeLabel, accessibility, false,
  |  | 1377|      0|    NodeBoolean, readonly, false)
  |  | 1378|       |
  |  | 1379|      0|ESTREE_LAST(TS)
  |  | 1380|       |
  |  | 1381|      0|#endif
  |  | 1382|       |
  |  | 1383|       |// ================================================
  |  | 1384|       |
  |  | 1385|      0|#ifndef ESTREE_DEFINE_COVER_NODES
  |  | 1386|       |
  |  | 1387|      0|ESTREE_FIRST(Cover, Base)
  |  | 1388|       |
  |  | 1389|       |// CoverParenthesizedExpressionAndArrowParameterList: "(" ")"
  |  | 1390|      0|ESTREE_NODE_0_ARGS(CoverEmptyArgs, Cover)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1391|       |
  |  | 1392|       |// CoverParenthesizedExpressionAndArrowParameterList:
  |  | 1393|       |//      "(" Expression "," ")"
  |  | 1394|       |// This is the dummy "empty expression" for the last comma inside a
  |  | 1395|       |// SequenceExpression.
  |  | 1396|      0|ESTREE_NODE_0_ARGS(CoverTrailingComma, Cover)
  |  |  ------------------
  |  |  |  |  953|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (953:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  954|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1397|       |
  |  | 1398|       |// CoverInitializer
  |  | 1399|       |// This is used for destructuring object assignment with initializers. It
  |  | 1400|       |// will be the value node of a Property.
  |  | 1401|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1402|      0|    CoverInitializer, Cover,
  |  | 1403|      0|    NodePtr, init, false)
  |  | 1404|       |
  |  | 1405|       |// CoverRestElement
  |  | 1406|       |// This is used for parsing "...elem" in "()" and in SequenceExpression, so it
  |  | 1407|       |// can later be reparsed as an arrow function rest parameter. "rest" will point
  |  | 1408|       |// to the actual RestElement.
  |  | 1409|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  956|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (956:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  957|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1410|      0|    CoverRestElement, Cover,
  |  | 1411|      0|    NodePtr, rest, false)
  |  | 1412|       |
  |  | 1413|       |// CoverTypedIdentifier
  |  | 1414|       |// This is used for parsing "ident: type" as either a type cast expression
  |  | 1415|       |// or a typed parameter in the parameters list of an arrow function.
  |  | 1416|       |// 'left' is the identifier which is typed.
  |  | 1417|       |// 'right' is the type which is either the cast target or the type annotation,
  |  | 1418|       |//   which may be null if the identifier was simply given a '?' and no ':'
  |  | 1419|       |//   with a type annotation.
  |  | 1420|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  962|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (962:3): [True: 0, False: 12.0k]
  |  |  |  |  ------------------
  |  |  |  |  963|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1421|      0|    CoverTypedIdentifier, Cover,
  |  | 1422|      0|    NodePtr, left, false,
  |  | 1423|      0|    NodePtr, right, true,
  |  | 1424|      0|    NodeBoolean, optional, false)
  |  | 1425|       |
  |  | 1426|      0|ESTREE_LAST(Cover)
  |  | 1427|       |
  |  | 1428|      0|#endif
  |  | 1429|       |
  |  | 1430|      0|#undef ESTREE_FIRST
  |  | 1431|      0|#undef ESTREE_LAST
  |  | 1432|      0|#undef ESTREE_WRAP
  |  | 1433|      0|#undef ESTREE_IGNORE_IF_EMPTY
  |  | 1434|       |
  |  | 1435|      0|#undef ESTREE_NODE_0_ARGS
  |  | 1436|      0|#undef ESTREE_NODE_1_ARGS
  |  | 1437|      0|#undef ESTREE_NODE_2_ARGS
  |  | 1438|      0|#undef ESTREE_NODE_3_ARGS
  |  | 1439|      0|#undef ESTREE_NODE_4_ARGS
  |  | 1440|      0|#undef ESTREE_NODE_5_ARGS
  |  | 1441|      0|#undef ESTREE_NODE_6_ARGS
  |  | 1442|      0|#undef ESTREE_NODE_7_ARGS
  |  | 1443|      0|#undef ESTREE_NODE_8_ARGS
  |  | 1444|      0|#undef ESTREE_NODE_9_ARGS
  ------------------
  984|  12.0k|  }
  985|  12.0k|}
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_RKb:
  211|  2.73k|void ESTreeVisit(Visitor &V, const NodeBoolean &label) {}
ESTreeIRGen.cpp:_ZN6hermes6ESTree23FunctionDeclarationNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  833|  3.87k|    void visit(Visitor &V) {                                           \
  834|  3.87k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (834:11): [True: 3.87k, False: 0]
  ------------------
  835|  3.87k|        return;                                                        \
  836|  3.87k|      }                                                                \
  837|  3.87k|      V.enter(this);                                                   \
  838|      0|      ESTreeVisit(V, _##ARG0NM);                                       \
  839|      0|      ESTreeVisit(V, _##ARG1NM);                                       \
  840|      0|      ESTreeVisit(V, _##ARG2NM);                                       \
  841|      0|      ESTreeVisit(V, _##ARG3NM);                                       \
  842|      0|      ESTreeVisit(V, _##ARG4NM);                                       \
  843|      0|      ESTreeVisit(V, _##ARG5NM);                                       \
  844|      0|      ESTreeVisit(V, _##ARG6NM);                                       \
  845|      0|      ESTreeVisit(V, _##ARG7NM);                                       \
  846|      0|      V.leave(this);                                                   \
  847|      0|    }                                                                  \
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_RKPNS_12UniqueStringE:
  209|  5.47k|void ESTreeVisit(Visitor &V, const NodeLabel &label) {}
ESTreeIRGen.cpp:_ZN6hermes6ESTree14IdentifierNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  519|  2.73k|    void visit(Visitor &V) {                                           \
  520|  2.73k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (520:11): [True: 0, False: 2.73k]
  ------------------
  521|      0|        return;                                                        \
  522|      0|      }                                                                \
  523|  2.73k|      V.enter(this);                                                   \
  524|  2.73k|      ESTreeVisit(V, _##ARG0NM);                                       \
  525|  2.73k|      ESTreeVisit(V, _##ARG1NM);                                       \
  526|  2.73k|      ESTreeVisit(V, _##ARG2NM);                                       \
  527|  2.73k|      V.leave(this);                                                   \
  528|  2.73k|    }                                                                  \
ESTreeIRGen.cpp:_ZN6hermes6ESTree22VariableDeclaratorNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  478|  2.73k|    void visit(Visitor &V) {                                           \
  479|  2.73k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (479:11): [True: 0, False: 2.73k]
  ------------------
  480|      0|        return;                                                        \
  481|      0|      }                                                                \
  482|  2.73k|      V.enter(this);                                                   \
  483|  2.73k|      ESTreeVisit(V, _##ARG0NM);                                       \
  484|  2.73k|      ESTreeVisit(V, _##ARG1NM);                                       \
  485|  2.73k|      V.leave(this);                                                   \
  486|  2.73k|    }                                                                  \
ESTreeIRGen.cpp:_ZN6hermes6ESTree23VariableDeclarationNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  478|  2.73k|    void visit(Visitor &V) {                                           \
  479|  2.73k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (479:11): [True: 0, False: 2.73k]
  ------------------
  480|      0|        return;                                                        \
  481|      0|      }                                                                \
  482|  2.73k|      V.enter(this);                                                   \
  483|  2.73k|      ESTreeVisit(V, _##ARG0NM);                                       \
  484|  2.73k|      ESTreeVisit(V, _##ARG1NM);                                       \
  485|  2.73k|      V.leave(this);                                                   \
  486|  2.73k|    }                                                                  \
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL13linearizeLeftINS0_20BinaryExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1077|  2.91k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1078|  2.91k|  llvh::SmallVector<N *, 1> vec;
 1079|       |
 1080|  2.91k|  vec.push_back(e);
 1081|  34.8k|  while (auto *left = checkExprOperator<N>(e->_left, ops)) {
  ------------------
  |  Branch (1081:16): [True: 31.9k, False: 2.91k]
  ------------------
 1082|  31.9k|    e = left;
 1083|  31.9k|    vec.push_back(e);
 1084|  31.9k|  }
 1085|       |
 1086|  2.91k|  std::reverse(vec.begin(), vec.end());
 1087|  2.91k|  return vec;
 1088|  2.91k|}
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_20BinaryExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1056|  34.8k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1057|  34.8k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1057:13): [True: 32.2k, False: 2.68k]
  ------------------
 1058|  32.2k|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1058:9): [True: 31.9k, False: 221]
  ------------------
 1059|  31.9k|      return n;
 1060|  32.2k|  }
 1061|  2.91k|  return nullptr;
 1062|  34.8k|}
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL14linearizeRightINS0_24AssignmentExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1104|  4.55k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1105|  4.55k|  llvh::SmallVector<N *, 1> vec;
 1106|       |
 1107|  4.55k|  vec.push_back(e);
 1108|  4.56k|  while (auto *right = checkExprOperator<N>(e->_right, ops)) {
  ------------------
  |  Branch (1108:16): [True: 8, False: 4.55k]
  ------------------
 1109|      8|    e = right;
 1110|      8|    vec.push_back(e);
 1111|      8|  }
 1112|       |
 1113|  4.55k|  return vec;
 1114|  4.55k|}
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_24AssignmentExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1056|  4.56k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1057|  4.56k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1057:13): [True: 8, False: 4.55k]
  ------------------
 1058|      8|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1058:9): [True: 8, False: 0]
  ------------------
 1059|      8|      return n;
 1060|      8|  }
 1061|  4.55k|  return nullptr;
 1062|  4.56k|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL13linearizeLeftINS0_20BinaryExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1077|  2.91k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1078|  2.91k|  llvh::SmallVector<N *, 1> vec;
 1079|       |
 1080|  2.91k|  vec.push_back(e);
 1081|   613k|  while (auto *left = checkExprOperator<N>(e->_left, ops)) {
  ------------------
  |  Branch (1081:16): [True: 610k, False: 2.91k]
  ------------------
 1082|   610k|    e = left;
 1083|   610k|    vec.push_back(e);
 1084|   610k|  }
 1085|       |
 1086|  2.91k|  std::reverse(vec.begin(), vec.end());
 1087|  2.91k|  return vec;
 1088|  2.91k|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_20BinaryExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1056|   613k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1057|   613k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1057:13): [True: 611k, False: 2.69k]
  ------------------
 1058|   611k|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1058:9): [True: 610k, False: 221]
  ------------------
 1059|   610k|      return n;
 1060|   611k|  }
 1061|  2.91k|  return nullptr;
 1062|   613k|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL14linearizeRightINS0_24AssignmentExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1104|  4.55k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1105|  4.55k|  llvh::SmallVector<N *, 1> vec;
 1106|       |
 1107|  4.55k|  vec.push_back(e);
 1108|  4.56k|  while (auto *right = checkExprOperator<N>(e->_right, ops)) {
  ------------------
  |  Branch (1108:16): [True: 8, False: 4.55k]
  ------------------
 1109|      8|    e = right;
 1110|      8|    vec.push_back(e);
 1111|      8|  }
 1112|       |
 1113|  4.55k|  return vec;
 1114|  4.55k|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_24AssignmentExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1056|  4.56k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1057|  4.56k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1057:13): [True: 8, False: 4.55k]
  ------------------
 1058|      8|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1058:9): [True: 8, False: 0]
  ------------------
 1059|      8|      return n;
 1060|      8|  }
 1061|  4.55k|  return nullptr;
 1062|  4.56k|}

_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_4NodeEEEvRT_PT0_:
  565|  2.45M|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  2.45M|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  2.45M|}
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_4NodeE:
  287|  2.45M|  static void visitChildren(Visitor &v, Node *node) {
  288|  2.45M|    if (!node)
  ------------------
  |  Branch (288:9): [True: 0, False: 2.45M]
  ------------------
  289|      0|      return;
  290|       |
  291|  2.45M|    switch (node->getKind()) {
  292|      0|      default:
  ------------------
  |  Branch (292:7): [True: 0, False: 2.45M]
  ------------------
  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|  2.45M|#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|     41|#include "hermes/AST/Config.h"
  |  |   14|       |
  |  |   15|       |// clang-format off
  |  |   16|       |
  |  |   17|       |// Defines the start of range of nodes with the same base
  |  |   18|     41|#ifndef ESTREE_FIRST
  |  |   19|     41|#define ESTREE_FIRST(NAME, BASE)
  |  |   20|     41|#endif
  |  |   21|       |
  |  |   22|       |// Defines the end of range of nodes with the same base
  |  |   23|     41|#ifndef ESTREE_LAST
  |  |   24|     41|#define ESTREE_LAST(NAME)
  |  |   25|     41|#endif
  |  |   26|       |
  |  |   27|       |// Ignores the given field if it is "empty" (e.g. nullptr, empty list).
  |  |   28|     41|#ifndef ESTREE_IGNORE_IF_EMPTY
  |  |   29|     41|#define ESTREE_IGNORE_IF_EMPTY(NODE, FIELD)
  |  |   30|     41|#endif
  |  |   31|       |
  |  |   32|     41|ESTREE_NODE_0_ARGS(Empty, Base)
  |  |  ------------------
  |  |  |  |  299|     41|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     41|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 41, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     41|    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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|       |
  |  |   78|      0|#if HERMES_PARSE_FLOW
  |  |   79|       |
  |  |   80|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   81|      0|    ComponentDeclaration, FunctionLike,
  |  |   82|      0|    NodePtr, id, false,
  |  |   83|      0|    NodeList, params, false,
  |  |   84|      0|    NodePtr, body, false,
  |  |   85|      0|    NodePtr, typeParameters, true,
  |  |   86|      0|    NodePtr, rendersType, true)
  |  |   87|      0|ESTREE_IGNORE_IF_EMPTY(ComponentDeclaration, typeParameters)
  |  |   88|      0|ESTREE_IGNORE_IF_EMPTY(ComponentDeclaration, rendersType)
  |  |   89|       |
  |  |   90|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   91|      0|    HookDeclaration, FunctionLike,
  |  |   92|      0|    NodePtr, id, false,
  |  |   93|      0|    NodeList, params, false,
  |  |   94|      0|    NodePtr, body, false,
  |  |   95|      0|    NodePtr, typeParameters, true,
  |  |   96|      0|    NodePtr, returnType, true)
  |  |   97|      0|ESTREE_IGNORE_IF_EMPTY(HookDeclaration, typeParameters)
  |  |   98|      0|ESTREE_IGNORE_IF_EMPTY(HookDeclaration, returnType)
  |  |   99|       |
  |  |  100|      0|#endif
  |  |  101|       |
  |  |  102|      0|ESTREE_LAST(FunctionLike)
  |  |  103|       |
  |  |  104|      0|ESTREE_FIRST(Statement, Base)
  |  |  105|       |
  |  |  106|      0|#if HERMES_PARSE_FLOW
  |  |  107|       |
  |  |  108|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  109|      0|    MatchStatement, Statement,
  |  |  110|      0|    NodePtr, argument, false, // Expression
  |  |  111|      0|    NodeList, cases, false // [ MatchStatementCase ]
  |  |  112|      0|)
  |  |  113|       |
  |  |  114|      0|#endif
  |  |  115|       |
  |  |  116|      0|ESTREE_FIRST(LoopStatement, Statement)
  |  |  117|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  118|      0|    WhileStatement,
  |  |  119|      0|    LoopStatement,
  |  |  120|      0|    NodePtr,
  |  |  121|      0|    body,
  |  |  122|      0|    false,
  |  |  123|      0|    NodePtr,
  |  |  124|      0|    test,
  |  |  125|      0|    false)
  |  |  126|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  127|      0|    DoWhileStatement,
  |  |  128|      0|    LoopStatement,
  |  |  129|      0|    NodePtr,
  |  |  130|      0|    body,
  |  |  131|      0|    false,
  |  |  132|      0|    NodePtr,
  |  |  133|      0|    test,
  |  |  134|      0|    false)
  |  |  135|     15|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|     15|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     15|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 15, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     15|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|      0|    ForInStatement,
  |  |  137|      0|    LoopStatement,
  |  |  138|      0|    NodePtr,
  |  |  139|      0|    left,
  |  |  140|      0|    false,
  |  |  141|      0|    NodePtr,
  |  |  142|      0|    right,
  |  |  143|      0|    false,
  |  |  144|      0|    NodePtr,
  |  |  145|      0|    body,
  |  |  146|      0|    false)
  |  |  147|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|    ForOfStatement, LoopStatement,
  |  |  149|      0|    NodePtr, left, false,
  |  |  150|      0|    NodePtr, right, false,
  |  |  151|      0|    NodePtr, body, false,
  |  |  152|      0|    NodeBoolean, await, false)
  |  |  153|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  154|      0|    ForStatement,
  |  |  155|      0|    LoopStatement,
  |  |  156|      0|    NodePtr,
  |  |  157|      0|    init,
  |  |  158|      0|    true,
  |  |  159|      0|    NodePtr,
  |  |  160|      0|    test,
  |  |  161|      0|    true,
  |  |  162|      0|    NodePtr,
  |  |  163|      0|    update,
  |  |  164|      0|    true,
  |  |  165|      0|    NodePtr,
  |  |  166|      0|    body,
  |  |  167|      0|    false)
  |  |  168|      0|ESTREE_LAST(LoopStatement)
  |  |  169|       |
  |  |  170|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  171|  5.34k|ESTREE_NODE_0_ARGS(EmptyStatement, Statement)
  |  |  ------------------
  |  |  |  |  299|  5.34k|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  5.34k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 5.34k, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  5.34k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|      0|ESTREE_NODE_1_ARGS(BlockStatement, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  173|      0|ESTREE_NODE_1_ARGS(StaticBlock, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  174|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  175|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  176|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  178|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      0|    WithStatement,
  |  |  180|      0|    Statement,
  |  |  181|      0|    NodePtr,
  |  |  182|      0|    object,
  |  |  183|      0|    false,
  |  |  184|      0|    NodePtr,
  |  |  185|      0|    body,
  |  |  186|      0|    false)
  |  |  187|       |
  |  |  188|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  189|      0|    SwitchStatement,
  |  |  190|      0|    Statement,
  |  |  191|      0|    NodePtr,
  |  |  192|      0|    discriminant,
  |  |  193|      0|    false,
  |  |  194|      0|    NodeList,
  |  |  195|      0|    cases,
  |  |  196|      0|    false)
  |  |  197|       |
  |  |  198|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  199|      0|    LabeledStatement,
  |  |  200|      0|    Statement,
  |  |  201|      0|    NodePtr,
  |  |  202|      0|    label,
  |  |  203|      0|    false,
  |  |  204|      0|    NodePtr,
  |  |  205|      0|    body,
  |  |  206|      0|    false)
  |  |  207|       |
  |  |  208|   358k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|   358k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|   358k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 358k, False: 2.09M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|   358k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  209|      0|    ExpressionStatement,
  |  |  210|      0|    Statement,
  |  |  211|      0|    NodePtr,
  |  |  212|      0|    expression,
  |  |  213|      0|    false,
  |  |  214|      0|    NodeString,
  |  |  215|      0|    directive,
  |  |  216|      0|    true)
  |  |  217|       |
  |  |  218|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      0|    TryStatement,
  |  |  220|      0|    Statement,
  |  |  221|      0|    NodePtr,
  |  |  222|      0|    block,
  |  |  223|      0|    false,
  |  |  224|      0|    NodePtr,
  |  |  225|      0|    handler,
  |  |  226|      0|    true,
  |  |  227|      0|    NodePtr,
  |  |  228|      0|    finalizer,
  |  |  229|      0|    true)
  |  |  230|       |
  |  |  231|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  232|      0|    IfStatement,
  |  |  233|      0|    Statement,
  |  |  234|      0|    NodePtr,
  |  |  235|      0|    test,
  |  |  236|      0|    false,
  |  |  237|      0|    NodePtr,
  |  |  238|      0|    consequent,
  |  |  239|      0|    false,
  |  |  240|      0|    NodePtr,
  |  |  241|      0|    alternate,
  |  |  242|      0|    true)
  |  |  243|       |
  |  |  244|      0|ESTREE_LAST(Statement)
  |  |  245|       |
  |  |  246|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      0|ESTREE_NODE_1_ARGS(BooleanLiteral, Base, NodeBoolean, value, false)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  248|     20|ESTREE_NODE_1_ARGS(StringLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  300|     20|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     20|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 20, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     20|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|  1.59M|ESTREE_NODE_1_ARGS(NumericLiteral, Base, NodeNumber, value, false)
  |  |  ------------------
  |  |  |  |  300|  1.59M|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  1.59M|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 1.59M, False: 863k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  1.59M|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  250|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  251|      0|    RegExpLiteral,
  |  |  252|      0|    Base,
  |  |  253|      0|    NodeLabel,
  |  |  254|      0|    pattern,
  |  |  255|      0|    false,
  |  |  256|      0|    NodeLabel,
  |  |  257|      0|    flags,
  |  |  258|      0|    false)
  |  |  259|      5|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      5|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      5|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 5, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      5|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  260|      0|    BigIntLiteral, Base,
  |  |  261|      0|    NodeLabel, bigint, false)
  |  |  262|       |
  |  |  263|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  264|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  265|     98|ESTREE_NODE_1_ARGS(SequenceExpression, Base, NodeList, expressions, false)
  |  |  ------------------
  |  |  |  |  300|     98|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     98|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 98, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     98|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  266|      2|ESTREE_NODE_1_ARGS(ObjectExpression, Base, NodeList, properties, false)
  |  |  ------------------
  |  |  |  |  300|      2|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      2|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 2, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      2|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  267|    101|ESTREE_NODE_2_ARGS(ArrayExpression, Base,
  |  |  ------------------
  |  |  |  |  301|    101|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|    101|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 101, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|    101|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  268|      0|    NodeList, elements, false,
  |  |  269|      0|    NodeBoolean, trailingComma, false)
  |  |  270|       |
  |  |  271|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  272|      0|    SpreadElement, Base,
  |  |  273|      0|    NodePtr, argument, false)
  |  |  274|       |
  |  |  275|  25.0k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|  25.0k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  25.0k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 25.0k, False: 2.43M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  25.0k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  276|      0|    NewExpression, Base,
  |  |  277|      0|    NodePtr, callee, false,
  |  |  278|      0|    NodePtr, typeArguments, true,
  |  |  279|      0|    NodeList, arguments, false)
  |  |  280|      0|ESTREE_IGNORE_IF_EMPTY(NewExpression, typeArguments)
  |  |  281|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  282|      0|    YieldExpression, Base,
  |  |  283|      0|    NodePtr, argument, true,
  |  |  284|      0|    NodeBoolean, delegate, true)
  |  |  285|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  286|      0|    AwaitExpression, Base,
  |  |  287|      0|    NodePtr, argument, false)
  |  |  288|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  289|      0|    ImportExpression, Base,
  |  |  290|      0|    NodePtr, source, false,
  |  |  291|      0|    NodePtr, attributes, true)
  |  |  292|       |
  |  |  293|      0|ESTREE_FIRST(CallExpressionLike, Base)
  |  |  294|      3|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      3|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      3|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 3, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      3|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  295|      0|    CallExpression, CallExpressionLike,
  |  |  296|      0|    NodePtr, callee, false,
  |  |  297|      0|    NodePtr, typeArguments, true,
  |  |  298|      0|    NodeList, arguments, false)
  |  |  299|      0|ESTREE_IGNORE_IF_EMPTY(CallExpression, typeArguments)
  |  |  300|       |
  |  |  301|     16|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|     16|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     16|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 16, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     16|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  302|      0|    OptionalCallExpression, CallExpressionLike,
  |  |  303|      0|    NodePtr, callee, false,
  |  |  304|      0|    NodePtr, typeArguments, true,
  |  |  305|      0|    NodeList, arguments, false,
  |  |  306|      0|    NodeBoolean, optional, false)
  |  |  307|      0|ESTREE_IGNORE_IF_EMPTY(OptionalCallExpression, typeArguments)
  |  |  308|      0|ESTREE_LAST(CallExpressionLike)
  |  |  309|       |
  |  |  310|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  311|      0|    AssignmentExpression,
  |  |  312|      0|    Base,
  |  |  313|      0|    NodeLabel,
  |  |  314|      0|    operator,
  |  |  315|      0|    false,
  |  |  316|      0|    NodePtr,
  |  |  317|      0|    left,
  |  |  318|      0|    false,
  |  |  319|      0|    NodePtr,
  |  |  320|      0|    right,
  |  |  321|      0|    false)
  |  |  322|       |
  |  |  323|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  324|      0|    UnaryExpression,
  |  |  325|      0|    Base,
  |  |  326|      0|    NodeLabel,
  |  |  327|      0|    operator,
  |  |  328|      0|    false,
  |  |  329|      0|    NodePtr,
  |  |  330|      0|    argument,
  |  |  331|      0|    false,
  |  |  332|      0|    NodeBoolean,
  |  |  333|      0|    prefix,
  |  |  334|      0|    false)
  |  |  335|       |
  |  |  336|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  337|      0|    UpdateExpression,
  |  |  338|      0|    Base,
  |  |  339|      0|    NodeLabel,
  |  |  340|      0|    operator,
  |  |  341|      0|    false,
  |  |  342|      0|    NodePtr,
  |  |  343|      0|    argument,
  |  |  344|      0|    false,
  |  |  345|      0|    NodeBoolean,
  |  |  346|      0|    prefix,
  |  |  347|      0|    false)
  |  |  348|       |
  |  |  349|      0|ESTREE_FIRST(MemberExpressionLike, Base)
  |  |  350|  17.5k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|  17.5k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  17.5k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 17.5k, False: 2.43M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  17.5k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  351|      0|    MemberExpression, MemberExpressionLike,
  |  |  352|      0|    NodePtr, object, false,
  |  |  353|      0|    NodePtr, property, false,
  |  |  354|      0|    NodeBoolean, computed, false)
  |  |  355|       |
  |  |  356|  25.9k|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|  25.9k|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  25.9k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 25.9k, False: 2.43M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  25.9k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  357|      0|    OptionalMemberExpression, MemberExpressionLike,
  |  |  358|      0|    NodePtr, object, false,
  |  |  359|      0|    NodePtr, property, false,
  |  |  360|      0|    NodeBoolean, computed, false,
  |  |  361|      0|    NodeBoolean, optional, false)
  |  |  362|      0|ESTREE_LAST(MemberExpressionLike)
  |  |  363|       |
  |  |  364|  25.3k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|  25.3k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  25.3k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 25.3k, False: 2.43M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  25.3k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  365|      0|    LogicalExpression,
  |  |  366|      0|    Base,
  |  |  367|      0|    NodePtr,
  |  |  368|      0|    left,
  |  |  369|      0|    false,
  |  |  370|      0|    NodePtr,
  |  |  371|      0|    right,
  |  |  372|      0|    false,
  |  |  373|      0|    NodeLabel,
  |  |  374|      0|    operator,
  |  |  375|      0|    false)
  |  |  376|       |
  |  |  377|  3.66k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|  3.66k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  3.66k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 3.66k, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  3.66k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  378|      0|    ConditionalExpression,
  |  |  379|      0|    Base,
  |  |  380|      0|    NodePtr,
  |  |  381|      0|    test,
  |  |  382|      0|    false,
  |  |  383|      0|    NodePtr,
  |  |  384|      0|    alternate,
  |  |  385|      0|    false,
  |  |  386|      0|    NodePtr,
  |  |  387|      0|    consequent,
  |  |  388|      0|    false)
  |  |  389|       |
  |  |  390|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  391|      0|    BinaryExpression,
  |  |  392|      0|    Base,
  |  |  393|      0|    NodePtr,
  |  |  394|      0|    left,
  |  |  395|      0|    false,
  |  |  396|      0|    NodePtr,
  |  |  397|      0|    right,
  |  |  398|      0|    false,
  |  |  399|      0|    NodeLabel,
  |  |  400|      0|    operator,
  |  |  401|      0|    false)
  |  |  402|       |
  |  |  403|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  404|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  405|       |
  |  |  406|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|      0|    Identifier, Base,
  |  |  408|      0|    NodeLabel, name, false,
  |  |  409|      0|    NodePtr, typeAnnotation, true,
  |  |  410|      0|    NodeBoolean, optional, false)
  |  |  411|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, typeAnnotation)
  |  |  412|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, optional)
  |  |  413|       |
  |  |  414|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  415|      0|    PrivateName, Base,
  |  |  416|      0|    NodePtr, id, false)
  |  |  417|       |
  |  |  418|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  419|      0|    MetaProperty,
  |  |  420|      0|    Base,
  |  |  421|      0|    NodePtr,
  |  |  422|      0|    meta,
  |  |  423|      0|    false,
  |  |  424|      0|    NodePtr,
  |  |  425|      0|    property,
  |  |  426|      0|    false)
  |  |  427|       |
  |  |  428|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  429|      0|    SwitchCase,
  |  |  430|      0|    Base,
  |  |  431|      0|    NodePtr,
  |  |  432|      0|    test,
  |  |  433|      0|    true,
  |  |  434|      0|    NodeList,
  |  |  435|      0|    consequent,
  |  |  436|      0|    false)
  |  |  437|       |
  |  |  438|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  439|      0|    CatchClause,
  |  |  440|      0|    Base,
  |  |  441|      0|    NodePtr,
  |  |  442|      0|    param,
  |  |  443|      0|    true,
  |  |  444|      0|    NodePtr,
  |  |  445|      0|    body,
  |  |  446|      0|    false)
  |  |  447|       |
  |  |  448|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  449|      0|    VariableDeclarator,
  |  |  450|      0|    Base,
  |  |  451|      0|    NodePtr,
  |  |  452|      0|    init,
  |  |  453|      0|    true,
  |  |  454|      0|    NodePtr,
  |  |  455|      0|    id,
  |  |  456|      0|    false)
  |  |  457|       |
  |  |  458|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  459|      0|    VariableDeclaration,
  |  |  460|      0|    Base,
  |  |  461|      0|    NodeLabel,
  |  |  462|      0|    kind,
  |  |  463|      0|    false,
  |  |  464|      0|    NodeList,
  |  |  465|      0|    declarations,
  |  |  466|      0|    false)
  |  |  467|       |
  |  |  468|  23.2k|ESTREE_NODE_2_ARGS(TemplateLiteral, Base,
  |  |  ------------------
  |  |  |  |  301|  23.2k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  23.2k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 23.2k, False: 2.43M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  23.2k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  469|      0|                   NodeList, quasis, false,
  |  |  470|      0|                   NodeList, expressions, false)
  |  |  471|       |
  |  |  472|  2.82k|ESTREE_NODE_2_ARGS(TaggedTemplateExpression, Base,
  |  |  ------------------
  |  |  |  |  301|  2.82k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  2.82k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 2.82k, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  2.82k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  473|      0|                   NodePtr, tag, false,
  |  |  474|      0|                   NodePtr, quasi, false)
  |  |  475|       |
  |  |  476|       |// In ESTree, it is defined as {tail : boolean,
  |  |  477|       |//                              value : {cooked : string, raw : string}},
  |  |  478|       |// we flatten the value field.
  |  |  479|       |// If the template literal is tagged and the text has an invalid escape,
  |  |  480|       |// cooked will be null.
  |  |  481|   374k|ESTREE_NODE_3_ARGS(TemplateElement, Base,
  |  |  ------------------
  |  |  |  |  302|   374k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|   374k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 374k, False: 2.08M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|   374k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  482|      0|                   NodeBoolean, tail, false,
  |  |  483|      0|                   NodeString, cooked, true,
  |  |  484|      0|                   NodeLabel, raw, false)
  |  |  485|       |
  |  |  486|      1|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  305|      1|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      1|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 1, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      1|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  487|      0|    Property, Base,
  |  |  488|      0|    NodePtr, key, false,
  |  |  489|      0|    NodePtr, value, false,
  |  |  490|      0|    NodeLabel, kind, false,
  |  |  491|      0|    NodeBoolean, computed, false,
  |  |  492|      0|    NodeBoolean, method, false,
  |  |  493|      0|    NodeBoolean, shorthand, false)
  |  |  494|       |
  |  |  495|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  496|      0|    ClassDeclaration, Base,
  |  |  497|      0|    NodePtr, id, true,
  |  |  498|      0|    NodePtr, typeParameters, true,
  |  |  499|      0|    NodePtr, superClass, true,
  |  |  500|      0|    NodePtr, superTypeParameters, true,
  |  |  501|      0|    NodeList, implements, false,
  |  |  502|      0|    NodeList, decorators, false,
  |  |  503|      0|    NodePtr, body, false)
  |  |  504|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, typeParameters)
  |  |  505|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, superTypeParameters)
  |  |  506|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, implements)
  |  |  507|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, decorators)
  |  |  508|       |
  |  |  509|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  510|      0|    ClassExpression, Base,
  |  |  511|      0|    NodePtr, id, true,
  |  |  512|      0|    NodePtr, typeParameters, true,
  |  |  513|      0|    NodePtr, superClass, true,
  |  |  514|      0|    NodePtr, superTypeParameters, true,
  |  |  515|      0|    NodeList, implements, false,
  |  |  516|      0|    NodeList, decorators, false,
  |  |  517|      0|    NodePtr, body, false)
  |  |  518|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, typeParameters)
  |  |  519|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, superTypeParameters)
  |  |  520|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, implements)
  |  |  521|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, decorators)
  |  |  522|       |
  |  |  523|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  524|      0|    ClassBody, Base,
  |  |  525|      0|    NodeList, body, false)
  |  |  526|       |
  |  |  527|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  528|      0|    ClassProperty, Base,
  |  |  529|      0|    NodePtr, key, false,
  |  |  530|      0|    NodePtr, value, true,
  |  |  531|      0|    NodeBoolean, computed, false,
  |  |  532|      0|    NodeBoolean, static, false,
  |  |  533|      0|    NodeBoolean, declare, false,
  |  |  534|      0|    NodeBoolean, optional, false,
  |  |  535|      0|    NodePtr, variance, true,
  |  |  536|      0|    NodePtr, typeAnnotation, true,
  |  |  537|      0|    NodePtr, tsModifiers, true)
  |  |  538|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, variance)
  |  |  539|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, optional)
  |  |  540|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, typeAnnotation)
  |  |  541|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, tsModifiers)
  |  |  542|       |
  |  |  543|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  544|      0|    ClassPrivateProperty, Base,
  |  |  545|      0|    NodePtr, key, false,
  |  |  546|      0|    NodePtr, value, true,
  |  |  547|      0|    NodeBoolean, static, false,
  |  |  548|      0|    NodeBoolean, declare, false,
  |  |  549|      0|    NodeBoolean, optional, false,
  |  |  550|      0|    NodePtr, variance, true,
  |  |  551|      0|    NodePtr, typeAnnotation, true,
  |  |  552|      0|    NodePtr, tsModifiers, true)
  |  |  553|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, variance)
  |  |  554|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, optional)
  |  |  555|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, typeAnnotation)
  |  |  556|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, tsModifiers)
  |  |  557|       |
  |  |  558|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  559|      0|    MethodDefinition, Base,
  |  |  560|      0|    NodePtr, key, false,
  |  |  561|      0|    NodePtr, value, false,
  |  |  562|      0|    NodeLabel, kind, false,
  |  |  563|      0|    NodeBoolean, computed, false,
  |  |  564|      0|    NodeBoolean, static, false)
  |  |  565|       |
  |  |  566|       |// Imports ========================================
  |  |  567|       |
  |  |  568|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  569|      0|    ImportDeclaration, Base,
  |  |  570|      0|    NodeList, specifiers, false,
  |  |  571|      0|    NodePtr, source, false,
  |  |  572|      0|    NodeList, assertions, true,
  |  |  573|      0|    NodeLabel, importKind, false)
  |  |  574|       |
  |  |  575|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  576|      0|    ImportSpecifier, Base,
  |  |  577|      0|    NodePtr, imported, false,
  |  |  578|      0|    NodePtr, local, false,
  |  |  579|      0|    NodeLabel, importKind, false)
  |  |  580|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  581|      0|    ImportDefaultSpecifier, Base,
  |  |  582|      0|    NodePtr, local, false)
  |  |  583|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  584|      0|    ImportNamespaceSpecifier, Base,
  |  |  585|      0|    NodePtr, local, false)
  |  |  586|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  587|      0|    ImportAttribute, Base,
  |  |  588|      0|    NodePtr, key, false,
  |  |  589|      0|    NodePtr, value, false)
  |  |  590|       |
  |  |  591|       |
  |  |  592|       |// ================================================
  |  |  593|       |
  |  |  594|       |// Exports ========================================
  |  |  595|       |
  |  |  596|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  597|      0|    ExportNamedDeclaration, Base,
  |  |  598|      0|    NodePtr, declaration, true,
  |  |  599|      0|    NodeList, specifiers, false,
  |  |  600|      0|    NodePtr, source, true,
  |  |  601|      0|    NodeLabel, exportKind, 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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  604|      0|    ExportSpecifier, Base,
  |  |  605|      0|    NodePtr, exported, false,
  |  |  606|      0|    NodePtr, local, false)
  |  |  607|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  608|      0|    ExportNamespaceSpecifier, Base,
  |  |  609|      0|    NodePtr, exported, false)
  |  |  610|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  611|      0|    ExportDefaultDeclaration, Base,
  |  |  612|      0|    NodePtr, declaration, false)
  |  |  613|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  614|      0|    ExportAllDeclaration, Base,
  |  |  615|      0|    NodePtr, source, false,
  |  |  616|      0|    NodeLabel, exportKind, false)
  |  |  617|       |
  |  |  618|       |// ================================================
  |  |  619|       |
  |  |  620|       |// Patterns =======================================
  |  |  621|      0|ESTREE_FIRST(Pattern, Base)
  |  |  622|       |
  |  |  623|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  624|      0|    ObjectPattern, Pattern,
  |  |  625|      0|    NodeList, properties, false,
  |  |  626|      0|    NodePtr, typeAnnotation, true)
  |  |  627|      0|ESTREE_IGNORE_IF_EMPTY(ObjectPattern, typeAnnotation)
  |  |  628|       |
  |  |  629|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  630|      0|    ArrayPattern, Pattern,
  |  |  631|      0|    NodeList, elements, false,
  |  |  632|      0|    NodePtr, typeAnnotation, true)
  |  |  633|      0|ESTREE_IGNORE_IF_EMPTY(ArrayPattern, typeAnnotation)
  |  |  634|       |
  |  |  635|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  636|      0|    RestElement, Pattern,
  |  |  637|      0|    NodePtr, argument, false)
  |  |  638|       |
  |  |  639|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|    AssignmentPattern, Pattern,
  |  |  641|      0|    NodePtr, left, false,          // Pattern
  |  |  642|       |    NodePtr, right, false)         // Expression
  |  |  643|       |
  |  |  644|      0|ESTREE_LAST(Pattern)
  |  |  645|       |
  |  |  646|       |// ================================================
  |  |  647|       |
  |  |  648|       |// Flow match =====================================
  |  |  649|       |
  |  |  650|      0|#if HERMES_PARSE_FLOW
  |  |  651|       |
  |  |  652|       |// Match statement
  |  |  653|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  654|      0|    MatchStatementCase, Base,
  |  |  655|      0|    NodePtr, pattern, false, // MatchPattern
  |  |  656|      0|    NodePtr, body, false, // BlockStatement
  |  |  657|      0|    NodePtr, guard, true // Expression | null
  |  |  658|      0|)
  |  |  659|       |
  |  |  660|       |// Match expression
  |  |  661|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  662|      0|    MatchExpression, Base,
  |  |  663|      0|    NodePtr, argument, false, // Expression
  |  |  664|      0|    NodeList, cases, false // [ MatchExpressionCase ]
  |  |  665|      0|)
  |  |  666|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  667|      0|    MatchExpressionCase, Base,
  |  |  668|      0|    NodePtr, pattern, false, // MatchPattern
  |  |  669|      0|    NodePtr, body, false, // Expression
  |  |  670|      0|    NodePtr, guard, true // Expression | null
  |  |  671|      0|)
  |  |  672|       |
  |  |  673|       |// Match patterns
  |  |  674|      0|ESTREE_FIRST(MatchPattern, Base)
  |  |  675|       |
  |  |  676|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  677|      0|  MatchWildcardPattern, MatchPattern
  |  |  678|      0|)
  |  |  679|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  680|      0|  MatchLiteralPattern, MatchPattern,
  |  |  681|      0|  NodePtr, literal, false // Literal
  |  |  682|      0|)
  |  |  683|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  684|      0|  MatchUnaryPattern, MatchPattern,
  |  |  685|      0|  NodePtr, argument, false, // Literal
  |  |  686|      0|  NodeLabel, operator, false // "-" | "+"
  |  |  687|      0|)
  |  |  688|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  689|      0|  MatchIdentifierPattern, MatchPattern,
  |  |  690|      0|  NodePtr, id, false // Identifier
  |  |  691|      0|)
  |  |  692|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  693|      0|  MatchBindingPattern, MatchPattern,
  |  |  694|      0|  NodePtr, id, false, // Identifier
  |  |  695|      0|  NodeLabel, kind, false // "let" | "const"
  |  |  696|      0|)
  |  |  697|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  698|      0|  MatchObjectPattern, MatchPattern,
  |  |  699|      0|  NodeList, properties, false, // [ MatchObjectPatternProperty ]
  |  |  700|      0|  NodePtr, rest, true // MatchRestPattern | null
  |  |  701|      0|)
  |  |  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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  703|      0|  MatchArrayPattern, MatchPattern,
  |  |  704|      0|  NodeList, elements, false, // [ MatchPattern ]
  |  |  705|      0|  NodePtr, rest, true // MatchRestPattern | null
  |  |  706|      0|)
  |  |  707|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  708|      0|  MatchOrPattern, MatchPattern,
  |  |  709|      0|  NodeList, patterns, false // [ MatchPattern ]
  |  |  710|      0|)
  |  |  711|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  712|      0|  MatchAsPattern, MatchPattern,
  |  |  713|      0|  NodePtr, pattern, false, // MatchPattern
  |  |  714|      0|  NodePtr, target, false // Identifier | MatchBindingPattern
  |  |  715|      0|)
  |  |  716|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  717|      0|  MatchMemberPattern, MatchPattern,
  |  |  718|      0|  NodePtr, base, false, // MatchIdentifierPattern | MatchMemberPattern
  |  |  719|      0|  NodePtr, property, false // Identifier | Literal
  |  |  720|      0|)
  |  |  721|       |
  |  |  722|      0|ESTREE_LAST(MatchPattern)
  |  |  723|       |
  |  |  724|       |// Match pattern auxiliary nodes
  |  |  725|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  726|      0|  MatchObjectPatternProperty, Base,
  |  |  727|      0|  NodePtr, key, false, // Identifier | Literal
  |  |  728|      0|  NodePtr, pattern, false, // MatchPattern
  |  |  729|      0|  NodeBoolean, shorthand, false // boolean
  |  |  730|      0|)
  |  |  731|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  732|      0|  MatchRestPattern, Base,
  |  |  733|      0|  NodePtr, argument, true // MatchBindingPattern | null
  |  |  734|      0|)
  |  |  735|       |
  |  |  736|      0|#endif
  |  |  737|       |
  |  |  738|       |// ================================================
  |  |  739|       |
  |  |  740|       |// JSX ============================================
  |  |  741|       |
  |  |  742|      0|#if HERMES_PARSE_JSX
  |  |  743|       |
  |  |  744|      0|ESTREE_FIRST(JSX, Base)
  |  |  745|       |
  |  |  746|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  747|      0|    JSXIdentifier, JSX,
  |  |  748|      0|    NodeLabel, name, false)
  |  |  749|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  750|      0|    JSXMemberExpression, JSX,
  |  |  751|      0|    NodePtr, object, false,
  |  |  752|      0|    NodePtr, property, false)
  |  |  753|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  754|      0|    JSXNamespacedName, JSX,
  |  |  755|      0|    NodePtr, namespace, false,
  |  |  756|      0|    NodePtr, name, false)
  |  |  757|       |
  |  |  758|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  759|      0|    JSXEmptyExpression, JSX)
  |  |  760|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  761|      0|    JSXExpressionContainer, JSX,
  |  |  762|      0|    NodePtr, expression, false)
  |  |  763|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  764|      0|    JSXSpreadChild, JSX,
  |  |  765|      0|    NodePtr, expression, false)
  |  |  766|       |
  |  |  767|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  768|      0|    JSXOpeningElement, JSX,
  |  |  769|      0|    NodePtr, name, false,
  |  |  770|      0|    NodeList, attributes, false,
  |  |  771|      0|    NodeBoolean, selfClosing, false,
  |  |  772|      0|    NodePtr, typeArguments, true)
  |  |  773|      0|ESTREE_IGNORE_IF_EMPTY(JSXOpeningElement, typeArguments)
  |  |  774|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  775|      0|    JSXClosingElement, JSX,
  |  |  776|      0|    NodePtr, name, false)
  |  |  777|       |
  |  |  778|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  779|      0|    JSXAttribute, JSX,
  |  |  780|      0|    NodePtr, name, false,
  |  |  781|      0|    NodePtr, value, true)
  |  |  782|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  783|      0|    JSXSpreadAttribute, JSX,
  |  |  784|      0|    NodePtr, argument, false)
  |  |  785|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  786|      0|    JSXStringLiteral, JSX,
  |  |  787|      0|    NodeString, value, false,
  |  |  788|      0|    NodeLabel, raw, false)
  |  |  789|       |
  |  |  790|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  791|      0|    JSXText, JSX,
  |  |  792|      0|    NodeString, value, false,
  |  |  793|      0|    NodeLabel, raw, false)
  |  |  794|       |
  |  |  795|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  796|      0|    JSXElement, JSX,
  |  |  797|      0|    NodePtr, openingElement, false,
  |  |  798|      0|    NodeList, children, false,
  |  |  799|      0|    NodePtr, closingElement, true)
  |  |  800|       |
  |  |  801|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  802|      0|    JSXFragment, JSX,
  |  |  803|      0|    NodePtr, openingFragment, false,
  |  |  804|      0|    NodeList, children, false,
  |  |  805|      0|    NodePtr, closingFragment, false)
  |  |  806|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  807|      0|    JSXOpeningFragment, JSX)
  |  |  808|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  809|      0|    JSXClosingFragment, JSX)
  |  |  810|       |
  |  |  811|      0|ESTREE_LAST(JSX)
  |  |  812|       |
  |  |  813|      0|#endif
  |  |  814|       |
  |  |  815|       |// ================================================
  |  |  816|       |
  |  |  817|       |// Types ==========================================
  |  |  818|       |
  |  |  819|      0|#if HERMES_PARSE_FLOW
  |  |  820|       |
  |  |  821|      0|ESTREE_FIRST(Flow, Base)
  |  |  822|       |
  |  |  823|      0|ESTREE_NODE_0_ARGS(ExistsTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  824|      0|ESTREE_NODE_0_ARGS(EmptyTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  825|      0|ESTREE_NODE_0_ARGS(StringTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  826|      0|ESTREE_NODE_0_ARGS(NumberTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  827|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  828|      0|    StringLiteralTypeAnnotation, Flow,
  |  |  829|      0|    NodeString, value, false,
  |  |  830|      0|    NodeString, raw, false)
  |  |  831|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  832|      0|    NumberLiteralTypeAnnotation, Flow,
  |  |  833|      0|    NodeNumber, value, false,
  |  |  834|      0|    NodeLabel, raw, false)
  |  |  835|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  836|      0|    BigIntLiteralTypeAnnotation, Flow,
  |  |  837|      0|    NodeLabel, raw, false)
  |  |  838|      0|ESTREE_NODE_0_ARGS(BooleanTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  839|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  840|      0|    BooleanLiteralTypeAnnotation, Flow,
  |  |  841|      0|    NodeBoolean, value, false,
  |  |  842|      0|    NodeLabel, raw, false)
  |  |  843|      0|ESTREE_NODE_0_ARGS(NullLiteralTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  844|      0|ESTREE_NODE_0_ARGS(SymbolTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  845|      0|ESTREE_NODE_0_ARGS(AnyTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  846|      0|ESTREE_NODE_0_ARGS(MixedTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  847|      0|ESTREE_NODE_0_ARGS(BigIntTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  848|      0|ESTREE_NODE_0_ARGS(VoidTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  849|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  850|      0|    FunctionTypeAnnotation, Flow,
  |  |  851|      0|    NodeList, params, false,
  |  |  852|      0|    NodePtr, this, true,
  |  |  853|      0|    NodePtr, returnType, false,
  |  |  854|      0|    NodePtr, rest, true,
  |  |  855|      0|    NodePtr, typeParameters, true)
  |  |  856|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  857|      0|    HookTypeAnnotation, Flow,
  |  |  858|      0|    NodeList, params, false,
  |  |  859|      0|    NodePtr, returnType, false,
  |  |  860|      0|    NodePtr, rest, true,
  |  |  861|      0|    NodePtr, typeParameters, true)
  |  |  862|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  863|      0|    FunctionTypeParam, Flow,
  |  |  864|      0|    NodePtr, name, true,
  |  |  865|      0|    NodePtr, typeAnnotation, false,
  |  |  866|      0|    NodeBoolean, optional, false)
  |  |  867|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  868|      0|    ComponentTypeAnnotation, Flow,
  |  |  869|      0|    NodeList, params, false,
  |  |  870|      0|    NodePtr, rest, true,
  |  |  871|      0|    NodePtr, typeParameters, true,
  |  |  872|      0|    NodePtr, rendersType, true)
  |  |  873|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  874|      0|    ComponentTypeParameter, Flow,
  |  |  875|      0|    NodePtr, name, true,
  |  |  876|      0|    NodePtr, typeAnnotation, false,
  |  |  877|      0|    NodeBoolean, optional, false)
  |  |  878|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  879|      0|    NullableTypeAnnotation, Flow,
  |  |  880|      0|    NodePtr, typeAnnotation, false)
  |  |  881|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  882|      0|    QualifiedTypeIdentifier, Flow,
  |  |  883|      0|    NodePtr, qualification, false,
  |  |  884|      0|    NodePtr, id, false)
  |  |  885|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  886|      0|    TypeofTypeAnnotation, Flow,
  |  |  887|      0|    NodePtr, argument, false,
  |  |  888|      0|    NodePtr, typeArguments, true)
  |  |  889|      0|ESTREE_IGNORE_IF_EMPTY(TypeofTypeAnnotation, typeArguments)
  |  |  890|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  891|      0|    KeyofTypeAnnotation, Flow,
  |  |  892|      0|    NodePtr, argument, false)
  |  |  893|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  894|      0|    TypeOperator, Flow,
  |  |  895|      0|    NodeLabel, operator, false,
  |  |  896|      0|    NodePtr, typeAnnotation, false)
  |  |  897|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  898|      0|    QualifiedTypeofIdentifier, Flow,
  |  |  899|      0|    NodePtr, qualification, false,
  |  |  900|      0|    NodePtr, id, false)
  |  |  901|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  902|      0|    TupleTypeAnnotation, Flow,
  |  |  903|      0|    NodeList, types, false,
  |  |  904|      0|    NodeBoolean, inexact, false)
  |  |  905|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  906|      0|    TupleTypeSpreadElement, Flow,
  |  |  907|      0|    NodePtr, label, true,
  |  |  908|      0|    NodePtr, typeAnnotation, false)
  |  |  909|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  910|      0|    TupleTypeLabeledElement, Flow,
  |  |  911|      0|    NodePtr, label, false,
  |  |  912|      0|    NodePtr, elementType, false,
  |  |  913|      0|    NodeBoolean, optional, false,
  |  |  914|      0|    NodePtr, variance, true)
  |  |  915|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  916|      0|    ArrayTypeAnnotation, Flow,
  |  |  917|      0|    NodePtr, elementType, false)
  |  |  918|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  919|      0|    InferTypeAnnotation, Flow,
  |  |  920|      0|    NodePtr, typeParameter, false)
  |  |  921|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  922|      0|    UnionTypeAnnotation, Flow,
  |  |  923|      0|    NodeList, types, false)
  |  |  924|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  925|      0|    IntersectionTypeAnnotation, Flow,
  |  |  926|      0|    NodeList, types, false)
  |  |  927|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  928|      0|    GenericTypeAnnotation, Flow,
  |  |  929|      0|    NodePtr, id, false,
  |  |  930|      0|    NodePtr, typeParameters, true)
  |  |  931|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  932|      0|    IndexedAccessType, Flow,
  |  |  933|      0|    NodePtr, objectType, false,
  |  |  934|      0|    NodePtr, indexType, false)
  |  |  935|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  936|      0|    OptionalIndexedAccessType, Flow,
  |  |  937|      0|    NodePtr, objectType, false,
  |  |  938|      0|    NodePtr, indexType, false,
  |  |  939|      0|    NodeBoolean, optional, false)
  |  |  940|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  941|      0|    ConditionalTypeAnnotation, Flow,
  |  |  942|      0|    NodePtr, checkType, false,
  |  |  943|      0|    NodePtr, extendsType, false,
  |  |  944|      0|    NodePtr, trueType, false,
  |  |  945|      0|    NodePtr, falseType, false)
  |  |  946|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  947|      0|    TypePredicate, Flow,
  |  |  948|      0|    NodePtr, parameterName, false,
  |  |  949|      0|    NodePtr, typeAnnotation, true,
  |  |  950|      0|    NodeString, kind, true)
  |  |  951|       |
  |  |  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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  953|      0|    InterfaceTypeAnnotation, Flow,
  |  |  954|      0|    NodeList, extends, false,
  |  |  955|      0|    NodePtr, body, true)
  |  |  956|       |
  |  |  957|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  958|      0|    TypeAlias, Flow,
  |  |  959|      0|    NodePtr, id, false,
  |  |  960|      0|    NodePtr, typeParameters, true,
  |  |  961|      0|    NodePtr, right, false)
  |  |  962|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  963|      0|    OpaqueType, Flow,
  |  |  964|      0|    NodePtr, id, false,
  |  |  965|      0|    NodePtr, typeParameters, true,
  |  |  966|      0|    NodePtr, impltype, false,
  |  |  967|      0|    NodePtr, supertype, true)
  |  |  968|       |
  |  |  969|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  970|      0|    InterfaceDeclaration, Flow,
  |  |  971|      0|    NodePtr, id, false,
  |  |  972|      0|    NodePtr, typeParameters, true,
  |  |  973|      0|    NodeList, extends, false,
  |  |  974|      0|    NodePtr, body, false)
  |  |  975|       |
  |  |  976|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  977|      0|    DeclareTypeAlias, Flow,
  |  |  978|      0|    NodePtr, id, false,
  |  |  979|      0|    NodePtr, typeParameters, true,
  |  |  980|      0|    NodePtr, right, false)
  |  |  981|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  982|      0|    DeclareOpaqueType, Flow,
  |  |  983|      0|    NodePtr, id, false,
  |  |  984|      0|    NodePtr, typeParameters, true,
  |  |  985|      0|    NodePtr, impltype, true,
  |  |  986|      0|    NodePtr, supertype, true)
  |  |  987|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  988|      0|    DeclareInterface, Flow,
  |  |  989|      0|    NodePtr, id, false,
  |  |  990|      0|    NodePtr, typeParameters, true,
  |  |  991|      0|    NodeList, extends, false,
  |  |  992|      0|    NodePtr, body, false)
  |  |  993|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  994|      0|    DeclareClass, Flow,
  |  |  995|      0|    NodePtr, id, false,
  |  |  996|      0|    NodePtr, typeParameters, true,
  |  |  997|      0|    NodeList, extends, false,
  |  |  998|      0|    NodeList, implements, false,
  |  |  999|      0|    NodeList, mixins, false,
  |  | 1000|      0|    NodePtr, body, false)
  |  | 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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1002|      0|    DeclareFunction, Flow,
  |  | 1003|      0|    NodePtr, id, false,
  |  | 1004|      0|    NodePtr, predicate, true)
  |  | 1005|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1006|      0|    DeclareHook, Flow,
  |  | 1007|      0|    NodePtr, id, false)
  |  | 1008|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1009|      0|    DeclareComponent, Flow,
  |  | 1010|      0|    NodePtr, id, false,
  |  | 1011|      0|    NodeList, params, false,
  |  | 1012|      0|    NodePtr, rest, true,
  |  | 1013|      0|    NodePtr, typeParameters, true,
  |  | 1014|      0|    NodePtr, rendersType, true)
  |  | 1015|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1016|      0|    DeclareVariable, Flow,
  |  | 1017|      0|    NodePtr, id, false,
  |  | 1018|      0|    NodeLabel, kind, false)
  |  | 1019|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1020|      0|    DeclareEnum, Flow,
  |  | 1021|      0|    NodePtr, id, false,
  |  | 1022|      0|    NodePtr, body, false)
  |  | 1023|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1024|      0|    DeclareExportDeclaration, Flow,
  |  | 1025|      0|    NodePtr, declaration, true,
  |  | 1026|      0|    NodeList, specifiers, false,
  |  | 1027|      0|    NodePtr, source, true,
  |  | 1028|      0|    NodeBoolean, default, false)
  |  | 1029|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1030|      0|    DeclareExportAllDeclaration, Flow,
  |  | 1031|      0|    NodePtr, source, false)
  |  | 1032|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1033|      0|    DeclareModule, Flow,
  |  | 1034|      0|    NodePtr, id, false,
  |  | 1035|      0|    NodePtr, body, false)
  |  | 1036|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1037|      0|    DeclareNamespace, Flow,
  |  | 1038|      0|    NodePtr, id, false,
  |  | 1039|      0|    NodePtr, body, false)
  |  | 1040|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1041|      0|    DeclareModuleExports, Flow,
  |  | 1042|      0|    NodePtr, typeAnnotation, false)
  |  | 1043|       |
  |  | 1044|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1045|      0|    InterfaceExtends, Flow,
  |  | 1046|      0|    NodePtr, id, false,
  |  | 1047|      0|    NodePtr, typeParameters, true)
  |  | 1048|       |
  |  | 1049|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1050|      0|    ClassImplements, Flow,
  |  | 1051|      0|    NodePtr, id, false,
  |  | 1052|      0|    NodePtr, typeParameters, true)
  |  | 1053|       |
  |  | 1054|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1055|      0|    TypeAnnotation, Flow,
  |  | 1056|      0|    NodePtr, typeAnnotation, false)
  |  | 1057|       |
  |  | 1058|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1059|      0|    ObjectTypeAnnotation, Flow,
  |  | 1060|      0|    NodeList, properties, false,
  |  | 1061|      0|    NodeList, indexers, false,
  |  | 1062|      0|    NodeList, callProperties, false,
  |  | 1063|      0|    NodeList, internalSlots, false,
  |  | 1064|      0|    NodeBoolean, inexact, false,
  |  | 1065|      0|    NodeBoolean, exact, false)
  |  | 1066|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1067|      0|    ObjectTypeProperty, Flow,
  |  | 1068|      0|    NodePtr, key, false,
  |  | 1069|      0|    NodePtr, value, false,
  |  | 1070|      0|    NodeBoolean, method, false,
  |  | 1071|      0|    NodeBoolean, optional, false,
  |  | 1072|      0|    NodeBoolean, static, false,
  |  | 1073|      0|    NodeBoolean, proto, false,
  |  | 1074|      0|    NodePtr, variance, true,
  |  | 1075|      0|    NodeLabel, kind, false)
  |  | 1076|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|    ObjectTypeSpreadProperty, Flow,
  |  | 1078|      0|    NodePtr, argument, false)
  |  | 1079|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1080|      0|    ObjectTypeInternalSlot, Flow,
  |  | 1081|      0|    NodePtr, id, false,
  |  | 1082|      0|    NodePtr, value, false,
  |  | 1083|      0|    NodeBoolean, optional, false,
  |  | 1084|      0|    NodeBoolean, static, false,
  |  | 1085|      0|    NodeBoolean, method, false)
  |  | 1086|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1087|      0|    ObjectTypeCallProperty, Flow,
  |  | 1088|      0|    NodePtr, value, false,
  |  | 1089|      0|    NodeBoolean, static, false)
  |  | 1090|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1091|      0|    ObjectTypeIndexer, Flow,
  |  | 1092|      0|    NodePtr, id, true,
  |  | 1093|      0|    NodePtr, key, false,
  |  | 1094|      0|    NodePtr, value, false,
  |  | 1095|      0|    NodeBoolean, static, false,
  |  | 1096|      0|    NodePtr, variance, true)
  |  | 1097|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1098|      0|    ObjectTypeMappedTypeProperty, Flow,
  |  | 1099|      0|    NodePtr, keyTparam, false,
  |  | 1100|      0|    NodePtr, propType, false,
  |  | 1101|      0|    NodePtr, sourceType, false,
  |  | 1102|      0|    NodePtr, variance, true,
  |  | 1103|      0|    NodeString, optional, true)
  |  | 1104|       |
  |  | 1105|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1106|      0|    Variance, Flow,
  |  | 1107|      0|    NodeLabel, kind, false)
  |  | 1108|       |
  |  | 1109|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1110|      0|    TypeParameterDeclaration, Flow,
  |  | 1111|      0|    NodeList, params, false)
  |  | 1112|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1113|      0|    TypeParameter, Flow,
  |  | 1114|      0|    NodeLabel, name, false,
  |  | 1115|      0|    NodeBoolean, const, false,
  |  | 1116|      0|    NodePtr, bound, true,
  |  | 1117|      0|    NodePtr, variance, true,
  |  | 1118|      0|    NodePtr, default, true,
  |  | 1119|      0|    NodeBoolean, usesExtendsBound, false)
  |  | 1120|      0|ESTREE_IGNORE_IF_EMPTY(TypeParameter, usesExtendsBound)
  |  | 1121|      0|ESTREE_IGNORE_IF_EMPTY(TypeParameter, const)
  |  | 1122|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1123|      0|    TypeParameterInstantiation, Flow,
  |  | 1124|      0|    NodeList, params, false)
  |  | 1125|       |
  |  | 1126|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1127|      0|    TypeCastExpression, Flow,
  |  | 1128|      0|    NodePtr, expression, false,
  |  | 1129|      0|    NodePtr, typeAnnotation, false)
  |  | 1130|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1131|      0|    AsExpression, Flow,
  |  | 1132|      0|    NodePtr, expression, false,
  |  | 1133|      0|    NodePtr, typeAnnotation, false)
  |  | 1134|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1135|      0|    AsConstExpression, Flow,
  |  | 1136|      0|    NodePtr, expression, false)
  |  | 1137|       |
  |  | 1138|      0|ESTREE_NODE_0_ARGS(InferredPredicate, Flow)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1139|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1140|      0|    DeclaredPredicate, Flow,
  |  | 1141|      0|    NodePtr, value, false)
  |  | 1142|       |
  |  | 1143|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1144|      0|    EnumDeclaration, Flow,
  |  | 1145|      0|    NodePtr, id, false,
  |  | 1146|      0|    NodePtr, body, false)
  |  | 1147|       |
  |  | 1148|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1149|      0|    EnumStringBody, Flow,
  |  | 1150|      0|    NodeList, members, false,
  |  | 1151|      0|    NodeBoolean, explicitType, false,
  |  | 1152|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1153|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1154|      0|    EnumNumberBody, Flow,
  |  | 1155|      0|    NodeList, members, false,
  |  | 1156|      0|    NodeBoolean, explicitType, false,
  |  | 1157|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1158|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1159|      0|    EnumBigIntBody, Flow,
  |  | 1160|      0|    NodeList, members, false,
  |  | 1161|      0|    NodeBoolean, explicitType, false,
  |  | 1162|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1163|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1164|      0|    EnumBooleanBody, Flow,
  |  | 1165|      0|    NodeList, members, false,
  |  | 1166|      0|    NodeBoolean, explicitType, false,
  |  | 1167|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1168|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1169|      0|    EnumSymbolBody, Flow,
  |  | 1170|      0|    NodeList, members, false,
  |  | 1171|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1172|       |
  |  | 1173|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1174|      0|    EnumDefaultedMember, Flow,
  |  | 1175|      0|    NodePtr, id, false)
  |  | 1176|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1177|      0|    EnumStringMember, Flow,
  |  | 1178|      0|    NodePtr, id, false,
  |  | 1179|      0|    NodePtr, init, false)
  |  | 1180|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1181|      0|    EnumNumberMember, Flow,
  |  | 1182|      0|    NodePtr, id, false,
  |  | 1183|      0|    NodePtr, init, false)
  |  | 1184|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1185|      0|    EnumBigIntMember, Flow,
  |  | 1186|      0|    NodePtr, id, false,
  |  | 1187|      0|    NodePtr, init, false)
  |  | 1188|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1189|      0|    EnumBooleanMember, Flow,
  |  | 1190|      0|    NodePtr, id, false,
  |  | 1191|      0|    NodePtr, init, false)
  |  | 1192|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1193|      0|    ComponentParameter, Flow,
  |  | 1194|      0|    NodePtr, name, false,
  |  | 1195|      0|    NodePtr, local, false,
  |  | 1196|      0|    NodeBoolean, shorthand, false)
  |  | 1197|       |
  |  | 1198|      0|ESTREE_LAST(Flow)
  |  | 1199|       |
  |  | 1200|      0|#endif
  |  | 1201|       |
  |  | 1202|      0|#if HERMES_PARSE_TS
  |  | 1203|       |
  |  | 1204|      0|ESTREE_FIRST(TS, Base)
  |  | 1205|       |
  |  | 1206|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1207|      0|    TSTypeAnnotation, TS,
  |  | 1208|      0|    NodePtr, typeAnnotation, false)
  |  | 1209|       |
  |  | 1210|      0|ESTREE_NODE_0_ARGS(TSAnyKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1211|      0|ESTREE_NODE_0_ARGS(TSNumberKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1212|      0|ESTREE_NODE_0_ARGS(TSBooleanKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1213|      0|ESTREE_NODE_0_ARGS(TSStringKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1214|      0|ESTREE_NODE_0_ARGS(TSSymbolKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1215|      0|ESTREE_NODE_0_ARGS(TSVoidKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1216|      0|ESTREE_NODE_0_ARGS(TSUndefinedKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1217|      0|ESTREE_NODE_0_ARGS(TSUnknownKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1218|      0|ESTREE_NODE_0_ARGS(TSNeverKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1219|      0|ESTREE_NODE_0_ARGS(TSBigIntKeyword, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1220|      0|ESTREE_NODE_0_ARGS(TSThisType, TS)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1221|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1222|      0|    TSLiteralType, TS,
  |  | 1223|      0|    NodePtr, literal, false)
  |  | 1224|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1225|      0|    TSIndexedAccessType, TS,
  |  | 1226|      0|    NodePtr, objectType, false,
  |  | 1227|      0|    NodePtr, indexType, false)
  |  | 1228|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1229|      0|    TSArrayType, TS,
  |  | 1230|      0|    NodePtr, elementType, false)
  |  | 1231|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1232|      0|    TSTypeReference, TS,
  |  | 1233|      0|    NodePtr, typeName, false,
  |  | 1234|      0|    NodePtr, typeParameters, true)
  |  | 1235|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1236|      0|    TSQualifiedName, TS,
  |  | 1237|      0|    NodePtr, left, false,
  |  | 1238|      0|    NodePtr, right, true)
  |  | 1239|       |
  |  | 1240|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1241|      0|    TSFunctionType, TS,
  |  | 1242|      0|    NodeList, params, false,
  |  | 1243|      0|    NodePtr, returnType, false,
  |  | 1244|      0|    NodePtr, typeParameters, true)
  |  | 1245|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1246|      0|    TSConstructorType, TS,
  |  | 1247|      0|    NodeList, params, false,
  |  | 1248|      0|    NodePtr, returnType, false,
  |  | 1249|      0|    NodePtr, typeParameters, true)
  |  | 1250|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1251|      0|    TSTypePredicate, TS,
  |  | 1252|      0|    NodePtr, parameterName, false,
  |  | 1253|      0|    NodePtr, typeAnnotation, false)
  |  | 1254|       |
  |  | 1255|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1256|      0|    TSTupleType, TS,
  |  | 1257|      0|    NodeList, elementTypes, false)
  |  | 1258|       |
  |  | 1259|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1260|      0|    TSTypeAssertion, TS,
  |  | 1261|      0|    NodePtr, typeAnnotation, false,
  |  | 1262|      0|    NodePtr, expression, false)
  |  | 1263|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1264|      0|    TSAsExpression, TS,
  |  | 1265|      0|    NodePtr, expression, false,
  |  | 1266|      0|    NodePtr, typeAnnotation, false)
  |  | 1267|       |
  |  | 1268|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1269|      0|    TSParameterProperty, TS,
  |  | 1270|      0|    NodePtr, parameter, false,
  |  | 1271|      0|    NodeLabel, accessibility, true,
  |  | 1272|      0|    NodeBoolean, readonly, false,
  |  | 1273|      0|    NodeBoolean, static, false,
  |  | 1274|      0|    NodeBoolean, export, false)
  |  | 1275|       |
  |  | 1276|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1277|      0|    TSTypeAliasDeclaration, TS,
  |  | 1278|      0|    NodePtr, id, false,
  |  | 1279|      0|    NodePtr, typeParameters, true,
  |  | 1280|      0|    NodePtr, typeAnnotation, false)
  |  | 1281|       |
  |  | 1282|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1283|      0|    TSInterfaceDeclaration, TS,
  |  | 1284|      0|    NodePtr, id, false,
  |  | 1285|      0|    NodePtr, body, false,
  |  | 1286|      0|    NodeList, extends, false,
  |  | 1287|      0|    NodePtr, typeParameters, true)
  |  | 1288|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1289|      0|    TSInterfaceHeritage, TS,
  |  | 1290|      0|    NodePtr, expression, false,
  |  | 1291|      0|    NodePtr, typeParameters, true)
  |  | 1292|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1293|      0|    TSInterfaceBody, TS,
  |  | 1294|      0|    NodeList, body, false)
  |  | 1295|       |
  |  | 1296|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1297|      0|    TSEnumDeclaration, TS,
  |  | 1298|      0|    NodePtr, id, false,
  |  | 1299|      0|    NodeList, members, false)
  |  | 1300|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1301|      0|    TSEnumMember, TS,
  |  | 1302|      0|    NodePtr, id, false,
  |  | 1303|      0|    NodePtr, initializer, true)
  |  | 1304|       |
  |  | 1305|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1306|      0|    TSModuleDeclaration, TS,
  |  | 1307|      0|    NodePtr, id, false,
  |  | 1308|      0|    NodePtr, body, false)
  |  | 1309|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1310|      0|    TSModuleBlock, TS,
  |  | 1311|      0|    NodeList, body, false)
  |  | 1312|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1313|      0|    TSModuleMember, TS,
  |  | 1314|      0|    NodePtr, id, false,
  |  | 1315|      0|    NodePtr, initializer, true)
  |  | 1316|       |
  |  | 1317|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1318|      0|    TSTypeParameterDeclaration, TS,
  |  | 1319|      0|    NodeList, params, false)
  |  | 1320|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1321|      0|    TSTypeParameter, TS,
  |  | 1322|      0|    NodePtr, name, false,
  |  | 1323|      0|    NodePtr, constraint, true,
  |  | 1324|      0|    NodePtr, default, true)
  |  | 1325|       |
  |  | 1326|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1327|      0|    TSTypeParameterInstantiation, TS,
  |  | 1328|      0|    NodeList, params, false)
  |  | 1329|       |
  |  | 1330|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1331|      0|    TSUnionType, TS,
  |  | 1332|      0|    NodeList, types, false)
  |  | 1333|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1334|      0|    TSIntersectionType, TS,
  |  | 1335|      0|    NodeList, types, false)
  |  | 1336|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1337|      0|    TSTypeQuery, TS,
  |  | 1338|      0|    NodePtr, exprName, false)
  |  | 1339|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1340|      0|    TSConditionalType, TS,
  |  | 1341|      0|    NodePtr, checkType, false,
  |  | 1342|      0|    NodePtr, extendsType, false,
  |  | 1343|      0|    NodePtr, trueType, false,
  |  | 1344|      0|    NodePtr, falseType, false)
  |  | 1345|       |
  |  | 1346|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1347|      0|    TSTypeLiteral, TS,
  |  | 1348|      0|    NodeList, members, false)
  |  | 1349|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1350|      0|    TSPropertySignature, TS,
  |  | 1351|      0|    NodePtr, key, false,
  |  | 1352|      0|    NodePtr, typeAnnotation, true,
  |  | 1353|      0|    NodePtr, initializer, true,
  |  | 1354|      0|    NodeBoolean, optional, false,
  |  | 1355|      0|    NodeBoolean, computed, false,
  |  | 1356|      0|    NodeBoolean, readonly, false,
  |  | 1357|      0|    NodeBoolean, static, false,
  |  | 1358|      0|    NodeBoolean, export, false)
  |  | 1359|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1360|      0|    TSMethodSignature, TS,
  |  | 1361|      0|    NodePtr, key, false,
  |  | 1362|      0|    NodeList, params, false,
  |  | 1363|      0|    NodePtr, returnType, true,
  |  | 1364|      0|    NodeBoolean, computed, false)
  |  | 1365|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1366|      0|    TSIndexSignature, TS,
  |  | 1367|      0|    NodeList, parameters, false,
  |  | 1368|      0|    NodePtr, typeAnnotation, true)
  |  | 1369|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1370|      0|    TSCallSignatureDeclaration, TS,
  |  | 1371|      0|    NodeList, params, false,
  |  | 1372|      0|    NodePtr, returnType, true)
  |  | 1373|       |
  |  | 1374|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1375|      0|    TSModifiers, TS,
  |  | 1376|      0|    NodeLabel, accessibility, false,
  |  | 1377|      0|    NodeBoolean, readonly, false)
  |  | 1378|       |
  |  | 1379|      0|ESTREE_LAST(TS)
  |  | 1380|       |
  |  | 1381|      0|#endif
  |  | 1382|       |
  |  | 1383|       |// ================================================
  |  | 1384|       |
  |  | 1385|      0|#ifndef ESTREE_DEFINE_COVER_NODES
  |  | 1386|       |
  |  | 1387|      0|ESTREE_FIRST(Cover, Base)
  |  | 1388|       |
  |  | 1389|       |// CoverParenthesizedExpressionAndArrowParameterList: "(" ")"
  |  | 1390|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1391|       |
  |  | 1392|       |// CoverParenthesizedExpressionAndArrowParameterList:
  |  | 1393|       |//      "(" Expression "," ")"
  |  | 1394|       |// This is the dummy "empty expression" for the last comma inside a
  |  | 1395|       |// SequenceExpression.
  |  | 1396|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1397|       |
  |  | 1398|       |// CoverInitializer
  |  | 1399|       |// This is used for destructuring object assignment with initializers. It
  |  | 1400|       |// will be the value node of a Property.
  |  | 1401|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1402|      0|    CoverInitializer, Cover,
  |  | 1403|      0|    NodePtr, init, false)
  |  | 1404|       |
  |  | 1405|       |// CoverRestElement
  |  | 1406|       |// This is used for parsing "...elem" in "()" and in SequenceExpression, so it
  |  | 1407|       |// can later be reparsed as an arrow function rest parameter. "rest" will point
  |  | 1408|       |// to the actual RestElement.
  |  | 1409|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1410|      0|    CoverRestElement, Cover,
  |  | 1411|      0|    NodePtr, rest, false)
  |  | 1412|       |
  |  | 1413|       |// CoverTypedIdentifier
  |  | 1414|       |// This is used for parsing "ident: type" as either a type cast expression
  |  | 1415|       |// or a typed parameter in the parameters list of an arrow function.
  |  | 1416|       |// 'left' is the identifier which is typed.
  |  | 1417|       |// 'right' is the type which is either the cast target or the type annotation,
  |  | 1418|       |//   which may be null if the identifier was simply given a '?' and no ':'
  |  | 1419|       |//   with a type annotation.
  |  | 1420|      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: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1421|      0|    CoverTypedIdentifier, Cover,
  |  | 1422|      0|    NodePtr, left, false,
  |  | 1423|      0|    NodePtr, right, true,
  |  | 1424|      0|    NodeBoolean, optional, false)
  |  | 1425|       |
  |  | 1426|      0|ESTREE_LAST(Cover)
  |  | 1427|       |
  |  | 1428|      0|#endif
  |  | 1429|       |
  |  | 1430|      0|#undef ESTREE_FIRST
  |  | 1431|      0|#undef ESTREE_LAST
  |  | 1432|      0|#undef ESTREE_WRAP
  |  | 1433|      0|#undef ESTREE_IGNORE_IF_EMPTY
  |  | 1434|       |
  |  | 1435|      0|#undef ESTREE_NODE_0_ARGS
  |  | 1436|      0|#undef ESTREE_NODE_1_ARGS
  |  | 1437|      0|#undef ESTREE_NODE_2_ARGS
  |  | 1438|      0|#undef ESTREE_NODE_3_ARGS
  |  | 1439|      0|#undef ESTREE_NODE_4_ARGS
  |  | 1440|      0|#undef ESTREE_NODE_5_ARGS
  |  | 1441|      0|#undef ESTREE_NODE_6_ARGS
  |  | 1442|      0|#undef ESTREE_NODE_7_ARGS
  |  | 1443|      0|#undef ESTREE_NODE_8_ARGS
  |  | 1444|      0|#undef ESTREE_NODE_9_ARGS
  ------------------
  311|       |
  312|  2.45M|#undef VISIT
  313|  2.45M|    }
  314|  2.45M|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_9EmptyNodeE:
  326|     41|  static void visitChildren(Visitor &v, NAME##Node *) {}
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_11ProgramNodeE:
  329|    204|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|    204|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|    204|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|    204|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    204|    visit(visitor, field, parent);                           \
  |  |  320|    204|  } else {                                                   \
  |  |  321|    204|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    204|  }
  ------------------
  331|    204|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_RN4llvh12simple_ilistINS0_4NodeEJEEEPS8_:
  227|  94.4k|  static UnmodifiedT visit(Visitor &v, NodeList &list, Node *parent) {
  228|  94.4k|    if constexpr (readOnlyVisitor) {
  229|       |      // Read-only visitors don't need the extra overhead of checking visit's
  230|       |      // return value.
  231|  2.34M|      for (Node &node : list) {
  ------------------
  |  Branch (231:23): [True: 2.34M, False: 94.4k]
  ------------------
  232|  2.34M|        visit(v, &node, parent);
  233|  2.34M|      }
  234|       |    } else {
  235|       |      for (auto it = list.begin(), end = list.end(); it != end;) {
  236|       |        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|       |        list.erase(curr);
  241|       |
  242|       |        VisitResult res = visit(v, &*curr, parent);
  243|       |        if (std::holds_alternative<Node *>(res)) {
  244|       |          // The visitor decided to return a new node; insert it.
  245|       |          list.insert(it, *std::get<Node *>(res));
  246|       |        } else if (std::holds_alternative<UnmodifiedT>(res)) {
  247|       |          // The visitor didn't do anything to the old node; insert it back.
  248|       |          list.insert(it, *curr);
  249|       |        } else {
  250|       |          // The visitor decided to remove the node; do nothing, as the node's
  251|       |          // been removed already.
  252|       |          assert(
  253|       |              std::holds_alternative<RemovedT>(res) &&
  254|       |              "Unexpected VisitResult alternative.");
  255|       |        }
  256|       |      }
  257|       |    }
  258|  94.4k|    return Unmodified;
  259|  94.4k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_9EmptyNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     41|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     41|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     41|      v.visit(node);
   48|     41|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|     41|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_11ProgramNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|    204|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|    204|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|    204|      v.visit(node);
   48|    204|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|    204|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_22FunctionExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     82|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     82|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     82|      v.visit(node);
   48|     82|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|     82|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_27ArrowFunctionExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   103k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   103k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   103k|      v.visit(node);
   48|   103k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|   103k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18ForInStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     15|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     15|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     15|      v.visit(node);
   48|     15|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|     15|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18EmptyStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  5.34k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  5.34k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  5.34k|      v.visit(node);
   48|  5.34k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  5.34k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19ReturnStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   103k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   103k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   103k|      v.visit(node);
   48|   103k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|   103k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20LabeledStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   245k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   245k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   245k|      v.visit(node);
   48|   245k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|   245k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_23ExpressionStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   358k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   358k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   358k|      v.visit(node);
   48|   358k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|   358k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_17StringLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     20|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     20|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     20|      v.visit(node);
   48|     20|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|     20|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18NumericLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  1.59M|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  1.59M|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  1.59M|      v.visit(node);
   48|  1.59M|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  1.59M|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_17RegExpLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|    120|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|    120|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|    120|      v.visit(node);
   48|    120|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|    120|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_17BigIntLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|      5|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|      5|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      5|      v.visit(node);
   48|      5|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|      5|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_22SequenceExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     98|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     98|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     98|      v.visit(node);
   48|     98|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|     98|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20ObjectExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|      2|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|      2|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      2|      v.visit(node);
   48|      2|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|      2|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19ArrayExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|    101|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|    101|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|    101|      v.visit(node);
   48|    101|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|    101|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_17NewExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  25.0k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  25.0k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  25.0k|      v.visit(node);
   48|  25.0k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  25.0k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18CallExpressionNodeEvE4callERS4_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))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      3|      v.visit(node);
   48|      3|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|      3|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_26OptionalCallExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     16|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     16|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     16|      v.visit(node);
   48|     16|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|     16|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_24AssignmentExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  4.55k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  4.55k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  4.55k|      v.visit(node);
   48|  4.55k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  4.55k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19UnaryExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  25.9k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  25.9k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  25.9k|      v.visit(node);
   48|  25.9k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  25.9k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20UpdateExpressionNodeEvE4callERS4_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))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      1|      v.visit(node);
   48|      1|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|      1|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20MemberExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  17.5k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  17.5k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  17.5k|      v.visit(node);
   48|  17.5k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  17.5k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_28OptionalMemberExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  25.9k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  25.9k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  25.9k|      v.visit(node);
   48|  25.9k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  25.9k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_21LogicalExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  25.3k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  25.3k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  25.3k|      v.visit(node);
   48|  25.3k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  25.3k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_25ConditionalExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  3.66k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  3.66k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  3.66k|      v.visit(node);
   48|  3.66k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  3.66k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20BinaryExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   103k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   103k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   103k|      v.visit(node);
   48|   103k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|   103k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_14IdentifierNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   926k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   926k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   926k|      v.visit(node);
   48|   926k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|   926k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19TemplateLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  23.2k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  23.2k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  23.2k|      v.visit(node);
   48|  23.2k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  23.2k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_28TaggedTemplateExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  2.82k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  2.82k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  2.82k|      v.visit(node);
   48|  2.82k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  2.82k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19TemplateElementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   374k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   374k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   374k|      v.visit(node);
   48|   374k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|   374k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_12PropertyNodeEvE4callERS4_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))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      1|      v.visit(node);
   48|      1|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|      1|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_16ArrayPatternNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  22.3k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  22.3k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  22.3k|      v.visit(node);
   48|  22.3k|      return Unmodified;
   49|       |    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|       |      return v.visit(node);
   52|       |    }
   53|  22.3k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_PNS0_4NodeES7_:
  181|  4.14M|  static VisitResult visit(Visitor &v, Node *node, Node *parent) {
  182|  4.14M|    if (!node)
  ------------------
  |  Branch (182:9): [True: 150k, False: 3.99M]
  ------------------
  183|   150k|      return Unmodified;
  184|  3.99M|    if (LLVM_UNLIKELY(!v.incRecursionDepth(node)))
  ------------------
  |  |  189|  3.99M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.02k, False: 3.99M]
  |  |  ------------------
  ------------------
  185|  1.02k|      return Unmodified;
  186|       |
  187|  3.99M|    VisitResult result;
  188|  3.99M|    switch (node->getKind()) {
  189|      0|      default:
  ------------------
  |  Branch (189:7): [True: 0, False: 3.99M]
  ------------------
  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|  3.99M|#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|     41|#include "hermes/AST/Config.h"
  |  |   14|       |
  |  |   15|       |// clang-format off
  |  |   16|       |
  |  |   17|       |// Defines the start of range of nodes with the same base
  |  |   18|     41|#ifndef ESTREE_FIRST
  |  |   19|     41|#define ESTREE_FIRST(NAME, BASE)
  |  |   20|     41|#endif
  |  |   21|       |
  |  |   22|       |// Defines the end of range of nodes with the same base
  |  |   23|     41|#ifndef ESTREE_LAST
  |  |   24|     41|#define ESTREE_LAST(NAME)
  |  |   25|     41|#endif
  |  |   26|       |
  |  |   27|       |// Ignores the given field if it is "empty" (e.g. nullptr, empty list).
  |  |   28|     41|#ifndef ESTREE_IGNORE_IF_EMPTY
  |  |   29|     41|#define ESTREE_IGNORE_IF_EMPTY(NODE, FIELD)
  |  |   30|     41|#endif
  |  |   31|       |
  |  |   32|     41|ESTREE_NODE_0_ARGS(Empty, Base)
  |  |  ------------------
  |  |  |  |  198|     41|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     41|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 41, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     41|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     41|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     41|    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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|    204|ESTREE_NODE_1_ARGS(Program, FunctionLike,
  |  |  ------------------
  |  |  |  |  199|    204|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|    204|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 204, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|    204|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|    204|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|    204|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   37|      0|    NodeList, body, false)
  |  |   38|     82|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|     82|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     82|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 82, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     82|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     82|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     82|    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|   103k|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|   103k|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   103k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 103k, False: 3.88M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   103k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   103k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   103k|    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|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    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|       |
  |  |   78|      0|#if HERMES_PARSE_FLOW
  |  |   79|       |
  |  |   80|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   81|      0|    ComponentDeclaration, FunctionLike,
  |  |   82|      0|    NodePtr, id, false,
  |  |   83|      0|    NodeList, params, false,
  |  |   84|      0|    NodePtr, body, false,
  |  |   85|      0|    NodePtr, typeParameters, true,
  |  |   86|      0|    NodePtr, rendersType, true)
  |  |   87|      0|ESTREE_IGNORE_IF_EMPTY(ComponentDeclaration, typeParameters)
  |  |   88|      0|ESTREE_IGNORE_IF_EMPTY(ComponentDeclaration, rendersType)
  |  |   89|       |
  |  |   90|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   91|      0|    HookDeclaration, FunctionLike,
  |  |   92|      0|    NodePtr, id, false,
  |  |   93|      0|    NodeList, params, false,
  |  |   94|      0|    NodePtr, body, false,
  |  |   95|      0|    NodePtr, typeParameters, true,
  |  |   96|      0|    NodePtr, returnType, true)
  |  |   97|      0|ESTREE_IGNORE_IF_EMPTY(HookDeclaration, typeParameters)
  |  |   98|      0|ESTREE_IGNORE_IF_EMPTY(HookDeclaration, returnType)
  |  |   99|       |
  |  |  100|      0|#endif
  |  |  101|       |
  |  |  102|      0|ESTREE_LAST(FunctionLike)
  |  |  103|       |
  |  |  104|      0|ESTREE_FIRST(Statement, Base)
  |  |  105|       |
  |  |  106|      0|#if HERMES_PARSE_FLOW
  |  |  107|       |
  |  |  108|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  109|      0|    MatchStatement, Statement,
  |  |  110|      0|    NodePtr, argument, false, // Expression
  |  |  111|      0|    NodeList, cases, false // [ MatchStatementCase ]
  |  |  112|      0|)
  |  |  113|       |
  |  |  114|      0|#endif
  |  |  115|       |
  |  |  116|      0|ESTREE_FIRST(LoopStatement, Statement)
  |  |  117|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  118|      0|    WhileStatement,
  |  |  119|      0|    LoopStatement,
  |  |  120|      0|    NodePtr,
  |  |  121|      0|    body,
  |  |  122|      0|    false,
  |  |  123|      0|    NodePtr,
  |  |  124|      0|    test,
  |  |  125|      0|    false)
  |  |  126|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  127|      0|    DoWhileStatement,
  |  |  128|      0|    LoopStatement,
  |  |  129|      0|    NodePtr,
  |  |  130|      0|    body,
  |  |  131|      0|    false,
  |  |  132|      0|    NodePtr,
  |  |  133|      0|    test,
  |  |  134|      0|    false)
  |  |  135|     15|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|     15|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     15|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 15, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     15|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     15|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     15|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|      0|    ForInStatement,
  |  |  137|      0|    LoopStatement,
  |  |  138|      0|    NodePtr,
  |  |  139|      0|    left,
  |  |  140|      0|    false,
  |  |  141|      0|    NodePtr,
  |  |  142|      0|    right,
  |  |  143|      0|    false,
  |  |  144|      0|    NodePtr,
  |  |  145|      0|    body,
  |  |  146|      0|    false)
  |  |  147|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|    ForOfStatement, LoopStatement,
  |  |  149|      0|    NodePtr, left, false,
  |  |  150|      0|    NodePtr, right, false,
  |  |  151|      0|    NodePtr, body, false,
  |  |  152|      0|    NodeBoolean, await, false)
  |  |  153|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  154|      0|    ForStatement,
  |  |  155|      0|    LoopStatement,
  |  |  156|      0|    NodePtr,
  |  |  157|      0|    init,
  |  |  158|      0|    true,
  |  |  159|      0|    NodePtr,
  |  |  160|      0|    test,
  |  |  161|      0|    true,
  |  |  162|      0|    NodePtr,
  |  |  163|      0|    update,
  |  |  164|      0|    true,
  |  |  165|      0|    NodePtr,
  |  |  166|      0|    body,
  |  |  167|      0|    false)
  |  |  168|      0|ESTREE_LAST(LoopStatement)
  |  |  169|       |
  |  |  170|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  171|  5.34k|ESTREE_NODE_0_ARGS(EmptyStatement, Statement)
  |  |  ------------------
  |  |  |  |  198|  5.34k|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  5.34k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 5.34k, False: 3.98M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  5.34k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  5.34k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  5.34k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|      0|ESTREE_NODE_1_ARGS(BlockStatement, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  173|      0|ESTREE_NODE_1_ARGS(StaticBlock, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  174|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  175|      0|ESTREE_NODE_1_ARGS(ContinueStatement, 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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  176|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|   103k|ESTREE_NODE_1_ARGS(ReturnStatement, Statement, NodePtr, argument, true)
  |  |  ------------------
  |  |  |  |  199|   103k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   103k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 103k, False: 3.88M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   103k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   103k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   103k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  178|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  179|      0|    WithStatement,
  |  |  180|      0|    Statement,
  |  |  181|      0|    NodePtr,
  |  |  182|      0|    object,
  |  |  183|      0|    false,
  |  |  184|      0|    NodePtr,
  |  |  185|      0|    body,
  |  |  186|      0|    false)
  |  |  187|       |
  |  |  188|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  189|      0|    SwitchStatement,
  |  |  190|      0|    Statement,
  |  |  191|      0|    NodePtr,
  |  |  192|      0|    discriminant,
  |  |  193|      0|    false,
  |  |  194|      0|    NodeList,
  |  |  195|      0|    cases,
  |  |  196|      0|    false)
  |  |  197|       |
  |  |  198|   245k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|   245k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   245k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 245k, False: 3.74M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   245k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   245k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   245k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  199|      0|    LabeledStatement,
  |  |  200|      0|    Statement,
  |  |  201|      0|    NodePtr,
  |  |  202|      0|    label,
  |  |  203|      0|    false,
  |  |  204|      0|    NodePtr,
  |  |  205|      0|    body,
  |  |  206|      0|    false)
  |  |  207|       |
  |  |  208|   358k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|   358k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   358k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 358k, False: 3.63M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   358k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   358k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   358k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  209|      0|    ExpressionStatement,
  |  |  210|      0|    Statement,
  |  |  211|      0|    NodePtr,
  |  |  212|      0|    expression,
  |  |  213|      0|    false,
  |  |  214|      0|    NodeString,
  |  |  215|      0|    directive,
  |  |  216|      0|    true)
  |  |  217|       |
  |  |  218|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  219|      0|    TryStatement,
  |  |  220|      0|    Statement,
  |  |  221|      0|    NodePtr,
  |  |  222|      0|    block,
  |  |  223|      0|    false,
  |  |  224|      0|    NodePtr,
  |  |  225|      0|    handler,
  |  |  226|      0|    true,
  |  |  227|      0|    NodePtr,
  |  |  228|      0|    finalizer,
  |  |  229|      0|    true)
  |  |  230|       |
  |  |  231|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  232|      0|    IfStatement,
  |  |  233|      0|    Statement,
  |  |  234|      0|    NodePtr,
  |  |  235|      0|    test,
  |  |  236|      0|    false,
  |  |  237|      0|    NodePtr,
  |  |  238|      0|    consequent,
  |  |  239|      0|    false,
  |  |  240|      0|    NodePtr,
  |  |  241|      0|    alternate,
  |  |  242|      0|    true)
  |  |  243|       |
  |  |  244|      0|ESTREE_LAST(Statement)
  |  |  245|       |
  |  |  246|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|      0|ESTREE_NODE_1_ARGS(BooleanLiteral, Base, NodeBoolean, value, false)
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  248|     20|ESTREE_NODE_1_ARGS(StringLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  199|     20|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     20|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 20, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     20|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     20|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     20|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  249|  1.59M|ESTREE_NODE_1_ARGS(NumericLiteral, Base, NodeNumber, value, false)
  |  |  ------------------
  |  |  |  |  199|  1.59M|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  1.59M|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 1.59M, False: 2.39M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  1.59M|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  1.59M|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  1.59M|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  250|    120|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|    120|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|    120|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 120, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|    120|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|    120|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|    120|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  251|      0|    RegExpLiteral,
  |  |  252|      0|    Base,
  |  |  253|      0|    NodeLabel,
  |  |  254|      0|    pattern,
  |  |  255|      0|    false,
  |  |  256|      0|    NodeLabel,
  |  |  257|      0|    flags,
  |  |  258|      0|    false)
  |  |  259|      5|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      5|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      5|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 5, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      5|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      5|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      5|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  260|      0|    BigIntLiteral, Base,
  |  |  261|      0|    NodeLabel, bigint, false)
  |  |  262|       |
  |  |  263|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  264|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  265|     98|ESTREE_NODE_1_ARGS(SequenceExpression, Base, NodeList, expressions, false)
  |  |  ------------------
  |  |  |  |  199|     98|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     98|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 98, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     98|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     98|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     98|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  266|      2|ESTREE_NODE_1_ARGS(ObjectExpression, Base, NodeList, properties, false)
  |  |  ------------------
  |  |  |  |  199|      2|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      2|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 2, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      2|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      2|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      2|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  267|    101|ESTREE_NODE_2_ARGS(ArrayExpression, Base,
  |  |  ------------------
  |  |  |  |  200|    101|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|    101|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 101, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|    101|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|    101|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|    101|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  268|      0|    NodeList, elements, false,
  |  |  269|      0|    NodeBoolean, trailingComma, false)
  |  |  270|       |
  |  |  271|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  272|      0|    SpreadElement, Base,
  |  |  273|      0|    NodePtr, argument, false)
  |  |  274|       |
  |  |  275|  25.0k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  25.0k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  25.0k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 25.0k, False: 3.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  25.0k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  25.0k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  25.0k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  276|      0|    NewExpression, Base,
  |  |  277|      0|    NodePtr, callee, false,
  |  |  278|      0|    NodePtr, typeArguments, true,
  |  |  279|      0|    NodeList, arguments, false)
  |  |  280|      0|ESTREE_IGNORE_IF_EMPTY(NewExpression, typeArguments)
  |  |  281|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  282|      0|    YieldExpression, Base,
  |  |  283|      0|    NodePtr, argument, true,
  |  |  284|      0|    NodeBoolean, delegate, true)
  |  |  285|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  286|      0|    AwaitExpression, Base,
  |  |  287|      0|    NodePtr, argument, false)
  |  |  288|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  289|      0|    ImportExpression, Base,
  |  |  290|      0|    NodePtr, source, false,
  |  |  291|      0|    NodePtr, attributes, true)
  |  |  292|       |
  |  |  293|      0|ESTREE_FIRST(CallExpressionLike, Base)
  |  |  294|      3|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      3|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      3|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 3, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      3|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      3|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      3|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  295|      0|    CallExpression, CallExpressionLike,
  |  |  296|      0|    NodePtr, callee, false,
  |  |  297|      0|    NodePtr, typeArguments, true,
  |  |  298|      0|    NodeList, arguments, false)
  |  |  299|      0|ESTREE_IGNORE_IF_EMPTY(CallExpression, typeArguments)
  |  |  300|       |
  |  |  301|     16|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|     16|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     16|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 16, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     16|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     16|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     16|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  302|      0|    OptionalCallExpression, CallExpressionLike,
  |  |  303|      0|    NodePtr, callee, false,
  |  |  304|      0|    NodePtr, typeArguments, true,
  |  |  305|      0|    NodeList, arguments, false,
  |  |  306|      0|    NodeBoolean, optional, false)
  |  |  307|      0|ESTREE_IGNORE_IF_EMPTY(OptionalCallExpression, typeArguments)
  |  |  308|      0|ESTREE_LAST(CallExpressionLike)
  |  |  309|       |
  |  |  310|  4.55k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  4.55k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  4.55k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 4.55k, False: 3.98M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  4.55k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  4.55k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  4.55k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  311|      0|    AssignmentExpression,
  |  |  312|      0|    Base,
  |  |  313|      0|    NodeLabel,
  |  |  314|      0|    operator,
  |  |  315|      0|    false,
  |  |  316|      0|    NodePtr,
  |  |  317|      0|    left,
  |  |  318|      0|    false,
  |  |  319|      0|    NodePtr,
  |  |  320|      0|    right,
  |  |  321|      0|    false)
  |  |  322|       |
  |  |  323|  25.9k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  25.9k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  25.9k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 25.9k, False: 3.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  25.9k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  25.9k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  25.9k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  324|      0|    UnaryExpression,
  |  |  325|      0|    Base,
  |  |  326|      0|    NodeLabel,
  |  |  327|      0|    operator,
  |  |  328|      0|    false,
  |  |  329|      0|    NodePtr,
  |  |  330|      0|    argument,
  |  |  331|      0|    false,
  |  |  332|      0|    NodeBoolean,
  |  |  333|      0|    prefix,
  |  |  334|      0|    false)
  |  |  335|       |
  |  |  336|      1|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      1|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      1|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 1, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      1|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      1|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      1|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  337|      0|    UpdateExpression,
  |  |  338|      0|    Base,
  |  |  339|      0|    NodeLabel,
  |  |  340|      0|    operator,
  |  |  341|      0|    false,
  |  |  342|      0|    NodePtr,
  |  |  343|      0|    argument,
  |  |  344|      0|    false,
  |  |  345|      0|    NodeBoolean,
  |  |  346|      0|    prefix,
  |  |  347|      0|    false)
  |  |  348|       |
  |  |  349|      0|ESTREE_FIRST(MemberExpressionLike, Base)
  |  |  350|  17.5k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  17.5k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  17.5k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 17.5k, False: 3.97M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  17.5k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  17.5k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  17.5k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  351|      0|    MemberExpression, MemberExpressionLike,
  |  |  352|      0|    NodePtr, object, false,
  |  |  353|      0|    NodePtr, property, false,
  |  |  354|      0|    NodeBoolean, computed, false)
  |  |  355|       |
  |  |  356|  25.9k|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|  25.9k|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  25.9k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 25.9k, False: 3.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  25.9k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  25.9k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  25.9k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  357|      0|    OptionalMemberExpression, MemberExpressionLike,
  |  |  358|      0|    NodePtr, object, false,
  |  |  359|      0|    NodePtr, property, false,
  |  |  360|      0|    NodeBoolean, computed, false,
  |  |  361|      0|    NodeBoolean, optional, false)
  |  |  362|      0|ESTREE_LAST(MemberExpressionLike)
  |  |  363|       |
  |  |  364|  25.3k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  25.3k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  25.3k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 25.3k, False: 3.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  25.3k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  25.3k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  25.3k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  365|      0|    LogicalExpression,
  |  |  366|      0|    Base,
  |  |  367|      0|    NodePtr,
  |  |  368|      0|    left,
  |  |  369|      0|    false,
  |  |  370|      0|    NodePtr,
  |  |  371|      0|    right,
  |  |  372|      0|    false,
  |  |  373|      0|    NodeLabel,
  |  |  374|      0|    operator,
  |  |  375|      0|    false)
  |  |  376|       |
  |  |  377|  3.66k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  3.66k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  3.66k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 3.66k, False: 3.98M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  3.66k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  3.66k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  3.66k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  378|      0|    ConditionalExpression,
  |  |  379|      0|    Base,
  |  |  380|      0|    NodePtr,
  |  |  381|      0|    test,
  |  |  382|      0|    false,
  |  |  383|      0|    NodePtr,
  |  |  384|      0|    alternate,
  |  |  385|      0|    false,
  |  |  386|      0|    NodePtr,
  |  |  387|      0|    consequent,
  |  |  388|      0|    false)
  |  |  389|       |
  |  |  390|   103k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|   103k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   103k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 103k, False: 3.88M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   103k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   103k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   103k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  391|      0|    BinaryExpression,
  |  |  392|      0|    Base,
  |  |  393|      0|    NodePtr,
  |  |  394|      0|    left,
  |  |  395|      0|    false,
  |  |  396|      0|    NodePtr,
  |  |  397|      0|    right,
  |  |  398|      0|    false,
  |  |  399|      0|    NodeLabel,
  |  |  400|      0|    operator,
  |  |  401|      0|    false)
  |  |  402|       |
  |  |  403|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  404|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  405|       |
  |  |  406|   926k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|   926k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   926k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 926k, False: 3.06M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   926k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   926k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   926k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|      0|    Identifier, Base,
  |  |  408|      0|    NodeLabel, name, false,
  |  |  409|      0|    NodePtr, typeAnnotation, true,
  |  |  410|      0|    NodeBoolean, optional, false)
  |  |  411|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, typeAnnotation)
  |  |  412|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, optional)
  |  |  413|       |
  |  |  414|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  415|      0|    PrivateName, Base,
  |  |  416|      0|    NodePtr, id, false)
  |  |  417|       |
  |  |  418|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  419|      0|    MetaProperty,
  |  |  420|      0|    Base,
  |  |  421|      0|    NodePtr,
  |  |  422|      0|    meta,
  |  |  423|      0|    false,
  |  |  424|      0|    NodePtr,
  |  |  425|      0|    property,
  |  |  426|      0|    false)
  |  |  427|       |
  |  |  428|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  429|      0|    SwitchCase,
  |  |  430|      0|    Base,
  |  |  431|      0|    NodePtr,
  |  |  432|      0|    test,
  |  |  433|      0|    true,
  |  |  434|      0|    NodeList,
  |  |  435|      0|    consequent,
  |  |  436|      0|    false)
  |  |  437|       |
  |  |  438|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  439|      0|    CatchClause,
  |  |  440|      0|    Base,
  |  |  441|      0|    NodePtr,
  |  |  442|      0|    param,
  |  |  443|      0|    true,
  |  |  444|      0|    NodePtr,
  |  |  445|      0|    body,
  |  |  446|      0|    false)
  |  |  447|       |
  |  |  448|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  449|      0|    VariableDeclarator,
  |  |  450|      0|    Base,
  |  |  451|      0|    NodePtr,
  |  |  452|      0|    init,
  |  |  453|      0|    true,
  |  |  454|      0|    NodePtr,
  |  |  455|      0|    id,
  |  |  456|      0|    false)
  |  |  457|       |
  |  |  458|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  459|      0|    VariableDeclaration,
  |  |  460|      0|    Base,
  |  |  461|      0|    NodeLabel,
  |  |  462|      0|    kind,
  |  |  463|      0|    false,
  |  |  464|      0|    NodeList,
  |  |  465|      0|    declarations,
  |  |  466|      0|    false)
  |  |  467|       |
  |  |  468|  23.2k|ESTREE_NODE_2_ARGS(TemplateLiteral, Base,
  |  |  ------------------
  |  |  |  |  200|  23.2k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  23.2k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 23.2k, False: 3.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  23.2k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  23.2k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  23.2k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  469|      0|                   NodeList, quasis, false,
  |  |  470|      0|                   NodeList, expressions, false)
  |  |  471|       |
  |  |  472|  2.82k|ESTREE_NODE_2_ARGS(TaggedTemplateExpression, Base,
  |  |  ------------------
  |  |  |  |  200|  2.82k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  2.82k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 2.82k, False: 3.98M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  2.82k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  2.82k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  2.82k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  473|      0|                   NodePtr, tag, false,
  |  |  474|      0|                   NodePtr, quasi, false)
  |  |  475|       |
  |  |  476|       |// In ESTree, it is defined as {tail : boolean,
  |  |  477|       |//                              value : {cooked : string, raw : string}},
  |  |  478|       |// we flatten the value field.
  |  |  479|       |// If the template literal is tagged and the text has an invalid escape,
  |  |  480|       |// cooked will be null.
  |  |  481|   374k|ESTREE_NODE_3_ARGS(TemplateElement, Base,
  |  |  ------------------
  |  |  |  |  201|   374k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   374k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 374k, False: 3.61M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   374k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   374k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   374k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  482|      0|                   NodeBoolean, tail, false,
  |  |  483|      0|                   NodeString, cooked, true,
  |  |  484|      0|                   NodeLabel, raw, false)
  |  |  485|       |
  |  |  486|      1|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  204|      1|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      1|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 1, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      1|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      1|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      1|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  487|      0|    Property, Base,
  |  |  488|      0|    NodePtr, key, false,
  |  |  489|      0|    NodePtr, value, false,
  |  |  490|      0|    NodeLabel, kind, false,
  |  |  491|      0|    NodeBoolean, computed, false,
  |  |  492|      0|    NodeBoolean, method, false,
  |  |  493|      0|    NodeBoolean, shorthand, false)
  |  |  494|       |
  |  |  495|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  496|      0|    ClassDeclaration, Base,
  |  |  497|      0|    NodePtr, id, true,
  |  |  498|      0|    NodePtr, typeParameters, true,
  |  |  499|      0|    NodePtr, superClass, true,
  |  |  500|      0|    NodePtr, superTypeParameters, true,
  |  |  501|      0|    NodeList, implements, false,
  |  |  502|      0|    NodeList, decorators, false,
  |  |  503|      0|    NodePtr, body, false)
  |  |  504|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, typeParameters)
  |  |  505|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, superTypeParameters)
  |  |  506|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, implements)
  |  |  507|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, decorators)
  |  |  508|       |
  |  |  509|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  510|      0|    ClassExpression, Base,
  |  |  511|      0|    NodePtr, id, true,
  |  |  512|      0|    NodePtr, typeParameters, true,
  |  |  513|      0|    NodePtr, superClass, true,
  |  |  514|      0|    NodePtr, superTypeParameters, true,
  |  |  515|      0|    NodeList, implements, false,
  |  |  516|      0|    NodeList, decorators, false,
  |  |  517|      0|    NodePtr, body, false)
  |  |  518|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, typeParameters)
  |  |  519|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, superTypeParameters)
  |  |  520|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, implements)
  |  |  521|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, decorators)
  |  |  522|       |
  |  |  523|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  524|      0|    ClassBody, Base,
  |  |  525|      0|    NodeList, body, false)
  |  |  526|       |
  |  |  527|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  528|      0|    ClassProperty, Base,
  |  |  529|      0|    NodePtr, key, false,
  |  |  530|      0|    NodePtr, value, true,
  |  |  531|      0|    NodeBoolean, computed, false,
  |  |  532|      0|    NodeBoolean, static, false,
  |  |  533|      0|    NodeBoolean, declare, false,
  |  |  534|      0|    NodeBoolean, optional, false,
  |  |  535|      0|    NodePtr, variance, true,
  |  |  536|      0|    NodePtr, typeAnnotation, true,
  |  |  537|      0|    NodePtr, tsModifiers, true)
  |  |  538|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, variance)
  |  |  539|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, optional)
  |  |  540|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, typeAnnotation)
  |  |  541|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, tsModifiers)
  |  |  542|       |
  |  |  543|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  544|      0|    ClassPrivateProperty, Base,
  |  |  545|      0|    NodePtr, key, false,
  |  |  546|      0|    NodePtr, value, true,
  |  |  547|      0|    NodeBoolean, static, false,
  |  |  548|      0|    NodeBoolean, declare, false,
  |  |  549|      0|    NodeBoolean, optional, false,
  |  |  550|      0|    NodePtr, variance, true,
  |  |  551|      0|    NodePtr, typeAnnotation, true,
  |  |  552|      0|    NodePtr, tsModifiers, true)
  |  |  553|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, variance)
  |  |  554|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, optional)
  |  |  555|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, typeAnnotation)
  |  |  556|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, tsModifiers)
  |  |  557|       |
  |  |  558|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  559|      0|    MethodDefinition, Base,
  |  |  560|      0|    NodePtr, key, false,
  |  |  561|      0|    NodePtr, value, false,
  |  |  562|      0|    NodeLabel, kind, false,
  |  |  563|      0|    NodeBoolean, computed, false,
  |  |  564|      0|    NodeBoolean, static, false)
  |  |  565|       |
  |  |  566|       |// Imports ========================================
  |  |  567|       |
  |  |  568|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  569|      0|    ImportDeclaration, Base,
  |  |  570|      0|    NodeList, specifiers, false,
  |  |  571|      0|    NodePtr, source, false,
  |  |  572|      0|    NodeList, assertions, true,
  |  |  573|      0|    NodeLabel, importKind, false)
  |  |  574|       |
  |  |  575|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  576|      0|    ImportSpecifier, Base,
  |  |  577|      0|    NodePtr, imported, false,
  |  |  578|      0|    NodePtr, local, false,
  |  |  579|      0|    NodeLabel, importKind, false)
  |  |  580|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  581|      0|    ImportDefaultSpecifier, Base,
  |  |  582|      0|    NodePtr, local, false)
  |  |  583|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  584|      0|    ImportNamespaceSpecifier, Base,
  |  |  585|      0|    NodePtr, local, false)
  |  |  586|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  587|      0|    ImportAttribute, Base,
  |  |  588|      0|    NodePtr, key, false,
  |  |  589|      0|    NodePtr, value, false)
  |  |  590|       |
  |  |  591|       |
  |  |  592|       |// ================================================
  |  |  593|       |
  |  |  594|       |// Exports ========================================
  |  |  595|       |
  |  |  596|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  597|      0|    ExportNamedDeclaration, Base,
  |  |  598|      0|    NodePtr, declaration, true,
  |  |  599|      0|    NodeList, specifiers, false,
  |  |  600|      0|    NodePtr, source, true,
  |  |  601|      0|    NodeLabel, exportKind, 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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  604|      0|    ExportSpecifier, Base,
  |  |  605|      0|    NodePtr, exported, false,
  |  |  606|      0|    NodePtr, local, false)
  |  |  607|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  608|      0|    ExportNamespaceSpecifier, Base,
  |  |  609|      0|    NodePtr, exported, false)
  |  |  610|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  611|      0|    ExportDefaultDeclaration, Base,
  |  |  612|      0|    NodePtr, declaration, false)
  |  |  613|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  614|      0|    ExportAllDeclaration, Base,
  |  |  615|      0|    NodePtr, source, false,
  |  |  616|      0|    NodeLabel, exportKind, false)
  |  |  617|       |
  |  |  618|       |// ================================================
  |  |  619|       |
  |  |  620|       |// Patterns =======================================
  |  |  621|      0|ESTREE_FIRST(Pattern, Base)
  |  |  622|       |
  |  |  623|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  624|      0|    ObjectPattern, Pattern,
  |  |  625|      0|    NodeList, properties, false,
  |  |  626|      0|    NodePtr, typeAnnotation, true)
  |  |  627|      0|ESTREE_IGNORE_IF_EMPTY(ObjectPattern, typeAnnotation)
  |  |  628|       |
  |  |  629|  22.3k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|  22.3k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  22.3k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 22.3k, False: 3.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  22.3k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  22.3k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  22.3k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  630|      0|    ArrayPattern, Pattern,
  |  |  631|      0|    NodeList, elements, false,
  |  |  632|      0|    NodePtr, typeAnnotation, true)
  |  |  633|      0|ESTREE_IGNORE_IF_EMPTY(ArrayPattern, typeAnnotation)
  |  |  634|       |
  |  |  635|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  636|      0|    RestElement, Pattern,
  |  |  637|      0|    NodePtr, argument, false)
  |  |  638|       |
  |  |  639|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|    AssignmentPattern, Pattern,
  |  |  641|      0|    NodePtr, left, false,          // Pattern
  |  |  642|       |    NodePtr, right, false)         // Expression
  |  |  643|       |
  |  |  644|      0|ESTREE_LAST(Pattern)
  |  |  645|       |
  |  |  646|       |// ================================================
  |  |  647|       |
  |  |  648|       |// Flow match =====================================
  |  |  649|       |
  |  |  650|      0|#if HERMES_PARSE_FLOW
  |  |  651|       |
  |  |  652|       |// Match statement
  |  |  653|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  654|      0|    MatchStatementCase, Base,
  |  |  655|      0|    NodePtr, pattern, false, // MatchPattern
  |  |  656|      0|    NodePtr, body, false, // BlockStatement
  |  |  657|      0|    NodePtr, guard, true // Expression | null
  |  |  658|      0|)
  |  |  659|       |
  |  |  660|       |// Match expression
  |  |  661|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  662|      0|    MatchExpression, Base,
  |  |  663|      0|    NodePtr, argument, false, // Expression
  |  |  664|      0|    NodeList, cases, false // [ MatchExpressionCase ]
  |  |  665|      0|)
  |  |  666|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  667|      0|    MatchExpressionCase, Base,
  |  |  668|      0|    NodePtr, pattern, false, // MatchPattern
  |  |  669|      0|    NodePtr, body, false, // Expression
  |  |  670|      0|    NodePtr, guard, true // Expression | null
  |  |  671|      0|)
  |  |  672|       |
  |  |  673|       |// Match patterns
  |  |  674|      0|ESTREE_FIRST(MatchPattern, Base)
  |  |  675|       |
  |  |  676|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  677|      0|  MatchWildcardPattern, MatchPattern
  |  |  678|      0|)
  |  |  679|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  680|      0|  MatchLiteralPattern, MatchPattern,
  |  |  681|      0|  NodePtr, literal, false // Literal
  |  |  682|      0|)
  |  |  683|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  684|      0|  MatchUnaryPattern, MatchPattern,
  |  |  685|      0|  NodePtr, argument, false, // Literal
  |  |  686|      0|  NodeLabel, operator, false // "-" | "+"
  |  |  687|      0|)
  |  |  688|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  689|      0|  MatchIdentifierPattern, MatchPattern,
  |  |  690|      0|  NodePtr, id, false // Identifier
  |  |  691|      0|)
  |  |  692|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  693|      0|  MatchBindingPattern, MatchPattern,
  |  |  694|      0|  NodePtr, id, false, // Identifier
  |  |  695|      0|  NodeLabel, kind, false // "let" | "const"
  |  |  696|      0|)
  |  |  697|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  698|      0|  MatchObjectPattern, MatchPattern,
  |  |  699|      0|  NodeList, properties, false, // [ MatchObjectPatternProperty ]
  |  |  700|      0|  NodePtr, rest, true // MatchRestPattern | null
  |  |  701|      0|)
  |  |  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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  703|      0|  MatchArrayPattern, MatchPattern,
  |  |  704|      0|  NodeList, elements, false, // [ MatchPattern ]
  |  |  705|      0|  NodePtr, rest, true // MatchRestPattern | null
  |  |  706|      0|)
  |  |  707|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  708|      0|  MatchOrPattern, MatchPattern,
  |  |  709|      0|  NodeList, patterns, false // [ MatchPattern ]
  |  |  710|      0|)
  |  |  711|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  712|      0|  MatchAsPattern, MatchPattern,
  |  |  713|      0|  NodePtr, pattern, false, // MatchPattern
  |  |  714|      0|  NodePtr, target, false // Identifier | MatchBindingPattern
  |  |  715|      0|)
  |  |  716|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  717|      0|  MatchMemberPattern, MatchPattern,
  |  |  718|      0|  NodePtr, base, false, // MatchIdentifierPattern | MatchMemberPattern
  |  |  719|      0|  NodePtr, property, false // Identifier | Literal
  |  |  720|      0|)
  |  |  721|       |
  |  |  722|      0|ESTREE_LAST(MatchPattern)
  |  |  723|       |
  |  |  724|       |// Match pattern auxiliary nodes
  |  |  725|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  726|      0|  MatchObjectPatternProperty, Base,
  |  |  727|      0|  NodePtr, key, false, // Identifier | Literal
  |  |  728|      0|  NodePtr, pattern, false, // MatchPattern
  |  |  729|      0|  NodeBoolean, shorthand, false // boolean
  |  |  730|      0|)
  |  |  731|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  732|      0|  MatchRestPattern, Base,
  |  |  733|      0|  NodePtr, argument, true // MatchBindingPattern | null
  |  |  734|      0|)
  |  |  735|       |
  |  |  736|      0|#endif
  |  |  737|       |
  |  |  738|       |// ================================================
  |  |  739|       |
  |  |  740|       |// JSX ============================================
  |  |  741|       |
  |  |  742|      0|#if HERMES_PARSE_JSX
  |  |  743|       |
  |  |  744|      0|ESTREE_FIRST(JSX, Base)
  |  |  745|       |
  |  |  746|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  747|      0|    JSXIdentifier, JSX,
  |  |  748|      0|    NodeLabel, name, false)
  |  |  749|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  750|      0|    JSXMemberExpression, JSX,
  |  |  751|      0|    NodePtr, object, false,
  |  |  752|      0|    NodePtr, property, false)
  |  |  753|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  754|      0|    JSXNamespacedName, JSX,
  |  |  755|      0|    NodePtr, namespace, false,
  |  |  756|      0|    NodePtr, name, false)
  |  |  757|       |
  |  |  758|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  759|      0|    JSXEmptyExpression, JSX)
  |  |  760|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  761|      0|    JSXExpressionContainer, JSX,
  |  |  762|      0|    NodePtr, expression, false)
  |  |  763|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  764|      0|    JSXSpreadChild, JSX,
  |  |  765|      0|    NodePtr, expression, false)
  |  |  766|       |
  |  |  767|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  768|      0|    JSXOpeningElement, JSX,
  |  |  769|      0|    NodePtr, name, false,
  |  |  770|      0|    NodeList, attributes, false,
  |  |  771|      0|    NodeBoolean, selfClosing, false,
  |  |  772|      0|    NodePtr, typeArguments, true)
  |  |  773|      0|ESTREE_IGNORE_IF_EMPTY(JSXOpeningElement, typeArguments)
  |  |  774|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  775|      0|    JSXClosingElement, JSX,
  |  |  776|      0|    NodePtr, name, false)
  |  |  777|       |
  |  |  778|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  779|      0|    JSXAttribute, JSX,
  |  |  780|      0|    NodePtr, name, false,
  |  |  781|      0|    NodePtr, value, true)
  |  |  782|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  783|      0|    JSXSpreadAttribute, JSX,
  |  |  784|      0|    NodePtr, argument, false)
  |  |  785|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  786|      0|    JSXStringLiteral, JSX,
  |  |  787|      0|    NodeString, value, false,
  |  |  788|      0|    NodeLabel, raw, false)
  |  |  789|       |
  |  |  790|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  791|      0|    JSXText, JSX,
  |  |  792|      0|    NodeString, value, false,
  |  |  793|      0|    NodeLabel, raw, false)
  |  |  794|       |
  |  |  795|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  796|      0|    JSXElement, JSX,
  |  |  797|      0|    NodePtr, openingElement, false,
  |  |  798|      0|    NodeList, children, false,
  |  |  799|      0|    NodePtr, closingElement, true)
  |  |  800|       |
  |  |  801|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  802|      0|    JSXFragment, JSX,
  |  |  803|      0|    NodePtr, openingFragment, false,
  |  |  804|      0|    NodeList, children, false,
  |  |  805|      0|    NodePtr, closingFragment, false)
  |  |  806|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  807|      0|    JSXOpeningFragment, JSX)
  |  |  808|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  809|      0|    JSXClosingFragment, JSX)
  |  |  810|       |
  |  |  811|      0|ESTREE_LAST(JSX)
  |  |  812|       |
  |  |  813|      0|#endif
  |  |  814|       |
  |  |  815|       |// ================================================
  |  |  816|       |
  |  |  817|       |// Types ==========================================
  |  |  818|       |
  |  |  819|      0|#if HERMES_PARSE_FLOW
  |  |  820|       |
  |  |  821|      0|ESTREE_FIRST(Flow, Base)
  |  |  822|       |
  |  |  823|      0|ESTREE_NODE_0_ARGS(ExistsTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  824|      0|ESTREE_NODE_0_ARGS(EmptyTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  825|      0|ESTREE_NODE_0_ARGS(StringTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  826|      0|ESTREE_NODE_0_ARGS(NumberTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  827|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  828|      0|    StringLiteralTypeAnnotation, Flow,
  |  |  829|      0|    NodeString, value, false,
  |  |  830|      0|    NodeString, raw, false)
  |  |  831|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  832|      0|    NumberLiteralTypeAnnotation, Flow,
  |  |  833|      0|    NodeNumber, value, false,
  |  |  834|      0|    NodeLabel, raw, false)
  |  |  835|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  836|      0|    BigIntLiteralTypeAnnotation, Flow,
  |  |  837|      0|    NodeLabel, raw, false)
  |  |  838|      0|ESTREE_NODE_0_ARGS(BooleanTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  839|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  840|      0|    BooleanLiteralTypeAnnotation, Flow,
  |  |  841|      0|    NodeBoolean, value, false,
  |  |  842|      0|    NodeLabel, raw, false)
  |  |  843|      0|ESTREE_NODE_0_ARGS(NullLiteralTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  844|      0|ESTREE_NODE_0_ARGS(SymbolTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  845|      0|ESTREE_NODE_0_ARGS(AnyTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  846|      0|ESTREE_NODE_0_ARGS(MixedTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  847|      0|ESTREE_NODE_0_ARGS(BigIntTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  848|      0|ESTREE_NODE_0_ARGS(VoidTypeAnnotation, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  849|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  850|      0|    FunctionTypeAnnotation, Flow,
  |  |  851|      0|    NodeList, params, false,
  |  |  852|      0|    NodePtr, this, true,
  |  |  853|      0|    NodePtr, returnType, false,
  |  |  854|      0|    NodePtr, rest, true,
  |  |  855|      0|    NodePtr, typeParameters, true)
  |  |  856|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  857|      0|    HookTypeAnnotation, Flow,
  |  |  858|      0|    NodeList, params, false,
  |  |  859|      0|    NodePtr, returnType, false,
  |  |  860|      0|    NodePtr, rest, true,
  |  |  861|      0|    NodePtr, typeParameters, true)
  |  |  862|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  863|      0|    FunctionTypeParam, Flow,
  |  |  864|      0|    NodePtr, name, true,
  |  |  865|      0|    NodePtr, typeAnnotation, false,
  |  |  866|      0|    NodeBoolean, optional, false)
  |  |  867|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  868|      0|    ComponentTypeAnnotation, Flow,
  |  |  869|      0|    NodeList, params, false,
  |  |  870|      0|    NodePtr, rest, true,
  |  |  871|      0|    NodePtr, typeParameters, true,
  |  |  872|      0|    NodePtr, rendersType, true)
  |  |  873|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  874|      0|    ComponentTypeParameter, Flow,
  |  |  875|      0|    NodePtr, name, true,
  |  |  876|      0|    NodePtr, typeAnnotation, false,
  |  |  877|      0|    NodeBoolean, optional, false)
  |  |  878|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  879|      0|    NullableTypeAnnotation, Flow,
  |  |  880|      0|    NodePtr, typeAnnotation, false)
  |  |  881|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  882|      0|    QualifiedTypeIdentifier, Flow,
  |  |  883|      0|    NodePtr, qualification, false,
  |  |  884|      0|    NodePtr, id, false)
  |  |  885|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  886|      0|    TypeofTypeAnnotation, Flow,
  |  |  887|      0|    NodePtr, argument, false,
  |  |  888|      0|    NodePtr, typeArguments, true)
  |  |  889|      0|ESTREE_IGNORE_IF_EMPTY(TypeofTypeAnnotation, typeArguments)
  |  |  890|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  891|      0|    KeyofTypeAnnotation, Flow,
  |  |  892|      0|    NodePtr, argument, false)
  |  |  893|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  894|      0|    TypeOperator, Flow,
  |  |  895|      0|    NodeLabel, operator, false,
  |  |  896|      0|    NodePtr, typeAnnotation, false)
  |  |  897|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  898|      0|    QualifiedTypeofIdentifier, Flow,
  |  |  899|      0|    NodePtr, qualification, false,
  |  |  900|      0|    NodePtr, id, false)
  |  |  901|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  902|      0|    TupleTypeAnnotation, Flow,
  |  |  903|      0|    NodeList, types, false,
  |  |  904|      0|    NodeBoolean, inexact, false)
  |  |  905|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  906|      0|    TupleTypeSpreadElement, Flow,
  |  |  907|      0|    NodePtr, label, true,
  |  |  908|      0|    NodePtr, typeAnnotation, false)
  |  |  909|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  910|      0|    TupleTypeLabeledElement, Flow,
  |  |  911|      0|    NodePtr, label, false,
  |  |  912|      0|    NodePtr, elementType, false,
  |  |  913|      0|    NodeBoolean, optional, false,
  |  |  914|      0|    NodePtr, variance, true)
  |  |  915|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  916|      0|    ArrayTypeAnnotation, Flow,
  |  |  917|      0|    NodePtr, elementType, false)
  |  |  918|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  919|      0|    InferTypeAnnotation, Flow,
  |  |  920|      0|    NodePtr, typeParameter, false)
  |  |  921|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  922|      0|    UnionTypeAnnotation, Flow,
  |  |  923|      0|    NodeList, types, false)
  |  |  924|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  925|      0|    IntersectionTypeAnnotation, Flow,
  |  |  926|      0|    NodeList, types, false)
  |  |  927|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  928|      0|    GenericTypeAnnotation, Flow,
  |  |  929|      0|    NodePtr, id, false,
  |  |  930|      0|    NodePtr, typeParameters, true)
  |  |  931|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  932|      0|    IndexedAccessType, Flow,
  |  |  933|      0|    NodePtr, objectType, false,
  |  |  934|      0|    NodePtr, indexType, false)
  |  |  935|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  936|      0|    OptionalIndexedAccessType, Flow,
  |  |  937|      0|    NodePtr, objectType, false,
  |  |  938|      0|    NodePtr, indexType, false,
  |  |  939|      0|    NodeBoolean, optional, false)
  |  |  940|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  941|      0|    ConditionalTypeAnnotation, Flow,
  |  |  942|      0|    NodePtr, checkType, false,
  |  |  943|      0|    NodePtr, extendsType, false,
  |  |  944|      0|    NodePtr, trueType, false,
  |  |  945|      0|    NodePtr, falseType, false)
  |  |  946|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  947|      0|    TypePredicate, Flow,
  |  |  948|      0|    NodePtr, parameterName, false,
  |  |  949|      0|    NodePtr, typeAnnotation, true,
  |  |  950|      0|    NodeString, kind, true)
  |  |  951|       |
  |  |  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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  953|      0|    InterfaceTypeAnnotation, Flow,
  |  |  954|      0|    NodeList, extends, false,
  |  |  955|      0|    NodePtr, body, true)
  |  |  956|       |
  |  |  957|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  958|      0|    TypeAlias, Flow,
  |  |  959|      0|    NodePtr, id, false,
  |  |  960|      0|    NodePtr, typeParameters, true,
  |  |  961|      0|    NodePtr, right, false)
  |  |  962|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  963|      0|    OpaqueType, Flow,
  |  |  964|      0|    NodePtr, id, false,
  |  |  965|      0|    NodePtr, typeParameters, true,
  |  |  966|      0|    NodePtr, impltype, false,
  |  |  967|      0|    NodePtr, supertype, true)
  |  |  968|       |
  |  |  969|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  970|      0|    InterfaceDeclaration, Flow,
  |  |  971|      0|    NodePtr, id, false,
  |  |  972|      0|    NodePtr, typeParameters, true,
  |  |  973|      0|    NodeList, extends, false,
  |  |  974|      0|    NodePtr, body, false)
  |  |  975|       |
  |  |  976|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  977|      0|    DeclareTypeAlias, Flow,
  |  |  978|      0|    NodePtr, id, false,
  |  |  979|      0|    NodePtr, typeParameters, true,
  |  |  980|      0|    NodePtr, right, false)
  |  |  981|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  982|      0|    DeclareOpaqueType, Flow,
  |  |  983|      0|    NodePtr, id, false,
  |  |  984|      0|    NodePtr, typeParameters, true,
  |  |  985|      0|    NodePtr, impltype, true,
  |  |  986|      0|    NodePtr, supertype, true)
  |  |  987|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  988|      0|    DeclareInterface, Flow,
  |  |  989|      0|    NodePtr, id, false,
  |  |  990|      0|    NodePtr, typeParameters, true,
  |  |  991|      0|    NodeList, extends, false,
  |  |  992|      0|    NodePtr, body, false)
  |  |  993|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  994|      0|    DeclareClass, Flow,
  |  |  995|      0|    NodePtr, id, false,
  |  |  996|      0|    NodePtr, typeParameters, true,
  |  |  997|      0|    NodeList, extends, false,
  |  |  998|      0|    NodeList, implements, false,
  |  |  999|      0|    NodeList, mixins, false,
  |  | 1000|      0|    NodePtr, body, false)
  |  | 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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1002|      0|    DeclareFunction, Flow,
  |  | 1003|      0|    NodePtr, id, false,
  |  | 1004|      0|    NodePtr, predicate, true)
  |  | 1005|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1006|      0|    DeclareHook, Flow,
  |  | 1007|      0|    NodePtr, id, false)
  |  | 1008|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1009|      0|    DeclareComponent, Flow,
  |  | 1010|      0|    NodePtr, id, false,
  |  | 1011|      0|    NodeList, params, false,
  |  | 1012|      0|    NodePtr, rest, true,
  |  | 1013|      0|    NodePtr, typeParameters, true,
  |  | 1014|      0|    NodePtr, rendersType, true)
  |  | 1015|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1016|      0|    DeclareVariable, Flow,
  |  | 1017|      0|    NodePtr, id, false,
  |  | 1018|      0|    NodeLabel, kind, false)
  |  | 1019|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1020|      0|    DeclareEnum, Flow,
  |  | 1021|      0|    NodePtr, id, false,
  |  | 1022|      0|    NodePtr, body, false)
  |  | 1023|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1024|      0|    DeclareExportDeclaration, Flow,
  |  | 1025|      0|    NodePtr, declaration, true,
  |  | 1026|      0|    NodeList, specifiers, false,
  |  | 1027|      0|    NodePtr, source, true,
  |  | 1028|      0|    NodeBoolean, default, false)
  |  | 1029|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1030|      0|    DeclareExportAllDeclaration, Flow,
  |  | 1031|      0|    NodePtr, source, false)
  |  | 1032|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1033|      0|    DeclareModule, Flow,
  |  | 1034|      0|    NodePtr, id, false,
  |  | 1035|      0|    NodePtr, body, false)
  |  | 1036|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1037|      0|    DeclareNamespace, Flow,
  |  | 1038|      0|    NodePtr, id, false,
  |  | 1039|      0|    NodePtr, body, false)
  |  | 1040|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1041|      0|    DeclareModuleExports, Flow,
  |  | 1042|      0|    NodePtr, typeAnnotation, false)
  |  | 1043|       |
  |  | 1044|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1045|      0|    InterfaceExtends, Flow,
  |  | 1046|      0|    NodePtr, id, false,
  |  | 1047|      0|    NodePtr, typeParameters, true)
  |  | 1048|       |
  |  | 1049|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1050|      0|    ClassImplements, Flow,
  |  | 1051|      0|    NodePtr, id, false,
  |  | 1052|      0|    NodePtr, typeParameters, true)
  |  | 1053|       |
  |  | 1054|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1055|      0|    TypeAnnotation, Flow,
  |  | 1056|      0|    NodePtr, typeAnnotation, false)
  |  | 1057|       |
  |  | 1058|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1059|      0|    ObjectTypeAnnotation, Flow,
  |  | 1060|      0|    NodeList, properties, false,
  |  | 1061|      0|    NodeList, indexers, false,
  |  | 1062|      0|    NodeList, callProperties, false,
  |  | 1063|      0|    NodeList, internalSlots, false,
  |  | 1064|      0|    NodeBoolean, inexact, false,
  |  | 1065|      0|    NodeBoolean, exact, false)
  |  | 1066|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1067|      0|    ObjectTypeProperty, Flow,
  |  | 1068|      0|    NodePtr, key, false,
  |  | 1069|      0|    NodePtr, value, false,
  |  | 1070|      0|    NodeBoolean, method, false,
  |  | 1071|      0|    NodeBoolean, optional, false,
  |  | 1072|      0|    NodeBoolean, static, false,
  |  | 1073|      0|    NodeBoolean, proto, false,
  |  | 1074|      0|    NodePtr, variance, true,
  |  | 1075|      0|    NodeLabel, kind, false)
  |  | 1076|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|    ObjectTypeSpreadProperty, Flow,
  |  | 1078|      0|    NodePtr, argument, false)
  |  | 1079|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1080|      0|    ObjectTypeInternalSlot, Flow,
  |  | 1081|      0|    NodePtr, id, false,
  |  | 1082|      0|    NodePtr, value, false,
  |  | 1083|      0|    NodeBoolean, optional, false,
  |  | 1084|      0|    NodeBoolean, static, false,
  |  | 1085|      0|    NodeBoolean, method, false)
  |  | 1086|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1087|      0|    ObjectTypeCallProperty, Flow,
  |  | 1088|      0|    NodePtr, value, false,
  |  | 1089|      0|    NodeBoolean, static, false)
  |  | 1090|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1091|      0|    ObjectTypeIndexer, Flow,
  |  | 1092|      0|    NodePtr, id, true,
  |  | 1093|      0|    NodePtr, key, false,
  |  | 1094|      0|    NodePtr, value, false,
  |  | 1095|      0|    NodeBoolean, static, false,
  |  | 1096|      0|    NodePtr, variance, true)
  |  | 1097|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1098|      0|    ObjectTypeMappedTypeProperty, Flow,
  |  | 1099|      0|    NodePtr, keyTparam, false,
  |  | 1100|      0|    NodePtr, propType, false,
  |  | 1101|      0|    NodePtr, sourceType, false,
  |  | 1102|      0|    NodePtr, variance, true,
  |  | 1103|      0|    NodeString, optional, true)
  |  | 1104|       |
  |  | 1105|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1106|      0|    Variance, Flow,
  |  | 1107|      0|    NodeLabel, kind, false)
  |  | 1108|       |
  |  | 1109|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1110|      0|    TypeParameterDeclaration, Flow,
  |  | 1111|      0|    NodeList, params, false)
  |  | 1112|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1113|      0|    TypeParameter, Flow,
  |  | 1114|      0|    NodeLabel, name, false,
  |  | 1115|      0|    NodeBoolean, const, false,
  |  | 1116|      0|    NodePtr, bound, true,
  |  | 1117|      0|    NodePtr, variance, true,
  |  | 1118|      0|    NodePtr, default, true,
  |  | 1119|      0|    NodeBoolean, usesExtendsBound, false)
  |  | 1120|      0|ESTREE_IGNORE_IF_EMPTY(TypeParameter, usesExtendsBound)
  |  | 1121|      0|ESTREE_IGNORE_IF_EMPTY(TypeParameter, const)
  |  | 1122|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1123|      0|    TypeParameterInstantiation, Flow,
  |  | 1124|      0|    NodeList, params, false)
  |  | 1125|       |
  |  | 1126|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1127|      0|    TypeCastExpression, Flow,
  |  | 1128|      0|    NodePtr, expression, false,
  |  | 1129|      0|    NodePtr, typeAnnotation, false)
  |  | 1130|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1131|      0|    AsExpression, Flow,
  |  | 1132|      0|    NodePtr, expression, false,
  |  | 1133|      0|    NodePtr, typeAnnotation, false)
  |  | 1134|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1135|      0|    AsConstExpression, Flow,
  |  | 1136|      0|    NodePtr, expression, false)
  |  | 1137|       |
  |  | 1138|      0|ESTREE_NODE_0_ARGS(InferredPredicate, Flow)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1139|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1140|      0|    DeclaredPredicate, Flow,
  |  | 1141|      0|    NodePtr, value, false)
  |  | 1142|       |
  |  | 1143|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1144|      0|    EnumDeclaration, Flow,
  |  | 1145|      0|    NodePtr, id, false,
  |  | 1146|      0|    NodePtr, body, false)
  |  | 1147|       |
  |  | 1148|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1149|      0|    EnumStringBody, Flow,
  |  | 1150|      0|    NodeList, members, false,
  |  | 1151|      0|    NodeBoolean, explicitType, false,
  |  | 1152|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1153|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1154|      0|    EnumNumberBody, Flow,
  |  | 1155|      0|    NodeList, members, false,
  |  | 1156|      0|    NodeBoolean, explicitType, false,
  |  | 1157|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1158|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1159|      0|    EnumBigIntBody, Flow,
  |  | 1160|      0|    NodeList, members, false,
  |  | 1161|      0|    NodeBoolean, explicitType, false,
  |  | 1162|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1163|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1164|      0|    EnumBooleanBody, Flow,
  |  | 1165|      0|    NodeList, members, false,
  |  | 1166|      0|    NodeBoolean, explicitType, false,
  |  | 1167|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1168|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1169|      0|    EnumSymbolBody, Flow,
  |  | 1170|      0|    NodeList, members, false,
  |  | 1171|      0|    NodeBoolean, hasUnknownMembers, false)
  |  | 1172|       |
  |  | 1173|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1174|      0|    EnumDefaultedMember, Flow,
  |  | 1175|      0|    NodePtr, id, false)
  |  | 1176|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1177|      0|    EnumStringMember, Flow,
  |  | 1178|      0|    NodePtr, id, false,
  |  | 1179|      0|    NodePtr, init, false)
  |  | 1180|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1181|      0|    EnumNumberMember, Flow,
  |  | 1182|      0|    NodePtr, id, false,
  |  | 1183|      0|    NodePtr, init, false)
  |  | 1184|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1185|      0|    EnumBigIntMember, Flow,
  |  | 1186|      0|    NodePtr, id, false,
  |  | 1187|      0|    NodePtr, init, false)
  |  | 1188|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1189|      0|    EnumBooleanMember, Flow,
  |  | 1190|      0|    NodePtr, id, false,
  |  | 1191|      0|    NodePtr, init, false)
  |  | 1192|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1193|      0|    ComponentParameter, Flow,
  |  | 1194|      0|    NodePtr, name, false,
  |  | 1195|      0|    NodePtr, local, false,
  |  | 1196|      0|    NodeBoolean, shorthand, false)
  |  | 1197|       |
  |  | 1198|      0|ESTREE_LAST(Flow)
  |  | 1199|       |
  |  | 1200|      0|#endif
  |  | 1201|       |
  |  | 1202|      0|#if HERMES_PARSE_TS
  |  | 1203|       |
  |  | 1204|      0|ESTREE_FIRST(TS, Base)
  |  | 1205|       |
  |  | 1206|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1207|      0|    TSTypeAnnotation, TS,
  |  | 1208|      0|    NodePtr, typeAnnotation, false)
  |  | 1209|       |
  |  | 1210|      0|ESTREE_NODE_0_ARGS(TSAnyKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1211|      0|ESTREE_NODE_0_ARGS(TSNumberKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1212|      0|ESTREE_NODE_0_ARGS(TSBooleanKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1213|      0|ESTREE_NODE_0_ARGS(TSStringKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1214|      0|ESTREE_NODE_0_ARGS(TSSymbolKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1215|      0|ESTREE_NODE_0_ARGS(TSVoidKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1216|      0|ESTREE_NODE_0_ARGS(TSUndefinedKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1217|      0|ESTREE_NODE_0_ARGS(TSUnknownKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1218|      0|ESTREE_NODE_0_ARGS(TSNeverKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1219|      0|ESTREE_NODE_0_ARGS(TSBigIntKeyword, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1220|      0|ESTREE_NODE_0_ARGS(TSThisType, TS)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1221|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1222|      0|    TSLiteralType, TS,
  |  | 1223|      0|    NodePtr, literal, false)
  |  | 1224|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1225|      0|    TSIndexedAccessType, TS,
  |  | 1226|      0|    NodePtr, objectType, false,
  |  | 1227|      0|    NodePtr, indexType, false)
  |  | 1228|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1229|      0|    TSArrayType, TS,
  |  | 1230|      0|    NodePtr, elementType, false)
  |  | 1231|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1232|      0|    TSTypeReference, TS,
  |  | 1233|      0|    NodePtr, typeName, false,
  |  | 1234|      0|    NodePtr, typeParameters, true)
  |  | 1235|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1236|      0|    TSQualifiedName, TS,
  |  | 1237|      0|    NodePtr, left, false,
  |  | 1238|      0|    NodePtr, right, true)
  |  | 1239|       |
  |  | 1240|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1241|      0|    TSFunctionType, TS,
  |  | 1242|      0|    NodeList, params, false,
  |  | 1243|      0|    NodePtr, returnType, false,
  |  | 1244|      0|    NodePtr, typeParameters, true)
  |  | 1245|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1246|      0|    TSConstructorType, TS,
  |  | 1247|      0|    NodeList, params, false,
  |  | 1248|      0|    NodePtr, returnType, false,
  |  | 1249|      0|    NodePtr, typeParameters, true)
  |  | 1250|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1251|      0|    TSTypePredicate, TS,
  |  | 1252|      0|    NodePtr, parameterName, false,
  |  | 1253|      0|    NodePtr, typeAnnotation, false)
  |  | 1254|       |
  |  | 1255|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1256|      0|    TSTupleType, TS,
  |  | 1257|      0|    NodeList, elementTypes, false)
  |  | 1258|       |
  |  | 1259|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1260|      0|    TSTypeAssertion, TS,
  |  | 1261|      0|    NodePtr, typeAnnotation, false,
  |  | 1262|      0|    NodePtr, expression, false)
  |  | 1263|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1264|      0|    TSAsExpression, TS,
  |  | 1265|      0|    NodePtr, expression, false,
  |  | 1266|      0|    NodePtr, typeAnnotation, false)
  |  | 1267|       |
  |  | 1268|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1269|      0|    TSParameterProperty, TS,
  |  | 1270|      0|    NodePtr, parameter, false,
  |  | 1271|      0|    NodeLabel, accessibility, true,
  |  | 1272|      0|    NodeBoolean, readonly, false,
  |  | 1273|      0|    NodeBoolean, static, false,
  |  | 1274|      0|    NodeBoolean, export, false)
  |  | 1275|       |
  |  | 1276|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1277|      0|    TSTypeAliasDeclaration, TS,
  |  | 1278|      0|    NodePtr, id, false,
  |  | 1279|      0|    NodePtr, typeParameters, true,
  |  | 1280|      0|    NodePtr, typeAnnotation, false)
  |  | 1281|       |
  |  | 1282|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1283|      0|    TSInterfaceDeclaration, TS,
  |  | 1284|      0|    NodePtr, id, false,
  |  | 1285|      0|    NodePtr, body, false,
  |  | 1286|      0|    NodeList, extends, false,
  |  | 1287|      0|    NodePtr, typeParameters, true)
  |  | 1288|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1289|      0|    TSInterfaceHeritage, TS,
  |  | 1290|      0|    NodePtr, expression, false,
  |  | 1291|      0|    NodePtr, typeParameters, true)
  |  | 1292|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1293|      0|    TSInterfaceBody, TS,
  |  | 1294|      0|    NodeList, body, false)
  |  | 1295|       |
  |  | 1296|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1297|      0|    TSEnumDeclaration, TS,
  |  | 1298|      0|    NodePtr, id, false,
  |  | 1299|      0|    NodeList, members, false)
  |  | 1300|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1301|      0|    TSEnumMember, TS,
  |  | 1302|      0|    NodePtr, id, false,
  |  | 1303|      0|    NodePtr, initializer, true)
  |  | 1304|       |
  |  | 1305|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1306|      0|    TSModuleDeclaration, TS,
  |  | 1307|      0|    NodePtr, id, false,
  |  | 1308|      0|    NodePtr, body, false)
  |  | 1309|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1310|      0|    TSModuleBlock, TS,
  |  | 1311|      0|    NodeList, body, false)
  |  | 1312|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1313|      0|    TSModuleMember, TS,
  |  | 1314|      0|    NodePtr, id, false,
  |  | 1315|      0|    NodePtr, initializer, true)
  |  | 1316|       |
  |  | 1317|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1318|      0|    TSTypeParameterDeclaration, TS,
  |  | 1319|      0|    NodeList, params, false)
  |  | 1320|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1321|      0|    TSTypeParameter, TS,
  |  | 1322|      0|    NodePtr, name, false,
  |  | 1323|      0|    NodePtr, constraint, true,
  |  | 1324|      0|    NodePtr, default, true)
  |  | 1325|       |
  |  | 1326|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1327|      0|    TSTypeParameterInstantiation, TS,
  |  | 1328|      0|    NodeList, params, false)
  |  | 1329|       |
  |  | 1330|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1331|      0|    TSUnionType, TS,
  |  | 1332|      0|    NodeList, types, false)
  |  | 1333|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1334|      0|    TSIntersectionType, TS,
  |  | 1335|      0|    NodeList, types, false)
  |  | 1336|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1337|      0|    TSTypeQuery, TS,
  |  | 1338|      0|    NodePtr, exprName, false)
  |  | 1339|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1340|      0|    TSConditionalType, TS,
  |  | 1341|      0|    NodePtr, checkType, false,
  |  | 1342|      0|    NodePtr, extendsType, false,
  |  | 1343|      0|    NodePtr, trueType, false,
  |  | 1344|      0|    NodePtr, falseType, false)
  |  | 1345|       |
  |  | 1346|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1347|      0|    TSTypeLiteral, TS,
  |  | 1348|      0|    NodeList, members, false)
  |  | 1349|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1350|      0|    TSPropertySignature, TS,
  |  | 1351|      0|    NodePtr, key, false,
  |  | 1352|      0|    NodePtr, typeAnnotation, true,
  |  | 1353|      0|    NodePtr, initializer, true,
  |  | 1354|      0|    NodeBoolean, optional, false,
  |  | 1355|      0|    NodeBoolean, computed, false,
  |  | 1356|      0|    NodeBoolean, readonly, false,
  |  | 1357|      0|    NodeBoolean, static, false,
  |  | 1358|      0|    NodeBoolean, export, false)
  |  | 1359|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1360|      0|    TSMethodSignature, TS,
  |  | 1361|      0|    NodePtr, key, false,
  |  | 1362|      0|    NodeList, params, false,
  |  | 1363|      0|    NodePtr, returnType, true,
  |  | 1364|      0|    NodeBoolean, computed, false)
  |  | 1365|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1366|      0|    TSIndexSignature, TS,
  |  | 1367|      0|    NodeList, parameters, false,
  |  | 1368|      0|    NodePtr, typeAnnotation, true)
  |  | 1369|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1370|      0|    TSCallSignatureDeclaration, TS,
  |  | 1371|      0|    NodeList, params, false,
  |  | 1372|      0|    NodePtr, returnType, true)
  |  | 1373|       |
  |  | 1374|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1375|      0|    TSModifiers, TS,
  |  | 1376|      0|    NodeLabel, accessibility, false,
  |  | 1377|      0|    NodeBoolean, readonly, false)
  |  | 1378|       |
  |  | 1379|      0|ESTREE_LAST(TS)
  |  | 1380|       |
  |  | 1381|      0|#endif
  |  | 1382|       |
  |  | 1383|       |// ================================================
  |  | 1384|       |
  |  | 1385|      0|#ifndef ESTREE_DEFINE_COVER_NODES
  |  | 1386|       |
  |  | 1387|      0|ESTREE_FIRST(Cover, Base)
  |  | 1388|       |
  |  | 1389|       |// CoverParenthesizedExpressionAndArrowParameterList: "(" ")"
  |  | 1390|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1391|       |
  |  | 1392|       |// CoverParenthesizedExpressionAndArrowParameterList:
  |  | 1393|       |//      "(" Expression "," ")"
  |  | 1394|       |// This is the dummy "empty expression" for the last comma inside a
  |  | 1395|       |// SequenceExpression.
  |  | 1396|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1397|       |
  |  | 1398|       |// CoverInitializer
  |  | 1399|       |// This is used for destructuring object assignment with initializers. It
  |  | 1400|       |// will be the value node of a Property.
  |  | 1401|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1402|      0|    CoverInitializer, Cover,
  |  | 1403|      0|    NodePtr, init, false)
  |  | 1404|       |
  |  | 1405|       |// CoverRestElement
  |  | 1406|       |// This is used for parsing "...elem" in "()" and in SequenceExpression, so it
  |  | 1407|       |// can later be reparsed as an arrow function rest parameter. "rest" will point
  |  | 1408|       |// to the actual RestElement.
  |  | 1409|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1410|      0|    CoverRestElement, Cover,
  |  | 1411|      0|    NodePtr, rest, false)
  |  | 1412|       |
  |  | 1413|       |// CoverTypedIdentifier
  |  | 1414|       |// This is used for parsing "ident: type" as either a type cast expression
  |  | 1415|       |// or a typed parameter in the parameters list of an arrow function.
  |  | 1416|       |// 'left' is the identifier which is typed.
  |  | 1417|       |// 'right' is the type which is either the cast target or the type annotation,
  |  | 1418|       |//   which may be null if the identifier was simply given a '?' and no ':'
  |  | 1419|       |//   with a type annotation.
  |  | 1420|      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: 3.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1421|      0|    CoverTypedIdentifier, Cover,
  |  | 1422|      0|    NodePtr, left, false,
  |  | 1423|      0|    NodePtr, right, true,
  |  | 1424|      0|    NodeBoolean, optional, false)
  |  | 1425|       |
  |  | 1426|      0|ESTREE_LAST(Cover)
  |  | 1427|       |
  |  | 1428|      0|#endif
  |  | 1429|       |
  |  | 1430|      0|#undef ESTREE_FIRST
  |  | 1431|      0|#undef ESTREE_LAST
  |  | 1432|      0|#undef ESTREE_WRAP
  |  | 1433|      0|#undef ESTREE_IGNORE_IF_EMPTY
  |  | 1434|       |
  |  | 1435|      0|#undef ESTREE_NODE_0_ARGS
  |  | 1436|      0|#undef ESTREE_NODE_1_ARGS
  |  | 1437|      0|#undef ESTREE_NODE_2_ARGS
  |  | 1438|      0|#undef ESTREE_NODE_3_ARGS
  |  | 1439|      0|#undef ESTREE_NODE_4_ARGS
  |  | 1440|      0|#undef ESTREE_NODE_5_ARGS
  |  | 1441|      0|#undef ESTREE_NODE_6_ARGS
  |  | 1442|      0|#undef ESTREE_NODE_7_ARGS
  |  | 1443|      0|#undef ESTREE_NODE_8_ARGS
  |  | 1444|      0|#undef ESTREE_NODE_9_ARGS
  ------------------
  210|       |
  211|  3.99M|#undef VISIT
  212|  3.99M|    }
  213|  3.99M|    v.decRecursionDepth();
  214|  3.99M|    return result;
  215|  3.99M|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_bPNS0_4NodeE:
  220|   470k|  static UnmodifiedT visit(Visitor &, NodeBoolean, Node *) {
  221|   470k|    return Unmodified;
  222|   470k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18ForInStatementNodeE:
  352|     15|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|     15|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|     15|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     15|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     15|    visit(visitor, field, parent);                           \
  |  |  320|     15|  } else {                                                   \
  |  |  321|     15|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     15|  }
  ------------------
  354|     15|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|     15|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     15|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     15|    visit(visitor, field, parent);                           \
  |  |  320|     15|  } else {                                                   \
  |  |  321|     15|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     15|  }
  ------------------
  355|     15|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|     15|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     15|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     15|    visit(visitor, field, parent);                           \
  |  |  320|     15|  } else {                                                   \
  |  |  321|     15|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     15|  }
  ------------------
  356|     15|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18EmptyStatementNodeE:
  326|  5.34k|  static void visitChildren(Visitor &v, NAME##Node *) {}
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19ReturnStatementNodeE:
  329|   103k|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|   103k|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|   103k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   103k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   103k|    visit(visitor, field, parent);                           \
  |  |  320|   103k|  } else {                                                   \
  |  |  321|   103k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   103k|  }
  ------------------
  331|   103k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20LabeledStatementNodeE:
  335|   245k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|   245k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|   245k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   245k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   245k|    visit(visitor, field, parent);                           \
  |  |  320|   245k|  } else {                                                   \
  |  |  321|   245k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   245k|  }
  ------------------
  337|   245k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|   245k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   245k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   245k|    visit(visitor, field, parent);                           \
  |  |  320|   245k|  } else {                                                   \
  |  |  321|   245k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   245k|  }
  ------------------
  338|   245k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_23ExpressionStatementNodeE:
  335|   358k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|   358k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|   358k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   358k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   358k|    visit(visitor, field, parent);                           \
  |  |  320|   358k|  } else {                                                   \
  |  |  321|   358k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   358k|  }
  ------------------
  337|   358k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|   358k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   358k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   358k|    visit(visitor, field, parent);                           \
  |  |  320|   358k|  } else {                                                   \
  |  |  321|   358k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   358k|  }
  ------------------
  338|   358k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_PNS_12UniqueStringEPNS0_4NodeE:
  217|  1.26M|  static UnmodifiedT visit(Visitor &, NodeLabel, Node *) {
  218|  1.26M|    return Unmodified;
  219|  1.26M|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_17StringLiteralNodeE:
  329|     20|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|     20|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|     20|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     20|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     20|    visit(visitor, field, parent);                           \
  |  |  320|     20|  } else {                                                   \
  |  |  321|     20|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     20|  }
  ------------------
  331|     20|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18NumericLiteralNodeE:
  329|  1.59M|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|  1.59M|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|  1.59M|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  1.59M|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.59M|    visit(visitor, field, parent);                           \
  |  |  320|  1.59M|  } else {                                                   \
  |  |  321|  1.59M|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.59M|  }
  ------------------
  331|  1.59M|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_RdPNS0_4NodeE:
  223|  1.59M|  static UnmodifiedT visit(Visitor &, NodeNumber &, Node *) {
  224|  1.59M|    return Unmodified;
  225|  1.59M|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_17RegExpLiteralNodeE:
  335|    120|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|    120|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|    120|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|    120|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    120|    visit(visitor, field, parent);                           \
  |  |  320|    120|  } else {                                                   \
  |  |  321|    120|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    120|  }
  ------------------
  337|    120|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|    120|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|    120|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    120|    visit(visitor, field, parent);                           \
  |  |  320|    120|  } else {                                                   \
  |  |  321|    120|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    120|  }
  ------------------
  338|    120|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_17BigIntLiteralNodeE:
  329|      5|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|      5|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|      5|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|      5|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      5|    visit(visitor, field, parent);                           \
  |  |  320|      5|  } else {                                                   \
  |  |  321|      5|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      5|  }
  ------------------
  331|      5|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_22SequenceExpressionNodeE:
  329|     98|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|     98|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|     98|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     98|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     98|    visit(visitor, field, parent);                           \
  |  |  320|     98|  } else {                                                   \
  |  |  321|     98|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     98|  }
  ------------------
  331|     98|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20ObjectExpressionNodeE:
  329|      2|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|      2|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|      2|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|      2|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      2|    visit(visitor, field, parent);                           \
  |  |  320|      2|  } else {                                                   \
  |  |  321|      2|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      2|  }
  ------------------
  331|      2|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19ArrayExpressionNodeE:
  335|    101|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|    101|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|    101|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|    101|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    101|    visit(visitor, field, parent);                           \
  |  |  320|    101|  } else {                                                   \
  |  |  321|    101|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    101|  }
  ------------------
  337|    101|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|    101|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|    101|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    101|    visit(visitor, field, parent);                           \
  |  |  320|    101|  } else {                                                   \
  |  |  321|    101|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    101|  }
  ------------------
  338|    101|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_17NewExpressionNodeE:
  352|  25.0k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  25.0k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  25.0k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.0k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.0k|    visit(visitor, field, parent);                           \
  |  |  320|  25.0k|  } else {                                                   \
  |  |  321|  25.0k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.0k|  }
  ------------------
  354|  25.0k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  25.0k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.0k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.0k|    visit(visitor, field, parent);                           \
  |  |  320|  25.0k|  } else {                                                   \
  |  |  321|  25.0k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.0k|  }
  ------------------
  355|  25.0k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  25.0k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.0k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.0k|    visit(visitor, field, parent);                           \
  |  |  320|  25.0k|  } else {                                                   \
  |  |  321|  25.0k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.0k|  }
  ------------------
  356|  25.0k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18CallExpressionNodeE:
  352|      3|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|      3|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|      3|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  354|      3|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|      3|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  355|      3|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|      3|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  356|      3|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_26OptionalCallExpressionNodeE:
  373|     16|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  374|     16|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|     16|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     16|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     16|    visit(visitor, field, parent);                           \
  |  |  320|     16|  } else {                                                   \
  |  |  321|     16|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     16|  }
  ------------------
  375|     16|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|     16|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     16|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     16|    visit(visitor, field, parent);                           \
  |  |  320|     16|  } else {                                                   \
  |  |  321|     16|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     16|  }
  ------------------
  376|     16|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|     16|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     16|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     16|    visit(visitor, field, parent);                           \
  |  |  320|     16|  } else {                                                   \
  |  |  321|     16|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     16|  }
  ------------------
  377|     16|    VISIT(v, node->_##ARG3NM, node);                        \
  ------------------
  |  |  317|     16|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|     16|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     16|    visit(visitor, field, parent);                           \
  |  |  320|     16|  } else {                                                   \
  |  |  321|     16|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     16|  }
  ------------------
  378|     16|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_24AssignmentExpressionNodeE:
  352|      1|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|      1|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  354|      1|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  355|      1|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  356|      1|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19UnaryExpressionNodeE:
  352|  25.9k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  25.9k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  25.9k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.9k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.9k|    visit(visitor, field, parent);                           \
  |  |  320|  25.9k|  } else {                                                   \
  |  |  321|  25.9k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.9k|  }
  ------------------
  354|  25.9k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  25.9k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.9k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.9k|    visit(visitor, field, parent);                           \
  |  |  320|  25.9k|  } else {                                                   \
  |  |  321|  25.9k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.9k|  }
  ------------------
  355|  25.9k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  25.9k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.9k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.9k|    visit(visitor, field, parent);                           \
  |  |  320|  25.9k|  } else {                                                   \
  |  |  321|  25.9k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.9k|  }
  ------------------
  356|  25.9k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20UpdateExpressionNodeE:
  352|      1|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|      1|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  354|      1|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  355|      1|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  356|      1|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20MemberExpressionNodeE:
  352|  17.5k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  17.5k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  17.5k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  17.5k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  17.5k|    visit(visitor, field, parent);                           \
  |  |  320|  17.5k|  } else {                                                   \
  |  |  321|  17.5k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  17.5k|  }
  ------------------
  354|  17.5k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  17.5k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  17.5k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  17.5k|    visit(visitor, field, parent);                           \
  |  |  320|  17.5k|  } else {                                                   \
  |  |  321|  17.5k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  17.5k|  }
  ------------------
  355|  17.5k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  17.5k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  17.5k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  17.5k|    visit(visitor, field, parent);                           \
  |  |  320|  17.5k|  } else {                                                   \
  |  |  321|  17.5k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  17.5k|  }
  ------------------
  356|  17.5k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_28OptionalMemberExpressionNodeE:
  373|  25.9k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  374|  25.9k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  25.9k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.9k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.9k|    visit(visitor, field, parent);                           \
  |  |  320|  25.9k|  } else {                                                   \
  |  |  321|  25.9k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.9k|  }
  ------------------
  375|  25.9k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  25.9k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.9k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.9k|    visit(visitor, field, parent);                           \
  |  |  320|  25.9k|  } else {                                                   \
  |  |  321|  25.9k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.9k|  }
  ------------------
  376|  25.9k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  25.9k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.9k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.9k|    visit(visitor, field, parent);                           \
  |  |  320|  25.9k|  } else {                                                   \
  |  |  321|  25.9k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.9k|  }
  ------------------
  377|  25.9k|    VISIT(v, node->_##ARG3NM, node);                        \
  ------------------
  |  |  317|  25.9k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.9k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.9k|    visit(visitor, field, parent);                           \
  |  |  320|  25.9k|  } else {                                                   \
  |  |  321|  25.9k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.9k|  }
  ------------------
  378|  25.9k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_21LogicalExpressionNodeE:
  352|  25.3k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  25.3k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  25.3k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.3k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.3k|    visit(visitor, field, parent);                           \
  |  |  320|  25.3k|  } else {                                                   \
  |  |  321|  25.3k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.3k|  }
  ------------------
  354|  25.3k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  25.3k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.3k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.3k|    visit(visitor, field, parent);                           \
  |  |  320|  25.3k|  } else {                                                   \
  |  |  321|  25.3k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.3k|  }
  ------------------
  355|  25.3k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  25.3k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  25.3k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.3k|    visit(visitor, field, parent);                           \
  |  |  320|  25.3k|  } else {                                                   \
  |  |  321|  25.3k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.3k|  }
  ------------------
  356|  25.3k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_25ConditionalExpressionNodeE:
  352|  3.66k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  3.66k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  3.66k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  3.66k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  3.66k|    visit(visitor, field, parent);                           \
  |  |  320|  3.66k|  } else {                                                   \
  |  |  321|  3.66k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  3.66k|  }
  ------------------
  354|  3.66k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  3.66k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  3.66k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  3.66k|    visit(visitor, field, parent);                           \
  |  |  320|  3.66k|  } else {                                                   \
  |  |  321|  3.66k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  3.66k|  }
  ------------------
  355|  3.66k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  3.66k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  3.66k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  3.66k|    visit(visitor, field, parent);                           \
  |  |  320|  3.66k|  } else {                                                   \
  |  |  321|  3.66k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  3.66k|  }
  ------------------
  356|  3.66k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20BinaryExpressionNodeE:
  352|   101k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|   101k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|   101k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   101k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   101k|    visit(visitor, field, parent);                           \
  |  |  320|   101k|  } else {                                                   \
  |  |  321|   101k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   101k|  }
  ------------------
  354|   101k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|   101k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   101k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   101k|    visit(visitor, field, parent);                           \
  |  |  320|   101k|  } else {                                                   \
  |  |  321|   101k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   101k|  }
  ------------------
  355|   101k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|   101k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   101k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   101k|    visit(visitor, field, parent);                           \
  |  |  320|   101k|  } else {                                                   \
  |  |  321|   101k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   101k|  }
  ------------------
  356|   101k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19TemplateLiteralNodeE:
  335|  23.2k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|  23.2k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|  23.2k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  23.2k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  23.2k|    visit(visitor, field, parent);                           \
  |  |  320|  23.2k|  } else {                                                   \
  |  |  321|  23.2k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  23.2k|  }
  ------------------
  337|  23.2k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|  23.2k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  23.2k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  23.2k|    visit(visitor, field, parent);                           \
  |  |  320|  23.2k|  } else {                                                   \
  |  |  321|  23.2k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  23.2k|  }
  ------------------
  338|  23.2k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_28TaggedTemplateExpressionNodeE:
  335|  2.82k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|  2.82k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|  2.82k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  2.82k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  2.82k|    visit(visitor, field, parent);                           \
  |  |  320|  2.82k|  } else {                                                   \
  |  |  321|  2.82k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  2.82k|  }
  ------------------
  337|  2.82k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|  2.82k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  2.82k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  2.82k|    visit(visitor, field, parent);                           \
  |  |  320|  2.82k|  } else {                                                   \
  |  |  321|  2.82k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  2.82k|  }
  ------------------
  338|  2.82k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19TemplateElementNodeE:
  352|   374k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|   374k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|   374k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   374k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   374k|    visit(visitor, field, parent);                           \
  |  |  320|   374k|  } else {                                                   \
  |  |  321|   374k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   374k|  }
  ------------------
  354|   374k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|   374k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   374k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   374k|    visit(visitor, field, parent);                           \
  |  |  320|   374k|  } else {                                                   \
  |  |  321|   374k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   374k|  }
  ------------------
  355|   374k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|   374k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|   374k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   374k|    visit(visitor, field, parent);                           \
  |  |  320|   374k|  } else {                                                   \
  |  |  321|   374k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   374k|  }
  ------------------
  356|   374k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_12PropertyNodeE:
  427|      1|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  428|      1|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  429|      1|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  430|      1|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  431|      1|    VISIT(v, node->_##ARG3NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  432|      1|    VISIT(v, node->_##ARG4NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  433|      1|    VISIT(v, node->_##ARG5NM, node);                        \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  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|  }
  ------------------
  434|      1|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_16ArrayPatternNodeE:
  335|  22.3k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|  22.3k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|  22.3k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  22.3k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  22.3k|    visit(visitor, field, parent);                           \
  |  |  320|  22.3k|  } else {                                                   \
  |  |  321|  22.3k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  22.3k|  }
  ------------------
  337|  22.3k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|  22.3k|  if constexpr (readOnlyVisitor) {                           \
  |  |  318|  22.3k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  22.3k|    visit(visitor, field, parent);                           \
  |  |  320|  22.3k|  } else {                                                   \
  |  |  321|  22.3k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  22.3k|  }
  ------------------
  338|  22.3k|  }
_ZN6hermes6ESTree15visitESTreeNodeINS_3sem17SemanticValidatorEEEvRT_PNS0_4NodeES7_:
  559|   385k|void visitESTreeNode(Visitor &v, Node *node, Node *parent = nullptr) {
  560|   385k|  RecursiveVisitorDispatch<Visitor>::visit(v, node, parent);
  561|   385k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_11ProgramNodeEEEvRT_PT0_:
  565|    204|void visitESTreeChildren(Visitor &v, Node *node) {
  566|    204|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|    204|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_17LoopStatementNodeEEEvRT_PT0_:
  565|     15|void visitESTreeChildren(Visitor &v, Node *node) {
  566|     15|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|     15|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_20BinaryExpressionNodeEEEvRT_PT0_:
  565|   101k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|   101k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|   101k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_24AssignmentExpressionNodeEEEvRT_PT0_:
  565|      1|void visitESTreeChildren(Visitor &v, Node *node) {
  566|      1|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|      1|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_20UpdateExpressionNodeEEEvRT_PT0_:
  565|      1|void visitESTreeChildren(Visitor &v, Node *node) {
  566|      1|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|      1|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_20LabeledStatementNodeEEEvRT_PT0_:
  565|   245k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|   245k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|   245k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_17RegExpLiteralNodeEEEvRT_PT0_:
  565|    120|void visitESTreeChildren(Visitor &v, Node *node) {
  566|    120|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|    120|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_19ReturnStatementNodeEEEvRT_PT0_:
  565|   103k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|   103k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|   103k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_19UnaryExpressionNodeEEEvRT_PT0_:
  565|  25.9k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  25.9k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  25.9k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_16ArrayPatternNodeEEEvRT_PT0_:
  565|  22.3k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  22.3k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  22.3k|}

_ZN6hermes3sem12FunctionInfo7VarDeclC2ENS_18JavaScriptDeclKindEPNS_6ESTree14IdentifierNodeE:
   37|   103k|        : kind(k), identifier(id), needsInitializer(true) {}
_ZN6hermes3sem12FunctionInfo13allocateLabelEv:
   94|   246k|  unsigned allocateLabel() {
   95|   246k|    return labelCount++;
   96|   246k|  }
_ZN6hermes3sem10SemContext14createFunctionEv:
  105|   103k|  FunctionInfo *createFunction() {
  106|   103k|    functions_.emplace_back();
  107|   103k|    return &functions_.back();
  108|   103k|  }

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

_ZN6hermes3hbc16BytecodeFunctionC2EONSt3__16vectorIhNS2_9allocatorIhEEEEONS0_14FunctionHeaderEONS3_INS0_23HBCExceptionHandlerInfoENS4_ISA_EEEE:
   67|   103k|      : opcodesAndJumpTables_(std::move(opcodesAndJumpTables)),
   68|   103k|        header_(std::move(header)),
   69|   103k|        exceptions_(std::move(exceptionHandlers)) {}
_ZNK6hermes3hbc16BytecodeFunction9getHeaderEv:
   71|    359|  const FunctionHeader &getHeader() const {
   72|    359|    return header_;
   73|    359|  }
_ZNK6hermes3hbc16BytecodeFunction14getOpcodeArrayEv:
   96|    197|  ArrayRef<opcode_atom_t> getOpcodeArray() const {
   97|    197|    return opcodesAndJumpTables_;
   98|    197|  }
_ZNK6hermes3hbc16BytecodeFunction20getExceptionHandlersEv:
  118|     52|  ArrayRef<HBCExceptionHandlerInfo> getExceptionHandlers() const {
  119|     52|    return exceptions_;
  120|     52|  }
_ZNK6hermes3hbc16BytecodeFunction12hasDebugInfoEv:
  122|   103k|  bool hasDebugInfo() const {
  123|   103k|    return debugOffsets_.sourceLocations != DebugOffsets::NO_OFFSET ||
  ------------------
  |  Branch (123:12): [True: 103k, False: 0]
  ------------------
  124|   103k|        debugOffsets_.scopeDescData != DebugOffsets::NO_OFFSET;
  ------------------
  |  Branch (124:9): [True: 0, False: 0]
  ------------------
  125|   103k|  }
_ZNK6hermes3hbc16BytecodeFunction15getDebugOffsetsEv:
  127|     53|  const DebugOffsets *getDebugOffsets() const {
  128|     53|    return &debugOffsets_;
  129|     53|  }
_ZN6hermes3hbc16BytecodeFunction15setDebugOffsetsENS0_12DebugOffsetsE:
  131|   103k|  void setDebugOffsets(DebugOffsets offsets) {
  132|   103k|    debugOffsets_ = offsets;
  133|   103k|    header_.flags.hasDebugInfo = hasDebugInfo();
  134|   103k|  }
_ZN6hermes3hbc16BytecodeFunction22setLazyCompilationDataENSt3__110unique_ptrINS0_19LazyCompilationDataENS2_14default_deleteIS4_EEEE:
  140|     81|  void setLazyCompilationData(std::unique_ptr<LazyCompilationData> data) {
  141|     81|    lazyCompilationData_ = std::move(data);
  142|     81|  }
_ZNK6hermes3hbc16BytecodeFunction6isLazyEv:
  145|    278|  bool isLazy() const {
  146|    278|    return (bool)lazyCompilationData_;
  147|    278|  }
_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:
  248|    196|      : globalFunctionIndex_(globalFunctionIndex),
  249|    196|        stringKinds_(std::move(stringKinds)),
  250|    196|        identifierHashes_(std::move(identifierHashes)),
  251|    196|        stringTable_(std::move(stringTable)),
  252|    196|        stringStorage_(std::move(stringStorage)),
  253|    196|        bigIntTable_(std::move(bigIntTable)),
  254|    196|        bigIntStorage_(std::move(bigIntStorage)),
  255|    196|        regExpStorage_(std::move(regExpStorage)),
  256|    196|        regExpTable_(std::move(regExpTable)),
  257|    196|        arrayBuffer_(std::move(arrayBuffer)),
  258|    196|        objKeyBuffer_(std::move(objKeyBuffer)),
  259|    196|        objValBuffer_(std::move(objValBuffer)),
  260|    196|        segmentID_(segmentID),
  261|    196|        cjsModuleTable_(std::move(cjsModuleTable)),
  262|    196|        cjsModuleTableStatic_(std::move(cjsModuleTableStatic)),
  263|    196|        functionSourceTable_(std::move(functionSourceTable)),
  264|    196|        options_(options) {
  265|    196|    functions_.resize(functionCount);
  266|    196|  }
_ZNK6hermes3hbc14BytecodeModule15getNumFunctionsEv:
  276|   104k|  uint32_t getNumFunctions() const {
  277|   104k|    return functions_.size();
  278|   104k|  }
_ZNK6hermes3hbc14BytecodeModule22getGlobalFunctionIndexEv:
  280|    196|  uint32_t getGlobalFunctionIndex() const {
  281|    196|    return globalFunctionIndex_;
  282|    196|  }
_ZNK6hermes3hbc14BytecodeModule14getStringKindsEv:
  293|    196|  llvh::ArrayRef<StringKind::Entry> getStringKinds() const {
  294|    196|    return stringKinds_;
  295|    196|  }
_ZNK6hermes3hbc14BytecodeModule19getIdentifierHashesEv:
  302|    196|  llvh::ArrayRef<uint32_t> getIdentifierHashes() const {
  303|    196|    return identifierHashes_;
  304|    196|  }
_ZNK6hermes3hbc14BytecodeModule14getStringTableEv:
  310|  4.84k|  StringTableEntry::StringTableRefTy getStringTable() const {
  311|  4.84k|    return stringTable_;
  312|  4.84k|  }
_ZNK6hermes3hbc14BytecodeModule16getStringStorageEv:
  318|    196|  StringTableEntry::StringStorageRefTy getStringStorage() const {
  319|    196|    return stringStorage_;
  320|    196|  }
_ZNK6hermes3hbc14BytecodeModule14getBigIntTableEv:
  322|    196|  llvh::ArrayRef<bigint::BigIntTableEntry> getBigIntTable() const {
  323|    196|    return bigIntTable_;
  324|    196|  }
_ZNK6hermes3hbc14BytecodeModule16getBigIntStorageEv:
  326|    196|  llvh::ArrayRef<uint8_t> getBigIntStorage() const {
  327|    196|    return bigIntStorage_;
  328|    196|  }
_ZNK6hermes3hbc14BytecodeModule14getRegExpTableEv:
  330|    196|  llvh::ArrayRef<RegExpTableEntry> getRegExpTable() const {
  331|    196|    return regExpTable_;
  332|    196|  }
_ZNK6hermes3hbc14BytecodeModule16getRegExpStorageEv:
  334|    196|  llvh::ArrayRef<unsigned char> getRegExpStorage() const {
  335|    196|    return regExpStorage_;
  336|    196|  }
_ZNK6hermes3hbc14BytecodeModule12getSegmentIDEv:
  338|    196|  uint32_t getSegmentID() const {
  339|    196|    return segmentID_;
  340|    196|  }
_ZNK6hermes3hbc14BytecodeModule17getCJSModuleTableEv:
  342|    196|  llvh::ArrayRef<std::pair<uint32_t, uint32_t>> getCJSModuleTable() const {
  343|    196|    return cjsModuleTable_;
  344|    196|  }
_ZNK6hermes3hbc14BytecodeModule23getCJSModuleTableStaticEv:
  347|    196|      const {
  348|    196|    return cjsModuleTableStatic_;
  349|    196|  }
_ZNK6hermes3hbc14BytecodeModule22getFunctionSourceTableEv:
  351|    196|  llvh::ArrayRef<std::pair<uint32_t, uint32_t>> getFunctionSourceTable() const {
  352|    196|    return functionSourceTable_;
  353|    196|  }
_ZN6hermes3hbc14BytecodeModule12getDebugInfoEv:
  355|    196|  DebugInfo &getDebugInfo() {
  356|    196|    return debugInfo_;
  357|    196|  }
_ZN6hermes3hbc14BytecodeModule12setDebugInfoENS0_9DebugInfoE:
  359|    196|  void setDebugInfo(DebugInfo info) {
  360|    196|    debugInfo_ = std::move(info);
  361|    196|  }
_ZNK6hermes3hbc14BytecodeModule14getArrayBufferEv:
  367|    196|  ArrayRef<unsigned char> getArrayBuffer() const {
  368|    196|    return arrayBuffer_;
  369|    196|  }
_ZNK6hermes3hbc14BytecodeModule15getObjectBufferEv:
  384|    392|      const {
  385|    392|    return {
  386|    392|        ArrayRef<unsigned char>(objKeyBuffer_),
  387|    392|        ArrayRef<unsigned char>(objValBuffer_)};
  388|    392|  }
_ZNK6hermes3hbc14BytecodeModule18getBytecodeOptionsEv:
  402|    196|  BytecodeOptions getBytecodeOptions() const {
  403|    196|    return options_;
  404|    196|  }

_ZN6hermes3hbc20BCProviderFromBuffer16isBytecodeStreamEN4llvh8ArrayRefIhEE:
  388|    320|  static bool isBytecodeStream(llvh::ArrayRef<uint8_t> aref) {
  389|    320|    const auto *header =
  390|    320|        reinterpret_cast<const hbc::BytecodeFileHeader *>(aref.data());
  391|    320|    return (
  392|    320|        aref.size() >= sizeof(hbc::BytecodeFileHeader) &&
  ------------------
  |  Branch (392:9): [True: 320, False: 0]
  ------------------
  393|    320|        header->magic == hbc::MAGIC);
  ------------------
  |  Branch (393:9): [True: 0, False: 320]
  ------------------
  394|    320|  }
_ZN6hermes3hbc20BCProviderFromBuffer26createBCProviderFromBufferENSt3__110unique_ptrIKNS_6BufferENS2_14default_deleteIS5_EEEENS0_12BytecodeFormE:
  380|    320|      BytecodeForm form = BytecodeForm::Execution) {
  381|    320|    auto ret = std::unique_ptr<BCProviderFromBuffer>(
  382|    320|        new BCProviderFromBuffer(std::move(buffer), form));
  383|    320|    auto errstr = ret->getErrorStr();
  384|    320|    return {errstr.empty() ? std::move(ret) : nullptr, errstr};
  ------------------
  |  Branch (384:13): [True: 320, False: 0]
  ------------------
  385|    320|  }
_ZNK6hermes3hbc14BCProviderBase11getErrorStrEv:
  217|    320|  const std::string getErrorStr() const {
  218|    320|    return errstr_;
  219|    320|  }
_ZN6hermes3hbc20BCProviderFromBufferD2Ev:
  505|    320|  ~BCProviderFromBuffer() override {
  506|    320|    stopWarmup();
  507|    320|    delete debugInfo_;
  508|    320|  }
_ZN6hermes3hbc14BCProviderBaseD2Ev:
  269|    597|  virtual ~BCProviderBase() = default;
_ZNK6hermes3hbc14BCProviderBase12getRawBufferEv:
  305|    473|  virtual llvh::ArrayRef<uint8_t> getRawBuffer() const {
  306|    473|    return llvh::ArrayRef<uint8_t>();
  307|    473|  }
_ZN6hermes3hbc21RuntimeFunctionHeaderC2EPKNS0_15SmallFuncHeaderE:
   55|  12.4k|      : ptr_(reinterpret_cast<const char *>(smallHeader)) {
   56|  12.4k|    assert(!isLarge());
   57|  12.4k|  }
_ZN6hermes3hbc21RuntimeFunctionHeaderC2EPKNS0_14FunctionHeaderE:
   59|    278|      : ptr_(reinterpret_cast<const char *>(large) + 1) {
   60|    278|    assert(isLarge());
   61|    278|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader6offsetEv:
   64|  6.24k|  api_type name() const {                                       \
   65|  6.24k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  6.24k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6.24k]
  |  |  ------------------
  ------------------
   66|  6.24k|      return asLarge()->name;                                   \
   67|  6.24k|    else                                                        \
   68|  6.24k|      return asSmall()->name;                                   \
   69|  6.24k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader10paramCountEv:
   64|    454|  api_type name() const {                                       \
   65|    454|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|    454|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 134, False: 320]
  |  |  ------------------
  ------------------
   66|    454|      return asLarge()->name;                                   \
   67|    454|    else                                                        \
   68|    454|      return asSmall()->name;                                   \
   69|    454|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader19bytecodeSizeInBytesEv:
   64|  21.8M|  api_type name() const {                                       \
   65|  21.8M|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  21.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 21.7M, False: 68.3k]
  |  |  ------------------
  ------------------
   66|  21.8M|      return asLarge()->name;                                   \
   67|  21.8M|    else                                                        \
   68|  21.8M|      return asSmall()->name;                                   \
   69|  21.8M|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader12functionNameEv:
   64|    373|  api_type name() const {                                       \
   65|    373|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|    373|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 53, False: 320]
  |  |  ------------------
  ------------------
   66|    373|      return asLarge()->name;                                   \
   67|    373|    else                                                        \
   68|    373|      return asSmall()->name;                                   \
   69|    373|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader9frameSizeEv:
   64|  9.27k|  api_type name() const {                                       \
   65|  9.27k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  9.27k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 474, False: 8.80k]
  |  |  ------------------
  ------------------
   66|  9.27k|      return asLarge()->name;                                   \
   67|  9.27k|    else                                                        \
   68|  9.27k|      return asSmall()->name;                                   \
   69|  9.27k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader15environmentSizeEv:
   64|    836|  api_type name() const {                                       \
   65|    836|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|    836|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 196, False: 640]
  |  |  ------------------
  ------------------
   66|    836|      return asLarge()->name;                                   \
   67|    836|    else                                                        \
   68|    836|      return asSmall()->name;                                   \
   69|    836|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader21highestReadCacheIndexEv:
   64|  6.51k|  api_type name() const {                                       \
   65|  6.51k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  6.51k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 278, False: 6.24k]
  |  |  ------------------
  ------------------
   66|  6.51k|      return asLarge()->name;                                   \
   67|  6.51k|    else                                                        \
   68|  6.51k|      return asSmall()->name;                                   \
   69|  6.51k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader22highestWriteCacheIndexEv:
   64|  6.51k|  api_type name() const {                                       \
   65|  6.51k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  6.51k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 278, False: 6.24k]
  |  |  ------------------
  ------------------
   66|  6.51k|      return asLarge()->name;                                   \
   67|  6.51k|    else                                                        \
   68|  6.51k|      return asSmall()->name;                                   \
   69|  6.51k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader5flagsEv:
   64|  8.82k|  api_type name() const {                                       \
   65|  8.82k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  8.82k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 660, False: 8.16k]
  |  |  ------------------
  ------------------
   66|  8.82k|      return asLarge()->name;                                   \
   67|  8.82k|    else                                                        \
   68|  8.82k|      return asSmall()->name;                                   \
   69|  8.82k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader7isLargeEv:
   79|  43.7M|  bool isLarge() const {
   80|  43.7M|    return reinterpret_cast<uintptr_t>(ptr_) & 1;
   81|  43.7M|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader7asSmallEv:
   83|   105k|  const hbc::SmallFuncHeader *asSmall() const {
   84|   105k|    assert(!isLarge());
   85|   105k|    return reinterpret_cast<const hbc::SmallFuncHeader *>(ptr_);
   86|   105k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader7asLargeEv:
   88|  21.7M|  const hbc::FunctionHeader *asLarge() const {
   89|  21.7M|    assert(isLarge());
   90|  21.7M|    return reinterpret_cast<const hbc::FunctionHeader *>(ptr_ - 1);
   91|  21.7M|  }
_ZNK6hermes3hbc14BCProviderBase18getBytecodeOptionsEv:
  159|    712|  BytecodeOptions getBytecodeOptions() const {
  160|    712|    return options_;
  161|    712|  }
_ZNK6hermes3hbc14BCProviderBase16getFunctionCountEv:
  162|  1.03k|  uint32_t getFunctionCount() const {
  163|  1.03k|    return functionCount_;
  164|  1.03k|  }
_ZNK6hermes3hbc14BCProviderBase22getGlobalFunctionIndexEv:
  165|    356|  uint32_t getGlobalFunctionIndex() const {
  166|    356|    return globalFunctionIndex_;
  167|    356|  }
_ZNK6hermes3hbc14BCProviderBase14getStringCountEv:
  168|    516|  uint32_t getStringCount() const {
  169|    516|    return stringCount_;
  170|    516|  }
_ZNK6hermes3hbc14BCProviderBase14getStringKindsEv:
  174|    516|  llvh::ArrayRef<StringKind::Entry> getStringKinds() const {
  175|    516|    return stringKinds_;
  176|    516|  }
_ZNK6hermes3hbc14BCProviderBase19getIdentifierHashesEv:
  177|    516|  llvh::ArrayRef<uint32_t> getIdentifierHashes() const {
  178|    516|    return identifierHashes_;
  179|    516|  }
_ZNK6hermes3hbc14BCProviderBase16getStringStorageEv:
  180|  19.6k|  llvh::ArrayRef<unsigned char> getStringStorage() const {
  181|  19.6k|    return stringStorage_;
  182|  19.6k|  }
_ZNK6hermes3hbc14BCProviderBase14getArrayBufferEv:
  183|     14|  llvh::ArrayRef<unsigned char> getArrayBuffer() const {
  184|     14|    return arrayBuffer_;
  185|     14|  }
_ZNK6hermes3hbc14BCProviderBase14getBigIntTableEv:
  192|   781k|  llvh::ArrayRef<bigint::BigIntTableEntry> getBigIntTable() const {
  193|   781k|    return bigIntTable_;
  194|   781k|  }
_ZNK6hermes3hbc14BCProviderBase16getBigIntStorageEv:
  195|   390k|  llvh::ArrayRef<unsigned char> getBigIntStorage() const {
  196|   390k|    return bigIntStorage_;
  197|   390k|  }
_ZNK6hermes3hbc14BCProviderBase14getRegExpTableEv:
  198|     14|  llvh::ArrayRef<RegExpTableEntry> getRegExpTable() const {
  199|     14|    return regExpTable_;
  200|     14|  }
_ZNK6hermes3hbc14BCProviderBase16getRegExpStorageEv:
  201|      7|  llvh::ArrayRef<unsigned char> getRegExpStorage() const {
  202|      7|    return regExpStorage_;
  203|      7|  }
_ZNK6hermes3hbc14BCProviderBase17getCJSModuleTableEv:
  207|    712|  llvh::ArrayRef<std::pair<uint32_t, uint32_t>> getCJSModuleTable() const {
  208|    712|    return cjsModuleTable_;
  209|    712|  }
_ZNK6hermes3hbc14BCProviderBase23getCJSModuleTableStaticEv:
  211|    712|      const {
  212|    712|    return cjsModuleTableStatic_;
  213|    712|  }
_ZNK6hermes3hbc14BCProviderBase22getFunctionSourceTableEv:
  214|     81|  llvh::ArrayRef<std::pair<uint32_t, uint32_t>> getFunctionSourceTable() const {
  215|     81|    return functionSourceTable_;
  216|     81|  }
_ZNK6hermes3hbc14BCProviderBase12getDebugInfoEv:
  231|    105|  const hbc::DebugInfo *getDebugInfo() const {
  232|    105|    if (!debugInfo_) {
  ------------------
  |  Branch (232:9): [True: 0, False: 105]
  ------------------
  233|      0|      const_cast<BCProviderBase *>(this)->createDebugInfo();
  234|      0|    }
  235|    105|    return debugInfo_;
  236|    105|  }
_ZNK6hermes3hbc20BCProviderFromBuffer17getFunctionHeaderEj:
  435|  12.4k|  RuntimeFunctionHeader getFunctionHeader(uint32_t functionID) const override {
  436|  12.4k|    const hbc::SmallFuncHeader &smallHeader = functionHeaders_[functionID];
  437|  12.4k|    if (LLVM_UNLIKELY(smallHeader.flags.overflowed)) {
  ------------------
  |  |  189|  12.4k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 12.4k]
  |  |  ------------------
  ------------------
  438|      0|      auto large = reinterpret_cast<const hbc::FunctionHeader *>(
  439|      0|          bufferPtr_ + smallHeader.getLargeHeaderOffset());
  440|      0|      return RuntimeFunctionHeader(large);
  441|  12.4k|    } else {
  442|  12.4k|      return RuntimeFunctionHeader(&smallHeader);
  443|  12.4k|    }
  444|  12.4k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer19getStringTableEntryEj:
  459|  15.0k|  StringTableEntry getStringTableEntry(uint32_t index) const override {
  460|  15.0k|    auto &smallHeader = stringTableEntries_[index];
  461|  15.0k|    if (LLVM_UNLIKELY(smallHeader.isOverflowed())) {
  ------------------
  |  |  189|  15.0k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15.0k]
  |  |  ------------------
  ------------------
  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|  15.0k|    StringTableEntry entry(
  468|  15.0k|        smallHeader.offset, smallHeader.length, smallHeader.isUTF16);
  469|  15.0k|    return entry;
  470|  15.0k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer11getBytecodeEj:
  472|  6.24k|  const uint8_t *getBytecode(uint32_t functionID) const override {
  473|  6.24k|    return bufferPtr_ + getFunctionHeader(functionID).offset();
  474|  6.24k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer12getRawBufferEv:
  501|    480|  llvh::ArrayRef<uint8_t> getRawBuffer() const override {
  502|    480|    return llvh::ArrayRef<uint8_t>(bufferPtr_, buffer_->size());
  503|    480|  }
_ZNK6hermes3hbc20BCProviderFromBuffer14isFunctionLazyEj:
  510|  6.24k|  bool isFunctionLazy(uint32_t functionID) const override {
  511|  6.24k|    return false;
  512|  6.24k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer6isLazyEv:
  514|  6.24k|  bool isLazy() const override {
  515|  6.24k|    return false;
  516|  6.24k|  }

_ZN6hermes3hbc15BytecodeOptionsC2Ev:
   58|    953|  BytecodeOptions() : _flags(0) {}
_ZN6hermes3hbc18BytecodeFileHeaderC2EmjRKNSt3__15arrayIhLm20EEEjjjjjjjjjjjjjjjjjjjNS0_15BytecodeOptionsE:
  123|    160|      : magic(magic),
  124|    160|        version(version),
  125|       |        sourceHash(),
  126|    160|        fileLength(fileLength),
  127|    160|        globalCodeIndex(globalCodeIndex),
  128|    160|        functionCount(functionCount),
  129|    160|        stringKindCount(stringKindCount),
  130|    160|        identifierCount(identifierCount),
  131|    160|        stringCount(stringCount),
  132|    160|        overflowStringCount(overflowStringCount),
  133|    160|        stringStorageSize(stringStorageSize),
  134|    160|        bigIntCount(bigIntCount),
  135|    160|        bigIntStorageSize(bigIntStorageSize),
  136|    160|        regExpCount(regExpCount),
  137|    160|        regExpStorageSize(regExpStorageSize),
  138|    160|        arrayBufferSize(arrayBufferSize),
  139|    160|        objKeyBufferSize(objKeyBufferSize),
  140|    160|        objValueBufferSize(objValueBufferSize),
  141|    160|        segmentID(segmentID),
  142|    160|        cjsModuleCount(cjsModuleCount),
  143|    160|        functionSourceCount(functionSourceCount),
  144|    160|        debugInfoOffset(debugInfoOffset),
  145|    160|        options(options) {
  146|    160|    std::copy(sourceHash.begin(), sourceHash.end(), this->sourceHash);
  147|    160|    std::fill(padding, padding + sizeof(padding), 0);
  148|    160|  }
_ZN6hermes3hbc18BytecodeFileFooterC2ERKNSt3__15arrayIhLm20EEE:
  161|    160|  BytecodeFileFooter(const SHA1 &fileHash) {
  162|    160|    std::copy(fileHash.begin(), fileHash.end(), this->fileHash);
  163|    160|  }
_ZNK6hermes3hbc21SmallStringTableEntry12isOverflowedEv:
  184|  15.0k|  bool isOverflowed() const {
  185|  15.0k|    return length == INVALID_LENGTH;
  186|  15.0k|  }
_ZN6hermes3hbc18FunctionHeaderFlagC2Ev:
  237|   104k|  FunctionHeaderFlag() {
  238|   104k|    flags = 0;
  239|   104k|    prohibitInvoke = ProhibitNone;
  240|   104k|  }
_ZNK6hermes3hbc18FunctionHeaderFlag16isCallProhibitedEb:
  244|  3.21k|  bool isCallProhibited(bool construct) const {
  245|  3.21k|    return prohibitInvoke == (uint8_t)construct;
  246|  3.21k|  }
_ZN6hermes3hbc14FunctionHeaderC2Ejjjjjhh:
  293|   103k|      : offset(0),
  294|   103k|        paramCount(paramCount),
  295|   103k|        bytecodeSizeInBytes(size),
  296|   103k|        functionName(functionNameID),
  297|   103k|        infoOffset(0),
  298|   103k|        frameSize(frameSize),
  299|   103k|        environmentSize(envSize),
  300|   103k|        highestReadCacheIndex(hiRCacheIndex),
  301|   103k|        highestWriteCacheIndex(hiWCacheIndex) {}
_ZN6hermes3hbc15SmallFuncHeaderC2ERKNS0_14FunctionHeaderE:
  324|    320|  SmallFuncHeader(const FunctionHeader &large) {
  325|    320|    std::memset(this, 0, sizeof(SmallFuncHeader)); // Avoid leaking junk.
  326|    320|    flags = large.flags;
  327|    320|#define CHECK_COPY_FIELD(api_type, store_type, name, bits) \
  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  329|    320|    setLargeHeaderOffset(large.infoOffset);                \
  330|    320|    return;                                                \
  331|    320|  }                                                        \
  332|    320|  name = large.name;
  333|    320|#pragma GCC diagnostic push
  334|    320|#pragma GCC diagnostic ignored "-Wtype-limits"
  335|  2.88k|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  ------------------
  |  |  260|    320|  V(uint32_t, uint32_t, offset, 25)              \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  261|    320|  V(uint32_t, uint32_t, paramCount, 7)           \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  262|    320|  /* second word */                              \
  |  |  263|    320|  V(uint32_t, uint32_t, bytecodeSizeInBytes, 15) \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  264|    320|  V(uint32_t, uint32_t, functionName, 17)        \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  265|    320|  /* third word */                               \
  |  |  266|    320|  V(uint32_t, uint32_t, infoOffset, 25)          \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  267|    320|  V(uint32_t, uint32_t, frameSize, 7)            \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  268|    320|  /* fourth word, with flags below */            \
  |  |  269|    320|  V(uint32_t, uint8_t, environmentSize, 8)       \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  270|    320|  V(uint8_t, uint8_t, highestReadCacheIndex, 8)  \
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  271|    320|  V(uint8_t, uint8_t, highestWriteCacheIndex, 8)
  |  |  ------------------
  |  |  |  |  335|    320|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    320|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 320]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    320|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  2.88k|#pragma GCC diagnostic pop
  337|  2.88k|#undef CHECK_COPY_FIELD
  338|  2.88k|    assert(!flags.overflowed);
  339|  2.88k|  }
_ZN6hermes3hbc28visitBytecodeSegmentsInOrderIZNS0_18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEENS0_12BytecodeFormEE27BytecodeFileFieldsPopulatorEEvRT_:
  407|    320|void visitBytecodeSegmentsInOrder(Visitor &visitor) {
  408|    320|  visitor.visitFunctionHeaders();
  409|    320|  visitor.visitStringKinds();
  410|    320|  visitor.visitIdentifierHashes();
  411|    320|  visitor.visitSmallStringTable();
  412|    320|  visitor.visitOverflowStringTable();
  413|    320|  visitor.visitStringStorage();
  414|    320|  visitor.visitArrayBuffer();
  415|    320|  visitor.visitObjectKeyBuffer();
  416|    320|  visitor.visitObjectValueBuffer();
  417|    320|  visitor.visitBigIntTable();
  418|    320|  visitor.visitBigIntStorage();
  419|    320|  visitor.visitRegExpTable();
  420|    320|  visitor.visitRegExpStorage();
  421|    320|  visitor.visitCJSModuleTable();
  422|    320|  visitor.visitFunctionSourceTable();
  423|    320|}

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

_ZNK6hermes3hbc28BytecodeInstructionGenerator16hasEncodingErrorEv:
   54|   206k|  bool hasEncodingError() const {
   55|   206k|    return encodingError_;
   56|   206k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator18getCurrentLocationEv:
   59|  14.2M|  offset_t getCurrentLocation() {
   60|  14.2M|    return opcodes_.size();
   61|  14.2M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitOpcodeENS0_8OperatorE:
   63|  8.54M|  offset_t emitOpcode(Operator op) {
   64|  8.54M|    auto loc = getCurrentLocation();
   65|  8.54M|    emitUInt8(op);
   66|  8.54M|    return loc;
   67|  8.54M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitOperandEli:
   69|  26.3M|  void emitOperand(param_t t, int size) {
   70|  78.5M|    while (size--) {
  ------------------
  |  Branch (70:12): [True: 52.1M, False: 26.3M]
  ------------------
   71|  52.1M|      opcodes_.push_back((opcode_atom_t)t);
   72|  52.1M|      t >>= 8;
   73|  52.1M|    }
   74|  26.3M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator15acquireBytecodeEv:
   77|    320|  std::vector<opcode_atom_t> acquireBytecode() {
   78|    320|    return std::move(opcodes_);
   79|    320|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitReg8El:
   89|  7.16M|  void emit##name(param_t value) {                        \
   90|  7.16M|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 7.16M]
  ------------------
   91|  7.16M|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  7.16M|    emitOperand(value, sizeof(ctype));                    \
   93|  7.16M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitReg32El:
   89|  7.22M|  void emit##name(param_t value) {                        \
   90|  7.22M|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 7.22M]
  ------------------
   91|  7.22M|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  7.22M|    emitOperand(value, sizeof(ctype));                    \
   93|  7.22M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitUInt8El:
   89|  9.94M|  void emit##name(param_t value) {                        \
   90|  9.94M|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 9.94M]
  ------------------
   91|  9.94M|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  9.94M|    emitOperand(value, sizeof(ctype));                    \
   93|  9.94M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitUInt16El:
   89|  1.00M|  void emit##name(param_t value) {                        \
   90|  1.00M|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 1.00M]
  ------------------
   91|  1.00M|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  1.00M|    emitOperand(value, sizeof(ctype));                    \
   93|  1.00M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitUInt32El:
   89|   827k|  void emit##name(param_t value) {                        \
   90|   827k|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 827k]
  ------------------
   91|   827k|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|   827k|    emitOperand(value, sizeof(ctype));                    \
   93|   827k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitAddr32El:
   89|   116k|  void emit##name(param_t value) {                        \
   90|   116k|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 116k]
  ------------------
   91|   116k|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|   116k|    emitOperand(value, sizeof(ctype));                    \
   93|   116k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitImm32El:
   89|  45.1k|  void emit##name(param_t value) {                        \
   90|  45.1k|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 45.1k]
  ------------------
   91|  45.1k|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  45.1k|    emitOperand(value, sizeof(ctype));                    \
   93|  45.1k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitDoubleEl:
   89|  21.8k|  void emit##name(param_t value) {                        \
   90|  21.8k|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 21.4k, False: 342]
  ------------------
   91|  21.8k|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  21.8k|    emitOperand(value, sizeof(ctype));                    \
   93|  21.8k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator13emitNewObjectEl:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitNewArrayWithBufferEllll:
  127|     14|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|     14|    auto loc = emitOpcode(name##Op);                                    \
  129|     14|    emit##t1(p1);                                                       \
  130|     14|    emit##t2(p2);                                                       \
  131|     14|    emit##t3(p3);                                                       \
  132|     14|    emit##t4(p4);                                                       \
  133|     14|    return loc;                                                         \
  134|     14|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitNewArrayEll:
  112|     87|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     87|    auto loc = emitOpcode(name##Op);            \
  114|     87|    emit##t1(p1);                               \
  115|     87|    emit##t2(p2);                               \
  116|     87|    return loc;                                 \
  117|     87|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitMovEll:
  112|   228k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|   228k|    auto loc = emitOpcode(name##Op);            \
  114|   228k|    emit##t1(p1);                               \
  115|   228k|    emit##t2(p2);                               \
  116|   228k|    return loc;                                 \
  117|   228k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitMovLongEll:
  112|  3.61M|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  3.61M|    auto loc = emitOpcode(name##Op);            \
  114|  3.61M|    emit##t1(p1);                               \
  115|  3.61M|    emit##t2(p2);                               \
  116|  3.61M|    return loc;                                 \
  117|  3.61M|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitNegateEll:
  112|  21.8k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  21.8k|    auto loc = emitOpcode(name##Op);            \
  114|  21.8k|    emit##t1(p1);                               \
  115|  21.8k|    emit##t2(p2);                               \
  116|  21.8k|    return loc;                                 \
  117|  21.8k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitNotEll:
  112|     24|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     24|    auto loc = emitOpcode(name##Op);            \
  114|     24|    emit##t1(p1);                               \
  115|     24|    emit##t2(p2);                               \
  116|     24|    return loc;                                 \
  117|     24|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitBitNotEll:
  112|  3.54k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  3.54k|    auto loc = emitOpcode(name##Op);            \
  114|  3.54k|    emit##t1(p1);                               \
  115|  3.54k|    emit##t2(p2);                               \
  116|  3.54k|    return loc;                                 \
  117|  3.54k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitTypeOfEll:
  112|     10|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     10|    auto loc = emitOpcode(name##Op);            \
  114|     10|    emit##t1(p1);                               \
  115|     10|    emit##t2(p2);                               \
  116|     10|    return loc;                                 \
  117|     10|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator6emitEqElll:
  119|    955|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|    955|    auto loc = emitOpcode(name##Op);                        \
  121|    955|    emit##t1(p1);                                           \
  122|    955|    emit##t2(p2);                                           \
  123|    955|    emit##t3(p3);                                           \
  124|    955|    return loc;                                             \
  125|    955|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitStrictEqElll:
  119|  20.3k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  20.3k|    auto loc = emitOpcode(name##Op);                        \
  121|  20.3k|    emit##t1(p1);                                           \
  122|  20.3k|    emit##t2(p2);                                           \
  123|  20.3k|    emit##t3(p3);                                           \
  124|  20.3k|    return loc;                                             \
  125|  20.3k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitLessElll:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitGreaterElll:
  119|  1.21k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  1.21k|    auto loc = emitOpcode(name##Op);                        \
  121|  1.21k|    emit##t1(p1);                                           \
  122|  1.21k|    emit##t2(p2);                                           \
  123|  1.21k|    emit##t3(p3);                                           \
  124|  1.21k|    return loc;                                             \
  125|  1.21k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitAddElll:
  119|  34.2k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  34.2k|    auto loc = emitOpcode(name##Op);                        \
  121|  34.2k|    emit##t1(p1);                                           \
  122|  34.2k|    emit##t2(p2);                                           \
  123|  34.2k|    emit##t3(p3);                                           \
  124|  34.2k|    return loc;                                             \
  125|  34.2k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitAddNElll:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitMulElll:
  119|    934|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|    934|    auto loc = emitOpcode(name##Op);                        \
  121|    934|    emit##t1(p1);                                           \
  122|    934|    emit##t2(p2);                                           \
  123|    934|    emit##t3(p3);                                           \
  124|    934|    return loc;                                             \
  125|    934|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitMulNElll:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitDivElll:
  119|  3.19k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  3.19k|    auto loc = emitOpcode(name##Op);                        \
  121|  3.19k|    emit##t1(p1);                                           \
  122|  3.19k|    emit##t2(p2);                                           \
  123|  3.19k|    emit##t3(p3);                                           \
  124|  3.19k|    return loc;                                             \
  125|  3.19k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitDivNElll:
  119|     22|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|     22|    auto loc = emitOpcode(name##Op);                        \
  121|     22|    emit##t1(p1);                                           \
  122|     22|    emit##t2(p2);                                           \
  123|     22|    emit##t3(p3);                                           \
  124|     22|    return loc;                                             \
  125|     22|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitModElll:
  119|  28.0k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  28.0k|    auto loc = emitOpcode(name##Op);                        \
  121|  28.0k|    emit##t1(p1);                                           \
  122|  28.0k|    emit##t2(p2);                                           \
  123|  28.0k|    emit##t3(p3);                                           \
  124|  28.0k|    return loc;                                             \
  125|  28.0k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitSubElll:
  119|    636|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|    636|    auto loc = emitOpcode(name##Op);                        \
  121|    636|    emit##t1(p1);                                           \
  122|    636|    emit##t2(p2);                                           \
  123|    636|    emit##t3(p3);                                           \
  124|    636|    return loc;                                             \
  125|    636|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitSubNElll:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitRShiftElll:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitBitAndElll:
  119|  16.3k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  16.3k|    auto loc = emitOpcode(name##Op);                        \
  121|  16.3k|    emit##t1(p1);                                           \
  122|  16.3k|    emit##t2(p2);                                           \
  123|  16.3k|    emit##t3(p3);                                           \
  124|  16.3k|    return loc;                                             \
  125|  16.3k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitBitOrElll:
  119|  51.1k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  51.1k|    auto loc = emitOpcode(name##Op);                        \
  121|  51.1k|    emit##t1(p1);                                           \
  122|  51.1k|    emit##t2(p2);                                           \
  123|  51.1k|    emit##t3(p3);                                           \
  124|  51.1k|    return loc;                                             \
  125|  51.1k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitIncEll:
  112|      1|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      1|    auto loc = emitOpcode(name##Op);            \
  114|      1|    emit##t1(p1);                               \
  115|      1|    emit##t2(p2);                               \
  116|      1|    return loc;                                 \
  117|      1|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator14emitInstanceOfElll:
  119|     12|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|     12|    auto loc = emitOpcode(name##Op);                        \
  121|     12|    emit##t1(p1);                                           \
  122|     12|    emit##t2(p2);                                           \
  123|     12|    emit##t3(p3);                                           \
  124|     12|    return loc;                                             \
  125|     12|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitIsInElll:
  119|     10|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|     10|    auto loc = emitOpcode(name##Op);                        \
  121|     10|    emit##t1(p1);                                           \
  122|     10|    emit##t2(p2);                                           \
  123|     10|    emit##t3(p3);                                           \
  124|     10|    return loc;                                             \
  125|     10|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitStoreToEnvironmentElll:
  119|   104k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|   104k|    auto loc = emitOpcode(name##Op);                        \
  121|   104k|    emit##t1(p1);                                           \
  122|   104k|    emit##t2(p2);                                           \
  123|   104k|    emit##t3(p3);                                           \
  124|   104k|    return loc;                                             \
  125|   104k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator23emitLoadFromEnvironmentElll:
  119|      4|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      4|    auto loc = emitOpcode(name##Op);                        \
  121|      4|    emit##t1(p1);                                           \
  122|      4|    emit##t2(p2);                                           \
  123|      4|    emit##t3(p3);                                           \
  124|      4|    return loc;                                             \
  125|      4|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitGetGlobalObjectEl:
  106|   503k|  offset_t emit##name(param_t p1) {  \
  107|   503k|    auto loc = emitOpcode(name##Op); \
  108|   503k|    emit##t1(p1);                    \
  109|   503k|    return loc;                      \
  110|   503k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitGetNewTargetEl:
  106|      9|  offset_t emit##name(param_t p1) {  \
  107|      9|    auto loc = emitOpcode(name##Op); \
  108|      9|    emit##t1(p1);                    \
  109|      9|    return loc;                      \
  110|      9|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator21emitCreateEnvironmentEl:
  106|   103k|  offset_t emit##name(param_t p1) {  \
  107|   103k|    auto loc = emitOpcode(name##Op); \
  108|   103k|    emit##t1(p1);                    \
  109|   103k|    return loc;                      \
  110|   103k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitGetByIdShortEllll:
  127|  68.4k|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|  68.4k|    auto loc = emitOpcode(name##Op);                                    \
  129|  68.4k|    emit##t1(p1);                                                       \
  130|  68.4k|    emit##t2(p2);                                                       \
  131|  68.4k|    emit##t3(p3);                                                       \
  132|  68.4k|    emit##t4(p4);                                                       \
  133|  68.4k|    return loc;                                                         \
  134|  68.4k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator14emitTryGetByIdEllll:
  127|   501k|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|   501k|    auto loc = emitOpcode(name##Op);                                    \
  129|   501k|    emit##t1(p1);                                                       \
  130|   501k|    emit##t2(p2);                                                       \
  131|   501k|    emit##t3(p3);                                                       \
  132|   501k|    emit##t4(p4);                                                       \
  133|   501k|    return loc;                                                         \
  134|   501k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitPutByIdEllll:
  127|  1.26k|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|  1.26k|    auto loc = emitOpcode(name##Op);                                    \
  129|  1.26k|    emit##t1(p1);                                                       \
  130|  1.26k|    emit##t2(p2);                                                       \
  131|  1.26k|    emit##t3(p3);                                                       \
  132|  1.26k|    emit##t4(p4);                                                       \
  133|  1.26k|    return loc;                                                         \
  134|  1.26k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitPutNewOwnByIdShortElll:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitPutOwnByIndexElll:
  119|     12|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|     12|    auto loc = emitOpcode(name##Op);                        \
  121|     12|    emit##t1(p1);                                           \
  122|     12|    emit##t2(p2);                                           \
  123|     12|    emit##t3(p3);                                           \
  124|     12|    return loc;                                             \
  125|     12|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitPutOwnByIndexLElll:
  119|   826k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|   826k|    auto loc = emitOpcode(name##Op);                        \
  121|   826k|    emit##t1(p1);                                           \
  122|   826k|    emit##t2(p2);                                           \
  123|   826k|    emit##t3(p3);                                           \
  124|   826k|    return loc;                                             \
  125|   826k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitGetByValElll:
  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|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitPutByValElll:
  119|     67|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|     67|    auto loc = emitOpcode(name##Op);                        \
  121|     67|    emit##t1(p1);                                           \
  122|     67|    emit##t2(p2);                                           \
  123|     67|    emit##t3(p3);                                           \
  124|     67|    return loc;                                             \
  125|     67|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitGetPNameListEllll:
  127|     15|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|     15|    auto loc = emitOpcode(name##Op);                                    \
  129|     15|    emit##t1(p1);                                                       \
  130|     15|    emit##t2(p2);                                                       \
  131|     15|    emit##t3(p3);                                                       \
  132|     15|    emit##t4(p4);                                                       \
  133|     15|    return loc;                                                         \
  134|     15|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitGetNextPNameElllll:
  137|     15|      param_t p1, param_t p2, param_t p3, param_t p4, param_t p5) { \
  138|     15|    auto loc = emitOpcode(name##Op);                                \
  139|     15|    emit##t1(p1);                                                   \
  140|     15|    emit##t2(p2);                                                   \
  141|     15|    emit##t3(p3);                                                   \
  142|     15|    emit##t4(p4);                                                   \
  143|     15|    emit##t5(p5);                                                   \
  144|     15|    return loc;                                                     \
  145|     15|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitCallElll:
  119|  2.82k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  2.82k|    auto loc = emitOpcode(name##Op);                        \
  121|  2.82k|    emit##t1(p1);                                           \
  122|  2.82k|    emit##t2(p2);                                           \
  123|  2.82k|    emit##t3(p3);                                           \
  124|  2.82k|    return loc;                                             \
  125|  2.82k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator13emitConstructElll:
  119|  25.0k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  25.0k|    auto loc = emitOpcode(name##Op);                        \
  121|  25.0k|    emit##t1(p1);                                           \
  122|  25.0k|    emit##t2(p2);                                           \
  123|  25.0k|    emit##t3(p3);                                           \
  124|  25.0k|    return loc;                                             \
  125|  25.0k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitCallLongElll:
  119|     19|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|     19|    auto loc = emitOpcode(name##Op);                        \
  121|     19|    emit##t1(p1);                                           \
  122|     19|    emit##t2(p2);                                           \
  123|     19|    emit##t3(p3);                                           \
  124|     19|    return loc;                                             \
  125|     19|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator15emitCallBuiltinElll:
  119|  2.80k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  2.80k|    auto loc = emitOpcode(name##Op);                        \
  121|  2.80k|    emit##t1(p1);                                           \
  122|  2.80k|    emit##t2(p2);                                           \
  123|  2.80k|    emit##t3(p3);                                           \
  124|  2.80k|    return loc;                                             \
  125|  2.80k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitCallBuiltinLongElll:
  119|     19|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|     19|    auto loc = emitOpcode(name##Op);                        \
  121|     19|    emit##t1(p1);                                           \
  122|     19|    emit##t2(p2);                                           \
  123|     19|    emit##t3(p3);                                           \
  124|     19|    return loc;                                             \
  125|     19|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitRetEl:
  106|   103k|  offset_t emit##name(param_t p1) {  \
  107|   103k|    auto loc = emitOpcode(name##Op); \
  108|   103k|    emit##t1(p1);                    \
  109|   103k|    return loc;                      \
  110|   103k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitCatchEl:
  106|  40.6k|  offset_t emit##name(param_t p1) {  \
  107|  40.6k|    auto loc = emitOpcode(name##Op); \
  108|  40.6k|    emit##t1(p1);                    \
  109|  40.6k|    return loc;                      \
  110|  40.6k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitThrowEl:
  106|  20.3k|  offset_t emit##name(param_t p1) {  \
  107|  20.3k|    auto loc = emitOpcode(name##Op); \
  108|  20.3k|    emit##t1(p1);                    \
  109|  20.3k|    return loc;                      \
  110|  20.3k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitAsyncBreakCheckEv:
  101|   103k|  offset_t emit##name() {            \
  102|   103k|    auto loc = emitOpcode(name##Op); \
  103|   103k|    return loc;                      \
  104|   103k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitCreateClosureElll:
  119|   103k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|   103k|    auto loc = emitOpcode(name##Op);                        \
  121|   103k|    emit##t1(p1);                                           \
  122|   103k|    emit##t2(p2);                                           \
  123|   103k|    emit##t3(p3);                                           \
  124|   103k|    return loc;                                             \
  125|   103k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator14emitCreateThisElll:
  119|  25.0k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  25.0k|    auto loc = emitOpcode(name##Op);                        \
  121|  25.0k|    emit##t1(p1);                                           \
  122|  25.0k|    emit##t2(p2);                                           \
  123|  25.0k|    emit##t3(p3);                                           \
  124|  25.0k|    return loc;                                             \
  125|  25.0k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitSelectObjectElll:
  119|  25.0k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  25.0k|    auto loc = emitOpcode(name##Op);                        \
  121|  25.0k|    emit##t1(p1);                                           \
  122|  25.0k|    emit##t2(p2);                                           \
  123|  25.0k|    emit##t3(p3);                                           \
  124|  25.0k|    return loc;                                             \
  125|  25.0k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator13emitLoadParamEll:
  112|   103k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|   103k|    auto loc = emitOpcode(name##Op);            \
  114|   103k|    emit##t1(p1);                               \
  115|   103k|    emit##t2(p2);                               \
  116|   103k|    return loc;                                 \
  117|   103k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitLoadConstUInt8Ell:
  112|   482k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|   482k|    auto loc = emitOpcode(name##Op);            \
  114|   482k|    emit##t1(p1);                               \
  115|   482k|    emit##t2(p2);                               \
  116|   482k|    return loc;                                 \
  117|   482k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitLoadConstIntEll:
  112|  45.1k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  45.1k|    auto loc = emitOpcode(name##Op);            \
  114|  45.1k|    emit##t1(p1);                               \
  115|  45.1k|    emit##t2(p2);                               \
  116|  45.1k|    return loc;                                 \
  117|  45.1k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitLoadConstDoubleEll:
  112|  21.8k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  21.8k|    auto loc = emitOpcode(name##Op);            \
  114|  21.8k|    emit##t1(p1);                               \
  115|  21.8k|    emit##t2(p2);                               \
  116|  21.8k|    return loc;                                 \
  117|  21.8k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitLoadConstBigIntEll:
  112|      5|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      5|    auto loc = emitOpcode(name##Op);            \
  114|      5|    emit##t1(p1);                               \
  115|      5|    emit##t2(p2);                               \
  116|      5|    return loc;                                 \
  117|      5|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitLoadConstStringEll:
  112|   394k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|   394k|    auto loc = emitOpcode(name##Op);            \
  114|   394k|    emit##t1(p1);                               \
  115|   394k|    emit##t2(p2);                               \
  116|   394k|    return loc;                                 \
  117|   394k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitLoadConstUndefinedEl:
  106|  66.9k|  offset_t emit##name(param_t p1) {  \
  107|  66.9k|    auto loc = emitOpcode(name##Op); \
  108|  66.9k|    emit##t1(p1);                    \
  109|  66.9k|    return loc;                      \
  110|  66.9k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitLoadConstNullEl:
  106|    949|  offset_t emit##name(param_t p1) {  \
  107|    949|    auto loc = emitOpcode(name##Op); \
  108|    949|    emit##t1(p1);                    \
  109|    949|    return loc;                      \
  110|    949|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitLoadConstTrueEl:
  106|  2.69k|  offset_t emit##name(param_t p1) {  \
  107|  2.69k|    auto loc = emitOpcode(name##Op); \
  108|  2.69k|    emit##t1(p1);                    \
  109|  2.69k|    return loc;                      \
  110|  2.69k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitLoadConstFalseEl:
  106|    128|  offset_t emit##name(param_t p1) {  \
  107|    128|    auto loc = emitOpcode(name##Op); \
  108|    128|    emit##t1(p1);                    \
  109|    128|    return loc;                      \
  110|    128|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitLoadConstZeroEl:
  106|   634k|  offset_t emit##name(param_t p1) {  \
  107|   634k|    auto loc = emitOpcode(name##Op); \
  108|   634k|    emit##t1(p1);                    \
  109|   634k|    return loc;                      \
  110|   634k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator14emitLoadThisNSEl:
  106|      9|  offset_t emit##name(param_t p1) {  \
  107|      9|    auto loc = emitOpcode(name##Op); \
  108|      9|    emit##t1(p1);                    \
  109|      9|    return loc;                      \
  110|      9|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitToNumberEll:
  112|    509|  offset_t emit##name(param_t p1, param_t p2) { \
  113|    509|    auto loc = emitOpcode(name##Op);            \
  114|    509|    emit##t1(p1);                               \
  115|    509|    emit##t2(p2);                               \
  116|    509|    return loc;                                 \
  117|    509|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitReifyArgumentsEl:
  106|     13|  offset_t emit##name(param_t p1) {  \
  107|     13|    auto loc = emitOpcode(name##Op); \
  108|     13|    emit##t1(p1);                    \
  109|     13|    return loc;                      \
  110|     13|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitCreateRegExpEllll:
  127|    119|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|    119|    auto loc = emitOpcode(name##Op);                                    \
  129|    119|    emit##t1(p1);                                                       \
  130|    119|    emit##t2(p2);                                                       \
  131|    119|    emit##t3(p3);                                                       \
  132|    119|    emit##t4(p4);                                                       \
  133|    119|    return loc;                                                         \
  134|    119|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitIteratorBeginEll:
  112|  22.3k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  22.3k|    auto loc = emitOpcode(name##Op);            \
  114|  22.3k|    emit##t1(p1);                               \
  115|  22.3k|    emit##t2(p2);                               \
  116|  22.3k|    return loc;                                 \
  117|  22.3k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitIteratorNextElll:
  119|  20.3k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  20.3k|    auto loc = emitOpcode(name##Op);                        \
  121|  20.3k|    emit##t1(p1);                                           \
  122|  20.3k|    emit##t2(p2);                                           \
  123|  20.3k|    emit##t3(p3);                                           \
  124|  20.3k|    return loc;                                             \
  125|  20.3k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitIteratorCloseEll:
  112|  42.7k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  42.7k|    auto loc = emitOpcode(name##Op);            \
  114|  42.7k|    emit##t1(p1);                               \
  115|  42.7k|    emit##t2(p2);                               \
  116|  42.7k|    return loc;                                 \
  117|  42.7k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitJmpLongEl:
  106|  24.7k|  offset_t emit##name(param_t p1) {  \
  107|  24.7k|    auto loc = emitOpcode(name##Op); \
  108|  24.7k|    emit##t1(p1);                    \
  109|  24.7k|    return loc;                      \
  110|  24.7k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator15emitJmpTrueLongEll:
  112|  75.6k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  75.6k|    auto loc = emitOpcode(name##Op);            \
  114|  75.6k|    emit##t1(p1);                               \
  115|  75.6k|    emit##t2(p2);                               \
  116|  75.6k|    return loc;                                 \
  117|  75.6k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitJmpFalseLongEll:
  112|  16.3k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  16.3k|    auto loc = emitOpcode(name##Op);            \
  114|  16.3k|    emit##t1(p1);                               \
  115|  16.3k|    emit##t2(p2);                               \
  116|  16.3k|    return loc;                                 \
  117|  16.3k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator20emitJmpUndefinedLongEll:
  112|     30|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     30|    auto loc = emitOpcode(name##Op);            \
  114|     30|    emit##t1(p1);                               \
  115|     30|    emit##t2(p2);                               \
  116|     30|    return loc;                                 \
  117|     30|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator25emitLoadConstDoubleDirectEld:
  168|  21.8k|  offset_t emitLoadConstDoubleDirect(param_t dst, double value) {
  169|       |    // NaN may have a different bit pattern on different platforms.
  170|       |    // We need to make sure that the bit pattern is consistent.
  171|  21.8k|    if (LLVM_UNLIKELY(std::isnan(value))) {
  ------------------
  |  |  189|  21.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 21.8k]
  |  |  ------------------
  ------------------
  172|      0|      static_assert(
  173|      0|          sizeof(double) == sizeof(uint64_t), "double better be 64 bits");
  174|      0|      static constexpr uint64_t qnan = 0xfff8000000000000;
  175|      0|      return emitLoadConstDouble(dst, qnan);
  176|      0|    }
  177|  21.8k|    return emitLoadConstDouble(dst, llvh::DoubleToBits(value));
  178|  21.8k|  }

_ZN6hermes3hbc17BCProviderFromSrc23createBCProviderFromSrcENSt3__110unique_ptrINS0_14BytecodeModuleENS2_14default_deleteIS4_EEEE:
  118|    196|      std::unique_ptr<hbc::BytecodeModule> module) {
  119|    196|    return std::unique_ptr<BCProviderFromSrc>(
  120|    196|        new BCProviderFromSrc(std::move(module)));
  121|    196|  }
_ZNK6hermes3hbc17BCProviderFromSrc17getFunctionHeaderEj:
  184|    197|  RuntimeFunctionHeader getFunctionHeader(uint32_t functionID) const override {
  185|    197|    return RuntimeFunctionHeader(&module_->getFunction(functionID).getHeader());
  186|    197|  }
_ZNK6hermes3hbc17BCProviderFromSrc19getStringTableEntryEj:
  188|  4.64k|  StringTableEntry getStringTableEntry(uint32_t index) const override {
  189|  4.64k|    assert(index < stringCount_ && "invalid string table index");
  190|  4.64k|    return module_->getStringTable()[index];
  191|  4.64k|  }
_ZNK6hermes3hbc17BCProviderFromSrc11getBytecodeEj:
  193|    197|  const uint8_t *getBytecode(uint32_t functionID) const override {
  194|    197|    return module_->getFunction(functionID).getOpcodeArray().data();
  195|    197|  }
_ZNK6hermes3hbc17BCProviderFromSrc17getExceptionTableEj:
  198|     52|      uint32_t functionID) const override {
  199|     52|    return module_->getFunction(functionID).getExceptionHandlers();
  200|     52|  }
_ZNK6hermes3hbc17BCProviderFromSrc15getDebugOffsetsEj:
  202|     53|  const hbc::DebugOffsets *getDebugOffsets(uint32_t functionID) const override {
  203|     53|    return module_->getFunction(functionID).getDebugOffsets();
  204|     53|  }
_ZNK6hermes3hbc17BCProviderFromSrc14isFunctionLazyEj:
  206|    278|  bool isFunctionLazy(uint32_t functionID) const override {
  207|    278|    return module_->getFunction(functionID).isLazy();
  208|    278|  }
_ZNK6hermes3hbc17BCProviderFromSrc6isLazyEv:
  210|    278|  bool isLazy() const override {
  211|    278|    return false;
  212|    278|  }
_ZNK6hermes3hbc17BCProviderFromSrc16isSingleFunctionEv:
  214|     82|  bool isSingleFunction() const {
  215|     82|    return singleFunction_;
  216|     82|  }
_ZN6hermes3hbc17BCProviderFromSrc17getBytecodeModuleEv:
  218|     81|  hbc::BytecodeModule *getBytecodeModule() {
  219|     81|    return module_.get();
  220|     81|  }
_ZN6hermes3hbc14BCProviderLazy20createBCProviderLazyEPNS0_16BytecodeFunctionE:
  247|     81|      hbc::BytecodeFunction *bytecodeFunction) {
  248|     81|    return std::unique_ptr<BCProviderBase>(
  249|     81|        new BCProviderLazy(bytecodeFunction));
  250|     81|  }
_ZNK6hermes3hbc14BCProviderLazy17getFunctionHeaderEj:
  252|     81|  RuntimeFunctionHeader getFunctionHeader(uint32_t) const override {
  253|     81|    return RuntimeFunctionHeader(&bytecodeFunction_->getHeader());
  254|     81|  }
_ZNK6hermes3hbc14BCProviderLazy6isLazyEv:
  277|     81|  bool isLazy() const override {
  278|     81|    return true;
  279|     81|  }

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

_ZN6hermes3hbc19DebugSourceLocationC2Ev:
   60|   206k|  DebugSourceLocation() {}
_ZN6hermes3hbc12DebugOffsetsC2Ejjj:
  152|   103k|      : sourceLocations(src),
  153|   103k|        scopeDescData(scopeDesc),
  154|   103k|        textifiedCallees(tCallee) {}
_ZN6hermes3hbc9DebugInfoC2EONS0_24ConsecutiveStringStorageEON4llvh11SmallVectorINS0_15DebugFileRegionELj1EEEjjjONS0_12StreamVectorIhEE:
  223|    196|      : filenameTable_(filenameStrings.acquireStringTable()),
  224|    196|        filenameStorage_(filenameStrings.acquireStringStorage()),
  225|    196|        files_(std::move(files)),
  226|    196|        scopeDescDataOffset_(scopeDescDataOffset),
  227|    196|        textifiedCalleeOffset_(textifiedCalleeOffset),
  228|    196|        stringTableOffset_(stringTableOffset),
  229|    196|        data_(std::move(data)) {}
_ZNK6hermes3hbc9DebugInfo15getFilenameByIDEj:
  263|     52|  std::string getFilenameByID(uint32_t id) const {
  264|     52|    assert(id < filenameTable_.size() && "Filename ID out of bounds");
  265|     52|    std::string utf8Storage;
  266|     52|    return getStringFromEntry(filenameTable_[id], filenameStorage_, utf8Storage)
  267|     52|        .str();
  268|     52|  }
_ZNK6hermes3hbc9DebugInfo32getTextifiedCalleesDataSizeBytesEv:
  323|      1|  uint32_t getTextifiedCalleesDataSizeBytes() const {
  324|      1|    return stringTableOffset_ - textifiedCalleeOffset_;
  325|      1|  }
_ZNK6hermes3hbc9DebugInfo19textifiedCalleeDataEv:
  353|      1|  llvh::ArrayRef<uint8_t> textifiedCalleeData() const {
  354|      1|    return data_.getData().slice(
  355|      1|        textifiedCalleeOffset_, getTextifiedCalleesDataSizeBytes());
  356|      1|  }
_ZNK6hermes3hbc9DebugInfo15stringTableDataEv:
  359|      1|  llvh::ArrayRef<uint8_t> stringTableData() const {
  360|      1|    return data_.getData().slice(stringTableOffset_);
  361|      1|  }
_ZN6hermes3hbc18DebugInfoGenerator5deltaEjj:
  431|  15.3M|  int32_t delta(uint32_t to, uint32_t from) {
  432|  15.3M|    int64_t diff = (int64_t)to - from;
  433|       |    // It's unlikely that lines or columns will ever jump from 0 to 3 billion,
  434|       |    // but if it ever happens we can extend to 64bit types.
  435|  15.3M|    assert(
  436|  15.3M|        diff <= INT32_MAX && diff >= INT32_MIN &&
  437|  15.3M|        "uint32_t delta too large when encoding debug info");
  438|  15.3M|    return (int32_t)diff;
  439|  15.3M|  }
_ZN6hermes3hbc9DebugInfoC2Ev:
  213|    196|  explicit DebugInfo() = default;
_ZN6hermes3hbc9DebugInfoaSEOS1_:
  247|    196|  DebugInfo &operator=(DebugInfo &&that) = default;
_ZN6hermes3hbc12DebugOffsetsC2Ev:
  150|   103k|  DebugOffsets() = default;

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

_ZN6hermes3hbc7HBCISelC2EPNS_8FunctionEPNS0_25BytecodeFunctionGeneratorERNS0_20HVMRegisterAllocatorERNS_21FunctionScopeAnalysisERNS_21ScopeRegisterAnalysisERKNS_25BytecodeGenerationOptionsERN4llvh13SmallDenseMapIjNS0_18FileAndSourceMapIdELj4ENSF_12DenseMapInfoIjEENSF_6detail12DenseMapPairIjSH_EEEE:
  211|   103k|      : F_(F),
  212|   103k|        BCFGen_(BCFGen),
  213|   103k|        RA_(RA),
  214|   103k|        scopeAnalysis_(scopeAnalysis),
  215|   103k|        SRA_(SRA),
  216|   103k|        bytecodeGenerationOptions_(options),
  217|   103k|        fileAndSourceMapIdCache_(debugIdCache) {
  218|   103k|    protoIdent_ = F->getContext().getIdentifier("__proto__");
  219|   103k|  }

_ZN6hermes3hbc23LowerLoadStoreFrameInstC2Ev:
   53|    196|      : FunctionPass("LowerLoadStoreFrameInst") {}
_ZN6hermes3hbc17LowerConstructionC2Ev:
   80|    196|  explicit LowerConstruction() : FunctionPass("LowerConstruction") {}
_ZN6hermes3hbc19LowerArgumentsArrayC2Ev:
   64|    196|  explicit LowerArgumentsArray() : FunctionPass("LowerArgumentsArray") {}
_ZN6hermes3hbc19DedupReifyArgumentsC2Ev:
   73|    196|  explicit DedupReifyArguments() : FunctionPass("DedupReifyArguments") {}
_ZN6hermes3hbc25LowerSwitchIntoJumpTablesC2Ev:
  178|    196|      : FunctionPass("LowerSwitchIntoJumpTables") {}
_ZN6hermes3hbc13LoadConstantsC2Ev:
   32|    196|  explicit LoadConstants() : FunctionPass("LoadConstants") {}
_ZN6hermes3hbc14LoadParametersC2Ev:
   40|    196|  explicit LoadParameters() : FunctionPass("LoadParameters") {}
_ZN6hermes3hbc10LowerCallsC2ERNS0_20HVMRegisterAllocatorE:
   90|   103k|      : FunctionPass("LowerCalls"), RA_(RA) {}
_ZN6hermes3hbc14SpillRegistersC2ERNS0_20HVMRegisterAllocatorE:
  134|   103k|      : FunctionPass("SpillRegisters"), RA_(RA) {}
_ZN6hermes3hbc14SpillRegisters7isShortENS_8RegisterE:
  150|  2.43M|  bool isShort(Register reg) {
  151|  2.43M|    return reg.getIndex() < boundary_;
  152|  2.43M|  }
_ZN6hermes3hbc14SpillRegisters11getReservedEi:
  153|  2.34M|  Register getReserved(int i) {
  154|  2.34M|    assert(i < reserved_ && "Using too many reserved regs.");
  155|  2.34M|    return Register(i);
  156|  2.34M|  }
_ZN6hermes3hbc14SpillRegisters19reserveLowRegistersEPNS_8FunctionE:
  158|     32|  void reserveLowRegisters(Function *F) {
  159|     32|    RA_.allocateSpillTempCount(reserved_);
  160|   492k|    for (auto &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (160:19): [True: 492k, False: 32]
  ------------------
  161|  3.56M|      for (auto &inst : BB) {
  ------------------
  |  Branch (161:23): [True: 3.56M, False: 492k]
  ------------------
  162|  3.56M|        if (RA_.isAllocated(&inst)) {
  ------------------
  |  Branch (162:13): [True: 3.56M, False: 0]
  ------------------
  163|  3.56M|          auto reg = RA_.getRegister(&inst);
  164|  3.56M|          RA_.updateRegister(&inst, reg.getConsecutive(reserved_));
  165|  3.56M|        }
  166|  3.56M|      }
  167|   492k|    }
  168|     32|  }

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

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

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

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

_ZN6hermes3hbc16StackFrameLayout23callerOutgoingRegistersEj:
  132|  2.66M|  static uint32_t callerOutgoingRegisters(uint32_t numArgsExcludingThis) {
  133|       |    // The >= pattern is specially recognized as an overflow check.
  134|  2.66M|    uint32_t totalCount = CallerExtraRegistersAtEnd + numArgsExcludingThis + 1;
  135|  2.66M|    return totalCount >= numArgsExcludingThis ? totalCount : UINT32_MAX;
  ------------------
  |  Branch (135:12): [True: 2.66M, False: 0]
  ------------------
  136|  2.66M|  }

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

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

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

_ZN6hermes27LowerExponentiationOperatorC2Ev:
  143|    196|      : FunctionPass("LowerExponentiationOperator") {}
_ZN6hermes22LowerNumericPropertiesC2Ev:
   93|    196|  explicit LowerNumericProperties() : FunctionPass("LowerNumericProperties") {}
_ZN6hermes15LimitAllocArrayC2Ej:
  115|    196|      : FunctionPass("LimitAllocArray"), maxSize_(maxSizeInclusive) {}
_ZN6hermes14SwitchLoweringC2Ev:
   25|    196|  explicit SwitchLowering() : FunctionPass("SwitchLowering") {}
_ZN6hermes16LowerStoreInstrsC2ERNS_17RegisterAllocatorE:
   81|   103k|      : FunctionPass("LowerStoreInstrs"), RA_(RA) {}

_ZN6hermes17RegisterAllocatorC2EPNS_8FunctionE:
  350|   103k|  explicit RegisterAllocator(Function *func) : F(func) {}
_ZN6hermes12RegisterFileC2Ev:
   89|   103k|  RegisterFile() = default;
_ZN6hermes17RegisterAllocatorD2Ev:
  352|   103k|  virtual ~RegisterAllocator() = default;
_ZN6hermes17RegisterAllocator19getMaxRegisterUsageEv:
  417|   268k|  virtual unsigned getMaxRegisterUsage() {
  418|   268k|    return file.getMaxRegisterUsage();
  419|   268k|  }
_ZN6hermes12RegisterFile19getMaxRegisterUsageEv:
  113|   268k|  unsigned getMaxRegisterUsage() {
  114|   268k|    return registers.size();
  115|   268k|  }
_ZN6hermes17RegisterAllocator20setFastPassThresholdEj:
  358|   103k|  void setFastPassThreshold(unsigned maxInstCount) {
  359|   103k|    fastPassThreshold = maxInstCount;
  360|   103k|  }
_ZN6hermes17RegisterAllocator14setMemoryLimitEm:
  362|   103k|  void setMemoryLimit(uint64_t memoryLimitInBytes) {
  363|   103k|    memoryLimit = memoryLimitInBytes;
  364|   103k|  }
_ZN6hermes8RegisterC2Ej:
   32|  19.5M|  explicit Register(unsigned val = InvalidRegister) : value(val) {}
_ZNK6hermes8Register7isValidEv:
   35|  8.36M|  bool isValid() const {
   36|  8.36M|    return value != InvalidRegister;
   37|  8.36M|  }
_ZNK6hermes8Register8getIndexEv:
   40|  39.4M|  unsigned getIndex() const {
   41|  39.4M|    return value;
   42|  39.4M|  }
_ZN6hermes8Register14getConsecutiveEj:
   68|  3.66M|  Register getConsecutive(unsigned count = 1) {
   69|  3.66M|    return Register(getIndex() + count);
   70|  3.66M|  }
_ZN6hermes7SegmentC2Emm:
  136|  6.84M|  explicit Segment(size_t start, size_t end) : start_(start), end_(end) {
  137|  6.84M|    assert(end_ >= start_ && "invalid segment range");
  138|  6.84M|  }
_ZNK6hermes7Segment10intersectsES0_:
  156|  7.88M|  bool intersects(Segment other) const {
  157|  7.88M|    return !(other.start_ >= end_ || start_ >= other.end_);
  ------------------
  |  Branch (157:14): [True: 5.69M, False: 2.18M]
  |  Branch (157:38): [True: 216, False: 2.18M]
  ------------------
  158|  7.88M|  }
_ZNK6hermes7Segment7touchesES0_:
  161|  5.69M|  bool touches(Segment other) const {
  162|  5.69M|    return other.start_ == end_ || start_ == other.end_;
  ------------------
  |  Branch (162:12): [True: 5.69M, False: 192]
  |  Branch (162:36): [True: 144, False: 48]
  ------------------
  163|  5.69M|  }
_ZN6hermes7Segment5mergeES0_:
  166|  3.94M|  void merge(Segment other) {
  167|  3.94M|    assert(
  168|  3.94M|        (intersects(other) || touches(other)) &&
  169|  3.94M|        "merging non overlapping segment");
  170|  3.94M|    start_ = std::min(start_, other.start_);
  171|  3.94M|    end_ = std::max(end_, other.end_);
  172|  3.94M|  }
_ZN6hermes8IntervalC2Emm:
  182|  2.89M|  explicit Interval(size_t start, size_t end) {
  183|  2.89M|    add(Segment(start, end));
  184|  2.89M|  }
_ZNK6hermes8Interval10intersectsERKS0_:
  196|     40|  bool intersects(const Interval &other) const {
  197|     40|    Segment a(start(), end());
  198|     40|    Segment b(other.start(), other.end());
  199|     40|    return a.intersects(b);
  200|     40|  }
_ZN6hermes8Interval3addERKS0_:
  203|     56|  void add(const Interval &other) {
  204|     72|    for (auto &S : other.segments_) {
  ------------------
  |  Branch (204:18): [True: 72, False: 56]
  ------------------
  205|     72|      add(S);
  206|     72|    }
  207|     56|  }
_ZN6hermes8Interval3addENS_7SegmentE:
  210|  6.84M|  void add(Segment other) {
  211|  6.84M|    for (auto &s : segments_) {
  ------------------
  |  Branch (211:18): [True: 3.94M, False: 2.89M]
  ------------------
  212|  3.94M|      if (s.intersects(other) || s.touches(other)) {
  ------------------
  |  Branch (212:11): [True: 1.09M, False: 2.84M]
  |  Branch (212:34): [True: 2.84M, False: 48]
  ------------------
  213|  3.94M|        s.merge(other);
  214|  3.94M|        return;
  215|  3.94M|      }
  216|  3.94M|    }
  217|  2.89M|    segments_.push_back(other);
  218|  2.89M|  }
_ZNK6hermes8Interval4sizeEv:
  230|  5.79M|  size_t size() const {
  231|  5.79M|    if (segments_.size())
  ------------------
  |  Branch (231:9): [True: 5.79M, False: 0]
  ------------------
  232|  5.79M|      return end() - start();
  233|       |
  234|      0|    return 0;
  235|  5.79M|  }
_ZNK6hermes8Interval5startEv:
  237|  98.3M|  size_t start() const {
  238|  98.3M|    assert(segments_.size() && "No segments in interval!");
  239|  98.3M|    size_t start = segments_[0].start_;
  240|  98.3M|    for (auto &S : segments_) {
  ------------------
  |  Branch (240:18): [True: 98.3M, False: 98.3M]
  ------------------
  241|  98.3M|      start = std::min(start, S.start_);
  242|  98.3M|    }
  243|  98.3M|    return start;
  244|  98.3M|  }
_ZNK6hermes8Interval3endEv:
  246|   289M|  size_t end() const {
  247|   289M|    assert(segments_.size() && "No segments in interval!");
  248|   289M|    size_t start = segments_[0].end_;
  249|   289M|    for (auto &S : segments_) {
  ------------------
  |  Branch (249:18): [True: 289M, False: 289M]
  ------------------
  250|   289M|      start = std::max(start, S.end_);
  251|   289M|    }
  252|   289M|    return start;
  253|   289M|  }
_ZN6hermes17RegisterAllocator17BlockLifetimeInfo4initEj:
  262|  33.0k|    void init(unsigned size) {
  263|  33.0k|      gen_.resize(size);
  264|  33.0k|      kill_.resize(size);
  265|  33.0k|      liveIn_.resize(size);
  266|  33.0k|      liveOut_.resize(size);
  267|  33.0k|      maskIn_.resize(size);
  268|  33.0k|    }
_ZN6hermes17RegisterAllocator16getMaxInstrIndexEv:
  295|    700|  unsigned getMaxInstrIndex() {
  296|    700|    return instructionsByNumbers_.size();
  297|    700|  }
_ZN6hermes8IntervalC2Ev:
  180|  2.89M|  explicit Interval() = default;
_ZN6hermes17RegisterAllocator17BlockLifetimeInfoC2Ev:
  261|  33.0k|    BlockLifetimeInfo() = default;

_ZN6hermes15isNativeBuiltinEj:
   44|   390k|inline bool isNativeBuiltin(unsigned method) {
   45|   390k|  assert(method < BuiltinMethod::_count && "out of bound BuiltinMethod index");
   46|   390k|  return method < BuiltinMethod::_firstJS;
   47|   390k|};

_ZN6hermes21FunctionScopeAnalysisC2EPNS_8FunctionE:
  171|    196|  explicit FunctionScopeAnalysis(Function *entryPoint) {
  172|    196|    ScopeData data =
  173|    196|        calculateFunctionScopeData(entryPoint->getFunctionScopeDesc(), 0);
  174|    196|    assert(!data.orphaned && data.depth == 0);
  175|    196|    (void)data;
  176|    196|  }
_ZN6hermes17PostOrderAnalysis6rbeginEv:
   60|   310k|  inline reverse_iterator rbegin() {
   61|   310k|    return Order.rbegin();
   62|   310k|  }
_ZN6hermes17PostOrderAnalysis4rendEv:
   63|   310k|  inline reverse_iterator rend() {
   64|   310k|    return Order.rend();
   65|   310k|  }
_ZN6hermes21FunctionScopeAnalysis9ScopeDataC2Eib:
  146|  1.17k|        : depth(depth), orphaned(orphaned) {}
_ZN6hermes21FunctionScopeAnalysis9ScopeData6orphanEv:
  149|    392|    static ScopeData orphan() {
  150|    392|      return ScopeData(0, true);
  151|    392|    }

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

_ZN6hermes4TypeC2Ett:
  129|  3.08M|      : bitmask_(mask), numBitmask_(numMask) {}
_ZNK6hermes4Type8isNoTypeEv:
  148|  4.73M|  constexpr bool isNoType() const {
  149|  4.73M|    return bitmask_ == 0;
  150|  4.73M|  }
_ZN6hermes4Type12createNoTypeEv:
  152|  1.40M|  static constexpr Type createNoType() {
  153|  1.40M|    return Type(0);
  154|  1.40M|  }
_ZN6hermes4Type11createEmptyEv:
  159|    196|  static constexpr Type createEmpty() {
  160|    196|    return Type(BIT_TO_VAL(Empty));
  ------------------
  |  |   94|    196|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  161|    196|  }
_ZN6hermes4Type15createUndefinedEv:
  162|    196|  static constexpr Type createUndefined() {
  163|    196|    return Type(BIT_TO_VAL(Undefined));
  ------------------
  |  |   94|    196|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  164|    196|  }
_ZN6hermes4Type10createNullEv:
  165|    196|  static constexpr Type createNull() {
  166|    196|    return Type(BIT_TO_VAL(Null));
  ------------------
  |  |   94|    196|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  167|    196|  }
_ZN6hermes4Type13createBooleanEv:
  168|    392|  static constexpr Type createBoolean() {
  169|    392|    return Type(BIT_TO_VAL(Boolean));
  ------------------
  |  |   94|    392|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  170|    392|  }
_ZN6hermes4Type12createStringEv:
  171|  11.4k|  static constexpr Type createString() {
  172|  11.4k|    return Type(BIT_TO_VAL(String));
  ------------------
  |  |   94|  11.4k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  173|  11.4k|  }
_ZN6hermes4Type12createObjectEv:
  174|   631k|  static constexpr Type createObject() {
  175|   631k|    return Type(BIT_TO_VAL(Object));
  ------------------
  |  |   94|   631k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  176|   631k|  }
_ZN6hermes4Type12createNumberEv:
  177|    889|  static constexpr Type createNumber() {
  178|    889|    return Type(BIT_TO_VAL(Number));
  ------------------
  |  |   94|    889|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  179|    889|  }
_ZN6hermes4Type12createBigIntEv:
  180|      5|  static constexpr Type createBigInt() {
  181|      5|    return Type(BIT_TO_VAL(BigInt));
  ------------------
  |  |   94|      5|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  182|      5|  }
_ZN6hermes4Type13createClosureEv:
  186|   206k|  static constexpr Type createClosure() {
  187|   206k|    return Type(BIT_TO_VAL(Closure));
  ------------------
  |  |   94|   206k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  188|   206k|  }
_ZN6hermes4Type12createRegExpEv:
  189|    119|  static constexpr Type createRegExp() {
  190|    119|    return Type(BIT_TO_VAL(RegExp));
  ------------------
  |  |   94|    119|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  191|    119|  }
_ZN6hermes4Type11createInt32Ev:
  192|   827k|  static constexpr Type createInt32() {
  193|   827k|    return Type(BIT_TO_VAL(Number), NUM_BIT_TO_VAL(Int32));
  ------------------
  |  |   94|   827k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
                  return Type(BIT_TO_VAL(Number), NUM_BIT_TO_VAL(Int32));
  ------------------
  |  |   97|   827k|#define NUM_BIT_TO_VAL(XX) (1 << NumTypeKind::XX)
  ------------------
  194|   827k|  }
_ZNK6hermes4Type12isObjectTypeEv:
  216|      1|  bool isObjectType() const {
  217|       |    // One or more of OBJECT_BITS must be set, and no other bit must be set.
  218|      1|    return bitmask_ && !(bitmask_ & ~OBJECT_BITS);
  ------------------
  |  Branch (218:12): [True: 1, False: 0]
  |  Branch (218:24): [True: 1, False: 0]
  ------------------
  219|      1|  }
_ZNK6hermes4Type12isNumberTypeEv:
  221|   157k|  constexpr bool isNumberType() const {
  222|   157k|    return IS_VAL(Number);
  ------------------
  |  |   95|   157k|#define IS_VAL(XX) (bitmask_ == (1 << TypeKind::XX))
  ------------------
  223|   157k|  }
_ZNK6hermes4Type8isNonPtrEv:
  255|   104k|  constexpr bool isNonPtr() const {
  256|       |    // One or more of NONPTR_BITS must be set, and no other bit must be set.
  257|   104k|    return bitmask_ && !(bitmask_ & ~NONPTR_BITS);
  ------------------
  |  Branch (257:12): [True: 104k, False: 0]
  |  Branch (257:24): [True: 0, False: 104k]
  ------------------
  258|   104k|  }
_ZN6hermes5ValuedlEPv:
  474|  12.5M|  void operator delete(void *p) {
  475|  12.5M|    ::operator delete(p);
  476|  12.5M|  }
_ZN6hermes5ValueC2ENS_9ValueKindE:
  480|  12.7M|  explicit Value(ValueKind k) {
  481|  12.7M|    Kind = k;
  482|  12.7M|  }
_ZNK6hermes5Value7getKindEv:
  520|   562M|  ValueKind getKind() const {
  521|   562M|    return Kind;
  522|   562M|  }
_ZN6hermes5Value7setTypeENS_4TypeE:
  528|  6.18M|  void setType(Type type) {
  529|  6.18M|    valueType = type;
  530|  6.18M|  }
_ZNK6hermes5Value7getTypeEv:
  533|  8.09M|  Type getType() const {
  534|  8.09M|    return valueType;
  535|  8.09M|  }
_ZN6hermes9ScopeDescC2EPS0_:
  572|   103k|      : Value(ValueKind::ScopeDescKind), parent_(p) {}
_ZN6hermes9ScopeDesc16createInnerScopeEv:
  580|   103k|  ScopeDesc *createInnerScope() {
  581|   103k|    auto *S = new ScopeDesc(this);
  582|   103k|    innerScopes_.emplace_back(S);
  583|   103k|    return S;
  584|   103k|  }
_ZNK6hermes9ScopeDesc9getParentEv:
  586|   310k|  ScopeDesc *getParent() const {
  587|   310k|    return parent_;
  588|   310k|  }
_ZNK6hermes9ScopeDesc12getVariablesEv:
  609|   311k|  const VariableListType &getVariables() const {
  610|   311k|    return variables_;
  611|   311k|  }
_ZN6hermes9ScopeDesc11addVariableEPNS_8VariableE:
  613|   103k|  void addVariable(Variable *V) {
  614|   103k|    variables_.emplace_back(V);
  615|   103k|  }
_ZNK6hermes9ScopeDesc11hasFunctionEv:
  620|  4.90M|  bool hasFunction() const {
  621|  4.90M|    return function_;
  622|  4.90M|  }
_ZNK6hermes9ScopeDesc18getSerializedScopeEv:
  633|    162|  SerializedScopePtr getSerializedScope() const {
  634|    162|    return serializedScope_;
  635|    162|  }
_ZNK6hermes9ScopeDesc10getDynamicEv:
  641|   103k|  bool getDynamic() const {
  642|   103k|    return dynamic_;
  643|   103k|  }
_ZN6hermes9ScopeDesc7classofEPKNS_5ValueE:
  645|   621k|  static bool classof(const Value *V) {
  646|   621k|    return V->getKind() == ValueKind::ScopeDescKind;
  647|   621k|  }
_ZN6hermes9Parameter7classofEPKNS_5ValueE:
  696|   206k|  static bool classof(const Value *V) {
  697|   206k|    return V->getKind() == ValueKind::ParameterKind;
  698|   206k|  }
_ZN6hermes13EmptySentinelC2Ev:
  707|    196|  explicit EmptySentinel() : Value(ValueKind::EmptySentinelKind) {}
_ZN6hermes13EmptySentinel7classofEPKNS_5ValueE:
  709|      2|  static bool classof(const Value *V) {
  710|      2|    return V->getKind() == ValueKind::EmptySentinelKind;
  711|      2|  }
_ZN6hermes5LabelC2ENS_10IdentifierE:
  731|   136k|  explicit Label(Identifier txt) : Value(ValueKind::LabelKind), text(txt) {}
_ZN6hermes7LiteralC2ENS_9ValueKindE:
  747|   840k|  explicit Literal(ValueKind k) : Value(k) {}
_ZN6hermes7Literal7classofEPKNS_5ValueE:
  749|  18.6M|  static bool classof(const Value *V) {
  750|  18.6M|    return kindIsA(V->getKind(), ValueKind::LiteralKind);
  751|  18.6M|  }
_ZN6hermes12LiteralEmptyC2Ev:
  759|    196|  explicit LiteralEmpty() : Literal(ValueKind::LiteralEmptyKind) {
  760|    196|    setType(Type::createEmpty());
  761|    196|  }
_ZN6hermes11LiteralNullC2Ev:
  773|    196|  explicit LiteralNull() : Literal(ValueKind::LiteralNullKind) {
  774|    196|    setType(Type::createNull());
  775|    196|  }
_ZN6hermes16LiteralUndefinedC2Ev:
  787|    196|  explicit LiteralUndefined() : Literal(ValueKind::LiteralUndefinedKind) {
  788|    196|    setType(Type::createUndefined());
  789|    196|  }
_ZN6hermes16LiteralUndefined7classofEPKNS_5ValueE:
  791|  2.82k|  static bool classof(const Value *V) {
  792|  2.82k|    return V->getKind() == ValueKind::LiteralUndefinedKind;
  793|  2.82k|  }
_ZN6hermes13LiteralBigIntC2EPNS_12UniqueStringE:
  805|      5|      : Literal(ValueKind::LiteralBigIntKind), value(v) {
  806|      5|    setType(Type::createBigInt());
  807|      5|  }
_ZNK6hermes13LiteralBigInt8getValueEv:
  809|      5|  UniqueString *getValue() const {
  810|      5|    return value;
  811|      5|  }
_ZN6hermes13LiteralBigInt7ProfileERN4llvh16FoldingSetNodeIDEPNS_12UniqueStringE:
  813|      5|  static void Profile(llvh::FoldingSetNodeID &ID, UniqueString *value) {
  814|      5|    ID.AddPointer(value);
  815|      5|  }
_ZN6hermes13LiteralBigInt7classofEPKNS_5ValueE:
  821|     10|  static bool classof(const Value *V) {
  822|     10|    return V->getKind() == ValueKind::LiteralBigIntKind;
  823|     10|  }
_ZNK6hermes13LiteralNumber8getValueEv:
  832|  30.2k|  double getValue() const {
  833|  30.2k|    return value;
  834|  30.2k|  }
_ZNK6hermes13LiteralNumber14isPositiveZeroEv:
  860|  1.18M|  bool isPositiveZero() const {
  861|  1.18M|    return value == 0.0 && !std::signbit(value);
  ------------------
  |  Branch (861:12): [True: 634k, False: 549k]
  |  Branch (861:28): [True: 634k, False: 0]
  ------------------
  862|  1.18M|  }
_ZNK6hermes13LiteralNumber20isUInt8RepresentibleEv:
  866|   549k|  bool isUInt8Representible() const {
  867|   549k|    return isIntTypeRepresentible<uint8_t>().hasValue();
  868|   549k|  }
_ZNK6hermes13LiteralNumber20isInt32RepresentibleEv:
  872|   894k|  bool isInt32Representible() const {
  873|   894k|    return isIntTypeRepresentible<int32_t>().hasValue();
  874|   894k|  }
_ZNK6hermes13LiteralNumber21isUInt32RepresentibleEv:
  878|      2|  bool isUInt32Representible() const {
  879|      2|    return isIntTypeRepresentible<uint32_t>().hasValue();
  880|      2|  }
_ZNK6hermes13LiteralNumber7asUInt8Ev:
  884|   482k|  uint32_t asUInt8() const {
  885|   482k|    auto tmp = isIntTypeRepresentible<uint8_t>();
  886|   482k|    assert(tmp && "Cannot convert to uint8_t");
  887|   482k|    return tmp.getValue();
  888|   482k|  }
_ZNK6hermes13LiteralNumber7asInt32Ev:
  892|  47.9k|  int32_t asInt32() const {
  893|  47.9k|    auto tmp = isIntTypeRepresentible<int32_t>();
  894|  47.9k|    assert(tmp && "Cannot convert to int32_t");
  895|  47.9k|    return tmp.getValue();
  896|  47.9k|  }
_ZNK6hermes13LiteralNumber8asUInt32Ev:
  900|   103k|  uint32_t asUInt32() const {
  901|   103k|    auto tmp = isIntTypeRepresentible<uint32_t>();
  902|   103k|    assert(tmp && "Cannot convert to uint32_t");
  903|   103k|    return tmp.getValue();
  904|   103k|  }
_ZNK6hermes13LiteralNumber19convertToArrayIndexEv:
  918|  1.65M|  OptValue<uint32_t> convertToArrayIndex() const {
  919|  1.65M|    return doubleToArrayIndex(value);
  920|  1.65M|  }
_ZN6hermes13LiteralNumberC2Ed:
  923|   827k|      : Literal(ValueKind::LiteralNumberKind), value(val) {
  924|   827k|    if (isInt32Representible()) {
  ------------------
  |  Branch (924:9): [True: 827k, False: 380]
  ------------------
  925|   827k|      setType(Type::createInt32());
  926|   827k|    } else {
  927|    380|      setType(Type::createNumber());
  928|    380|    }
  929|   827k|  }
_ZN6hermes13LiteralNumber7ProfileERN4llvh16FoldingSetNodeIDEd:
  931|  7.09M|  static void Profile(llvh::FoldingSetNodeID &ID, double value) {
  932|  7.09M|    ID.AddInteger(llvh::DoubleToBits(value));
  933|  7.09M|  }
_ZNK6hermes13LiteralNumber7ProfileERN4llvh16FoldingSetNodeIDE:
  935|  4.56M|  void Profile(llvh::FoldingSetNodeID &ID) const {
  936|  4.56M|    LiteralNumber::Profile(ID, value);
  937|  4.56M|  }
_ZN6hermes13LiteralNumber7classofEPKNS_5ValueE:
  939|  6.24M|  static bool classof(const Value *V) {
  940|  6.24M|    return V->getKind() == ValueKind::LiteralNumberKind;
  941|  6.24M|  }
_ZNK6hermes13LiteralString8getValueEv:
  950|  2.48M|  Identifier getValue() const {
  951|  2.48M|    return value;
  952|  2.48M|  }
_ZN6hermes13LiteralStringC2ENS_10IdentifierE:
  955|  11.4k|      : Literal(ValueKind::LiteralStringKind), value(val) {
  956|  11.4k|    setType(Type::createString());
  957|  11.4k|  }
_ZN6hermes13LiteralString7ProfileERN4llvh16FoldingSetNodeIDENS_10IdentifierE:
  959|  2.42M|  static void Profile(llvh::FoldingSetNodeID &ID, Identifier value) {
  960|  2.42M|    ID.AddPointer(value.getUnderlyingPointer());
  961|  2.42M|  }
_ZNK6hermes13LiteralString7ProfileERN4llvh16FoldingSetNodeIDE:
  963|  1.52M|  void Profile(llvh::FoldingSetNodeID &ID) const {
  964|  1.52M|    LiteralString::Profile(ID, value);
  965|  1.52M|  }
_ZN6hermes13LiteralString7classofEPKNS_5ValueE:
  967|  15.6M|  static bool classof(const Value *V) {
  968|  15.6M|    return V->getKind() == ValueKind::LiteralStringKind;
  969|  15.6M|  }
_ZNK6hermes11LiteralBool8getValueEv:
  978|  1.69M|  bool getValue() const {
  979|  1.69M|    return value;
  980|  1.69M|  }
_ZN6hermes11LiteralBoolC2Eb:
  983|    392|      : Literal(ValueKind::LiteralBoolKind), value(val) {
  984|    392|    setType(Type::createBoolean());
  985|    392|  }
_ZN6hermes11LiteralBool7classofEPKNS_5ValueE:
  987|  1.69M|  static bool classof(const Value *V) {
  988|  1.69M|    return V->getKind() == ValueKind::LiteralBoolKind;
  989|  1.69M|  }
_ZN6hermes12GlobalObjectC2Ev:
  999|    196|  explicit GlobalObject() : Literal(ValueKind::GlobalObjectKind) {
 1000|    196|    setType(Type::createObject());
 1001|    196|  }
_ZN6hermes12GlobalObject7classofEPKNS_5ValueE:
 1003|  2.75M|  static bool classof(const Value *V) {
 1004|  2.75M|    return V->getKind() == ValueKind::GlobalObjectKind;
 1005|  2.75M|  }
_ZN6hermes8VariableC2EPNS_9ScopeDescENS_18JavaScriptDeclKindENS_10IdentifierE:
 1043|   103k|      : Variable(ValueKind::VariableKind, scope, declKind, txt){};
_ZNK6hermes8Variable7getNameEv:
 1051|   104k|  Identifier getName() const {
 1052|   104k|    return text;
 1053|   104k|  }
_ZNK6hermes8Variable9getParentEv:
 1054|   208k|  ScopeDesc *getParent() const {
 1055|   208k|    return parent;
 1056|   208k|  }
_ZNK6hermes8Variable11getObeysTDZEv:
 1063|  1.16k|  bool getObeysTDZ() const {
 1064|  1.16k|    return declKind != DeclKind::Var;
 1065|  1.16k|  }
_ZN6hermes8Variable7classofEPKNS_5ValueE:
 1083|  1.23M|  static bool classof(const Value *V) {
 1084|  1.23M|    return V->getKind() == ValueKind::VariableKind;
 1085|  1.23M|  }
_ZN6hermes20GlobalObjectPropertyC2EPNS_6ModuleEPNS_13LiteralStringEb:
 1101|  9.38k|      : Value(ValueKind::GlobalObjectPropertyKind),
 1102|  9.38k|        parent_(parent),
 1103|  9.38k|        name_(name),
 1104|  9.38k|        declared_(declared) {}
_ZN6hermes20GlobalObjectProperty7classofEPKNS_5ValueE:
 1106|  1.52M|  static bool classof(const Value *v) {
 1107|  1.52M|    return v->getKind() == ValueKind::GlobalObjectPropertyKind;
 1108|  1.52M|  }
_ZNK6hermes20GlobalObjectProperty7getNameEv:
 1114|   504k|  LiteralString *getName() const {
 1115|   504k|    return name_;
 1116|   504k|  }
_ZNK6hermes20GlobalObjectProperty10isDeclaredEv:
 1118|   521k|  bool isDeclared() const {
 1119|   521k|    return declared_;
 1120|   521k|  }
_ZN6hermes11InstructionC2ENS_9ValueKindE:
 1150|  10.3M|  explicit Instruction(ValueKind kind) : Value(kind), Parent(nullptr) {}
_ZN6hermes11Instruction11setLocationEN4llvh5SMLocE:
 1175|  10.3M|  void setLocation(SMLoc loc) {
 1176|  10.3M|    location_ = loc;
 1177|  10.3M|  }
_ZNK6hermes11Instruction11getLocationEv:
 1178|  13.0M|  SMLoc getLocation() const {
 1179|  13.0M|    return location_;
 1180|  13.0M|  }
_ZNK6hermes11Instruction11hasLocationEv:
 1181|  13.3M|  bool hasLocation() const {
 1182|  13.3M|    return location_.isValid();
 1183|  13.3M|  }
_ZN6hermes11Instruction19setSourceLevelScopeEPNS_9ScopeDescE:
 1185|  10.3M|  void setSourceLevelScope(ScopeDesc *sourceLevelScope) {
 1186|  10.3M|    SourceLevelScope = sourceLevelScope;
 1187|  10.3M|  }
_ZNK6hermes11Instruction19getSourceLevelScopeEv:
 1188|  13.0M|  ScopeDesc *getSourceLevelScope() const {
 1189|  13.0M|    return SourceLevelScope;
 1190|  13.0M|  }
_ZN6hermes11Instruction17setStatementIndexEj:
 1194|  10.3M|  void setStatementIndex(uint32_t statementIndex) {
 1195|  10.3M|    statementIndex_ = statementIndex;
 1196|  10.3M|  }
_ZNK6hermes11Instruction17getStatementIndexEv:
 1198|  10.8M|  uint32_t getStatementIndex() const {
 1199|  10.8M|    return statementIndex_;
 1200|  10.8M|  }
_ZNK6hermes11Instruction9getParentEv:
 1243|  21.9M|  BasicBlock *getParent() const {
 1244|  21.9M|    return Parent;
 1245|  21.9M|  }
_ZN6hermes11Instruction9setParentEPNS_10BasicBlockE:
 1246|  10.3M|  void setParent(BasicBlock *parent) {
 1247|  10.3M|    Parent = parent;
 1248|  10.3M|  }
_ZN6hermes11Instruction7classofEPKNS_5ValueE:
 1250|  58.9M|  static bool classof(const Value *V) {
 1251|  58.9M|    return kindIsA(V->getKind(), ValueKind::InstructionKind);
 1252|  58.9M|  }
_ZN4llvh18ilist_alloc_traitsIN6hermes11InstructionEE10deleteNodeEPS2_:
 1296|  10.3M|  static void deleteNode(::hermes::Instruction *V) {
 1297|  10.3M|    ::hermes::Value::destroy(V);
 1298|  10.3M|  }
_ZN6hermes10BasicBlock11getInstListEv:
 1332|  19.3M|  InstListType &getInstList() {
 1333|  19.3M|    return InstList;
 1334|  19.3M|  }
_ZNK6hermes10BasicBlock9getParentEv:
 1343|  11.7M|  Function *getParent() const {
 1344|  11.7M|    return Parent;
 1345|  11.7M|  }
_ZN6hermes10BasicBlock5beginEv:
 1366|  15.5M|  inline iterator begin() {
 1367|  15.5M|    return InstList.begin();
 1368|  15.5M|  }
_ZN6hermes10BasicBlock3endEv:
 1369|  16.5M|  inline iterator end() {
 1370|  16.5M|    return InstList.end();
 1371|  16.5M|  }
_ZN6hermes10BasicBlock6rbeginEv:
 1372|   707k|  inline reverse_iterator rbegin() {
 1373|   707k|    return InstList.rbegin();
 1374|   707k|  }
_ZN6hermes10BasicBlock4rendEv:
 1375|   707k|  inline reverse_iterator rend() {
 1376|   707k|    return InstList.rend();
 1377|   707k|  }
_ZNK6hermes10BasicBlock5emptyEv:
 1393|   103k|  inline bool empty() const {
 1394|   103k|    return InstList.empty();
 1395|   103k|  }
_ZN6hermes10BasicBlock5frontEv:
 1396|   740k|  inline Instruction &front() {
 1397|   740k|    return InstList.front();
 1398|   740k|  }
_ZN6hermes10BasicBlock7classofEPKNS_5ValueE:
 1409|   129M|  static bool classof(const Value *V) {
 1410|   129M|    return V->getKind() == ValueKind::BasicBlockKind;
 1411|   129M|  }
_ZN4llvh18ilist_alloc_traitsIN6hermes10BasicBlockEE10deleteNodeEPS2_:
 1424|   845k|  static void deleteNode(::hermes::BasicBlock *V) {
 1425|   845k|    ::hermes::Value::destroy(V);
 1426|   845k|  }
_ZN6hermes8FunctionC2EPNS_6ModuleEPNS_9ScopeDescENS_10IdentifierENS0_14DefinitionKindEbNS_16SourceVisibilityEbN4llvh7SMRangeEPS0_:
 1568|   103k|      : Function(
 1569|   103k|            ValueKind::FunctionKind,
 1570|   103k|            parent,
 1571|   103k|            scopeDesc,
 1572|   103k|            originalName,
 1573|   103k|            definitionKind,
 1574|   103k|            strictMode,
 1575|   103k|            sourceVisibility,
 1576|   103k|            isGlobal,
 1577|   103k|            sourceRange,
 1578|   103k|            insertBefore) {}
_ZNK6hermes8Function9getParentEv:
 1582|  1.34M|  Module *getParent() const {
 1583|  1.34M|    return parent_;
 1584|  1.34M|  }
_ZNK6hermes8Function20getFunctionScopeDescEv:
 1586|   930k|  ScopeDesc *getFunctionScopeDesc() const {
 1587|   930k|    return scopeDesc_;
 1588|   930k|  }
_ZNK6hermes8Function13isGlobalScopeEv:
 1591|   310k|  bool isGlobalScope() const {
 1592|   310k|    return isGlobal_;
 1593|   310k|  }
_ZNK6hermes8Function25getOriginalOrInferredNameEv:
 1629|   207k|  const Identifier getOriginalOrInferredName() const {
 1630|   207k|    return originalOrInferredName_;
 1631|   207k|  }
_ZN6hermes8Function17getBasicBlockListEv:
 1642|   312k|  BasicBlockListType &getBasicBlockList() {
 1643|   312k|    return BasicBlockList;
 1644|   312k|  }
_ZNK6hermes8Function17getDefinitionKindEv:
 1656|   103k|  DefinitionKind getDefinitionKind() const {
 1657|   103k|    return definitionKind_;
 1658|   103k|  }
_ZNK6hermes8Function12isStrictModeEv:
 1661|   107k|  bool isStrictMode() const {
 1662|   107k|    return strictMode_;
 1663|   107k|  }
_ZNK6hermes8Function14getSourceRangeEv:
 1666|   310k|  SMRange getSourceRange() const {
 1667|   310k|    return SourceRange;
 1668|   310k|  }
_ZNK6hermes8Function19getSourceVisibilityEv:
 1671|   206k|  SourceVisibility getSourceVisibility() const {
 1672|   206k|    return sourceVisibility_;
 1673|   206k|  }
_ZNK6hermes8Function17getStatementCountEv:
 1675|  10.3M|  OptValue<uint32_t> getStatementCount() const {
 1676|  10.3M|    return statementCount_;
 1677|  10.3M|  }
_ZN6hermes8Function23incrementStatementCountEv:
 1685|   713k|  void incrementStatementCount() {
 1686|   713k|    assert(
 1687|   713k|        statementCount_.hasValue() &&
 1688|   713k|        "cannot incrementStatementCount after clearing it");
 1689|   713k|    statementCount_ = *statementCount_ + 1;
 1690|   713k|  }
_ZN6hermes8Function19clearStatementCountEv:
 1692|   103k|  void clearStatementCount() {
 1693|   103k|    statementCount_ = llvh::None;
 1694|   103k|  }
_ZN6hermes8Function13getParametersEv:
 1696|   103k|  ParameterListType &getParameters() {
 1697|   103k|    return Parameters;
 1698|   103k|  }
_ZN6hermes8Function34setExpectedParamCountIncludingThisEj:
 1700|   103k|  void setExpectedParamCountIncludingThis(uint32_t count) {
 1701|   103k|    expectedParamCountIncludingThis_ = count;
 1702|   103k|  }
_ZNK6hermes8Function34getExpectedParamCountIncludingThisEv:
 1704|   103k|  uint32_t getExpectedParamCountIncludingThis() const {
 1705|   103k|    return expectedParamCountIncludingThis_;
 1706|   103k|  }
_ZN6hermes8Function16setThisParameterEPNS_9ParameterE:
 1708|   103k|  void setThisParameter(Parameter *thisParam) {
 1709|   103k|    assert(!thisParameter && "This parameter can only be created once");
 1710|   103k|    thisParameter = thisParam;
 1711|   103k|  }
_ZNK6hermes8Function16getThisParameterEv:
 1712|   103k|  Parameter *getThisParameter() const {
 1713|   103k|    return thisParameter;
 1714|   103k|  }
_ZN6hermes8Function13getLazySourceEv:
 1717|    486|  LazySource &getLazySource() {
 1718|    486|    return lazySource_;
 1719|    486|  }
_ZN6hermes8Function12setLazyScopeENSt3__110shared_ptrIKNS_15SerializedScopeEEE:
 1721|     81|  void setLazyScope(SerializedScopePtr vars) {
 1722|     81|    lazyScope_ = std::move(vars);
 1723|     81|  }
_ZNK6hermes8Function12getLazyScopeEv:
 1724|     81|  SerializedScopePtr getLazyScope() const {
 1725|     81|    return lazyScope_;
 1726|     81|  }
_ZN6hermes8Function19setLazyClosureAliasEPNS_8VariableE:
 1728|     82|  void setLazyClosureAlias(Variable *var) {
 1729|     82|    lazyClosureAlias_ = var;
 1730|     82|  }
_ZNK6hermes8Function19getLazyClosureAliasEv:
 1731|    162|  Variable *getLazyClosureAlias() const {
 1732|    162|    return lazyClosureAlias_;
 1733|    162|  }
_ZNK6hermes8Function6isLazyEv:
 1737|  1.86M|  bool isLazy() const {
 1738|       |#ifdef HERMESVM_LEAN
 1739|       |    return false;
 1740|       |#else
 1741|  1.86M|    return lazySource_.nodeKind != ESTree::NodeKind::Empty;
 1742|  1.86M|#endif
 1743|  1.86M|  }
_ZN6hermes8Function5beginEv:
 1753|  1.55M|  inline iterator begin() {
 1754|  1.55M|    return BasicBlockList.begin();
 1755|  1.55M|  }
_ZN6hermes8Function3endEv:
 1756|  1.24M|  inline iterator end() {
 1757|  1.24M|    return BasicBlockList.end();
 1758|  1.24M|  }
_ZN6hermes8Function5frontEv:
 1795|  1.15M|  inline BasicBlock &front() {
 1796|  1.15M|    return BasicBlockList.front();
 1797|  1.15M|  }
_ZN6hermes8Function7classofEPKNS_5ValueE:
 1810|   516k|  static bool classof(const Value *V) {
 1811|   516k|    return kindIsA(V->getKind(), ValueKind::FunctionKind);
 1812|   516k|  }
_ZN6hermes17GeneratorFunction7classofEPKNS_5ValueE:
 1839|   103k|  static bool classof(const Value *V) {
 1840|   103k|    return kindIsA(V->getKind(), ValueKind::GeneratorFunctionKind);
 1841|   103k|  }
_ZN6hermes22GeneratorInnerFunction7classofEPKNS_5ValueE:
 1871|   310k|  static bool classof(const Value *V) {
 1872|   310k|    return kindIsA(V->getKind(), ValueKind::GeneratorInnerFunctionKind);
 1873|   310k|  }
_ZN6hermes13AsyncFunction7classofEPKNS_5ValueE:
 1900|   309k|  static bool classof(const Value *V) {
 1901|   309k|    return kindIsA(V->getKind(), ValueKind::AsyncFunctionKind);
 1902|   309k|  }
_ZN4llvh18ilist_alloc_traitsIN6hermes8FunctionEE10deleteNodeEPS2_:
 1915|   103k|  static void deleteNode(::hermes::Function *V) {
 1916|   103k|    ::hermes::Value::destroy(V);
 1917|   103k|  }
_ZNK6hermes6Module14HashRawStringsclERKNSt3__16vectorIPNS_13LiteralStringENS2_9allocatorIS5_EEEE:
 2009|  2.82k|    std::size_t operator()(const RawStringList &rawStrings) const {
 2010|  2.82k|      return llvh::hash_combine_range(rawStrings.begin(), rawStrings.end());
 2011|  2.82k|    }
_ZN6hermes6ModuleC2ENSt3__110shared_ptrINS_7ContextEEE:
 2023|    196|      : Value(ValueKind::ModuleKind), Ctx(std::move(ctx)) {}
_ZNK6hermes6Module10getContextEv:
 2027|  21.6M|  Context &getContext() const {
 2028|  21.6M|    return *Ctx;
 2029|  21.6M|  }
_ZNK6hermes6Module12shareContextEv:
 2031|     81|  std::shared_ptr<Context> shareContext() const {
 2032|     81|    return Ctx;
 2033|     81|  }
_ZN6hermes6Module19setTopLevelFunctionEPNS_8FunctionE:
 2057|    196|  void setTopLevelFunction(Function *topLevelFunction) {
 2058|    196|    assert(
 2059|    196|        topLevelFunction->getParent() == this &&
 2060|    196|        "topLevelFunction from a different module");
 2061|    196|    topLevelFunction_ = topLevelFunction;
 2062|    196|  }
_ZN6hermes6Module19getTopLevelFunctionEv:
 2065|    196|  Function *getTopLevelFunction() {
 2066|    196|    assert(
 2067|    196|        !FunctionList.empty() && "top-level function hasn't been created yet");
 2068|       |    // If the top level function hasn't been overridden, return the first
 2069|       |    // function.
 2070|    196|    return !topLevelFunction_ ? &*FunctionList.begin() : topLevelFunction_;
  ------------------
  |  Branch (2070:12): [True: 0, False: 196]
  ------------------
 2071|    196|  }
_ZN6hermes6Module19getGlobalPropertiesEv:
 2075|    392|  llvh::iterator_range<GlobalObjectPropertyIterator> getGlobalProperties() {
 2076|    392|    return {globalPropertyList_.begin(), globalPropertyList_.end()};
 2077|    392|  }
_ZN6hermes6Module15getLiteralEmptyEv:
 2102|   103k|  LiteralEmpty *getLiteralEmpty() {
 2103|   103k|    return &literalEmpty;
 2104|   103k|  }
_ZN6hermes6Module19getLiteralUndefinedEv:
 2107|   304k|  LiteralUndefined *getLiteralUndefined() {
 2108|   304k|    return &literalUndefined;
 2109|   304k|  }
_ZN6hermes6Module14getLiteralNullEv:
 2112|    949|  LiteralNull *getLiteralNull() {
 2113|    949|    return &literalNull;
 2114|    949|  }
_ZN6hermes6Module15getInitialScopeEv:
 2116|    196|  ScopeDesc *getInitialScope() {
 2117|    196|    return &initialScope_;
 2118|    196|  }
_ZN6hermes6Module15getGlobalObjectEv:
 2125|   503k|  GlobalObject *getGlobalObject() {
 2126|   503k|    return &globalObject_;
 2127|   503k|  }
_ZN6hermes6Module16getEmptySentinelEv:
 2130|      2|  EmptySentinel *getEmptySentinel() {
 2131|      2|    return &emptySentinel_;
 2132|      2|  }
_ZNK6hermes6Module13findCJSModuleEPNS_8FunctionE:
 2160|   207k|  const CJSModule *findCJSModule(Function *function) const {
 2161|   207k|    auto it = cjsModuleFunctionMap_.find(function);
 2162|   207k|    return it == cjsModuleFunctionMap_.end() ? nullptr : it->second;
  ------------------
  |  Branch (2162:12): [True: 207k, False: 0]
  ------------------
 2163|   207k|  }
_ZNK6hermes6Module21getCJSModulesResolvedEv:
 2181|    196|  bool getCJSModulesResolved() const {
 2182|    196|    return cjsModulesResolved_;
 2183|    196|  }
_ZNK6hermes6Module9isLoweredEv:
 2198|    196|  bool isLowered() const {
 2199|    196|    return isLowered_;
 2200|    196|  }
_ZN6hermes6Module10setLoweredEb:
 2202|    196|  void setLowered(bool isLowered) {
 2203|    196|    isLowered_ = isLowered;
 2204|    196|  }
_ZN6hermes6Module5beginEv:
 2206|  3.72k|  inline iterator begin() {
 2207|  3.72k|    return FunctionList.begin();
 2208|  3.72k|  }
_ZN6hermes6Module3endEv:
 2209|  3.72k|  inline iterator end() {
 2210|  3.72k|    return FunctionList.end();
 2211|  3.72k|  }
_ZNK6hermes9ScopeDesc11getFunctionEv:
 2256|  5.00M|Function *ScopeDesc::getFunction() const {
 2257|  5.00M|  assert(function_ && "function not set. Is this the initial scope?");
 2258|  5.00M|  return function_;
 2259|  5.00M|}
_ZN6hermes9ScopeDesc11setFunctionEPNS_8FunctionE:
 2261|   103k|void ScopeDesc::setFunction(Function *F) {
 2262|   103k|  assert(!function_ && "Scopes shouldn't change functions.");
 2263|   103k|  function_ = F;
 2264|   103k|}
_ZNK6hermes13LiteralNumber22isIntTypeRepresentibleIhEEN4llvh8OptionalIT_EEv:
  840|  1.03M|  llvh::Optional<T> isIntTypeRepresentible() const {
  841|       |    // Check the value is within the bounds of T.
  842|       |    // Converting double to int when it's out of bound is undefined behavior.
  843|       |    // Although it is harmless in this scenario, we should still avoid it.
  844|  1.03M|    if (value > std::numeric_limits<T>::max() ||
  ------------------
  |  Branch (844:9): [True: 66.9k, False: 965k]
  ------------------
  845|  1.03M|        value < std::numeric_limits<T>::min()) {
  ------------------
  |  Branch (845:9): [True: 0, False: 965k]
  ------------------
  846|  66.9k|      return llvh::None;
  847|  66.9k|    }
  848|   965k|    if (std::isnan(value)) {
  ------------------
  |  Branch (848:9): [True: 0, False: 965k]
  ------------------
  849|      0|      return llvh::None;
  850|      0|    }
  851|       |    // Check the value is integer and is not -0.
  852|   965k|    T valAsInt = static_cast<T>(value);
  853|   965k|    if (valAsInt == value && (valAsInt || !std::signbit(value))) {
  ------------------
  |  Branch (853:9): [True: 965k, False: 3]
  |  Branch (853:31): [True: 965k, False: 0]
  |  Branch (853:43): [True: 0, False: 0]
  ------------------
  854|   965k|      return valAsInt;
  855|   965k|    }
  856|      3|    return llvh::None;
  857|   965k|  }
_ZNK6hermes13LiteralNumber22isIntTypeRepresentibleIiEEN4llvh8OptionalIT_EEv:
  840|  1.76M|  llvh::Optional<T> isIntTypeRepresentible() const {
  841|       |    // Check the value is within the bounds of T.
  842|       |    // Converting double to int when it's out of bound is undefined behavior.
  843|       |    // Although it is harmless in this scenario, we should still avoid it.
  844|  1.76M|    if (value > std::numeric_limits<T>::max() ||
  ------------------
  |  Branch (844:9): [True: 22.2k, False: 1.74M]
  ------------------
  845|  1.76M|        value < std::numeric_limits<T>::min()) {
  ------------------
  |  Branch (845:9): [True: 0, False: 1.74M]
  ------------------
  846|  22.2k|      return llvh::None;
  847|  22.2k|    }
  848|  1.74M|    if (std::isnan(value)) {
  ------------------
  |  Branch (848:9): [True: 0, False: 1.74M]
  ------------------
  849|      0|      return llvh::None;
  850|      0|    }
  851|       |    // Check the value is integer and is not -0.
  852|  1.74M|    T valAsInt = static_cast<T>(value);
  853|  1.74M|    if (valAsInt == value && (valAsInt || !std::signbit(value))) {
  ------------------
  |  Branch (853:9): [True: 1.74M, False: 6]
  |  Branch (853:31): [True: 1.39M, False: 348k]
  |  Branch (853:43): [True: 348k, False: 0]
  ------------------
  854|  1.74M|      return valAsInt;
  855|  1.74M|    }
  856|      6|    return llvh::None;
  857|  1.74M|  }
_ZNK6hermes13LiteralNumber22isIntTypeRepresentibleIjEEN4llvh8OptionalIT_EEv:
  840|   103k|  llvh::Optional<T> isIntTypeRepresentible() const {
  841|       |    // Check the value is within the bounds of T.
  842|       |    // Converting double to int when it's out of bound is undefined behavior.
  843|       |    // Although it is harmless in this scenario, we should still avoid it.
  844|   103k|    if (value > std::numeric_limits<T>::max() ||
  ------------------
  |  Branch (844:9): [True: 0, False: 103k]
  ------------------
  845|   103k|        value < std::numeric_limits<T>::min()) {
  ------------------
  |  Branch (845:9): [True: 0, False: 103k]
  ------------------
  846|      0|      return llvh::None;
  847|      0|    }
  848|   103k|    if (std::isnan(value)) {
  ------------------
  |  Branch (848:9): [True: 0, False: 103k]
  ------------------
  849|      0|      return llvh::None;
  850|      0|    }
  851|       |    // Check the value is integer and is not -0.
  852|   103k|    T valAsInt = static_cast<T>(value);
  853|   103k|    if (valAsInt == value && (valAsInt || !std::signbit(value))) {
  ------------------
  |  Branch (853:9): [True: 103k, False: 0]
  |  Branch (853:31): [True: 103k, False: 75]
  |  Branch (853:43): [True: 75, False: 0]
  ------------------
  854|   103k|      return valAsInt;
  855|   103k|    }
  856|      0|    return llvh::None;
  857|   103k|  }
_ZN6hermes4TypeC2Ev:
  132|  12.7M|  constexpr Type() = default;
HBC.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  44.7M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  44.7M|  switch (base) {
  381|  26.0M|    default:
  ------------------
  |  Branch (381:5): [True: 26.0M, False: 18.6M]
  ------------------
  382|  26.0M|      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|  26.0M|#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: 44.7M]
  |  |  |  |  ------------------
  |  |  |  |  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: 44.7M]
  |  |  |  |  ------------------
  |  |  |  |  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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 44.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|      0|#endif
  |  |  |  |  142|      0|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|      0|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|  18.6M|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|  18.6M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 18.6M, False: 26.0M]
  |  |  |  |  ------------------
  |  |  |  |  386|  18.6M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 15.2M, False: 3.36M]
  |  |  |  |  ------------------
  |  |  |  |  387|  18.6M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 13.1M, False: 2.04M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   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: 44.7M]
  |  |  |  |  ------------------
  |  |  |  |  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|  44.7M|#undef INCLUDE_ALL_INSTRS
  390|  44.7M|  }
  391|  44.7M|}
ISel.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|   257M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|   257M|  switch (base) {
  381|   118M|    default:
  ------------------
  |  Branch (381:5): [True: 118M, False: 138M]
  ------------------
  382|   118M|      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|   118M|#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: 257M]
  |  |  |  |  ------------------
  |  |  |  |  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|  58.9M|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|  58.9M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 58.9M, False: 198M]
  |  |  |  |  ------------------
  |  |  |  |  386|  58.9M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 58.9M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|  58.9M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 47.4M, False: 11.4M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|  58.9M|#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|  6.29M|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|  6.29M|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|  6.29M|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|  6.29M|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|  6.29M|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  6.29M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 6.29M, False: 250M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  6.29M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 6.29M, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  6.29M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 206k, False: 6.08M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 257M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 257M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|  5.13M|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  5.13M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 5.13M, False: 252M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  5.13M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 4.65M, False: 482k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  5.13M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 5.45k, False: 4.64M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|  10.9M|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  10.9M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 10.9M, False: 246M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  10.9M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 10.4M, False: 485k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  10.9M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 6.48M, False: 3.94M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|  5.78M|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  5.78M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 5.78M, False: 251M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  5.78M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 4.60M, False: 1.18M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  5.78M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 1.72M, False: 2.87M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|   103k|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   103k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 103k, False: 257M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   103k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 103k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   103k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 103k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|  28.2M|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  28.2M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 28.2M, False: 229M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  28.2M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 22.4M, False: 5.78M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  28.2M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 21.8M, False: 572k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|  22.9M|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  22.9M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 22.9M, False: 234M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  22.9M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 2.57M, False: 20.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  22.9M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 913k, False: 1.65M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|  22.9M|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|  22.9M|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|  22.9M|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|  22.9M|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|  22.9M|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|  22.9M|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|  22.9M|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|  22.9M|#endif
  |  |  |  |  142|  22.9M|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|  22.9M|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|  22.9M|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|  22.9M|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|  22.9M|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|  22.9M|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|  22.9M|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|  22.9M|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|  22.9M|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|  22.9M|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|  22.9M|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|  22.9M|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|  22.9M|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|  22.9M|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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: 257M]
  |  |  |  |  ------------------
  |  |  |  |  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|   516k|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|   516k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 516k, False: 256M]
  |  |  |  |  ------------------
  |  |  |  |  386|   516k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 516k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|   516k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 516k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|   516k|DEF_VALUE(Function, Value)
  |  |   52|   516k|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|   516k|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|   516k|DEF_VALUE(AsyncFunction, Function)
  |  |   55|   516k|MARK_LAST(Function)
  |  |   56|   516k|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|   516k|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|   516k|#undef DEF_VALUE
  |  |   61|   516k|#undef MARK_FIRST
  |  |   62|   516k|#undef MARK_LAST
  |  |   63|   516k|#undef MARK_VALUE
  ------------------
  389|   257M|#undef INCLUDE_ALL_INSTRS
  390|   257M|  }
  391|   257M|}
Passes.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  2.34M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  2.34M|  switch (base) {
  381|  2.17M|    default:
  ------------------
  |  Branch (381:5): [True: 2.17M, False: 175k]
  ------------------
  382|  2.17M|      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.17M|#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.34M]
  |  |  |  |  ------------------
  |  |  |  |  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.34M]
  |  |  |  |  ------------------
  |  |  |  |  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|   104k|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|   104k|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|   104k|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|   104k|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|   104k|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   104k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 104k, False: 2.24M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   104k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 104k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   104k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 104k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|  71.6k|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  71.6k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 71.6k, False: 2.27M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  71.6k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 71.6k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  71.6k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 68.6k, False: 2.99k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|      0|#endif
  |  |  |  |  142|      0|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|      0|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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.34M]
  |  |  |  |  ------------------
  |  |  |  |  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.34M]
  |  |  |  |  ------------------
  |  |  |  |  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.34M|#undef INCLUDE_ALL_INSTRS
  390|  2.34M|  }
  391|  2.34M|}
RegAlloc.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  7.53M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  7.53M|  switch (base) {
  381|  7.53M|    default:
  ------------------
  |  Branch (381:5): [True: 7.53M, False: 0]
  ------------------
  382|  7.53M|      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|  7.53M|#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: 7.53M]
  |  |  |  |  ------------------
  |  |  |  |  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: 7.53M]
  |  |  |  |  ------------------
  |  |  |  |  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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 7.53M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|      0|#endif
  |  |  |  |  142|      0|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|      0|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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: 7.53M]
  |  |  |  |  ------------------
  |  |  |  |  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: 7.53M]
  |  |  |  |  ------------------
  |  |  |  |  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|  7.53M|#undef INCLUDE_ALL_INSTRS
  390|  7.53M|  }
  391|  7.53M|}
Lowering.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|   870k|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|   870k|  switch (base) {
  381|   870k|    default:
  ------------------
  |  Branch (381:5): [True: 870k, False: 0]
  ------------------
  382|   870k|      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|   870k|#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: 870k]
  |  |  |  |  ------------------
  |  |  |  |  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: 870k]
  |  |  |  |  ------------------
  |  |  |  |  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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 870k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|      0|#endif
  |  |  |  |  142|      0|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|      0|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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: 870k]
  |  |  |  |  ------------------
  |  |  |  |  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: 870k]
  |  |  |  |  ------------------
  |  |  |  |  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|   870k|#undef INCLUDE_ALL_INSTRS
  390|   870k|  }
  391|   870k|}
Exceptions.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|   685k|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|   685k|  switch (base) {
  381|   685k|    default:
  ------------------
  |  Branch (381:5): [True: 685k, False: 0]
  ------------------
  382|   685k|      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|   685k|#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: 685k]
  |  |  |  |  ------------------
  |  |  |  |  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: 685k]
  |  |  |  |  ------------------
  |  |  |  |  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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 685k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|      0|#endif
  |  |  |  |  142|      0|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|      0|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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: 685k]
  |  |  |  |  ------------------
  |  |  |  |  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: 685k]
  |  |  |  |  ------------------
  |  |  |  |  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|   685k|#undef INCLUDE_ALL_INSTRS
  390|   685k|  }
  391|   685k|}
IR.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  6.85M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  6.85M|  switch (base) {
  381|  5.92M|    default:
  ------------------
  |  Branch (381:5): [True: 5.92M, False: 934k]
  ------------------
  382|  5.92M|      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|  5.92M|#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: 6.85M]
  |  |  |  |  ------------------
  |  |  |  |  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: 6.85M]
  |  |  |  |  ------------------
  |  |  |  |  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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 6.85M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 6.85M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 6.85M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|  1.32k|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  1.32k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 1.32k, False: 6.85M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  1.32k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 1.32k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  1.32k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 1.32k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|   826k|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   826k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 826k, False: 6.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   826k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 826k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   826k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 826k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 6.85M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|   103k|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   103k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 103k, False: 6.75M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   103k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 103k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   103k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 103k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 6.85M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|  2.84k|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  2.84k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 2.84k, False: 6.85M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  2.84k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 2.84k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  2.84k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 2.84k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|  2.84k|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|  2.84k|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|  2.84k|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|  2.84k|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|  2.84k|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|  2.84k|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|  2.84k|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|  2.84k|#endif
  |  |  |  |  142|  2.84k|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|  2.84k|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|  2.84k|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|  2.84k|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|  2.84k|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|  2.84k|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|  2.84k|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|  2.84k|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|  2.84k|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|  2.84k|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|  2.84k|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|  2.84k|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|  2.84k|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|  2.84k|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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: 6.85M]
  |  |  |  |  ------------------
  |  |  |  |  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: 6.85M]
  |  |  |  |  ------------------
  |  |  |  |  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|  6.85M|#undef INCLUDE_ALL_INSTRS
  390|  6.85M|  }
  391|  6.85M|}
Instrs.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  50.9M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  50.9M|  switch (base) {
  381|  50.9M|    default:
  ------------------
  |  Branch (381:5): [True: 50.9M, False: 0]
  ------------------
  382|  50.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|  50.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: 50.9M]
  |  |  |  |  ------------------
  |  |  |  |  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: 50.9M]
  |  |  |  |  ------------------
  |  |  |  |  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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |   27|       |
  |  |  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   47|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   54|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   59|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   96|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   97|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   98|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  104|       |
  |  |  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  119|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  124|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  125|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  127|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 50.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  141|      0|#endif
  |  |  |  |  142|      0|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  158|      0|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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: 50.9M]
  |  |  |  |  ------------------
  |  |  |  |  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: 50.9M]
  |  |  |  |  ------------------
  |  |  |  |  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|  50.9M|#undef INCLUDE_ALL_INSTRS
  390|  50.9M|  }
  391|  50.9M|}

_ZN6hermes9IRBuilderC2EPNS_6ModuleE:
   45|   103k|  explicit IRBuilder(Module *Mod) : M(Mod), InsertionPoint(nullptr) {}
_ZN6hermes9IRBuilderC2EPNS_8FunctionE:
   47|  1.24M|      : M(F->getParent()), InsertionPoint(nullptr) {}
_ZN6hermes9IRBuilder9getModuleEv:
   55|    119|  Module *getModule() {
   56|    119|    return M;
   57|    119|  }
_ZN6hermes9IRBuilder11getFunctionEv:
  227|  11.4M|  Function *getFunction() {
  228|  11.4M|    assert(Block && "Builder has no current function");
  229|  11.4M|    return Block->getParent();
  230|  11.4M|  }
_ZN6hermes9IRBuilder11setLocationEN4llvh5SMLocE:
  247|  15.7M|  void setLocation(SMLoc loc) {
  248|  15.7M|    Location = loc;
  249|  15.7M|  }
_ZN6hermes9IRBuilder13clearLocationEv:
  250|   123k|  void clearLocation() {
  251|   123k|    Location = SMLoc{};
  252|   123k|  }
_ZNK6hermes9IRBuilder11getLocationEv:
  253|  3.39M|  SMLoc getLocation() const {
  254|  3.39M|    return Location;
  255|  3.39M|  }
_ZN6hermes9IRBuilder26setCurrentSourceLevelScopeEPNS_9ScopeDescE:
  257|  9.28M|  void setCurrentSourceLevelScope(ScopeDesc *sourceLevelScope) {
  258|  9.28M|    CurrentSourceLevelScope = sourceLevelScope;
  259|  9.28M|  }
_ZN6hermes9IRBuilder20ScopedLocationChangeC2ERS0_N4llvh5SMLocE:
  624|  3.26M|        : builder_(builder), oldLocation_(builder.getLocation()) {
  625|  3.26M|      builder_.setLocation(location);
  626|  3.26M|    }
_ZN6hermes9IRBuilder20ScopedLocationChangeD2Ev:
  629|  3.26M|    ~ScopedLocationChange() {
  630|  3.26M|      builder_.setLocation(oldLocation_);
  631|  3.26M|    }
_ZN6hermes9IRBuilder11SaveRestoreC2ERS0_:
  651|   123k|        : Builder(builder),
  652|   123k|          BB(builder.getInsertionBlock()),
  653|   123k|          Location(builder.getLocation()) {
  654|   123k|      builder.clearLocation();
  655|   123k|    }
_ZN6hermes9IRBuilder11SaveRestoreD2Ev:
  658|   123k|    ~SaveRestore() {
  659|   123k|      Builder.setInsertionBlock(BB);
  660|   123k|      Builder.setLocation(Location);
  661|   123k|    }
_ZN6hermes9IRBuilder20InstructionDestroyer14hasInstructionEPNS_11InstructionE:
  677|   601k|    bool hasInstruction(Instruction *A) {
  678|   601k|      return std::find(list.begin(), list.end(), A) != list.end();
  679|   601k|    }
_ZN6hermes9IRBuilder20InstructionDestroyer3addEPNS_11InstructionE:
  682|   601k|    void add(Instruction *A) {
  683|   601k|#ifndef NDEBUG
  684|   601k|      assert(!hasInstruction(A) && "Instruction already in list!");
  685|   601k|#endif
  686|   601k|      list.push_back(A);
  687|   601k|    }
_ZN6hermes9IRBuilder20InstructionDestroyerD2Ev:
  689|  1.05M|    ~InstructionDestroyer() {
  690|  1.05M|      for (auto *I : list) {
  ------------------
  |  Branch (690:20): [True: 601k, False: 1.05M]
  ------------------
  691|   601k|        I->eraseFromParent();
  692|   601k|      }
  693|  1.05M|    }
_ZN6hermes9IRBuilder20InstructionDestroyerC2Ev:
  672|  1.05M|    explicit InstructionDestroyer() = default;

_ZN6hermes38ThrowIfHasRestrictedGlobalPropertyInst7classofEPKNS_5ValueE:
   62|  1.42M|  static bool classof(const Value *V) {
   63|  1.42M|    return kindIsA(
   64|  1.42M|        V->getKind(), ValueKind::ThrowIfHasRestrictedGlobalPropertyInstKind);
   65|  1.42M|  }
_ZN6hermes17ScopeCreationInstC2ENS_9ValueKindEPNS_9ScopeDescE:
   83|   206k|      : Instruction(kind) {
   84|   206k|    pushOperand(scopeDesc);
   85|   206k|  }
_ZNK6hermes17ScopeCreationInst19getCreatedScopeDescEv:
  101|   517k|  ScopeDesc *getCreatedScopeDesc() const {
  102|   517k|    return cast<ScopeDesc>(getOperand(CreatedScopeIdx));
  103|   517k|  }
_ZN6hermes17ScopeCreationInst7classofEPKNS_5ValueE:
  113|  6.39M|  static bool classof(const Value *V) {
  114|  6.39M|    return kindIsA(V->getKind(), ValueKind::ScopeCreationInstKind);
  115|  6.39M|  }
_ZN6hermes17SingleOperandInstC2ENS_9ValueKindEPNS_5ValueE:
  171|  5.74M|  explicit SingleOperandInst(ValueKind K, Value *Op) : Instruction(K) {
  172|  5.74M|    pushOperand(Op);
  173|  5.74M|  }
_ZNK6hermes17SingleOperandInst16getSingleOperandEv:
  185|  5.64M|  Value *getSingleOperand() const {
  186|  5.64M|    return getOperand(0);
  187|  5.64M|  }
_ZN6hermes14TerminatorInstC2ENS_9ValueKindE:
  209|   843k|  explicit TerminatorInst(ValueKind K) : Instruction(K) {}
_ZN6hermes14TerminatorInst7classofEPKNS_5ValueE:
  229|  28.2M|  static bool classof(const Value *V) {
  230|  28.2M|    return kindIsA(V->getKind(), ValueKind::TerminatorInstKind);
  231|  28.2M|  }
_ZNK6hermes10BranchInst13getBranchDestEv:
  269|  3.63M|  BasicBlock *getBranchDest() const {
  270|  3.63M|    return cast<BasicBlock>(getOperand(BranchDestIdx));
  271|  3.63M|  }
_ZN6hermes10BranchInstC2EPNS_10BasicBlockES2_:
  274|   484k|      : TerminatorInst(ValueKind::BranchInstKind) {
  275|   484k|    pushOperand(dest);
  276|   484k|  }
_ZN6hermes10BranchInst7classofEPKNS_5ValueE:
  288|  24.0M|  static bool classof(const Value *V) {
  289|  24.0M|    return kindIsA(V->getKind(), ValueKind::BranchInstKind);
  290|  24.0M|  }
_ZNK6hermes10BranchInst16getNumSuccessorsEv:
  292|  5.94M|  unsigned getNumSuccessors() const {
  293|  5.94M|    return 1;
  294|  5.94M|  }
_ZNK6hermes10BranchInst12getSuccessorEj:
  295|  3.15M|  BasicBlock *getSuccessor(unsigned idx) const {
  296|  3.15M|    assert(idx == 0 && "BranchInst only have 1 successor!");
  297|  3.15M|    return getBranchDest();
  298|  3.15M|  }
_ZN6hermes12AsNumberInstC2EPNS_5ValueE:
  338|    509|      : SingleOperandInst(ValueKind::AsNumberInstKind, value) {
  339|    509|    setType(Type::createNumber());
  340|    509|  }
_ZN6hermes12AsNumberInst22getChangedOperandsImplEv:
  350|    492|  WordBitSet<> getChangedOperandsImpl() {
  351|    492|    return {};
  352|    492|  }
_ZN6hermes12AsNumberInst7classofEPKNS_5ValueE:
  354|  1.51k|  static bool classof(const Value *V) {
  355|  1.51k|    return kindIsA(V->getKind(), ValueKind::AsNumberInstKind);
  356|  1.51k|  }
_ZNK6hermes14CondBranchInst12getConditionEv:
  418|  91.9k|  Value *getCondition() const {
  419|  91.9k|    return getOperand(ConditionIdx);
  420|  91.9k|  }
_ZNK6hermes14CondBranchInst11getTrueDestEv:
  421|   718k|  BasicBlock *getTrueDest() const {
  422|   718k|    return cast<BasicBlock>(getOperand(TrueBlockIdx));
  423|   718k|  }
_ZNK6hermes14CondBranchInst12getFalseDestEv:
  424|   718k|  BasicBlock *getFalseDest() const {
  425|   718k|    return cast<BasicBlock>(getOperand(FalseBlockIdx));
  426|   718k|  }
_ZN6hermes14CondBranchInstC2EPNS_10BasicBlockEPNS_5ValueES2_S2_:
  433|  91.9k|      : TerminatorInst(ValueKind::CondBranchInstKind) {
  434|  91.9k|    pushOperand(cond);
  435|  91.9k|    pushOperand(trueBlock);
  436|  91.9k|    pushOperand(falseBlock);
  437|  91.9k|  }
_ZN6hermes14CondBranchInst22getChangedOperandsImplEv:
  447|  73.5k|  WordBitSet<> getChangedOperandsImpl() {
  448|  73.5k|    return {};
  449|  73.5k|  }
_ZN6hermes14CondBranchInst7classofEPKNS_5ValueE:
  451|  7.74M|  static bool classof(const Value *V) {
  452|  7.74M|    return kindIsA(V->getKind(), ValueKind::CondBranchInstKind);
  453|  7.74M|  }
_ZNK6hermes14CondBranchInst16getNumSuccessorsEv:
  455|  1.88M|  unsigned getNumSuccessors() const {
  456|  1.88M|    return 2;
  457|  1.88M|  }
_ZNK6hermes14CondBranchInst12getSuccessorEj:
  458|  1.25M|  BasicBlock *getSuccessor(unsigned idx) const {
  459|  1.25M|    if (idx == 0)
  ------------------
  |  Branch (459:9): [True: 626k, False: 626k]
  ------------------
  460|   626k|      return getTrueDest();
  461|   626k|    if (idx == 1)
  ------------------
  |  Branch (461:9): [True: 626k, False: 0]
  ------------------
  462|   626k|      return getFalseDest();
  463|      0|    llvm_unreachable("CondBranchInst only have 2 successors!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  464|   626k|  }
_ZNK6hermes10ReturnInst8getValueEv:
  478|   103k|  Value *getValue() const {
  479|   103k|    return getOperand(ReturnValueIdx);
  480|   103k|  }
_ZN6hermes10ReturnInstC2EPNS_5ValueE:
  482|   206k|  explicit ReturnInst(Value *val) : TerminatorInst(ValueKind::ReturnInstKind) {
  483|   206k|    pushOperand(val);
  484|   206k|  }
_ZN6hermes10ReturnInst22getChangedOperandsImplEv:
  492|     12|  WordBitSet<> getChangedOperandsImpl() {
  493|     12|    return {};
  494|     12|  }
_ZN6hermes10ReturnInst7classofEPKNS_5ValueE:
  496|  5.63M|  static bool classof(const Value *V) {
  497|  5.63M|    return kindIsA(V->getKind(), ValueKind::ReturnInstKind);
  498|  5.63M|  }
_ZNK6hermes10ReturnInst16getNumSuccessorsEv:
  500|   414k|  unsigned getNumSuccessors() const {
  501|   414k|    return 0;
  502|   414k|  }
_ZN6hermes14AllocStackInstC2ENS_10IdentifierE:
  521|   136k|      : Instruction(ValueKind::AllocStackInstKind), variableName(varName) {
  522|   136k|    pushOperand(&variableName);
  523|   136k|  }
_ZN6hermes14AllocStackInst7classofEPKNS_5ValueE:
  544|   847k|  static bool classof(const Value *V) {
  545|   847k|    return kindIsA(V->getKind(), ValueKind::AllocStackInstKind);
  546|   847k|  }
_ZN6hermes13LoadStackInstC2EPNS_14AllocStackInstE:
  555|   128k|      : SingleOperandInst(ValueKind::LoadStackInstKind, alloc) {}
_ZN6hermes13LoadStackInst7classofEPKNS_5ValueE:
  573|   256k|  static bool classof(const Value *V) {
  574|   256k|    return kindIsA(V->getKind(), ValueKind::LoadStackInstKind);
  575|   256k|  }
_ZNK6hermes14StoreStackInst8getValueEv:
  585|   576k|  Value *getValue() const {
  586|   576k|    return getOperand(StoredValueIdx);
  587|   576k|  }
_ZNK6hermes14StoreStackInst6getPtrEv:
  588|   576k|  AllocStackInst *getPtr() const {
  589|   576k|    return cast<AllocStackInst>(getOperand(PtrIdx));
  590|   576k|  }
_ZN6hermes14StoreStackInstC2EPNS_5ValueEPNS_14AllocStackInstE:
  593|   576k|      : Instruction(ValueKind::StoreStackInstKind) {
  594|   576k|    setType(Type::createNoType());
  595|   576k|    pushOperand(storedValue);
  596|   576k|    pushOperand(ptr);
  597|   576k|  }
_ZN6hermes14StoreStackInst7classofEPKNS_5ValueE:
  611|  7.14M|  static bool classof(const Value *V) {
  612|  7.14M|    return kindIsA(V->getKind(), ValueKind::StoreStackInstKind);
  613|  7.14M|  }
_ZN6hermes13LoadFrameInstC2EPNS_8VariableEPNS_17ScopeCreationInstE:
  624|      4|      : Instruction(ValueKind::LoadFrameInstKind) {
  625|      4|    pushOperand(alloc);
  626|      4|    pushOperand(environment);
  627|      4|  }
_ZNK6hermes13LoadFrameInst15getLoadVariableEv:
  634|      4|  Variable *getLoadVariable() const {
  635|      4|    return cast<Variable>(getOperand(LoadVariableIdx));
  636|      4|  }
_ZNK6hermes13LoadFrameInst14getEnvironmentEv:
  638|      4|  ScopeCreationInst *getEnvironment() const {
  639|      4|    return cast<ScopeCreationInst>(getOperand(EnvIdx));
  640|      4|  }
_ZN6hermes13LoadFrameInst7classofEPKNS_5ValueE:
  650|      8|  static bool classof(const Value *V) {
  651|      8|    return kindIsA(V->getKind(), ValueKind::LoadFrameInstKind);
  652|      8|  }
_ZNK6hermes14StoreFrameInst8getValueEv:
  662|   104k|  Value *getValue() const {
  663|   104k|    return getOperand(StoredValueIdx);
  664|   104k|  }
_ZNK6hermes14StoreFrameInst11getVariableEv:
  665|   104k|  Variable *getVariable() const {
  666|   104k|    return cast<Variable>(getOperand(VariableIdx));
  667|   104k|  }
_ZNK6hermes14StoreFrameInst14getEnvironmentEv:
  668|   104k|  ScopeCreationInst *getEnvironment() const {
  669|   104k|    return cast<ScopeCreationInst>(getOperand(EnvIdx));
  670|   104k|  }
_ZN6hermes14StoreFrameInstC2EPNS_5ValueEPNS_8VariableEPNS_17ScopeCreationInstE:
  676|   104k|      : Instruction(ValueKind::StoreFrameInstKind) {
  677|   104k|    pushOperand(storedValue);
  678|   104k|    pushOperand(ptr);
  679|   104k|    pushOperand(environment);
  680|   104k|  }
_ZN6hermes14StoreFrameInst7classofEPKNS_5ValueE:
  694|   208k|  static bool classof(const Value *V) {
  695|   208k|    return kindIsA(V->getKind(), ValueKind::StoreFrameInstKind);
  696|   208k|  }
_ZN6hermes15CreateScopeInstC2EPNS_9ScopeDescE:
  705|   103k|      : ScopeCreationInst(ValueKind::CreateScopeInstKind, scopeDesc) {}
_ZN6hermes15CreateScopeInst7classofEPKNS_5ValueE:
  720|  3.83M|  static bool classof(const Value *V) {
  721|  3.83M|    return kindIsA(V->getKind(), ValueKind::CreateScopeInstKind);
  722|  3.83M|  }
_ZN6hermes20CreateInnerScopeInst7classofEPKNS_5ValueE:
  753|  3.52M|  static bool classof(const Value *V) {
  754|  3.52M|    return kindIsA(V->getKind(), ValueKind::CreateInnerScopeInstKind);
  755|  3.52M|  }
_ZN6hermes18CreateFunctionInstC2ENS_9ValueKindEPNS_8FunctionEPNS_5ValueE:
  767|   206k|      : Instruction(kind) {
  768|   206k|    setType(Type::createClosure());
  769|   206k|    pushOperand(code);
  770|       |    // N.B.: All non-HBC CreateFunctionInst have a ScopeCreationInst as the
  771|       |    // environment, but that is not necessarily true about the HBC variants; the
  772|       |    // environment could be an HBCSpillMov.
  773|   206k|    pushOperand(environment);
  774|   206k|  }
_ZN6hermes18CreateFunctionInstC2EPNS_8FunctionEPNS_17ScopeCreationInstE:
  780|   103k|      : CreateFunctionInst(
  781|   103k|            ValueKind::CreateFunctionInstKind,
  782|   103k|            code,
  783|   103k|            environment) {}
_ZNK6hermes18CreateFunctionInst15getFunctionCodeEv:
  789|   412k|  Function *getFunctionCode() const {
  790|   412k|    return cast<Function>(getOperand(FunctionCodeIdx));
  791|   412k|  }
_ZNK6hermes18CreateFunctionInst14getEnvironmentEv:
  793|   206k|  Value *getEnvironment() const {
  794|   206k|    return getOperand(EnvIdx);
  795|   206k|  }
_ZN6hermes18CreateFunctionInst7classofEPKNS_5ValueE:
  805|   206k|  static bool classof(const Value *V) {
  806|   206k|    return kindIsA(V->getKind(), ValueKind::CreateFunctionInstKind);
  807|   206k|  }
_ZN6hermes8CallInstC2ENS_9ValueKindEPNS_13LiteralStringEPNS_5ValueES5_S5_N4llvh8ArrayRefIS5_EE:
  828|  55.7k|      : Instruction(kind), textifiedCallee(textifiedCallee) {
  829|  55.7k|    pushOperand(callee);
  830|  55.7k|    pushOperand(newTarget);
  831|  55.7k|    pushOperand(thisValue);
  832|   734k|    for (const auto &arg : args) {
  ------------------
  |  Branch (832:26): [True: 734k, False: 55.7k]
  ------------------
  833|   734k|      pushOperand(arg);
  834|   734k|    }
  835|  55.7k|  }
_ZNK6hermes8CallInst18getTextifiedCalleeEv:
  853|  30.7k|  LiteralString *getTextifiedCallee() const {
  854|  30.7k|    return textifiedCallee;
  855|  30.7k|  }
_ZNK6hermes8CallInst9getCalleeEv:
  856|  58.5k|  Value *getCallee() const {
  857|  58.5k|    return getOperand(CalleeIdx);
  858|  58.5k|  }
_ZNK6hermes8CallInst12getNewTargetEv:
  859|  25.0k|  Value *getNewTarget() const {
  860|  25.0k|    return getOperand(NewTargetIdx);
  861|  25.0k|  }
_ZN6hermes8CallInst11getArgumentEj:
  867|  1.52M|  Value *getArgument(unsigned idx) {
  868|  1.52M|    return getOperand(ThisIdx + idx);
  869|  1.52M|  }
_ZN6hermes8CallInst11setArgumentEPNS_5ValueEj:
  871|   761k|  void setArgument(Value *V, unsigned idx) {
  872|   761k|    setOperand(V, ThisIdx + idx);
  873|   761k|  }
_ZNK6hermes8CallInst15getNumArgumentsEv:
  875|   178k|  unsigned getNumArguments() const {
  876|   178k|    return getNumOperands() - ThisIdx;
  877|   178k|  }
_ZN6hermes8CallInstC2EPNS_13LiteralStringEPNS_5ValueEPNS_16LiteralUndefinedES4_N4llvh8ArrayRefIS4_EE:
  885|  2.84k|      : CallInst(
  886|  2.84k|            ValueKind::CallInstKind,
  887|  2.84k|            textifiedCallee,
  888|  2.84k|            callee,
  889|  2.84k|            newTarget,
  890|  2.84k|            thisValue,
  891|  2.84k|            args) {}
_ZN6hermes8CallInst22getChangedOperandsImplEv:
  900|  2.62k|  WordBitSet<> getChangedOperandsImpl() {
  901|  2.62k|    return {};
  902|  2.62k|  }
_ZN6hermes8CallInst7classofEPKNS_5ValueE:
  904|  22.9M|  static bool classof(const Value *V) {
  905|  22.9M|    return kindIsA(V->getKind(), ValueKind::CallInstKind);
  906|  22.9M|  }
_ZN6hermes13ConstructInstC2EPNS_5ValueES2_PNS_16LiteralUndefinedEN4llvh8ArrayRefIS2_EE:
  930|  25.0k|      : CallInst(
  931|  25.0k|            ValueKind::ConstructInstKind,
  932|  25.0k|            kNoTextifiedCallee,
  933|  25.0k|            constructor,
  934|  25.0k|            newTarget,
  935|  25.0k|            thisValue,
  936|  25.0k|            args) {
  937|  25.0k|    setType(Type::createObject());
  938|  25.0k|  }
_ZN6hermes13ConstructInst7classofEPKNS_5ValueE:
  944|  3.67M|  static bool classof(const Value *V) {
  945|  3.67M|    return kindIsA(V->getKind(), ValueKind::ConstructInstKind);
  946|  3.67M|  }
_ZN6hermes15CallBuiltinInstC2EPNS_13LiteralNumberEPNS_16LiteralUndefinedES4_N4llvh8ArrayRefIPNS_5ValueEEE:
  968|  2.82k|      : CallInst(
  969|  2.82k|            ValueKind::CallBuiltinInstKind,
  970|  2.82k|            kNoTextifiedCallee,
  971|  2.82k|            callee,
  972|  2.82k|            newTarget,
  973|  2.82k|            thisValue,
  974|  2.82k|            args) {
  975|  2.82k|    assert(
  976|  2.82k|        callee->getValue() == (int)callee->getValue() &&
  977|  2.82k|        callee->getValue() < (double)BuiltinMethod::_count &&
  978|  2.82k|        "invalid builtin call");
  979|  2.82k|  }
_ZNK6hermes15CallBuiltinInst15getBuiltinIndexEv:
  985|  2.82k|  BuiltinMethod::Enum getBuiltinIndex() const {
  986|  2.82k|    return (BuiltinMethod::Enum)cast<LiteralNumber>(getCallee())->asInt32();
  987|  2.82k|  }
_ZN6hermes15CallBuiltinInst7classofEPKNS_5ValueE:
  989|  1.54M|  static bool classof(const Value *V) {
  990|  1.54M|    return kindIsA(V->getKind(), ValueKind::CallBuiltinInstKind);
  991|  1.54M|  }
_ZN6hermes21GetBuiltinClosureInst7classofEPKNS_5ValueE:
 1028|  1.47M|  static bool classof(const Value *V) {
 1029|  1.47M|    return kindIsA(V->getKind(), ValueKind::GetBuiltinClosureInstKind);
 1030|  1.47M|  }
_ZN6hermes12HBCCallNInst7classofEPKNS_5ValueE:
 1124|   795k|  static bool classof(const Value *V) {
 1125|   795k|    return V->getKind() == ValueKind::HBCCallNInstKind;
 1126|   795k|  }
_ZN6hermes22HBCGetGlobalObjectInstC2Ev:
 1135|   503k|      : Instruction(ValueKind::HBCGetGlobalObjectInstKind) {
 1136|   503k|    setType(Type::createObject());
 1137|   503k|  }
_ZN6hermes22HBCGetGlobalObjectInst7classofEPKNS_5ValueE:
 1151|  1.00M|  static bool classof(const Value *V) {
 1152|  1.00M|    return kindIsA(V->getKind(), ValueKind::HBCGetGlobalObjectInstKind);
 1153|  1.00M|  }
_ZN6hermes17StorePropertyInstC2ENS_9ValueKindEPNS_5ValueES3_S3_:
 1166|  1.32k|      : Instruction(kind) {
 1167|  1.32k|    setType(Type::createNoType());
 1168|  1.32k|    pushOperand(storedValue);
 1169|  1.32k|    pushOperand(object);
 1170|  1.32k|    pushOperand(property);
 1171|  1.32k|  }
_ZNK6hermes17StorePropertyInst14getStoredValueEv:
 1176|  1.32k|  Value *getStoredValue() const {
 1177|  1.32k|    return getOperand(StoredValueIdx);
 1178|  1.32k|  }
_ZNK6hermes17StorePropertyInst9getObjectEv:
 1179|  1.32k|  Value *getObject() const {
 1180|  1.32k|    return getOperand(ObjectIdx);
 1181|  1.32k|  };
_ZNK6hermes17StorePropertyInst11getPropertyEv:
 1182|  1.32k|  Value *getProperty() const {
 1183|  1.32k|    return getOperand(PropertyIdx);
 1184|  1.32k|  }
_ZN6hermes17StorePropertyInstC2EPNS_5ValueES2_S2_:
 1187|  1.32k|      : StorePropertyInst(
 1188|  1.32k|            ValueKind::StorePropertyInstKind,
 1189|  1.32k|            storedValue,
 1190|  1.32k|            object,
 1191|  1.32k|            property) {}
_ZN6hermes17StorePropertyInst22getChangedOperandsImplEv:
 1201|    277|  WordBitSet<> getChangedOperandsImpl() {
 1202|    277|    return {};
 1203|    277|  }
_ZN6hermes17StorePropertyInst7classofEPKNS_5ValueE:
 1205|  5.13M|  static bool classof(const Value *V) {
 1206|  5.13M|    return kindIsA(V->getKind(), ValueKind::StorePropertyInstKind);
 1207|  5.13M|  }
_ZN6hermes20StoreOwnPropertyInstC2ENS_9ValueKindEPNS_5ValueES3_S3_PNS_11LiteralBoolE:
 1262|   826k|      : Instruction(kind) {
 1263|   826k|    setType(Type::createNoType());
 1264|   826k|    pushOperand(storedValue);
 1265|   826k|    pushOperand(object);
 1266|   826k|    pushOperand(property);
 1267|   826k|    pushOperand(isEnumerable);
 1268|   826k|  }
_ZNK6hermes20StoreOwnPropertyInst14getStoredValueEv:
 1273|   826k|  Value *getStoredValue() const {
 1274|   826k|    return getOperand(StoredValueIdx);
 1275|   826k|  }
_ZNK6hermes20StoreOwnPropertyInst9getObjectEv:
 1276|   826k|  Value *getObject() const {
 1277|   826k|    return getOperand(ObjectIdx);
 1278|   826k|  }
_ZNK6hermes20StoreOwnPropertyInst11getPropertyEv:
 1279|   826k|  Value *getProperty() const {
 1280|   826k|    return getOperand(PropertyIdx);
 1281|   826k|  }
_ZNK6hermes20StoreOwnPropertyInst15getIsEnumerableEv:
 1282|  1.65M|  bool getIsEnumerable() const {
 1283|  1.65M|    return cast<LiteralBool>(getOperand(IsEnumerableIdx))->getValue();
 1284|  1.65M|  }
_ZN6hermes20StoreOwnPropertyInstC2EPNS_5ValueES2_S2_PNS_11LiteralBoolE:
 1291|   826k|      : StoreOwnPropertyInst(
 1292|   826k|            ValueKind::StoreOwnPropertyInstKind,
 1293|   826k|            storedValue,
 1294|   826k|            object,
 1295|   826k|            property,
 1296|   826k|            isEnumerable) {}
_ZN6hermes20StoreOwnPropertyInst22getChangedOperandsImplEv:
 1307|     24|  WordBitSet<> getChangedOperandsImpl() {
 1308|     24|    return {};
 1309|     24|  }
_ZN6hermes20StoreOwnPropertyInst7classofEPKNS_5ValueE:
 1311|  11.7M|  static bool classof(const Value *V) {
 1312|  11.7M|    return kindIsA(V->getKind(), ValueKind::StoreOwnPropertyInstKind);
 1313|  11.7M|  }
_ZN6hermes23StoreNewOwnPropertyInstC2EPNS_5ValueES2_PNS_7LiteralEPNS_11LiteralBoolE:
 1326|      1|      : StoreOwnPropertyInst(
 1327|      1|            ValueKind::StoreNewOwnPropertyInstKind,
 1328|      1|            storedValue,
 1329|      1|            object,
 1330|      1|            property,
 1331|      1|            isEnumerable) {
 1332|      1|    assert(
 1333|      1|        (llvh::isa<LiteralString>(property) ||
 1334|      1|         llvh::isa<LiteralNumber>(property)) &&
 1335|      1|        "Invalid property literal.");
 1336|      1|    assert(
 1337|      1|        object->getType().isObjectType() &&
 1338|      1|        "object operand must be known to be an object");
 1339|      1|  }
_ZN6hermes23StoreNewOwnPropertyInst7classofEPKNS_5ValueE:
 1346|   826k|  static bool classof(const Value *V) {
 1347|   826k|    return kindIsA(V->getKind(), ValueKind::StoreNewOwnPropertyInstKind);
 1348|   826k|  }
_ZN6hermes21StoreGetterSetterInst7classofEPKNS_5ValueE:
 1407|  3.86M|  static bool classof(const Value *V) {
 1408|  3.86M|    return kindIsA(V->getKind(), ValueKind::StoreGetterSetterInstKind);
 1409|  3.86M|  }
_ZN6hermes18DeletePropertyInst7classofEPKNS_5ValueE:
 1444|  3.86M|  static bool classof(const Value *V) {
 1445|  3.86M|    return kindIsA(V->getKind(), ValueKind::DeletePropertyInstKind);
 1446|  3.86M|  }
_ZN6hermes16LoadPropertyInstC2ENS_9ValueKindEPNS_5ValueES3_:
 1455|   570k|      : Instruction(kind) {
 1456|   570k|    pushOperand(object);
 1457|   570k|    pushOperand(property);
 1458|   570k|  }
_ZNK6hermes16LoadPropertyInst9getObjectEv:
 1463|   570k|  Value *getObject() const {
 1464|   570k|    return getOperand(ObjectIdx);
 1465|   570k|  };
_ZNK6hermes16LoadPropertyInst11getPropertyEv:
 1466|   570k|  Value *getProperty() const {
 1467|   570k|    return getOperand(PropertyIdx);
 1468|   570k|  }
_ZN6hermes16LoadPropertyInstC2EPNS_5ValueES2_:
 1471|  68.4k|      : LoadPropertyInst(ValueKind::LoadPropertyInstKind, object, property) {}
_ZN6hermes16LoadPropertyInst22getChangedOperandsImplEv:
 1481|  39.7k|  WordBitSet<> getChangedOperandsImpl() {
 1482|  39.7k|    return {};
 1483|  39.7k|  }
_ZN6hermes16LoadPropertyInst7classofEPKNS_5ValueE:
 1485|  5.85M|  static bool classof(const Value *V) {
 1486|  5.85M|    return kindIsA(V->getKind(), ValueKind::LoadPropertyInstKind);
 1487|  5.85M|  }
_ZNK6hermes25TryLoadGlobalPropertyInst11getPropertyEv:
 1495|   501k|  LiteralString *getProperty() const {
 1496|   501k|    return cast<LiteralString>(LoadPropertyInst::getProperty());
 1497|   501k|  }
_ZN6hermes25TryLoadGlobalPropertyInstC2EPNS_5ValueEPNS_13LiteralStringE:
 1502|   501k|      : LoadPropertyInst(
 1503|   501k|            ValueKind::TryLoadGlobalPropertyInstKind,
 1504|   501k|            globalObject,
 1505|   501k|            property) {
 1506|   501k|    assert(
 1507|   501k|        (llvh::isa<GlobalObject>(globalObject) ||
 1508|   501k|         llvh::isa<HBCGetGlobalObjectInst>(globalObject)) &&
 1509|   501k|        "globalObject must refer to the global object");
 1510|   501k|  }
_ZN6hermes25TryLoadGlobalPropertyInst22getChangedOperandsImplEv:
 1520|   277k|  WordBitSet<> getChangedOperandsImpl() {
 1521|   277k|    return {};
 1522|   277k|  }
_ZN6hermes25TryLoadGlobalPropertyInst7classofEPKNS_5ValueE:
 1524|  1.28M|  static bool classof(const Value *V) {
 1525|  1.28M|    return kindIsA(V->getKind(), ValueKind::TryLoadGlobalPropertyInstKind);
 1526|  1.28M|  }
_ZNK6hermes15AllocObjectInst15getParentObjectEv:
 1540|      2|  Value *getParentObject() const {
 1541|      2|    return getOperand(ParentObjectIdx);
 1542|      2|  }
_ZN6hermes15AllocObjectInstC2EPNS_13LiteralNumberEPNS_5ValueE:
 1545|      2|      : Instruction(ValueKind::AllocObjectInstKind) {
 1546|      2|    setType(Type::createObject());
 1547|      2|    assert(size->isUInt32Representible() && "size must be uint32");
 1548|      2|    pushOperand(size);
 1549|      2|    pushOperand(parentObject);
 1550|      2|  }
_ZN6hermes15AllocObjectInst7classofEPKNS_5ValueE:
 1564|  4.53M|  static bool classof(const Value *V) {
 1565|  4.53M|    return kindIsA(V->getKind(), ValueKind::AllocObjectInstKind);
 1566|  4.53M|  }
_ZN6hermes28HBCAllocObjectFromBufferInst7classofEPKNS_5ValueE:
 1623|  11.1M|  static bool classof(const Value *V) {
 1624|  11.1M|    return kindIsA(V->getKind(), ValueKind::HBCAllocObjectFromBufferInstKind);
 1625|  11.1M|  }
_ZN6hermes14AllocArrayInstC2ERN4llvh11SmallVectorIPNS_5ValueELj4EEEPNS_13LiteralNumberE:
 1638|    101|      : Instruction(ValueKind::AllocArrayInstKind) {
 1639|       |    // TODO: refine this type annotation to "array" ?.
 1640|    101|    setType(Type::createObject());
 1641|    101|    pushOperand(sizeHint);
 1642|   540k|    for (auto val : val_list) {
  ------------------
  |  Branch (1642:19): [True: 540k, False: 101]
  ------------------
 1643|   540k|      pushOperand(val);
 1644|   540k|    }
 1645|    101|  }
_ZNK6hermes14AllocArrayInst11getSizeHintEv:
 1652|    101|  LiteralNumber *getSizeHint() const {
 1653|    101|    return cast<LiteralNumber>(getOperand(SizeHintIdx));
 1654|    101|  }
_ZNK6hermes14AllocArrayInst15getElementCountEv:
 1657|    345|  unsigned getElementCount() const {
 1658|    345|    return getNumOperands() - 1;
 1659|    345|  }
_ZNK6hermes14AllocArrayInst15getArrayElementEj:
 1663|   411k|  Value *getArrayElement(unsigned index) const {
 1664|   411k|    return getOperand(ElementStartIdx + index);
 1665|   411k|  }
_ZN6hermes14AllocArrayInst7classofEPKNS_5ValueE:
 1690|  14.9M|  static bool classof(const Value *V) {
 1691|  14.9M|    return kindIsA(V->getKind(), ValueKind::AllocArrayInstKind);
 1692|  14.9M|  }
_ZN6hermes19CreateArgumentsInstC2Ev:
 1701|   103k|      : Instruction(ValueKind::CreateArgumentsInstKind) {
 1702|   103k|    setType(Type::createObject());
 1703|   103k|  }
_ZN6hermes19CreateArgumentsInst7classofEPKNS_5ValueE:
 1717|  1.49M|  static bool classof(const Value *V) {
 1718|  1.49M|    return kindIsA(V->getKind(), ValueKind::CreateArgumentsInstKind);
 1719|  1.49M|  }
_ZNK6hermes16CreateRegExpInst10getPatternEv:
 1729|    238|  LiteralString *getPattern() const {
 1730|    238|    return cast<LiteralString>(getOperand(PatternIdx));
 1731|    238|  }
_ZNK6hermes16CreateRegExpInst8getFlagsEv:
 1732|    238|  LiteralString *getFlags() const {
 1733|    238|    return cast<LiteralString>(getOperand(FlagsIdx));
 1734|    238|  }
_ZN6hermes16CreateRegExpInstC2EPNS_13LiteralStringES2_:
 1737|    119|      : Instruction(ValueKind::CreateRegExpInstKind) {
 1738|    119|    setType(Type::createRegExp());
 1739|    119|    pushOperand(pattern);
 1740|    119|    pushOperand(flags);
 1741|    119|  }
_ZN6hermes16CreateRegExpInst7classofEPKNS_5ValueE:
 1755|  1.48M|  static bool classof(const Value *V) {
 1756|  1.48M|    return kindIsA(V->getKind(), ValueKind::CreateRegExpInstKind);
 1757|  1.48M|  }
_ZNK6hermes17UnaryOperatorInst15getOperatorKindEv:
 1789|  25.3k|  OpKind getOperatorKind() const {
 1790|  25.3k|    return op_;
 1791|  25.3k|  }
_ZN6hermes17UnaryOperatorInstC2EPNS_5ValueENS0_6OpKindE:
 1803|  25.3k|      : SingleOperandInst(ValueKind::UnaryOperatorInstKind, value),
 1804|  25.3k|        op_(opKind) {}
_ZN6hermes17UnaryOperatorInst22getChangedOperandsImplEv:
 1812|  3.53k|  WordBitSet<> getChangedOperandsImpl() {
 1813|  3.53k|    return {};
 1814|  3.53k|  }
_ZN6hermes17UnaryOperatorInst7classofEPKNS_5ValueE:
 1816|  54.3k|  static bool classof(const Value *V) {
 1817|  54.3k|    return kindIsA(V->getKind(), ValueKind::UnaryOperatorInstKind);
 1818|  54.3k|  }
_ZNK6hermes18BinaryOperatorInst15getOperatorKindEv:
 1873|   314k|  OpKind getOperatorKind() const {
 1874|   314k|    return op_;
 1875|   314k|  }
_ZNK6hermes18BinaryOperatorInst15getLeftHandSideEv:
 1877|   314k|  Value *getLeftHandSide() const {
 1878|   314k|    return getOperand(LeftHandSideIdx);
 1879|   314k|  }
_ZNK6hermes18BinaryOperatorInst16getRightHandSideEv:
 1880|   157k|  Value *getRightHandSide() const {
 1881|   157k|    return getOperand(RightHandSideIdx);
 1882|   157k|  }
_ZN6hermes18BinaryOperatorInstC2EPNS_5ValueES2_NS0_6OpKindE:
 1902|   157k|      : Instruction(ValueKind::BinaryOperatorInstKind), op_(opKind) {
 1903|   157k|    pushOperand(left);
 1904|   157k|    pushOperand(right);
 1905|   157k|  }
_ZN6hermes18BinaryOperatorInst22getChangedOperandsImplEv:
 1918|   200k|  WordBitSet<> getChangedOperandsImpl() {
 1919|   200k|    return {};
 1920|   200k|  }
_ZN6hermes18BinaryOperatorInst7classofEPKNS_5ValueE:
 1922|  4.29M|  static bool classof(const Value *V) {
 1923|  4.29M|    return kindIsA(V->getKind(), ValueKind::BinaryOperatorInstKind);
 1924|  4.29M|  }
_ZN6hermes9CatchInstC2Ev:
 1937|  40.6k|  explicit CatchInst() : Instruction(ValueKind::CatchInstKind) {}
_ZN6hermes9CatchInst7classofEPKNS_5ValueE:
 1949|  8.65M|  static bool classof(const Value *V) {
 1950|  8.65M|    return kindIsA(V->getKind(), ValueKind::CatchInstKind);
 1951|  8.65M|  }
_ZN6hermes9ThrowInstC2EPNS_5ValueE:
 1962|  20.3k|      : TerminatorInst(ValueKind::ThrowInstKind) {
 1963|  20.3k|    pushOperand(thrownValue);
 1964|  20.3k|  }
_ZN6hermes9ThrowInst22getChangedOperandsImplEv:
 1972|  19.5k|  WordBitSet<> getChangedOperandsImpl() {
 1973|  19.5k|    return {};
 1974|  19.5k|  }
_ZNK6hermes9ThrowInst14getThrownValueEv:
 1976|  20.3k|  Value *getThrownValue() const {
 1977|  20.3k|    return getOperand(ThrownValueIdx);
 1978|  20.3k|  }
_ZN6hermes9ThrowInst7classofEPKNS_5ValueE:
 1980|  4.69M|  static bool classof(const Value *V) {
 1981|  4.69M|    return kindIsA(V->getKind(), ValueKind::ThrowInstKind);
 1982|  4.69M|  }
_ZNK6hermes9ThrowInst16getNumSuccessorsEv:
 1984|   142k|  unsigned getNumSuccessors() const {
 1985|   142k|    return 0;
 1986|   142k|  }
_ZN6hermes10SwitchInst7classofEPKNS_5ValueE:
 2034|  16.5M|  static bool classof(const Value *V) {
 2035|  16.5M|    return kindIsA(V->getKind(), ValueKind::SwitchInstKind);
 2036|  16.5M|  }
_ZNK6hermes13GetPNamesInst11getIteratorEv:
 2065|     15|  Value *getIterator() const {
 2066|     15|    return getOperand(IteratorIdx);
 2067|     15|  }
_ZNK6hermes13GetPNamesInst7getBaseEv:
 2068|     15|  Value *getBase() const {
 2069|     15|    return getOperand(BaseIdx);
 2070|     15|  }
_ZNK6hermes13GetPNamesInst8getIndexEv:
 2071|     15|  Value *getIndex() const {
 2072|     15|    return getOperand(IndexIdx);
 2073|     15|  }
_ZNK6hermes13GetPNamesInst7getSizeEv:
 2074|     15|  Value *getSize() const {
 2075|     15|    return getOperand(SizeIdx);
 2076|     15|  }
_ZNK6hermes13GetPNamesInst14getOnEmptyDestEv:
 2077|     78|  BasicBlock *getOnEmptyDest() const {
 2078|     78|    return cast<BasicBlock>(getOperand(OnEmptyIdx));
 2079|     78|  }
_ZNK6hermes13GetPNamesInst13getOnSomeDestEv:
 2080|     78|  BasicBlock *getOnSomeDest() const {
 2081|     78|    return cast<BasicBlock>(getOperand(OnSomeIdx));
 2082|     78|  }
_ZN6hermes13GetPNamesInst7classofEPKNS_5ValueE:
 2096|  1.21M|  static bool classof(const Value *V) {
 2097|  1.21M|    return kindIsA(V->getKind(), ValueKind::GetPNamesInstKind);
 2098|  1.21M|  }
_ZNK6hermes13GetPNamesInst16getNumSuccessorsEv:
 2100|    189|  unsigned getNumSuccessors() const {
 2101|    189|    return 2;
 2102|    189|  }
_ZNK6hermes13GetPNamesInst12getSuccessorEj:
 2103|    126|  BasicBlock *getSuccessor(unsigned idx) const {
 2104|    126|    if (idx == 0)
  ------------------
  |  Branch (2104:9): [True: 63, False: 63]
  ------------------
 2105|     63|      return getOnEmptyDest();
 2106|     63|    if (idx == 1)
  ------------------
  |  Branch (2106:9): [True: 63, False: 0]
  ------------------
 2107|     63|      return getOnSomeDest();
 2108|      0|    llvm_unreachable("GetPNamesInst only have 2 successors!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 2109|     63|  }
_ZN6hermes16GetNextPNameInst7classofEPKNS_5ValueE:
 2161|  1.21M|  static bool classof(const Value *V) {
 2162|  1.21M|    return kindIsA(V->getKind(), ValueKind::GetNextPNameInstKind);
 2163|  1.21M|  }
_ZNK6hermes16GetNextPNameInst15getPropertyAddrEv:
 2165|     15|  Value *getPropertyAddr() const {
 2166|     15|    return getOperand(PropertyIdx);
 2167|     15|  }
_ZNK6hermes16GetNextPNameInst11getBaseAddrEv:
 2168|     15|  Value *getBaseAddr() const {
 2169|     15|    return getOperand(BaseIdx);
 2170|     15|  }
_ZNK6hermes16GetNextPNameInst12getIndexAddrEv:
 2171|     15|  Value *getIndexAddr() const {
 2172|     15|    return getOperand(IndexIdx);
 2173|     15|  }
_ZNK6hermes16GetNextPNameInst11getSizeAddrEv:
 2174|     15|  Value *getSizeAddr() const {
 2175|     15|    return getOperand(SizeIdx);
 2176|     15|  }
_ZNK6hermes16GetNextPNameInst15getIteratorAddrEv:
 2177|     15|  Value *getIteratorAddr() const {
 2178|     15|    return getOperand(IteratorIdx);
 2179|     15|  }
_ZNK6hermes16GetNextPNameInst13getOnLastDestEv:
 2180|     78|  BasicBlock *getOnLastDest() const {
 2181|     78|    return cast<BasicBlock>(getOperand(OnLastIdx));
 2182|     78|  }
_ZNK6hermes16GetNextPNameInst13getOnSomeDestEv:
 2183|     78|  BasicBlock *getOnSomeDest() const {
 2184|     78|    return cast<BasicBlock>(getOperand(OnSomeIdx));
 2185|     78|  }
_ZNK6hermes16GetNextPNameInst16getNumSuccessorsEv:
 2187|    189|  unsigned getNumSuccessors() const {
 2188|    189|    return 2;
 2189|    189|  }
_ZNK6hermes16GetNextPNameInst12getSuccessorEj:
 2190|    126|  BasicBlock *getSuccessor(unsigned idx) const {
 2191|    126|    if (idx == 0)
  ------------------
  |  Branch (2191:9): [True: 63, False: 63]
  ------------------
 2192|     63|      return getOnLastDest();
 2193|     63|    if (idx == 1)
  ------------------
  |  Branch (2193:9): [True: 63, False: 0]
  ------------------
 2194|     63|      return getOnSomeDest();
 2195|      0|    llvm_unreachable("GetNextPNameInst only have 2 successors!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 2196|     63|  }
_ZN6hermes20CheckHasInstanceInst7classofEPKNS_5ValueE:
 2239|  1.21M|  static bool classof(const Value *V) {
 2240|  1.21M|    return kindIsA(V->getKind(), ValueKind::CheckHasInstanceInstKind);
 2241|  1.21M|  }
_ZN6hermes12TryStartInstC2EPNS_10BasicBlockES2_:
 2288|  40.6k|      : TerminatorInst(ValueKind::TryStartInstKind) {
 2289|  40.6k|    pushOperand(catchTargetBlock);
 2290|  40.6k|    pushOperand(tryBodyBlock);
 2291|  40.6k|  }
_ZNK6hermes12TryStartInst10getTryBodyEv:
 2297|  81.2k|  BasicBlock *getTryBody() const {
 2298|  81.2k|    return cast<BasicBlock>(getOperand(TryBodyBlockIdx));
 2299|  81.2k|  }
_ZNK6hermes12TryStartInst14getCatchTargetEv:
 2300|  81.2k|  BasicBlock *getCatchTarget() const {
 2301|  81.2k|    return cast<BasicBlock>(getOperand(CatchTargetBlockIdx));
 2302|  81.2k|  }
_ZN6hermes12TryStartInst7classofEPKNS_5ValueE:
 2312|  3.16M|  static bool classof(const Value *V) {
 2313|  3.16M|    return kindIsA(V->getKind(), ValueKind::TryStartInstKind);
 2314|  3.16M|  }
_ZNK6hermes12TryStartInst16getNumSuccessorsEv:
 2316|   730k|  unsigned getNumSuccessors() const {
 2317|   730k|    return 2;
 2318|   730k|  }
_ZNK6hermes12TryStartInst12getSuccessorEj:
 2319|   487k|  BasicBlock *getSuccessor(unsigned idx) const {
 2320|   487k|    return cast<BasicBlock>(getOperand(idx));
 2321|   487k|  }
_ZN6hermes10TryEndInstC2Ev:
 2332|  40.6k|  explicit TryEndInst() : Instruction(ValueKind::TryEndInstKind) {}
_ZN6hermes10TryEndInst7classofEPKNS_5ValueE:
 2344|   740k|  static bool classof(const Value *V) {
 2345|   740k|    return kindIsA(V->getKind(), ValueKind::TryEndInstKind);
 2346|   740k|  }
_ZN6hermes7PhiInst7classofEPKNS_5ValueE:
 2392|  21.6M|  static bool classof(const Value *V) {
 2393|  21.6M|    return kindIsA(V->getKind(), ValueKind::PhiInstKind);
 2394|  21.6M|  }
_ZN6hermes7MovInstC2EPNS_5ValueE:
 2403|  1.34M|      : SingleOperandInst(ValueKind::MovInstKind, input) {
 2404|  1.34M|    setType(input->getType());
 2405|  1.34M|  }
_ZN6hermes7MovInst7classofEPKNS_5ValueE:
 2417|  8.48M|  static bool classof(const Value *V) {
 2418|  8.48M|    return kindIsA(V->getKind(), ValueKind::MovInstKind);
 2419|  8.48M|  }
_ZN6hermes15ImplicitMovInstC2EPNS_5ValueE:
 2429|  2.82k|      : SingleOperandInst(ValueKind::ImplicitMovInstKind, input) {
 2430|  2.82k|    setType(input->getType());
 2431|  2.82k|  }
_ZN6hermes15ImplicitMovInst7classofEPKNS_5ValueE:
 2446|  5.64k|  static bool classof(const Value *V) {
 2447|  5.64k|    return kindIsA(V->getKind(), ValueKind::ImplicitMovInstKind);
 2448|  5.64k|  }
_ZN6hermes16GetNewTargetInstC2Ev:
 2509|      9|  explicit GetNewTargetInst() : Instruction(ValueKind::GetNewTargetInstKind) {}
_ZN6hermes16GetNewTargetInst7classofEPKNS_5ValueE:
 2523|     18|  static bool classof(const Value *V) {
 2524|     18|    return kindIsA(V->getKind(), ValueKind::GetNewTargetInstKind);
 2525|     18|  }
_ZN6hermes21HBCResolveEnvironment7classofEPKNS_5ValueE:
 2593|  6.18M|  static bool classof(const Value *V) {
 2594|  6.18M|    return kindIsA(V->getKind(), ValueKind::HBCResolveEnvironmentKind);
 2595|  6.18M|  }
_ZN6hermes25HBCStoreToEnvironmentInstC2EPNS_5ValueES2_PNS_8VariableE:
 2606|   104k|      : Instruction(ValueKind::HBCStoreToEnvironmentInstKind) {
 2607|   104k|    pushOperand(env);
 2608|   104k|    pushOperand(toPut);
 2609|   104k|    pushOperand(var);
 2610|   104k|  }
_ZNK6hermes25HBCStoreToEnvironmentInst15getResolvedNameEv:
 2616|   104k|  Variable *getResolvedName() const {
 2617|   104k|    return cast<Variable>(getOperand(NameIdx));
 2618|   104k|  }
_ZNK6hermes25HBCStoreToEnvironmentInst14getEnvironmentEv:
 2619|   104k|  Value *getEnvironment() const {
 2620|   104k|    return getOperand(EnvIdx);
 2621|   104k|  }
_ZNK6hermes25HBCStoreToEnvironmentInst14getStoredValueEv:
 2622|   208k|  Value *getStoredValue() const {
 2623|   208k|    return getOperand(ValueIdx);
 2624|   208k|  }
_ZN6hermes25HBCStoreToEnvironmentInst22getChangedOperandsImplEv:
 2630|      2|  WordBitSet<> getChangedOperandsImpl() {
 2631|      2|    return {};
 2632|      2|  }
_ZN6hermes25HBCStoreToEnvironmentInst7classofEPKNS_5ValueE:
 2634|   208k|  static bool classof(const Value *V) {
 2635|   208k|    return kindIsA(V->getKind(), ValueKind::HBCStoreToEnvironmentInstKind);
 2636|   208k|  }
_ZN6hermes26HBCLoadFromEnvironmentInstC2EPNS_5ValueEPNS_8VariableE:
 2647|      4|      : Instruction(ValueKind::HBCLoadFromEnvironmentInstKind) {
 2648|      4|    pushOperand(env);
 2649|      4|    pushOperand(var);
 2650|      4|  }
_ZNK6hermes26HBCLoadFromEnvironmentInst15getResolvedNameEv:
 2656|      4|  Variable *getResolvedName() const {
 2657|      4|    return cast<Variable>(getOperand(NameIdx));
 2658|      4|  }
_ZNK6hermes26HBCLoadFromEnvironmentInst14getEnvironmentEv:
 2659|      4|  Value *getEnvironment() const {
 2660|      4|    return getOperand(EnvIdx);
 2661|      4|  }
_ZN6hermes26HBCLoadFromEnvironmentInst7classofEPKNS_5ValueE:
 2671|      8|  static bool classof(const Value *V) {
 2672|      8|    return kindIsA(V->getKind(), ValueKind::HBCLoadFromEnvironmentInstKind);
 2673|      8|  }
_ZN6hermes13SwitchImmInst7classofEPKNS_5ValueE:
 2747|  1.48M|  static bool classof(const Value *V) {
 2748|  1.48M|    return kindIsA(V->getKind(), ValueKind::SwitchImmInstKind);
 2749|  1.48M|  }
_ZN6hermes14DirectEvalInst7classofEPKNS_5ValueE:
 2839|  1.42M|  static bool classof(const Value *V) {
 2840|  1.42M|    return kindIsA(V->getKind(), ValueKind::DirectEvalInstKind);
 2841|  1.42M|  }
_ZN6hermes24HBCCreateEnvironmentInstC2EPNS_9ScopeDescE:
 2850|   103k|      : ScopeCreationInst(ValueKind::HBCCreateEnvironmentInstKind, scopeDesc) {}
_ZN6hermes24HBCCreateEnvironmentInst7classofEPKNS_5ValueE:
 2864|   620k|  static bool classof(const Value *V) {
 2865|   620k|    return kindIsA(V->getKind(), ValueKind::HBCCreateEnvironmentInstKind);
 2866|   620k|  }
_ZN6hermes16HBCLoadConstInstC2EPNS_7LiteralE:
 2939|  1.75M|      : SingleOperandInst(ValueKind::HBCLoadConstInstKind, input) {
 2940|  1.75M|    setType(input->getType());
 2941|  1.75M|  }
_ZNK6hermes16HBCLoadConstInst8getConstEv:
 2947|  1.64M|  Literal *getConst() const {
 2948|  1.64M|    return cast<Literal>(getSingleOperand());
 2949|  1.64M|  }
_ZN6hermes16HBCLoadConstInst7classofEPKNS_5ValueE:
 2959|  8.35M|  static bool classof(const Value *V) {
 2960|  8.35M|    return kindIsA(V->getKind(), ValueKind::HBCLoadConstInstKind);
 2961|  8.35M|  }
_ZN6hermes16HBCLoadParamInstC2EPNS_13LiteralNumberE:
 2972|   103k|      : SingleOperandInst(ValueKind::HBCLoadParamInstKind, input) {}
_ZNK6hermes16HBCLoadParamInst8getIndexEv:
 2978|   103k|  LiteralNumber *getIndex() const {
 2979|   103k|    return cast<LiteralNumber>(getSingleOperand());
 2980|   103k|  }
_ZN6hermes16HBCLoadParamInst7classofEPKNS_5ValueE:
 2990|  5.15M|  static bool classof(const Value *V) {
 2991|  5.15M|    return kindIsA(V->getKind(), ValueKind::HBCLoadParamInstKind);
 2992|  5.15M|  }
_ZN6hermes16HBCGetThisNSInstC2Ev:
 3003|      9|  explicit HBCGetThisNSInst() : Instruction(ValueKind::HBCGetThisNSInstKind) {}
_ZN6hermes16HBCGetThisNSInst7classofEPKNS_5ValueE:
 3017|     18|  static bool classof(const Value *V) {
 3018|     18|    return kindIsA(V->getKind(), ValueKind::HBCGetThisNSInstKind);
 3019|     18|  }
_ZN6hermes21HBCReifyArgumentsInstC2EPNS_14AllocStackInstE:
 3098|    174|      : SingleOperandInst(ValueKind::HBCReifyArgumentsInstKind, reg) {
 3099|    174|    setType(Type::createNoType());
 3100|    174|  }
_ZNK6hermes21HBCReifyArgumentsInst15getLazyRegisterEv:
 3106|     13|  Value *getLazyRegister() const {
 3107|     13|    return getSingleOperand();
 3108|     13|  }
_ZN6hermes21HBCReifyArgumentsInst22getChangedOperandsImplEv:
 3114|     13|  WordBitSet<> getChangedOperandsImpl() {
 3115|     13|    return WordBitSet<>{}.set(0);
 3116|     13|  }
_ZN6hermes21HBCReifyArgumentsInst7classofEPKNS_5ValueE:
 3118|  3.96M|  static bool classof(const Value *V) {
 3119|  3.96M|    return kindIsA(V->getKind(), ValueKind::HBCReifyArgumentsInstKind);
 3120|  3.96M|  }
_ZN6hermes17HBCCreateThisInstC2EPNS_5ValueES2_:
 3132|  25.0k|      : Instruction(ValueKind::HBCCreateThisInstKind) {
 3133|  25.0k|    pushOperand(prototype);
 3134|  25.0k|    pushOperand(closure);
 3135|  25.0k|  }
_ZNK6hermes17HBCCreateThisInst12getPrototypeEv:
 3141|  25.0k|  Value *getPrototype() const {
 3142|  25.0k|    return getOperand(PrototypeIdx);
 3143|  25.0k|  }
_ZNK6hermes17HBCCreateThisInst10getClosureEv:
 3144|  25.0k|  Value *getClosure() const {
 3145|  25.0k|    return getOperand(ClosureIdx);
 3146|  25.0k|  }
_ZN6hermes17HBCCreateThisInst7classofEPKNS_5ValueE:
 3156|  50.0k|  static bool classof(const Value *V) {
 3157|  50.0k|    return kindIsA(V->getKind(), ValueKind::HBCCreateThisInstKind);
 3158|  50.0k|  }
_ZN6hermes16HBCConstructInstC2EPNS_5ValueES2_S2_N4llvh8ArrayRefIS2_EE:
 3179|  25.0k|      : CallInst(
 3180|  25.0k|            ValueKind::HBCConstructInstKind,
 3181|  25.0k|            kNoTextifiedCallee,
 3182|  25.0k|            constructor,
 3183|  25.0k|            newTarget,
 3184|  25.0k|            thisValue,
 3185|  25.0k|            args) {}
_ZN6hermes16HBCConstructInst7classofEPKNS_5ValueE:
 3191|  50.0k|  static bool classof(const Value *V) {
 3192|  50.0k|    return kindIsA(V->getKind(), ValueKind::HBCConstructInstKind);
 3193|  50.0k|  }
_ZN6hermes27HBCGetConstructedObjectInstC2EPNS_17HBCCreateThisInstEPNS_16HBCConstructInstE:
 3207|  25.0k|      : Instruction(ValueKind::HBCGetConstructedObjectInstKind) {
 3208|  25.0k|    pushOperand(thisValue);
 3209|  25.0k|    pushOperand(constructorReturnValue);
 3210|  25.0k|  }
_ZNK6hermes27HBCGetConstructedObjectInst12getThisValueEv:
 3216|  25.0k|  Value *getThisValue() const {
 3217|       |    // While originally a HBCCreateThisInst, it may have been replaced by a mov
 3218|       |    // or similar.
 3219|  25.0k|    return getOperand(ThisValueIdx);
 3220|  25.0k|  }
_ZNK6hermes27HBCGetConstructedObjectInst25getConstructorReturnValueEv:
 3221|  25.0k|  Value *getConstructorReturnValue() const {
 3222|  25.0k|    return getOperand(ConstructorReturnValueIdx);
 3223|  25.0k|  }
_ZN6hermes27HBCGetConstructedObjectInst7classofEPKNS_5ValueE:
 3233|  50.0k|  static bool classof(const Value *V) {
 3234|  50.0k|    return kindIsA(V->getKind(), ValueKind::HBCGetConstructedObjectInstKind);
 3235|  50.0k|  }
_ZN6hermes21HBCCreateFunctionInstC2EPNS_8FunctionEPNS_5ValueE:
 3283|   103k|      : CreateFunctionInst(
 3284|   103k|            ValueKind::HBCCreateFunctionInstKind,
 3285|   103k|            code,
 3286|   103k|            environment) {}
_ZN6hermes21HBCCreateFunctionInst7classofEPKNS_5ValueE:
 3292|   206k|  static bool classof(const Value *V) {
 3293|   206k|    return kindIsA(V->getKind(), ValueKind::HBCCreateFunctionInstKind);
 3294|   206k|  }
_ZN6hermes15HBCSpillMovInstC2EPNS_11InstructionE:
 3305|  2.38M|      : SingleOperandInst(ValueKind::HBCSpillMovInstKind, value) {}
_ZNK6hermes15HBCSpillMovInst8getValueEv:
 3311|  2.38M|  Instruction *getValue() const {
 3312|  2.38M|    return cast<Instruction>(getSingleOperand());
 3313|  2.38M|  }
_ZN6hermes15HBCSpillMovInst7classofEPKNS_5ValueE:
 3323|  4.77M|  static bool classof(const Value *V) {
 3324|  4.77M|    return kindIsA(V->getKind(), ValueKind::HBCSpillMovInstKind);
 3325|  4.77M|  }
_ZN6hermes17IteratorBeginInstC2EPNS_14AllocStackInstE:
 3522|  22.3k|      : Instruction(ValueKind::IteratorBeginInstKind) {
 3523|  22.3k|    pushOperand(sourceOrNext);
 3524|  22.3k|  }
_ZN6hermes17IteratorBeginInst22getChangedOperandsImplEv:
 3534|  22.3k|  WordBitSet<> getChangedOperandsImpl() {
 3535|  22.3k|    return WordBitSet<>{}.set(SourceOrNextIdx);
 3536|  22.3k|  }
_ZNK6hermes17IteratorBeginInst15getSourceOrNextEv:
 3538|  22.3k|  Value *getSourceOrNext() const {
 3539|  22.3k|    return getOperand(SourceOrNextIdx);
 3540|  22.3k|  }
_ZN6hermes17IteratorBeginInst7classofEPKNS_5ValueE:
 3542|  67.1k|  static bool classof(const Value *V) {
 3543|  67.1k|    return kindIsA(V->getKind(), ValueKind::IteratorBeginInstKind);
 3544|  67.1k|  }
_ZN6hermes16IteratorNextInstC2EPNS_14AllocStackInstES2_:
 3557|  20.3k|      : Instruction(ValueKind::IteratorNextInstKind) {
 3558|  20.3k|    pushOperand(iterator);
 3559|  20.3k|    pushOperand(sourceOrNext);
 3560|  20.3k|  }
_ZN6hermes16IteratorNextInst22getChangedOperandsImplEv:
 3570|  40.5k|  WordBitSet<> getChangedOperandsImpl() {
 3571|  40.5k|    return WordBitSet<>{}.set(IteratorIdx);
 3572|  40.5k|  }
_ZNK6hermes16IteratorNextInst11getIteratorEv:
 3574|  20.3k|  Value *getIterator() const {
 3575|  20.3k|    return getOperand(IteratorIdx);
 3576|  20.3k|  }
_ZNK6hermes16IteratorNextInst15getSourceOrNextEv:
 3577|  20.3k|  Value *getSourceOrNext() const {
 3578|  20.3k|    return getOperand(SourceOrNextIdx);
 3579|  20.3k|  }
_ZN6hermes16IteratorNextInst7classofEPKNS_5ValueE:
 3581|  81.1k|  static bool classof(const Value *V) {
 3582|  81.1k|    return kindIsA(V->getKind(), ValueKind::IteratorNextInstKind);
 3583|  81.1k|  }
_ZN6hermes17IteratorCloseInstC2EPNS_14AllocStackInstEPNS_11LiteralBoolE:
 3598|  42.7k|      : Instruction(ValueKind::IteratorCloseInstKind) {
 3599|  42.7k|    pushOperand(iterator);
 3600|  42.7k|    pushOperand(ignoreInnerException);
 3601|  42.7k|  }
_ZN6hermes17IteratorCloseInst22getChangedOperandsImplEv:
 3611|  42.6k|  WordBitSet<> getChangedOperandsImpl() {
 3612|  42.6k|    return {};
 3613|  42.6k|  }
_ZNK6hermes17IteratorCloseInst11getIteratorEv:
 3615|  42.7k|  Value *getIterator() const {
 3616|  42.7k|    return getOperand(IteratorIdx);
 3617|  42.7k|  }
_ZNK6hermes17IteratorCloseInst23getIgnoreInnerExceptionEv:
 3619|  42.7k|  bool getIgnoreInnerException() const {
 3620|  42.7k|    return cast<LiteralBool>(getOperand(IgnoreInnerExceptionIdx))->getValue();
 3621|  42.7k|  }
_ZN6hermes17IteratorCloseInst7classofEPKNS_5ValueE:
 3623|  1.59M|  static bool classof(const Value *V) {
 3624|  1.59M|    return kindIsA(V->getKind(), ValueKind::IteratorCloseInstKind);
 3625|  1.59M|  }

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

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

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

_ZN6hermes6parser13RegExpLiteralC2EPNS_12UniqueStringES3_:
   66|    240|      : body_(body), flags_(flags) {}
_ZNK6hermes6parser13RegExpLiteral7getBodyEv:
   68|    240|  UniqueString *getBody() const {
   69|    240|    return body_;
   70|    240|  }
_ZNK6hermes6parser13RegExpLiteral8getFlagsEv:
   71|    240|  UniqueString *getFlags() const {
   72|    240|    return flags_;
   73|    240|  }
_ZNK6hermes6parser5Token7getKindEv:
  111|   378M|  TokenKind getKind() const {
  112|   378M|    return kind_;
  113|   378M|  }
_ZNK6hermes6parser5Token9isResWordEv:
  114|  8.08k|  bool isResWord() const {
  115|  8.08k|    return kind_ > TokenKind::_first_resword &&
  ------------------
  |  Branch (115:12): [True: 8.08k, False: 0]
  ------------------
  116|  8.08k|        kind_ < TokenKind::_last_resword;
  ------------------
  |  Branch (116:9): [True: 7.91k, False: 168]
  ------------------
  117|  8.08k|  }
_ZNK6hermes6parser5Token17isTemplateLiteralEv:
  118|  3.27M|  bool isTemplateLiteral() const {
  119|  3.27M|    return getKind() == TokenKind::no_substitution_template ||
  ------------------
  |  Branch (119:12): [True: 1.16M, False: 2.10M]
  ------------------
  120|  3.27M|        getKind() == TokenKind::template_head ||
  ------------------
  |  Branch (120:9): [True: 150, False: 2.10M]
  ------------------
  121|  3.27M|        getKind() == TokenKind::template_middle ||
  ------------------
  |  Branch (121:9): [True: 2.10M, False: 141]
  ------------------
  122|  3.27M|        getKind() == TokenKind::template_tail;
  ------------------
  |  Branch (122:9): [True: 141, False: 0]
  ------------------
  123|  3.27M|  }
_ZNK6hermes6parser5Token11getStartLocEv:
  125|  87.5M|  SMLoc getStartLoc() const {
  126|  87.5M|    return range_.Start;
  127|  87.5M|  }
_ZNK6hermes6parser5Token9getEndLocEv:
  128|  28.3M|  SMLoc getEndLoc() const {
  129|  28.3M|    return range_.End;
  130|  28.3M|  }
_ZNK6hermes6parser5Token14getSourceRangeEv:
  131|  17.9M|  SMRange getSourceRange() const {
  132|  17.9M|    return range_;
  133|  17.9M|  }
_ZNK6hermes6parser5Token17getNumericLiteralEv:
  141|  5.13M|  double getNumericLiteral() const {
  142|  5.13M|    assert(getKind() == TokenKind::numeric_literal);
  143|  5.13M|    return numeric_;
  144|  5.13M|  }
_ZNK6hermes6parser5Token13getIdentifierEv:
  146|  18.6M|  UniqueString *getIdentifier() const {
  147|  18.6M|    assert(getKind() == TokenKind::identifier);
  148|  18.6M|    return ident_;
  149|  18.6M|  }
_ZNK6hermes6parser5Token22getResWordOrIdentifierEv:
  158|   100k|  UniqueString *getResWordOrIdentifier() const {
  159|   100k|    assert(getKind() == TokenKind::identifier || isResWord());
  160|   100k|    return ident_;
  161|   100k|  }
_ZNK6hermes6parser5Token16getStringLiteralEv:
  163|     49|  UniqueString *getStringLiteral() const {
  164|     49|    assert(getKind() == TokenKind::string_literal);
  165|     49|    return stringLiteral_;
  166|     49|  }
_ZNK6hermes6parser5Token31getStringLiteralContainsEscapesEv:
  171|     14|  bool getStringLiteralContainsEscapes() const {
  172|     14|    assert(getKind() == TokenKind::string_literal);
  173|     14|    return stringLiteralContainsEscapes_;
  174|     14|  }
_ZNK6hermes6parser5Token36getTemplateLiteralContainsNotEscapesEv:
  179|  1.09M|  bool getTemplateLiteralContainsNotEscapes() const {
  180|  1.09M|    assert(isTemplateLiteral());
  181|  1.09M|    return stringLiteral_ == nullptr;
  182|  1.09M|  }
_ZNK6hermes6parser5Token16getTemplateValueEv:
  184|  1.09M|  UniqueString *getTemplateValue() const {
  185|  1.09M|    assert(isTemplateLiteral());
  186|  1.09M|    return stringLiteral_;
  187|  1.09M|  }
_ZNK6hermes6parser5Token19getTemplateRawValueEv:
  189|  1.09M|  UniqueString *getTemplateRawValue() const {
  190|  1.09M|    assert(isTemplateLiteral());
  191|  1.09M|    return rawString_;
  192|  1.09M|  }
_ZNK6hermes6parser5Token16getBigIntLiteralEv:
  194|     54|  UniqueString *getBigIntLiteral() const {
  195|     54|    assert(getKind() == TokenKind::bigint_literal);
  196|     54|    return rawString_;
  197|     54|  }
_ZNK6hermes6parser5Token16getRegExpLiteralEv:
  199|    480|  RegExpLiteral *getRegExpLiteral() const {
  200|    480|    assert(getKind() == TokenKind::regexp_literal);
  201|    480|    return regExpLiteral_;
  202|    480|  }
_ZN6hermes6parser5Token8setStartEPKc:
  231|  18.6M|  void setStart(const char *start) {
  232|  18.6M|    range_.Start = SMLoc::getFromPointer(start);
  233|  18.6M|  }
_ZN6hermes6parser5Token6setEndEPKc:
  234|  18.6M|  void setEnd(const char *end) {
  235|  18.6M|    range_.End = SMLoc::getFromPointer(end);
  236|  18.6M|  }
_ZN6hermes6parser5Token13setPunctuatorENS0_9TokenKindE:
  242|  8.92M|  void setPunctuator(TokenKind kind) {
  243|  8.92M|    kind_ = kind;
  244|  8.92M|  }
_ZN6hermes6parser5Token6setEofEv:
  250|    597|  void setEof() {
  251|    597|    kind_ = TokenKind::eof;
  252|    597|  }
_ZN6hermes6parser5Token16setBigIntLiteralEPNS_12UniqueStringE:
  254|     55|  void setBigIntLiteral(UniqueString *raw) {
  255|     55|    kind_ = TokenKind::bigint_literal;
  256|     55|    rawString_ = raw;
  257|     55|  }
_ZN6hermes6parser5Token17setNumericLiteralEd:
  258|  5.13M|  void setNumericLiteral(double literal) {
  259|  5.13M|    kind_ = TokenKind::numeric_literal;
  260|  5.13M|    numeric_ = literal;
  261|  5.13M|  }
_ZN6hermes6parser5Token13setIdentifierEPNS_12UniqueStringE:
  262|  3.43M|  void setIdentifier(UniqueString *ident) {
  263|  3.43M|    kind_ = TokenKind::identifier;
  264|  3.43M|    ident_ = ident;
  265|  3.43M|  }
_ZN6hermes6parser5Token16setStringLiteralEPNS_12UniqueStringEb:
  270|     52|  void setStringLiteral(UniqueString *literal, bool containsEscapes) {
  271|     52|    kind_ = TokenKind::string_literal;
  272|     52|    stringLiteral_ = literal;
  273|     52|    stringLiteralContainsEscapes_ = containsEscapes;
  274|     52|  }
_ZN6hermes6parser5Token16setRegExpLiteralEPNS0_13RegExpLiteralE:
  281|    240|  void setRegExpLiteral(RegExpLiteral *literal) {
  282|    240|    kind_ = TokenKind::regexp_literal;
  283|    240|    regExpLiteral_ = literal;
  284|    240|  }
_ZN6hermes6parser5Token10setResWordENS0_9TokenKindEPNS_12UniqueStringE:
  285|  62.2k|  void setResWord(TokenKind kind, UniqueString *ident) {
  286|  62.2k|    assert(kind > TokenKind::_first_resword && kind < TokenKind::_last_resword);
  287|  62.2k|    kind_ = kind;
  288|  62.2k|    ident_ = ident;
  289|  62.2k|  }
_ZN6hermes6parser5Token18setTemplateLiteralENS0_9TokenKindEPNS_12UniqueStringES4_:
  292|  1.09M|  setTemplateLiteral(TokenKind kind, UniqueString *cooked, UniqueString *raw) {
  293|  1.09M|    assert(
  294|  1.09M|        kind == TokenKind::no_substitution_template ||
  295|  1.09M|        kind == TokenKind::template_head ||
  296|  1.09M|        kind == TokenKind::template_middle || kind == TokenKind::template_tail);
  297|  1.09M|    kind_ = kind;
  298|  1.09M|    stringLiteral_ = cooked;
  299|  1.09M|    rawString_ = raw;
  300|  1.09M|  }
_ZN6hermes6parser7JSLexer12resWordIdentENS0_9TokenKindE:
  438|  89.0k|  UniqueString *&resWordIdent(TokenKind kind) {
  439|  89.0k|    assert(
  440|  89.0k|        kind >= TokenKind::_first_resword && kind <= TokenKind::_last_resword);
  441|  89.0k|    return resWordIdent_[ord(kind) - ord(TokenKind::_first_resword)];
  442|  89.0k|  }
_ZN6hermes6parser7JSLexer12getSourceMgrEv:
  509|    581|  SourceErrorManager &getSourceMgr() {
  510|    581|    return sm_;
  511|    581|  }
_ZNK6hermes6parser7JSLexer12isStrictModeEv:
  520|   428k|  bool isStrictMode() const {
  521|   428k|    return strictMode_;
  522|   428k|  }
_ZN6hermes6parser7JSLexer13setStrictModeEb:
  524|   212k|  void setStrictMode(bool strictMode) {
  525|   212k|    strictMode_ = strictMode;
  526|   212k|  }
_ZNK6hermes6parser7JSLexer27isNewLineBeforeCurrentTokenEv:
  550|  7.25M|  bool isNewLineBeforeCurrentToken() const {
  551|  7.25M|    return newLineBeforeCurrentToken_;
  552|  7.25M|  }
_ZNK6hermes6parser7JSLexer18getPrevTokenEndLocEv:
  565|  9.96M|  SMLoc getPrevTokenEndLoc() const {
  566|  9.96M|    return prevTokenEndLoc_;
  567|  9.96M|  }
_ZN6hermes6parser7JSLexer8forceEOFEv:
  579|     25|  void forceEOF() {
  580|     25|    curCharPtr_ = bufferEnd_;
  581|     25|  }
_ZN6hermes6parser7JSLexer13getIdentifierEN4llvh9StringRefE:
  635|  3.58M|  UniqueString *getIdentifier(llvh::StringRef name) {
  636|  3.58M|    return strTab_.getString(name);
  637|  3.58M|  }
_ZN6hermes6parser7JSLexer16getStringLiteralEN4llvh9StringRefE:
  639|  2.18M|  UniqueString *getStringLiteral(llvh::StringRef str) {
  640|  2.18M|    if (LLVM_UNLIKELY(convertSurrogates_)) {
  ------------------
  |  |  189|  2.18M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.18M]
  |  |  ------------------
  ------------------
  641|      0|      return convertSurrogatesInString(str);
  642|      0|    }
  643|  2.18M|    return strTab_.getString(str);
  644|  2.18M|  }
_ZN6hermes6parser7JSLexer4seekEN4llvh5SMLocE:
  649|    681|  void seek(SMLoc loc) {
  650|    681|    curCharPtr_ = loc.getPointer();
  651|    681|  }
_ZN6hermes6parser7JSLexer11getBufferIdEv:
  654|     81|  uint32_t getBufferId() {
  655|     81|    return bufId_;
  656|     81|  }
_ZN6hermes6parser7JSLexer22appendUnicodeToStorageEj:
  797|  22.9k|  inline void appendUnicodeToStorage(uint32_t cp) {
  798|  22.9k|    appendUnicodeToStorage(cp, tmpStorage_);
  799|  22.9k|  }
_ZN6hermes6parser7JSLexer31scanIdentifierFastPathInContextEPKcNS1_14GrammarContextE:
  937|  3.49M|      GrammarContext grammarContext) {
  938|  3.49M|    if (HERMES_PARSE_JSX &&
  ------------------
  |  |   15|  6.99M|#define HERMES_PARSE_JSX 1
  |  |  ------------------
  |  |  |  Branch (15:26): [Folded - Ignored]
  |  |  ------------------
  ------------------
  939|  3.49M|        LLVM_UNLIKELY(grammarContext == GrammarContext::AllowJSXIdentifier)) {
  ------------------
  |  |  189|  3.49M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.49M]
  |  |  ------------------
  ------------------
  940|      0|      scanIdentifierFastPath<IdentifierMode::JSX>(start);
  941|  3.49M|    } else if (
  942|  3.49M|        HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  6.99M|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  943|  3.49M|        LLVM_UNLIKELY(grammarContext == GrammarContext::Type)) {
  ------------------
  |  |  189|  3.49M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.49M]
  |  |  ------------------
  ------------------
  944|      0|      scanIdentifierFastPath<IdentifierMode::Flow>(start);
  945|  3.49M|    } else {
  946|  3.49M|      scanIdentifierFastPath<IdentifierMode::JS>(start);
  947|  3.49M|    }
  948|  3.49M|  }
_ZN6hermes6parser7JSLexer28scanIdentifierPartsInContextENS1_14GrammarContextE:
  952|     17|  void scanIdentifierPartsInContext(GrammarContext grammarContext) {
  953|     17|    if (HERMES_PARSE_JSX &&
  ------------------
  |  |   15|     34|#define HERMES_PARSE_JSX 1
  |  |  ------------------
  |  |  |  Branch (15:26): [Folded - Ignored]
  |  |  ------------------
  ------------------
  954|     17|        LLVM_UNLIKELY(grammarContext == GrammarContext::AllowJSXIdentifier)) {
  ------------------
  |  |  189|     17|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 17]
  |  |  ------------------
  ------------------
  955|      0|      scanIdentifierParts<IdentifierMode::JSX>();
  956|     17|    } else if (
  957|     17|        HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|     34|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  958|     17|        LLVM_UNLIKELY(grammarContext == GrammarContext::Type)) {
  ------------------
  |  |  189|     17|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 17]
  |  |  ------------------
  ------------------
  959|      0|      scanIdentifierParts<IdentifierMode::Flow>();
  960|     17|    } else {
  961|     17|      scanIdentifierParts<IdentifierMode::JS>();
  962|     17|    }
  963|     17|  }
_ZN6hermes6parser7JSLexer19scanStringInContextENS1_14GrammarContextE:
  972|     52|  void scanStringInContext(GrammarContext grammarContext) {
  973|     52|#if HERMES_PARSE_JSX
  974|     52|    LLVM_UNLIKELY(grammarContext == GrammarContext::AllowJSXIdentifier)
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  975|     52|    ? scanString<true>() :
  976|     52|#endif
  977|     52|    scanString<false>();
  978|     52|  }
_ZN6hermes6parser7JSLexer11finishTokenEPKc:
 1020|  18.6M|  inline void finishToken(const char *end) {
 1021|  18.6M|    prevTokenEndLoc_ = token_.getEndLoc();
 1022|  18.6M|    token_.setEnd(end);
 1023|  18.6M|    if (LLVM_UNLIKELY(storeTokens_)) {
  ------------------
  |  |  189|  18.6M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18.6M]
  |  |  ------------------
  ------------------
 1024|      0|      storeCurrentToken();
 1025|      0|    }
 1026|  18.6M|  }
_ZN6hermes6parser7JSLexer10errorRangeEN4llvh5SMLocERKNS2_5TwineE:
 1035|      7|  bool errorRange(SMLoc startLoc, const llvh::Twine &msg) {
 1036|      7|    return error({startLoc, SMLoc::getFromPointer(curCharPtr_)}, msg);
 1037|      7|  }
_ZN6hermes6parser3ordENS0_9TokenKindE:
   39|   178k|inline constexpr int ord(TokenKind kind) {
   40|   178k|  return static_cast<int>(kind);
   41|   178k|}
_ZN6hermes6parser7JSLexer15initStorageWithEPKcS3_:
 1063|  14.1k|inline void JSLexer::initStorageWith(const char *begin, const char *end) {
 1064|  14.1k|  tmpStorage_.clear();
 1065|  14.1k|  tmpStorage_.append(begin, end);
 1066|  14.1k|}
_ZN6hermes6parser7JSLexer22appendUnicodeToStorageEjRN4llvh15SmallVectorImplIcEE:
 1070|  25.1k|    llvh::SmallVectorImpl<char> &storage) {
 1071|       |  // Sized to allow for two 16-bit values to be encoded.
 1072|       |  // A 16-bit value takes up to three bytes encoded in UTF-8.
 1073|  25.1k|  char buf[8];
 1074|  25.1k|  char *d = buf;
 1075|       |  // We need to normalize code points which would be encoded with a surrogate
 1076|       |  // pair. Note that this produces technically invalid UTF-8.
 1077|  25.1k|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|  25.1k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 22.4k, False: 2.77k]
  |  |  ------------------
  ------------------
 1078|  22.4k|    hermes::encodeUTF8(d, cp);
 1079|  22.4k|  } else {
 1080|  2.77k|    assert(cp <= UNICODE_MAX_VALUE && "invalid Unicode value");
 1081|  2.77k|    cp -= 0x10000;
 1082|  2.77k|    hermes::encodeUTF8(d, UTF16_HIGH_SURROGATE + ((cp >> 10) & 0x3FF));
 1083|  2.77k|    hermes::encodeUTF8(d, UTF16_LOW_SURROGATE + (cp & 0x3FF));
 1084|  2.77k|  }
 1085|  25.1k|  storage.append(buf, d);
 1086|  25.1k|}
_ZN6hermes6parser7JSLexer10decodeUTF8Ev:
 1088|    105|inline uint32_t JSLexer::decodeUTF8() {
 1089|    105|  const char *saveStart = curCharPtr_;
 1090|    105|  return hermes::decodeUTF8<false>(curCharPtr_, [=](const Twine &msg) {
 1091|    105|    error(SMLoc::getFromPointer(saveStart), msg);
 1092|    105|  });
 1093|    105|}
_ZN6hermes6parser7JSLexer19_decodeUTF8SlowPathERPKc:
 1095|  3.74k|inline uint32_t JSLexer::_decodeUTF8SlowPath(const char *&at) {
 1096|  3.74k|  return hermes::_decodeUTF8SlowPath<false>(
 1097|  3.74k|      at, [=](const Twine &msg) { error(SMLoc::getFromPointer(at), msg); });
 1098|  3.74k|}
_ZNK6hermes6parser7JSLexer9_peekUTF8EPKc:
 1101|  16.1k|    const char *at) const {
 1102|  16.1k|  uint32_t ch =
 1103|  16.1k|      hermes::_decodeUTF8SlowPath<false>(at, [](const llvh::Twine &) {});
 1104|  16.1k|  return std::make_pair(ch, at);
 1105|  16.1k|}
_ZNK6hermes6parser7JSLexer9_peekUTF8Ev:
 1107|  1.97k|inline std::pair<uint32_t, const char *> JSLexer::_peekUTF8() const {
 1108|  1.97k|  return _peekUTF8(curCharPtr_);
 1109|  1.97k|}
_ZN6hermes6parser5TokenC2Ev:
  108|    610|  Token() = default;
_ZZN6hermes6parser7JSLexer10decodeUTF8EvENKUlRKN4llvh5TwineEE_clES5_:
 1090|      3|  return hermes::decodeUTF8<false>(curCharPtr_, [=](const Twine &msg) {
 1091|      3|    error(SMLoc::getFromPointer(saveStart), msg);
 1092|      3|  });
_ZZN6hermes6parser7JSLexer19_decodeUTF8SlowPathERPKcENKUlRKN4llvh5TwineEE_clES8_:
 1097|      2|      at, [=](const Twine &msg) { error(SMLoc::getFromPointer(at), msg); });
_ZZNK6hermes6parser7JSLexer9_peekUTF8EPKcENKUlRKN4llvh5TwineEE_clES7_:
 1103|      1|      hermes::_decodeUTF8SlowPath<false>(at, [](const llvh::Twine &) {});

_ZN6hermes6parser8JSParserC2EONSt3__110shared_ptrINS0_6detail12JSParserImplEEE:
   41|    203|      : impl_(std::move(impl)) {}

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

_ZN6hermes13isMemberOfBMPEj:
   51|  9.95k|inline bool isMemberOfBMP(uint32_t cp) {
   52|  9.95k|  return cp <= UNICODE_LAST_BMP;
   53|  9.95k|}
_ZN6hermes15isHighSurrogateEj:
   56|   156k|inline bool isHighSurrogate(uint32_t cp) {
   57|   156k|  return UNICODE_SURROGATE_FIRST <= cp && cp < UTF16_LOW_SURROGATE;
  ------------------
  |  Branch (57:10): [True: 60, False: 156k]
  |  Branch (57:43): [True: 60, False: 0]
  ------------------
   58|   156k|}
_ZN6hermes14isLowSurrogateEj:
   61|   156k|inline bool isLowSurrogate(uint32_t cp) {
   62|   156k|  return UTF16_LOW_SURROGATE <= cp && cp <= UNICODE_SURROGATE_LAST;
  ------------------
  |  Branch (62:10): [True: 60, False: 156k]
  |  Branch (62:39): [True: 60, False: 0]
  ------------------
   63|   156k|}
_ZN6hermes29utf16SurrogatePairToCodePointEjj:
   69|     30|inline uint32_t utf16SurrogatePairToCodePoint(uint32_t lead, uint32_t trail) {
   70|     30|  assert(
   71|     30|      isHighSurrogate(lead) && isLowSurrogate(trail) && "Not a surrogate pair");
   72|     30|  return ((lead - UTF16_HIGH_SURROGATE) << 10) + (trail - UTF16_LOW_SURROGATE) +
   73|     30|      0x10000;
   74|     30|}
_ZN6hermes22isASCIIIdentifierStartEj:
   89|  16.2k|inline bool isASCIIIdentifierStart(uint32_t ch) {
   90|  16.2k|  return ch == '_' || ch == '$' || ((ch | 32) >= 'a' && (ch | 32) <= 'z');
  ------------------
  |  Branch (90:10): [True: 0, False: 16.2k]
  |  Branch (90:23): [True: 0, False: 16.2k]
  |  Branch (90:37): [True: 16.1k, False: 100]
  |  Branch (90:57): [True: 3, False: 16.1k]
  ------------------
   91|  16.2k|}
_ZN6hermes16isUnicodeIDStartEj:
   94|  16.1k|inline bool isUnicodeIDStart(uint32_t cp) {
   95|  16.1k|  return isASCIIIdentifierStart(cp) || isUnicodeOnlyLetter(cp);
  ------------------
  |  Branch (95:10): [True: 3, False: 16.1k]
  |  Branch (95:40): [True: 16.0k, False: 27]
  ------------------
   96|  16.1k|}
_ZN6hermes19isUnicodeIDContinueEj:
   99|  16.1k|inline bool isUnicodeIDContinue(uint32_t cp) {
  100|       |  // TODO: clearly this has to be optimized somehow
  101|  16.1k|  return isUnicodeIDStart(cp) || isUnicodeCombiningMark(cp) ||
  ------------------
  |  Branch (101:10): [True: 16.0k, False: 26]
  |  Branch (101:34): [True: 5, False: 21]
  ------------------
  102|  16.1k|      isUnicodeDigit(cp) || isUnicodeConnectorPunctuation(cp) ||
  ------------------
  |  Branch (102:7): [True: 0, False: 21]
  |  Branch (102:29): [True: 0, False: 21]
  ------------------
  103|  16.1k|      cp == UNICODE_ZWNJ || cp == UNICODE_ZWJ;
  ------------------
  |  Branch (103:7): [True: 0, False: 21]
  |  Branch (103:29): [True: 0, False: 21]
  ------------------
  104|  16.1k|}

_ZNK6hermes14CodePointRange3endEv:
   28|   187k|  uint32_t end() const {
   29|   187k|    assert(first + length >= first && "Range overflowed");
   30|   187k|    return first + length;
   31|   187k|  }
_ZN6hermes14CodePointRange8overlapsERKS0_:
   34|  84.6k|  bool overlaps(const CodePointRange &rhs) {
   35|  84.6k|    return this->first < rhs.end() && rhs.first < this->end();
  ------------------
  |  Branch (35:12): [True: 81.5k, False: 3.08k]
  |  Branch (35:39): [True: 1.37k, False: 80.1k]
  ------------------
   36|  84.6k|  }
_ZN6hermes14CodePointRange5abutsERKS0_:
   39|  6.78k|  bool abuts(const CodePointRange &rhs) {
   40|  6.78k|    return this->first == rhs.end() || rhs.first == this->end();
  ------------------
  |  Branch (40:12): [True: 312, False: 6.47k]
  |  Branch (40:40): [True: 342, False: 6.13k]
  ------------------
   41|  6.78k|  }
_ZN6hermes12CodePointSet3addENS_14CodePointRangeE:
   58|  1.95k|  void add(CodePointRange r) {
   59|  1.95k|    if (r.length == 0)
  ------------------
  |  Branch (59:9): [True: 0, False: 1.95k]
  ------------------
   60|      0|      return;
   61|       |
   62|       |    // Use equal_range to find the subarray which we overlap, treating
   63|       |    // overlapping or abutting as equality.
   64|  1.95k|    auto cmp = [](CodePointRange lhs, CodePointRange rhs) {
   65|  1.95k|      if (lhs.overlaps(rhs) || lhs.abuts(rhs))
   66|  1.95k|        return false;
   67|  1.95k|      return lhs.first < rhs.first;
   68|  1.95k|    };
   69|  1.95k|    auto pair = std::equal_range(ranges_.begin(), ranges_.end(), r, cmp);
   70|       |
   71|  1.95k|    if (pair.first == pair.second) {
  ------------------
  |  Branch (71:9): [True: 1.03k, False: 920]
  ------------------
   72|       |      // There was no overlap, just insert.
   73|  1.03k|      ranges_.insert(pair.first, r);
   74|  1.03k|    } 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|    920|      uint32_t start = std::min(r.first, pair.first->first);
   82|    920|      uint32_t end = std::max(r.end(), (pair.second - 1)->end());
   83|    920|      *pair.first = CodePointRange{start, end - start};
   84|    920|      ranges_.erase(pair.first + 1, pair.second);
   85|    920|    }
   86|  1.95k|  }
_ZN6hermes12CodePointSet3addEj:
   89|  1.95k|  void add(uint32_t cp) {
   90|  1.95k|    add(CodePointRange{cp, 1});
   91|  1.95k|  }
_ZNK6hermes12CodePointSet6rangesEv:
  109|  3.51k|  llvh::ArrayRef<CodePointRange> ranges() const {
  110|  3.51k|    return ranges_;
  111|  3.51k|  }
_ZZN6hermes12CodePointSet3addENS_14CodePointRangeEENKUlS1_S1_E_clES1_S1_:
   64|  8.00k|    auto cmp = [](CodePointRange lhs, CodePointRange rhs) {
   65|  8.00k|      if (lhs.overlaps(rhs) || lhs.abuts(rhs))
  ------------------
  |  Branch (65:11): [True: 1.21k, False: 6.78k]
  |  Branch (65:32): [True: 654, False: 6.13k]
  ------------------
   66|  1.87k|        return false;
   67|  6.13k|      return lhs.first < rhs.first;
   68|  8.00k|    };

_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEEC2EN4llvh8ArrayRefIDsEES6_:
  161|    122|      const llvh::ArrayRef<char16_t> flags = {}) {
  162|       |    // Compute the SyntaxFlags based on the flags string.
  163|    122|    auto sflags = SyntaxFlags::fromString(flags);
  164|    122|    if (!sflags) {
  ------------------
  |  Branch (164:9): [True: 0, False: 122]
  ------------------
  165|      0|      error_ = constants::ErrorType::InvalidFlags;
  166|      0|      return;
  167|      0|    }
  168|    122|    flags_ = *sflags;
  169|    122|    error_ = parse(pattern.begin(), pattern.end());
  170|    122|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE5parseIPKDsEENS0_9constants9ErrorTypeET_S9_:
  280|    122|    ForwardIterator last) {
  281|    122|  uint32_t maxBackRef = 0;
  282|    122|  bool hasNamedGroups = flags_.unicode;
  283|    122|  auto result = parseWithBackRefLimit(
  284|    122|      first,
  285|    122|      last,
  286|    122|      constants::kMaxCaptureGroupCount,
  287|    122|      hasNamedGroups,
  288|    122|      &maxBackRef);
  289|       |
  290|       |  // Validate loop and capture group count.
  291|    122|  if (loopCount_ > constants::kMaxLoopCount) {
  ------------------
  |  Branch (291:7): [True: 0, False: 122]
  ------------------
  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|    122|  bool reparseForNumberedBackref =
  303|    122|      result == constants::ErrorType::None && maxBackRef > markedCount_;
  ------------------
  |  Branch (303:7): [True: 121, False: 1]
  |  Branch (303:47): [True: 0, False: 121]
  ------------------
  304|       |  // We must also reparse if there were any named capture groups used and it is
  305|       |  // not unicode mode.
  306|    122|  bool reparseForNamedBackref = false;
  307|    122|  if (!flags_.unicode && nameMapping_.size() > 0 &&
  ------------------
  |  Branch (307:7): [True: 121, False: 1]
  |  Branch (307:26): [True: 0, False: 121]
  ------------------
  308|    122|      sawNamedBackrefBeforeGroup_) {
  ------------------
  |  Branch (308:7): [True: 0, False: 0]
  ------------------
  309|      0|    reparseForNamedBackref = true;
  310|      0|    hasNamedGroups = true;
  311|      0|  }
  312|       |
  313|    122|  if (reparseForNumberedBackref || reparseForNamedBackref) {
  ------------------
  |  Branch (313:7): [True: 0, False: 122]
  |  Branch (313:36): [True: 0, False: 122]
  ------------------
  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|    122|  return result;
  333|    122|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE21parseWithBackRefLimitIPKDsEENS0_9constants9ErrorTypeET_S9_jbPj:
  342|    122|    uint32_t *outMaxBackRef) {
  343|       |  // Initialize our node list with a single no-op node (it must never be empty.)
  344|    122|  nodes_.clear();
  345|    122|  appendNode<Node>();
  346|    122|  auto result = parseRegex(
  347|    122|      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|    122|  if (result == constants::ErrorType::None) {
  ------------------
  |  Branch (351:7): [True: 122, False: 0]
  ------------------
  352|    122|    appendNode<GoalNode>();
  353|    122|    Node::optimizeNodeList(nodes_, flags_, nodeHolder_);
  354|    122|    if (!resolveNamedBackRefs()) {
  ------------------
  |  Branch (354:9): [True: 1, False: 121]
  ------------------
  355|      1|      return constants::ErrorType::NonexistentNamedCaptureReference;
  356|      1|    }
  357|    122|  }
  358|       |
  359|       |  // Compute any match constraints.
  360|    121|  matchConstraints_ = Node::matchConstraintsForList(nodes_);
  361|       |
  362|    121|  return result;
  363|    122|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_4NodeEJEEEPT_DpOT0_:
   85|    122|  NodeType *appendNode(Args &&...args) {
   86|    122|    std::unique_ptr<NodeType> node =
   87|    122|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|    122|    NodeType *nodePtr = node.get();
   89|    122|    nodeHolder_.push_back(std::move(node));
   90|    122|    nodes_.push_back(nodePtr);
   91|    122|    return nodePtr;
   92|    122|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_8GoalNodeEJEEEPT_DpOT0_:
   85|    122|  NodeType *appendNode(Args &&...args) {
   86|    122|    std::unique_ptr<NodeType> node =
   87|    122|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|    122|    NodeType *nodePtr = node.get();
   89|    122|    nodeHolder_.push_back(std::move(node));
   90|    122|    nodes_.push_back(nodePtr);
   91|    122|    return nodePtr;
   92|    122|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE20resolveNamedBackRefsEv:
  366|    122|bool Regex<Traits>::resolveNamedBackRefs() {
  367|    122|  for (auto &[name, backRef] : unresolvedNamedBackRefs_) {
  ------------------
  |  Branch (367:30): [True: 1, False: 121]
  ------------------
  368|      1|    auto search = nameMapping_.find(name);
  369|      1|    if (search == nameMapping_.end()) {
  ------------------
  |  Branch (369:9): [True: 1, False: 0]
  ------------------
  370|      1|      return false;
  371|      1|    }
  372|      0|    auto groupNum = search->second;
  373|      0|    backRef->setBackRef(groupNum - 1);
  374|      0|  }
  375|    121|  return true;
  376|    122|}
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE5validEv:
  214|    242|  bool valid() const {
  215|    242|    return error_ == constants::ErrorType::None;
  216|    242|  }
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE8getErrorEv:
  209|      1|  constants::ErrorType getError() const {
  210|      1|    return error_;
  211|      1|  }
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE7compileEv:
  135|    121|  std::vector<uint8_t> compile() const {
  136|    121|    assert(valid() && "Cannot compile invalid regex.");
  137|       |    // TODO: add validation for the loop and reduce the size of loopCount_ to
  138|       |    // uint16_t.
  139|    121|    assert(
  140|    121|        markedCount_ <= constants::kMaxCaptureGroupCount &&
  141|    121|        "Too many capture groups");
  142|    121|    assert(loopCount_ <= constants::kMaxLoopCount && "Too many loops");
  143|    121|    RegexBytecodeHeader header = {
  144|    121|        markedCount_,
  145|    121|        static_cast<uint16_t>(loopCount_),
  146|    121|        flags_.toByte(),
  147|    121|        matchConstraints_};
  148|    121|    RegexBytecodeStream bcs(header);
  149|    121|    Node::compile(nodes_, bcs);
  150|    121|    return bcs.acquireBytecode();
  151|    121|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE21getOrderedNamedGroupsEv:
  188|      1|  std::deque<llvh::SmallVector<char16_t, 5>> &getOrderedNamedGroups() {
  189|      1|    return orderedGroupNames_;
  190|      1|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE20getGroupNamesMappingEv:
  196|      1|  ParsedGroupNamesMapping &getGroupNamesMapping() {
  197|      1|    return nameMapping_;
  198|      1|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEEC2EPKDsS5_:
  155|      1|      : Regex(
  156|      1|            {p, p + std::char_traits<CharT>::length(p)},
  157|      1|            {f, f + std::char_traits<CharT>::length(f)}) {}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE11currentNodeEv:
   95|  1.03M|  Node *currentNode() {
   96|  1.03M|    return nodes_.back();
   97|  1.03M|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE9spliceOutEPNS0_4NodeE:
  115|  73.5k|  NodeList spliceOut(Node *splicePoint) {
  116|  73.5k|    assert(splicePoint && "null node in spliceOut");
  117|       |    // Find the index of the splice point. We expect it to be towards the end.
  118|  73.5k|    size_t spliceIndex = nodes_.size();
  119|   436k|    while (spliceIndex--) {
  ------------------
  |  Branch (119:12): [True: 436k, False: 0]
  ------------------
  120|   436k|      if (nodes_[spliceIndex] == splicePoint)
  ------------------
  |  Branch (120:11): [True: 73.5k, False: 362k]
  ------------------
  121|  73.5k|        break;
  122|   436k|    }
  123|  73.5k|    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|  73.5k|    auto firstToMove = nodes_.begin() + spliceIndex + 1;
  127|  73.5k|    NodeList result;
  128|  73.5k|    std::move(firstToMove, nodes_.end(), std::back_inserter(result));
  129|  73.5k|    nodes_.erase(firstToMove, nodes_.end());
  130|  73.5k|    return result;
  131|  73.5k|  }
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE11markedCountEv:
  100|  1.03M|  uint16_t markedCount() const {
  101|  1.03M|    return markedCount_;
  102|  1.03M|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE20incrementMarkedCountEv:
  106|  1.60k|  uint16_t incrementMarkedCount() {
  107|  1.60k|    assert(
  108|  1.60k|        markedCount_ < std::numeric_limits<uint16_t>::max() &&
  109|  1.60k|        "markedCount_ will overflow");
  110|  1.60k|    return markedCount_++;
  111|  1.60k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE15pushAlternationENSt3__16vectorINS5_IPNS0_4NodeENS4_9allocatorIS7_EEEENS8_ISA_EEEE:
  456|      4|void Regex<Traits>::pushAlternation(std::vector<NodeList> alternatives) {
  457|      4|  appendNode<AlternationNode>(std::move(alternatives));
  458|      4|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_15AlternationNodeEJNSt3__16vectorINS7_IPNS0_4NodeENS6_9allocatorIS9_EEEENSA_ISC_EEEEEEEPT_DpOT0_:
   85|      4|  NodeType *appendNode(Args &&...args) {
   86|      4|    std::unique_ptr<NodeType> node =
   87|      4|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|      4|    NodeType *nodePtr = node.get();
   89|      4|    nodeHolder_.push_back(std::move(node));
   90|      4|    nodes_.push_back(nodePtr);
   91|      4|    return nodePtr;
   92|      4|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE23pushMarkedSubexpressionENSt3__16vectorIPNS0_4NodeENS4_9allocatorIS7_EEEEj:
  410|  1.60k|void Regex<Traits>::pushMarkedSubexpression(NodeList nodes, uint32_t mexp) {
  411|  1.60k|  appendNode<MarkedSubexpressionNode>(std::move(nodes), mexp);
  412|  1.60k|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_23MarkedSubexpressionNodeEJNSt3__16vectorIPNS0_4NodeENS6_9allocatorIS9_EEEERjEEEPT_DpOT0_:
   85|  1.60k|  NodeType *appendNode(Args &&...args) {
   86|  1.60k|    std::unique_ptr<NodeType> node =
   87|  1.60k|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|  1.60k|    NodeType *nodePtr = node.get();
   89|  1.60k|    nodeHolder_.push_back(std::move(node));
   90|  1.60k|    nodes_.push_back(nodePtr);
   91|  1.60k|    return nodePtr;
   92|  1.60k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE8pushLoopEjjNSt3__16vectorIPNS0_4NodeENS4_9allocatorIS7_EEEEjb:
  384|  10.5k|    bool greedy) {
  385|  10.5k|  appendNode<LoopNode>(
  386|  10.5k|      loopCount_++,
  387|  10.5k|      min,
  388|  10.5k|      max,
  389|  10.5k|      greedy,
  390|  10.5k|      mexp_begin,
  391|  10.5k|      markedCount_,
  392|  10.5k|      std::move(loopedExpr));
  393|  10.5k|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_8LoopNodeEJjRjS6_RbS6_RtNSt3__16vectorIPNS0_4NodeENS9_9allocatorISC_EEEEEEEPT_DpOT0_:
   85|  10.5k|  NodeType *appendNode(Args &&...args) {
   86|  10.5k|    std::unique_ptr<NodeType> node =
   87|  10.5k|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|  10.5k|    NodeType *nodePtr = node.get();
   89|  10.5k|    nodeHolder_.push_back(std::move(node));
   90|  10.5k|    nodes_.push_back(nodePtr);
   91|  10.5k|    return nodePtr;
   92|  10.5k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE14pushLeftAnchorEv:
  415|     49|void Regex<Traits>::pushLeftAnchor() {
  416|     49|  appendNode<LeftAnchorNode>(flags());
  417|     49|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_14LeftAnchorNodeEJNS0_11SyntaxFlagsEEEEPT_DpOT0_:
   85|     49|  NodeType *appendNode(Args &&...args) {
   86|     49|    std::unique_ptr<NodeType> node =
   87|     49|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|     49|    NodeType *nodePtr = node.get();
   89|     49|    nodeHolder_.push_back(std::move(node));
   90|     49|    nodes_.push_back(nodePtr);
   91|     49|    return nodePtr;
   92|     49|  }
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE5flagsEv:
  184|  2.12M|  SyntaxFlags flags() const {
  185|  2.12M|    return flags_;
  186|  2.12M|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE15pushRightAnchorEv:
  420|     15|void Regex<Traits>::pushRightAnchor() {
  421|     15|  appendNode<RightAnchorNode>();
  422|     15|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_15RightAnchorNodeEJEEEPT_DpOT0_:
   85|     15|  NodeType *appendNode(Args &&...args) {
   86|     15|    std::unique_ptr<NodeType> node =
   87|     15|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|     15|    NodeType *nodePtr = node.get();
   89|     15|    nodeHolder_.push_back(std::move(node));
   90|     15|    nodes_.push_back(nodePtr);
   91|     15|    return nodePtr;
   92|     15|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE16pushWordBoundaryEb:
  430|    368|void Regex<Traits>::pushWordBoundary(bool invert) {
  431|    368|  appendNode<WordBoundaryNode>(invert);
  432|    368|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_16WordBoundaryNodeEJRbEEEPT_DpOT0_:
   85|    368|  NodeType *appendNode(Args &&...args) {
   86|    368|    std::unique_ptr<NodeType> node =
   87|    368|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|    368|    NodeType *nodePtr = node.get();
   89|    368|    nodeHolder_.push_back(std::move(node));
   90|    368|    nodes_.push_back(nodePtr);
   91|    368|    return nodePtr;
   92|    368|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE13pushCharClassENS0_14CharacterClassE:
  404|      4|void Regex<Traits>::pushCharClass(CharacterClass c) {
  405|      4|  auto bracket = startBracketList(false);
  406|      4|  bracket->addClass(c);
  407|      4|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE16startBracketListEb:
  461|    854|BracketNode<Traits> *Regex<Traits>::startBracketList(bool negate) {
  462|    854|  return appendNode<BracketNode>(traits_, negate, flags_);
  463|    854|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_11BracketNodeIS2_EEJRS2_RbRNS0_11SyntaxFlagsEEEEPT_DpOT0_:
   85|    854|  NodeType *appendNode(Args &&...args) {
   86|    854|    std::unique_ptr<NodeType> node =
   87|    854|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|    854|    NodeType *nodePtr = node.get();
   89|    854|    nodeHolder_.push_back(std::move(node));
   90|    854|    nodes_.push_back(nodePtr);
   91|    854|    return nodePtr;
   92|    854|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE11pushBackRefEj:
  435|    136|void Regex<Traits>::pushBackRef(uint32_t i) {
  436|    136|  appendNode<BackRefNode>(i);
  437|    136|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_11BackRefNodeEJRjEEEPT_DpOT0_:
   85|    136|  NodeType *appendNode(Args &&...args) {
   86|    136|    std::unique_ptr<NodeType> node =
   87|    136|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|    136|    NodeType *nodePtr = node.get();
   89|    136|    nodeHolder_.push_back(std::move(node));
   90|    136|    nodes_.push_back(nodePtr);
   91|    136|    return nodePtr;
   92|    136|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE16pushNamedBackRefEON4llvh11SmallVectorIDsLj5EEE:
  440|      3|void Regex<Traits>::pushNamedBackRef(GroupName &&identifier) {
  441|      3|  auto search = nameMapping_.find(identifier);
  442|      3|  if (search == nameMapping_.end()) {
  ------------------
  |  Branch (442:7): [True: 3, False: 0]
  ------------------
  443|       |    // If this name hasn't been defined yet, we have a case of an ambiguous
  444|       |    // named backref. It could be valid or not, because the group name could be
  445|       |    // defined in the future. We will revist these nodes at the end to see if
  446|       |    // they are valid.
  447|      3|    BackRefNode *backRef = appendNode<BackRefNode>(0);
  448|      3|    unresolvedNamedBackRefs_.emplace_back(std::move(identifier), backRef);
  449|      3|    return;
  450|      3|  }
  451|      0|  auto groupNum = search->second;
  452|      0|  appendNode<BackRefNode>(groupNum - 1);
  453|      0|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_11BackRefNodeEJiEEEPT_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|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE12pushMatchAnyEv:
  425|  28.7k|void Regex<Traits>::pushMatchAny() {
  426|  28.7k|  appendNode<MatchAnyNode>(flags());
  427|  28.7k|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_12MatchAnyNodeEJNS0_11SyntaxFlagsEEEEPT_DpOT0_:
   85|  28.7k|  NodeType *appendNode(Args &&...args) {
   86|  28.7k|    std::unique_ptr<NodeType> node =
   87|  28.7k|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|  28.7k|    NodeType *nodePtr = node.get();
   89|  28.7k|    nodeHolder_.push_back(std::move(node));
   90|  28.7k|    nodes_.push_back(nodePtr);
   91|  28.7k|    return nodePtr;
   92|  28.7k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE8pushCharEj:
  396|   941k|void Regex<Traits>::pushChar(CodePoint c) {
  397|   941k|  bool icase = flags().ignoreCase;
  398|   941k|  if (icase)
  ------------------
  |  Branch (398:7): [True: 214k, False: 727k]
  ------------------
  399|   214k|    c = traits_.canonicalize(c, flags().unicode);
  400|   941k|  appendNode<MatchCharNode>(Node::CodePointList{c}, flags());
  401|   941k|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_13MatchCharNodeEJN4llvh11SmallVectorIjLj5EEENS0_11SyntaxFlagsEEEEPT_DpOT0_:
   85|   941k|  NodeType *appendNode(Args &&...args) {
   86|   941k|    std::unique_ptr<NodeType> node =
   87|   941k|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|   941k|    NodeType *nodePtr = node.get();
   89|   941k|    nodeHolder_.push_back(std::move(node));
   90|   941k|    nodes_.push_back(nodePtr);
   91|   941k|    return nodePtr;
   92|   941k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE24acquireOrderedGroupNamesEv:
  192|    119|  std::deque<llvh::SmallVector<char16_t, 5>> acquireOrderedGroupNames() {
  193|    119|    return std::move(orderedGroupNames_);
  194|    119|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE24acquireGroupNamesMappingEv:
  200|    119|  ParsedGroupNamesMapping acquireGroupNamesMapping() {
  201|    119|    return std::move(nameMapping_);
  202|    119|  }

_ZN6hermes5regex19RegexBytecodeStream16emitBracketRangeENS0_14BracketRange32E:
  331|  1.00k|  void emitBracketRange(BracketRange32 range) {
  332|  1.00k|    const uint8_t *rangeBytes = reinterpret_cast<const uint8_t *>(&range);
  333|  1.00k|    bytes_.insert(bytes_.end(), rangeBytes, rangeBytes + sizeof(range));
  334|  1.00k|  }
_ZN6hermes5regex19RegexBytecodeStream9emitChar8Ec:
  337|   701k|  void emitChar8(char c) {
  338|   701k|    bytes_.push_back((uint8_t)c);
  339|   701k|  }
_ZNK6hermes5regex19RegexBytecodeStream13currentOffsetEv:
  343|   143k|  uint32_t currentOffset() const {
  344|   143k|    return bytes_.size() - sizeof(RegexBytecodeHeader);
  345|   143k|  }
_ZN6hermes5regex19RegexBytecodeStream15acquireBytecodeEv:
  348|    121|  std::vector<uint8_t> acquireBytecode() {
  349|    121|    assert(!acquired_ && "Bytecode already acquired");
  350|    121|    acquired_ = true;
  351|    121|    return std::move(bytes_);
  352|    121|  }
_ZN6hermes5regex19RegexBytecodeStreamC2ERKNS0_19RegexBytecodeHeaderE:
  355|    121|  RegexBytecodeStream(const RegexBytecodeHeader &header) {
  356|    121|    const uint8_t *headerBytes = reinterpret_cast<const uint8_t *>(&header);
  357|    121|    bytes_.insert(bytes_.end(), headerBytes, headerBytes + sizeof header);
  358|    121|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_8GoalInsnEEENS1_18InstructionWrapperIT_EEv:
  322|    121|  InstructionWrapper<Instruction> emit() {
  323|    121|    size_t startSize = bytes_.size();
  324|    121|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    121|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    121|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    121|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    121|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_14Width1LoopInsnEEENS1_18InstructionWrapperIT_EEv:
  322|  10.3k|  InstructionWrapper<Instruction> emit() {
  323|  10.3k|    size_t startSize = bytes_.size();
  324|  10.3k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  10.3k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  10.3k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  10.3k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  10.3k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14Width1LoopInsnEEptEv:
  309|  51.8k|    Instruction *operator->() {
  310|  51.8k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  51.8k|      return llvh::cast<Instruction>(base);
  312|  51.8k|    }
_ZN4llvh8isa_implIN6hermes5regex14Width1LoopInsnENS2_4InsnEvE4doitERKS4_:
  377|  51.9k|  static inline bool doit(const From &val) {
  378|  51.9k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  51.9k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_13BeginLoopInsnEEENS1_18InstructionWrapperIT_EEv:
  322|    136|  InstructionWrapper<Instruction> emit() {
  323|    136|    size_t startSize = bytes_.size();
  324|    136|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    136|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    136|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    136|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    136|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_13BeginLoopInsnEEptEv:
  309|  1.08k|    Instruction *operator->() {
  310|  1.08k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  1.08k|      return llvh::cast<Instruction>(base);
  312|  1.08k|    }
_ZN4llvh8isa_implIN6hermes5regex13BeginLoopInsnENS2_4InsnEvE4doitERKS4_:
  377|  1.08k|  static inline bool doit(const From &val) {
  378|  1.08k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  1.08k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_11EndLoopInsnEEENS1_18InstructionWrapperIT_EEv:
  322|    136|  InstructionWrapper<Instruction> emit() {
  323|    136|    size_t startSize = bytes_.size();
  324|    136|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    136|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    136|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    136|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    136|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11EndLoopInsnEEptEv:
  309|    136|    Instruction *operator->() {
  310|    136|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|    136|      return llvh::cast<Instruction>(base);
  312|    136|    }
_ZN4llvh8isa_implIN6hermes5regex11EndLoopInsnENS2_4InsnEvE4doitERKS4_:
  377|    136|  static inline bool doit(const From &val) {
  378|    136|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|    136|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_15AlternationInsnEEENS1_18InstructionWrapperIT_EEv:
  322|  61.4k|  InstructionWrapper<Instruction> emit() {
  323|  61.4k|    size_t startSize = bytes_.size();
  324|  61.4k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  61.4k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  61.4k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  61.4k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  61.4k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15AlternationInsnEEptEv:
  309|   184k|    Instruction *operator->() {
  310|   184k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|   184k|      return llvh::cast<Instruction>(base);
  312|   184k|    }
_ZN4llvh8isa_implIN6hermes5regex15AlternationInsnENS2_4InsnEvE4doitERKS4_:
  377|   184k|  static inline bool doit(const From &val) {
  378|   184k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|   184k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_10Jump32InsnEEENS1_18InstructionWrapperIT_EEv:
  322|  61.4k|  InstructionWrapper<Instruction> emit() {
  323|  61.4k|    size_t startSize = bytes_.size();
  324|  61.4k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  61.4k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  61.4k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  61.4k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  61.4k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_10Jump32InsnEEptEv:
  309|  61.4k|    Instruction *operator->() {
  310|  61.4k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  61.4k|      return llvh::cast<Instruction>(base);
  312|  61.4k|    }
_ZN4llvh8isa_implIN6hermes5regex10Jump32InsnENS2_4InsnEvE4doitERKS4_:
  377|  61.4k|  static inline bool doit(const From &val) {
  378|  61.4k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  61.4k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_28BeginMarkedSubexpressionInsnEEENS1_18InstructionWrapperIT_EEv:
  322|  1.60k|  InstructionWrapper<Instruction> emit() {
  323|  1.60k|    size_t startSize = bytes_.size();
  324|  1.60k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  1.60k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  1.60k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  1.60k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  1.60k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_28BeginMarkedSubexpressionInsnEEptEv:
  309|  1.60k|    Instruction *operator->() {
  310|  1.60k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  1.60k|      return llvh::cast<Instruction>(base);
  312|  1.60k|    }
_ZN4llvh8isa_implIN6hermes5regex28BeginMarkedSubexpressionInsnENS2_4InsnEvE4doitERKS4_:
  377|  1.60k|  static inline bool doit(const From &val) {
  378|  1.60k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  1.60k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_26EndMarkedSubexpressionInsnEEENS1_18InstructionWrapperIT_EEv:
  322|  1.60k|  InstructionWrapper<Instruction> emit() {
  323|  1.60k|    size_t startSize = bytes_.size();
  324|  1.60k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  1.60k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  1.60k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  1.60k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  1.60k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_26EndMarkedSubexpressionInsnEEptEv:
  309|  1.60k|    Instruction *operator->() {
  310|  1.60k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  1.60k|      return llvh::cast<Instruction>(base);
  312|  1.60k|    }
_ZN4llvh8isa_implIN6hermes5regex26EndMarkedSubexpressionInsnENS2_4InsnEvE4doitERKS4_:
  377|  1.60k|  static inline bool doit(const From &val) {
  378|  1.60k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  1.60k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_11BackRefInsnEEENS1_18InstructionWrapperIT_EEv:
  322|    136|  InstructionWrapper<Instruction> emit() {
  323|    136|    size_t startSize = bytes_.size();
  324|    136|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    136|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    136|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    136|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    136|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11BackRefInsnEEptEv:
  309|    136|    Instruction *operator->() {
  310|    136|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|    136|      return llvh::cast<Instruction>(base);
  312|    136|    }
_ZN4llvh8isa_implIN6hermes5regex11BackRefInsnENS2_4InsnEvE4doitERKS4_:
  377|    136|  static inline bool doit(const From &val) {
  378|    136|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|    136|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_16WordBoundaryInsnEEENS1_18InstructionWrapperIT_EEv:
  322|    368|  InstructionWrapper<Instruction> emit() {
  323|    368|    size_t startSize = bytes_.size();
  324|    368|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    368|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    368|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    368|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    368|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_16WordBoundaryInsnEEptEv:
  309|    368|    Instruction *operator->() {
  310|    368|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|    368|      return llvh::cast<Instruction>(base);
  312|    368|    }
_ZN4llvh8isa_implIN6hermes5regex16WordBoundaryInsnENS2_4InsnEvE4doitERKS4_:
  377|    368|  static inline bool doit(const From &val) {
  378|    368|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|    368|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_14LeftAnchorInsnEEENS1_18InstructionWrapperIT_EEv:
  322|     49|  InstructionWrapper<Instruction> emit() {
  323|     49|    size_t startSize = bytes_.size();
  324|     49|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|     49|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|     49|    insn->opcode = OpcodeFor<Instruction>::value;
  327|     49|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|     49|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_15RightAnchorInsnEEENS1_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|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_12MatchAnyInsnEEENS1_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|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_22MatchAnyButNewlineInsnEEENS1_18InstructionWrapperIT_EEv:
  322|  28.7k|  InstructionWrapper<Instruction> emit() {
  323|  28.7k|    size_t startSize = bytes_.size();
  324|  28.7k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  28.7k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  28.7k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  28.7k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  28.7k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_20MatchNCharICase8InsnEEENS1_18InstructionWrapperIT_EEv:
  322|  20.8k|  InstructionWrapper<Instruction> emit() {
  323|  20.8k|    size_t startSize = bytes_.size();
  324|  20.8k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  20.8k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  20.8k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  20.8k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  20.8k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_20MatchNCharICase8InsnEEptEv:
  309|  20.8k|    Instruction *operator->() {
  310|  20.8k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  20.8k|      return llvh::cast<Instruction>(base);
  312|  20.8k|    }
_ZN4llvh8isa_implIN6hermes5regex20MatchNCharICase8InsnENS2_4InsnEvE4doitERKS4_:
  377|  20.8k|  static inline bool doit(const From &val) {
  378|  20.8k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  20.8k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_15MatchNChar8InsnEEENS1_18InstructionWrapperIT_EEv:
  322|  2.81k|  InstructionWrapper<Instruction> emit() {
  323|  2.81k|    size_t startSize = bytes_.size();
  324|  2.81k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  2.81k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  2.81k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  2.81k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  2.81k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchNChar8InsnEEptEv:
  309|  2.81k|    Instruction *operator->() {
  310|  2.81k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  2.81k|      return llvh::cast<Instruction>(base);
  312|  2.81k|    }
_ZN4llvh8isa_implIN6hermes5regex15MatchNChar8InsnENS2_4InsnEvE4doitERKS4_:
  377|  2.94k|  static inline bool doit(const From &val) {
  378|  2.94k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  2.94k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_19MatchCharICase8InsnEEENS1_18InstructionWrapperIT_EEv:
  322|  84.4k|  InstructionWrapper<Instruction> emit() {
  323|  84.4k|    size_t startSize = bytes_.size();
  324|  84.4k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  84.4k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  84.4k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  84.4k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  84.4k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_19MatchCharICase8InsnEEptEv:
  309|  84.4k|    Instruction *operator->() {
  310|  84.4k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  84.4k|      return llvh::cast<Instruction>(base);
  312|  84.4k|    }
_ZN4llvh8isa_implIN6hermes5regex19MatchCharICase8InsnENS2_4InsnEvE4doitERKS4_:
  377|  84.4k|  static inline bool doit(const From &val) {
  378|  84.4k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  84.4k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_14MatchChar8InsnEEENS1_18InstructionWrapperIT_EEv:
  322|    179|  InstructionWrapper<Instruction> emit() {
  323|    179|    size_t startSize = bytes_.size();
  324|    179|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    179|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    179|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    179|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    179|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14MatchChar8InsnEEptEv:
  309|    179|    Instruction *operator->() {
  310|    179|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|    179|      return llvh::cast<Instruction>(base);
  312|    179|    }
_ZN4llvh8isa_implIN6hermes5regex14MatchChar8InsnENS2_4InsnEvE4doitERKS4_:
  377|    179|  static inline bool doit(const From &val) {
  378|    179|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|    179|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_20MatchCharICase16InsnEEENS1_18InstructionWrapperIT_EEv:
  322|     38|  InstructionWrapper<Instruction> emit() {
  323|     38|    size_t startSize = bytes_.size();
  324|     38|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|     38|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|     38|    insn->opcode = OpcodeFor<Instruction>::value;
  327|     38|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|     38|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_20MatchCharICase16InsnEEptEv:
  309|     38|    Instruction *operator->() {
  310|     38|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|     38|      return llvh::cast<Instruction>(base);
  312|     38|    }
_ZN4llvh8isa_implIN6hermes5regex20MatchCharICase16InsnENS2_4InsnEvE4doitERKS4_:
  377|     38|  static inline bool doit(const From &val) {
  378|     38|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|     38|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_15MatchChar16InsnEEENS1_18InstructionWrapperIT_EEv:
  322|      7|  InstructionWrapper<Instruction> emit() {
  323|      7|    size_t startSize = bytes_.size();
  324|      7|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|      7|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|      7|    insn->opcode = OpcodeFor<Instruction>::value;
  327|      7|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|      7|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchChar16InsnEEptEv:
  309|      7|    Instruction *operator->() {
  310|      7|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|      7|      return llvh::cast<Instruction>(base);
  312|      7|    }
_ZN4llvh8isa_implIN6hermes5regex15MatchChar16InsnENS2_4InsnEvE4doitERKS4_:
  377|      7|  static inline bool doit(const From &val) {
  378|      7|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|      7|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_8GoalInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    121|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_20MatchNCharICase8InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  20.8k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchNChar8InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  2.81k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_19MatchCharICase8InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  84.4k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14MatchChar8InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    179|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_20MatchCharICase16InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|     38|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchChar16InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|      7|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15AlternationInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  61.4k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_10Jump32InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  61.4k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_28BeginMarkedSubexpressionInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  1.60k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_26EndMarkedSubexpressionInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  1.60k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14Width1LoopInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  10.3k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_13BeginLoopInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    136|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11EndLoopInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    136|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14LeftAnchorInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|     49|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15RightAnchorInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|     15|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_16WordBoundaryInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    368|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11BracketInsnEEptEv:
  309|  1.71k|    Instruction *operator->() {
  310|  1.71k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  1.71k|      return llvh::cast<Instruction>(base);
  312|  1.71k|    }
_ZN4llvh8isa_implIN6hermes5regex11BracketInsnENS2_4InsnEvE4doitERKS4_:
  377|  1.83k|  static inline bool doit(const From &val) {
  378|  1.83k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  1.83k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_11BracketInsnEEENS1_18InstructionWrapperIT_EEv:
  322|    854|  InstructionWrapper<Instruction> emit() {
  323|    854|    size_t startSize = bytes_.size();
  324|    854|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    854|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    854|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    854|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    854|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11BracketInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    854|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11BackRefInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    136|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_12MatchAnyInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|      1|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_22MatchAnyButNewlineInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  28.7k|        : bytes_(bytes), offset_(offset) {}

_ZN6hermes5regex4Node7compileERKNSt3__16vectorIPS1_NS2_9allocatorIS4_EEEERNS0_19RegexBytecodeStreamE:
   64|    121|  static void compile(const NodeList &nodes, RegexBytecodeStream &bcs) {
   65|    121|    std::vector<Node *> stack;
   66|    121|    stack.insert(stack.end(), nodes.rbegin(), nodes.rend());
   67|   209k|    while (!stack.empty()) {
  ------------------
  |  Branch (67:12): [True: 209k, False: 121]
  ------------------
   68|   209k|      if (auto n = stack.back()->emitStep(bcs)) {
  ------------------
  |  Branch (68:16): [True: 73.5k, False: 135k]
  ------------------
   69|  73.5k|        stack.insert(stack.end(), n->rbegin(), n->rend());
   70|   135k|      } else {
   71|   135k|        stack.pop_back();
   72|   135k|      }
   73|   209k|    }
   74|    121|  }
_ZN6hermes5regex4Node23matchConstraintsForListERKNSt3__16vectorIPS1_NS2_9allocatorIS4_EEEE:
   77|  73.6k|  static MatchConstraintSet matchConstraintsForList(const NodeList &nodes) {
   78|  73.6k|    MatchConstraintSet result = 0;
   79|   433k|    for (const auto &node : nodes) {
  ------------------
  |  Branch (79:27): [True: 433k, False: 73.6k]
  ------------------
   80|   433k|      result |= node->matchConstraints();
   81|   433k|    }
   82|  73.6k|    return result;
   83|  73.6k|  }
_ZNK6hermes5regex4Node26matchesExactlyOneCharacterEv:
   95|    136|  virtual bool matchesExactlyOneCharacter() const {
   96|    136|    return false;
   97|    136|  }
_ZNK6hermes5regex4Node21tryCoalesceCharactersEPN4llvh11SmallVectorIjLj5EEE:
  102|  42.1k|  virtual bool tryCoalesceCharacters(CodePointList *output) const {
  103|  42.1k|    return false;
  104|  42.1k|  }
_ZNK6hermes5regex4Node16matchConstraintsEv:
  110|   433k|  virtual MatchConstraintSet matchConstraints() const {
  111|   433k|    return 0;
  112|   433k|  }
_ZN6hermes5regex4Node11getChildrenEv:
  120|  95.1k|  virtual llvh::SmallVector<NodeList *, 1> getChildren() {
  121|  95.1k|    return {};
  122|  95.1k|  }
_ZN6hermes5regex4Node8emitStepERNS0_19RegexBytecodeStreamE:
  138|    121|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) {
  139|    121|    return nullptr;
  140|    121|  }
_ZN6hermes5regex8GoalNode8emitStepERNS0_19RegexBytecodeStreamE:
  146|    121|  NodeList *emitStep(RegexBytecodeStream &bcs) override {
  147|    121|    bcs.emit<GoalInsn>();
  148|    121|    return nullptr;
  149|    121|  }
_ZN6hermes5regex8LoopNodeC2EjjjbttNSt3__16vectorIPNS0_4NodeENS2_9allocatorIS5_EEEE:
  206|  10.5k|      : min_(min),
  207|  10.5k|        max_(max),
  208|  10.5k|        loopId_(loopId),
  209|  10.5k|        mexpBegin_(mexpBegin),
  210|  10.5k|        mexpEnd_(mexpEnd),
  211|  10.5k|        greedy_(greedy),
  212|  10.5k|        loopee_(std::move(loopee)),
  213|  10.5k|        loopeeConstraints_(matchConstraintsForList(loopee_)) {}
_ZNK6hermes5regex8LoopNode16matchConstraintsEv:
  217|  10.5k|  virtual MatchConstraintSet matchConstraints() const override {
  218|  10.5k|    MatchConstraintSet result = 0;
  219|  10.5k|    if (min_ > 0) {
  ------------------
  |  Branch (219:9): [True: 4, False: 10.4k]
  ------------------
  220|      4|      result |= loopeeConstraints_;
  221|      4|    }
  222|  10.5k|    return result | Super::matchConstraints();
  223|  10.5k|  }
_ZN6hermes5regex8LoopNode11getChildrenEv:
  225|    241|  virtual llvh::SmallVector<NodeList *, 1> getChildren() override {
  226|    241|    return {&loopee_};
  227|    241|  }
_ZN6hermes5regex8LoopNode8emitStepERNS0_19RegexBytecodeStreamE:
  237|  21.0k|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  238|  21.0k|    if (!endLoop_) {
  ------------------
  |  Branch (238:9): [True: 10.5k, False: 10.5k]
  ------------------
  239|       |      // This is the first call to emitStep() for this node, set up the loop
  240|       |      // node
  241|  10.5k|      auto loopEntryPosition = bcs.currentOffset();
  242|  10.5k|      if (isWidth1Loop()) {
  ------------------
  |  Branch (242:11): [True: 10.3k, False: 136]
  ------------------
  243|  10.3k|        assert(
  244|  10.3k|            mexpBegin_ == mexpEnd_ &&
  245|  10.3k|            "Width 1 loops should not contain capture groups");
  246|  10.3k|        auto loopInsn = bcs.emit<Width1LoopInsn>();
  247|  10.3k|        loopInsn->loopId = loopId_;
  248|  10.3k|        loopInsn->min = min_;
  249|  10.3k|        loopInsn->max = max_;
  250|  10.3k|        loopInsn->greedy = greedy_;
  251|  10.3k|        endLoop_ = [loopInsn, &bcs]() mutable {
  252|  10.3k|          loopInsn->notTakenTarget = bcs.currentOffset();
  253|  10.3k|        };
  254|  10.3k|      } else if (isSimpleLoop()) {
  ------------------
  |  Branch (254:18): [True: 0, False: 136]
  ------------------
  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|    136|      } else {
  262|    136|        auto loopInsn = bcs.emit<BeginLoopInsn>();
  263|    136|        loopInsn->loopId = loopId_;
  264|    136|        loopInsn->min = min_;
  265|    136|        loopInsn->max = max_;
  266|    136|        loopInsn->mexpBegin = mexpBegin_;
  267|    136|        loopInsn->mexpEnd = mexpEnd_;
  268|    136|        loopInsn->greedy = greedy_;
  269|    136|        loopInsn->loopeeConstraints = loopeeConstraints_;
  270|    136|        endLoop_ = [loopInsn, loopEntryPosition, &bcs]() mutable {
  271|    136|          bcs.emit<EndLoopInsn>()->target = loopEntryPosition;
  272|    136|          loopInsn->notTakenTarget = bcs.currentOffset();
  273|    136|        };
  274|    136|      }
  275|  10.5k|      return &loopee_;
  276|  10.5k|    }
  277|       |    // This is the second call to emitStep, emit the end instructions and set
  278|       |    // notTakenTarget.
  279|  10.5k|    endLoop_();
  280|  10.5k|    endLoop_ = nullptr;
  281|  10.5k|    return nullptr;
  282|  21.0k|  }
_ZNK6hermes5regex8LoopNode12isWidth1LoopEv:
  286|  10.5k|  bool isWidth1Loop() const {
  287|  10.5k|    if (loopee_.size() != 1)
  ------------------
  |  Branch (287:9): [True: 0, False: 10.5k]
  ------------------
  288|      0|      return false;
  289|  10.5k|    return loopee_[0]->matchesExactlyOneCharacter();
  290|  10.5k|  }
_ZNK6hermes5regex8LoopNode12isSimpleLoopEv:
  294|    136|  bool isSimpleLoop() const {
  295|    136|    return min_ == 0 && max_ == std::numeric_limits<uint32_t>::max() &&
  ------------------
  |  Branch (295:12): [True: 136, False: 0]
  |  Branch (295:25): [True: 136, False: 0]
  ------------------
  296|    136|        mexpBegin_ == mexpEnd_ && greedy_ &&
  ------------------
  |  Branch (296:9): [True: 136, False: 0]
  |  Branch (296:35): [True: 136, False: 0]
  ------------------
  297|    136|        (loopeeConstraints_ & MatchConstraintNonEmpty);
  ------------------
  |  Branch (297:9): [True: 0, False: 136]
  ------------------
  298|    136|  }
_ZN6hermes5regex15AlternationNodeC2ENSt3__16vectorINS3_IPNS0_4NodeENS2_9allocatorIS5_EEEENS6_IS8_EEEE:
  331|      4|      : alternatives_(std::move(alternatives)),
  332|      4|        elementConstraints_(alternatives_.size()),
  333|      4|        restConstraints_(alternatives_.size()) {
  334|      4|    assert(alternatives_.size() > 1 && "Must give at least 2 alternatives");
  335|       |
  336|      4|    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|      4|    elementConstraints_.back() = matchConstraintsForList(alternatives_.back());
  341|      4|    restConstraints_.back() = elementConstraints_.back();
  342|       |
  343|  61.4k|    for (auto i = alternatives_.size() - 1; i-- > 0;) {
  ------------------
  |  Branch (343:45): [True: 61.4k, False: 4]
  ------------------
  344|  61.4k|      elementConstraints_[i] = matchConstraintsForList(alternatives_[i]);
  345|  61.4k|      restConstraints_[i] = restConstraints_[i + 1] & elementConstraints_[i];
  346|  61.4k|    }
  347|      4|  }
_ZNK6hermes5regex15AlternationNode16matchConstraintsEv:
  352|      4|  virtual MatchConstraintSet matchConstraints() const override {
  353|      4|    return restConstraints_.front() | Super::matchConstraints();
  354|      4|  }
_ZN6hermes5regex15AlternationNode11getChildrenEv:
  356|      4|  virtual llvh::SmallVector<NodeList *, 1> getChildren() override {
  357|      4|    llvh::SmallVector<NodeList *, 1> ret;
  358|      4|    ret.reserve(alternatives_.size());
  359|  61.4k|    for (auto &alternative : alternatives_) {
  ------------------
  |  Branch (359:28): [True: 61.4k, False: 4]
  ------------------
  360|  61.4k|      ret.push_back(&alternative);
  361|  61.4k|    }
  362|      4|    return ret;
  363|      4|  }
_ZN6hermes5regex15AlternationNode8emitStepERNS0_19RegexBytecodeStreamE:
  372|  61.4k|  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|  61.4k|    if (callNext_ && callNext_()) {
  ------------------
  |  Branch (381:9): [True: 61.4k, False: 4]
  |  Branch (381:22): [True: 4, False: 61.4k]
  ------------------
  382|       |      // This is the last call to emitStep, clean up and return nullptr
  383|      4|      jumps_.clear();
  384|      4|      callNext_ = nullptr;
  385|      4|      return nullptr;
  386|      4|    }
  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|  61.4k|    if (jumps_.size() < alternatives_.size() - 1) {
  ------------------
  |  Branch (391:9): [True: 61.4k, False: 4]
  ------------------
  392|  61.4k|      auto altInsn = bcs.emit<AlternationInsn>();
  393|  61.4k|      altInsn->primaryConstraints = elementConstraints_[jumps_.size()];
  394|  61.4k|      altInsn->secondaryConstraints = restConstraints_[jumps_.size() + 1];
  395|  61.4k|      callNext_ = [this, altInsn, &bcs]() mutable {
  396|  61.4k|        jumps_.push_back(bcs.emit<Jump32Insn>());
  397|  61.4k|        altInsn->secondaryBranch = bcs.currentOffset();
  398|  61.4k|        return false;
  399|  61.4k|      };
  400|  61.4k|      return &alternatives_[jumps_.size()];
  401|  61.4k|    }
  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|      4|    callNext_ = [this, &bcs]() mutable {
  406|       |      // Set the jump instruction for every
  407|       |      // alternation to jump to the end of the block.
  408|      4|      for (auto &jump : jumps_) {
  409|      4|        jump->target = bcs.currentOffset();
  410|      4|      }
  411|      4|      return true;
  412|      4|    };
  413|      4|    return &alternatives_.back();
  414|  61.4k|  }
_ZN6hermes5regex23MarkedSubexpressionNodeC2ENSt3__16vectorIPNS0_4NodeENS2_9allocatorIS5_EEEEt:
  435|  1.60k|      : contents_(std::move(contents)),
  436|  1.60k|        contentsConstraints_(matchConstraintsForList(contents_)),
  437|  1.60k|        mexp_(mexp) {}
_ZN6hermes5regex23MarkedSubexpressionNode11getChildrenEv:
  443|     23|  virtual llvh::SmallVector<NodeList *, 1> getChildren() override {
  444|     23|    return {&contents_};
  445|     23|  }
_ZNK6hermes5regex23MarkedSubexpressionNode16matchConstraintsEv:
  447|  1.60k|  virtual MatchConstraintSet matchConstraints() const override {
  448|  1.60k|    return contentsConstraints_ | Super::matchConstraints();
  449|  1.60k|  }
_ZN6hermes5regex23MarkedSubexpressionNode8emitStepERNS0_19RegexBytecodeStreamE:
  452|  3.20k|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  453|  3.20k|    if (!emitEnd_) {
  ------------------
  |  Branch (453:9): [True: 1.60k, False: 1.60k]
  ------------------
  454|  1.60k|      bcs.emit<BeginMarkedSubexpressionInsn>()->mexp = mexp_;
  455|  1.60k|      emitEnd_ = true;
  456|  1.60k|      return &contents_;
  457|  1.60k|    }
  458|  1.60k|    emitEnd_ = false;
  459|  1.60k|    bcs.emit<EndMarkedSubexpressionInsn>()->mexp = mexp_;
  460|  1.60k|    return nullptr;
  461|  3.20k|  }
_ZN6hermes5regex11BackRefNodeC2Ej:
  470|    139|  explicit BackRefNode(unsigned mexp) : mexp_(mexp) {}
_ZN6hermes5regex11BackRefNode8emitStepERNS0_19RegexBytecodeStreamE:
  477|    136|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  478|    136|    bcs.emit<BackRefInsn>()->mexp = mexp_;
  479|    136|    return nullptr;
  480|    136|  }
_ZN6hermes5regex16WordBoundaryNodeC2Eb:
  491|    368|  WordBoundaryNode(bool invert) : invert_(invert) {}
_ZN6hermes5regex16WordBoundaryNode8emitStepERNS0_19RegexBytecodeStreamE:
  494|    368|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  495|    368|    bcs.emit<WordBoundaryInsn>()->invert = invert_;
  496|    368|    return nullptr;
  497|    368|  }
_ZN6hermes5regex14LeftAnchorNodeC2ENS0_11SyntaxFlagsE:
  507|     49|  LeftAnchorNode(SyntaxFlags flags) : multiline_(flags.multiline) {}
_ZNK6hermes5regex14LeftAnchorNode16matchConstraintsEv:
  509|     49|  virtual MatchConstraintSet matchConstraints() const override {
  510|     49|    MatchConstraintSet result = 0;
  511|       |    // We are anchored at the start, unless we are multiline, in which case we
  512|       |    // can match after a newline.
  513|     49|    if (!multiline_) {
  ------------------
  |  Branch (513:9): [True: 49, False: 0]
  ------------------
  514|     49|      result |= MatchConstraintAnchoredAtStart;
  515|     49|    }
  516|     49|    return result | Super::matchConstraints();
  517|     49|  }
_ZN6hermes5regex14LeftAnchorNode8emitStepERNS0_19RegexBytecodeStreamE:
  520|     49|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  521|     49|    bcs.emit<LeftAnchorInsn>();
  522|     49|    return nullptr;
  523|     49|  }
_ZN6hermes5regex15RightAnchorNodeC2Ev:
  531|     15|  RightAnchorNode() {}
_ZN6hermes5regex15RightAnchorNode8emitStepERNS0_19RegexBytecodeStreamE:
  534|     15|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  535|     15|    bcs.emit<RightAnchorInsn>();
  536|     15|    return nullptr;
  537|     15|  }
_ZN6hermes5regex12MatchAnyNodeC2ENS0_11SyntaxFlagsE:
  553|  28.7k|      : unicode_(flags.unicode), dotAll_(flags.dotAll) {}
_ZNK6hermes5regex12MatchAnyNode16matchConstraintsEv:
  555|  28.7k|  virtual MatchConstraintSet matchConstraints() const override {
  556|  28.7k|    return MatchConstraintNonEmpty | Super::matchConstraints();
  557|  28.7k|  }
_ZNK6hermes5regex12MatchAnyNode26matchesExactlyOneCharacterEv:
  559|    451|  virtual bool matchesExactlyOneCharacter() const override {
  560|       |    // In Unicode we may match a surrogate pair.
  561|    451|    return !unicode_;
  562|    451|  }
_ZN6hermes5regex12MatchAnyNode8emitStepERNS0_19RegexBytecodeStreamE:
  565|  28.7k|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  566|  28.7k|    if (unicode_) {
  ------------------
  |  Branch (566:9): [True: 0, False: 28.7k]
  ------------------
  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|  28.7k|    } else {
  573|  28.7k|      if (dotAll_) {
  ------------------
  |  Branch (573:11): [True: 1, False: 28.7k]
  ------------------
  574|      1|        bcs.emit<MatchAnyInsn>();
  575|  28.7k|      } else {
  576|  28.7k|        bcs.emit<MatchAnyButNewlineInsn>();
  577|  28.7k|      }
  578|  28.7k|    }
  579|  28.7k|    return nullptr;
  580|  28.7k|  }
_ZN6hermes5regex13MatchCharNodeC2EN4llvh11SmallVectorIjLj5EEENS0_11SyntaxFlagsE:
  607|   976k|      : chars_(std::move(chars)),
  608|   976k|        icase_(flags.ignoreCase),
  609|   976k|        unicode_(flags.unicode) {}
_ZNK6hermes5regex13MatchCharNode16matchConstraintsEv:
  611|   390k|  virtual MatchConstraintSet matchConstraints() const override {
  612|   390k|    MatchConstraintSet result = MatchConstraintNonEmpty;
  613|       |    // If our character is not ASCII, then we cannot match pure-ASCII strings.
  614|   390k|    if (!std::all_of(chars_.begin(), chars_.end(), isASCII)) {
  ------------------
  |  Branch (614:9): [True: 45, False: 390k]
  ------------------
  615|     45|      result |= MatchConstraintNonASCII;
  616|     45|    }
  617|   390k|    return result | Super::matchConstraints();
  618|   390k|  }
_ZNK6hermes5regex13MatchCharNode21tryCoalesceCharactersEPN4llvh11SmallVectorIjLj5EEE:
  624|   931k|  bool tryCoalesceCharacters(CodePointList *output) const override {
  625|   931k|    output->append(chars_.begin(), chars_.end());
  626|   931k|    return true;
  627|   931k|  }
_ZNK6hermes5regex13MatchCharNode31mayRequireDecodingSurrogatePairEj:
  631|  9.95k|  bool mayRequireDecodingSurrogatePair(uint32_t cp) const {
  632|  9.95k|    if (!isMemberOfBMP(cp)) {
  ------------------
  |  Branch (632:9): [True: 0, False: 9.95k]
  ------------------
  633|      0|      return true;
  634|      0|    }
  635|  9.95k|    if (unicode_ && (isHighSurrogate(cp) || isLowSurrogate(cp))) {
  ------------------
  |  Branch (635:9): [True: 0, False: 9.95k]
  |  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|  9.95k|    return false;
  643|  9.95k|  }
_ZNK6hermes5regex13MatchCharNode26matchesExactlyOneCharacterEv:
  646|  9.91k|  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|  9.91k|    return chars_.size() == 1 &&
  ------------------
  |  Branch (649:12): [True: 9.91k, False: 0]
  ------------------
  650|  9.91k|        !mayRequireDecodingSurrogatePair(chars_.front());
  ------------------
  |  Branch (650:9): [True: 9.91k, False: 0]
  ------------------
  651|  9.91k|  }
_ZNK6hermes5regex13MatchCharNode13emitASCIIListEN4llvh8ArrayRefIjEERNS0_19RegexBytecodeStreamE:
  655|  93.4k|      const {
  656|  93.4k|    assert(
  657|  93.4k|        std::all_of(chars.begin(), chars.end(), isASCII) &&
  658|  93.4k|        "All characters should be ASCII");
  659|       |
  660|       |    // Output groups of at least kMinMatchCharNCount, but no more than
  661|       |    // kMaxMatchCharNCount.
  662|  93.4k|    auto remaining = chars;
  663|   117k|    while (remaining.size() >= kMinMatchCharNCount) {
  ------------------
  |  Branch (663:12): [True: 23.6k, False: 93.4k]
  ------------------
  664|  23.6k|      size_t groupLen = std::min((size_t)kMaxMatchCharNCount, remaining.size());
  665|  23.6k|      auto group = remaining.take_front(groupLen);
  666|  23.6k|      remaining = remaining.drop_front(groupLen);
  667|       |
  668|  23.6k|      if (icase_) {
  ------------------
  |  Branch (668:11): [True: 20.8k, False: 2.81k]
  ------------------
  669|  20.8k|        bcs.emit<MatchNCharICase8Insn>()->charCount = groupLen;
  670|  20.8k|      } else {
  671|  2.81k|        bcs.emit<MatchNChar8Insn>()->charCount = groupLen;
  672|  2.81k|      }
  673|   701k|      for (char c : group) {
  ------------------
  |  Branch (673:19): [True: 701k, False: 23.6k]
  ------------------
  674|   701k|        bcs.emitChar8(c);
  675|   701k|      }
  676|  23.6k|    }
  677|       |
  678|       |    // Output any remaining as individual characters.
  679|  93.4k|    for (CodePoint c : remaining) {
  ------------------
  |  Branch (679:22): [True: 84.6k, False: 93.4k]
  ------------------
  680|  84.6k|      if (icase_) {
  ------------------
  |  Branch (680:11): [True: 84.4k, False: 179]
  ------------------
  681|  84.4k|        bcs.emit<MatchCharICase8Insn>()->c = c;
  682|  84.4k|      } else {
  683|    179|        bcs.emit<MatchChar8Insn>()->c = c;
  684|    179|      }
  685|  84.6k|    }
  686|  93.4k|  }
_ZNK6hermes5regex13MatchCharNode16emitNonASCIIListEN4llvh8ArrayRefIjEERNS0_19RegexBytecodeStreamE:
  691|  93.4k|      RegexBytecodeStream &bcs) const {
  692|  93.4k|    for (uint32_t c : chars) {
  ------------------
  |  Branch (692:21): [True: 45, False: 93.4k]
  ------------------
  693|     45|      if (mayRequireDecodingSurrogatePair(c)) {
  ------------------
  |  Branch (693:11): [True: 0, False: 45]
  ------------------
  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|     45|      } else {
  700|     45|        if (icase_) {
  ------------------
  |  Branch (700:13): [True: 38, False: 7]
  ------------------
  701|     38|          bcs.emit<MatchCharICase16Insn>()->c = c;
  702|     38|        } else {
  703|      7|          bcs.emit<MatchChar16Insn>()->c = c;
  704|      7|        }
  705|     45|      }
  706|     45|    }
  707|  93.4k|  }
_ZN6hermes5regex13MatchCharNode8emitStepERNS0_19RegexBytecodeStreamE:
  710|  93.3k|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  711|  93.3k|    llvh::ArrayRef<CodePoint> remaining{chars_};
  712|   186k|    while (!remaining.empty()) {
  ------------------
  |  Branch (712:12): [True: 93.4k, False: 93.3k]
  ------------------
  713|       |      // Output any run (possibly empty) of ASCII chars.
  714|  93.4k|      auto asciis = remaining.take_while(isASCII);
  715|  93.4k|      emitASCIIList(asciis, bcs);
  716|  93.4k|      remaining = remaining.drop_front(asciis.size());
  717|       |
  718|       |      // Output any run (possibly empty) of non-ASCII chars.
  719|  93.4k|      auto nonAsciis = remaining.take_until(isASCII);
  720|  93.4k|      emitNonASCIIList(nonAsciis, bcs);
  721|  93.4k|      remaining = remaining.drop_front(nonAsciis.size());
  722|  93.4k|    }
  723|  93.3k|    return nullptr;
  724|  93.3k|  }
_ZN6hermes5regex4Node16optimizeNodeListERNSt3__16vectorIPS1_NS2_9allocatorIS4_EEEENS0_11SyntaxFlagsERNS3_INS2_10unique_ptrIS1_NS2_14default_deleteIS1_EEEENS5_ISD_EEEE:
  971|    122|    NodeHolder &nodeHolder) {
  972|    122|  std::vector<NodeList *> stack;
  973|    122|  stack.push_back(&rootNodes);
  974|       |
  975|  61.9k|  while (!stack.empty()) {
  ------------------
  |  Branch (975:10): [True: 61.8k, False: 122]
  ------------------
  976|  61.8k|    auto &nodes = *stack.back();
  977|  61.8k|    stack.pop_back();
  978|       |
  979|       |    // Merge adjacent runs of char nodes.
  980|       |    // For example, [CharNode('a') CharNode('b') CharNode('c')] becomes
  981|       |    // [CharNode('abc')].
  982|   157k|    for (size_t idx = 0, max = nodes.size(); idx < max; idx++) {
  ------------------
  |  Branch (982:46): [True: 95.4k, False: 61.8k]
  ------------------
  983|  95.4k|      auto childNodes = nodes[idx]->getChildren();
  984|  95.4k|      stack.insert(stack.end(), childNodes.begin(), childNodes.end());
  985|       |      // Get the range of nodes that can be successfully coalesced.
  986|  95.4k|      CodePointList chars;
  987|  95.4k|      size_t rangeStart = idx;
  988|  1.02M|      while (idx < max && nodes[idx]->tryCoalesceCharacters(&chars)) {
  ------------------
  |  Branch (988:14): [True: 973k, False: 53.2k]
  |  Branch (988:27): [True: 931k, False: 42.1k]
  ------------------
  989|   931k|        idx++;
  990|   931k|      }
  991|  95.4k|      if (idx - rangeStart >= 2) {
  ------------------
  |  Branch (991:11): [True: 34.9k, False: 60.4k]
  ------------------
  992|       |        // We successfully coalesced some nodes.
  993|       |        // Replace the range with a new node.
  994|  34.9k|        nodeHolder.emplace_back(new MatchCharNode(std::move(chars), flags));
  995|  34.9k|        nodes[rangeStart] = nodeHolder.back().get();
  996|       |        // Fill the remainder of the range with null (we'll clean them up after
  997|       |        // the loop) and skip to the end of the range.
  998|       |        // Note that rangeEnd may be one past the last valid element.
  999|  34.9k|        std::fill(
 1000|  34.9k|            nodes.begin() + (rangeStart + 1), nodes.begin() + idx, nullptr);
 1001|  34.9k|      }
 1002|  95.4k|    }
 1003|       |
 1004|       |    // Remove any nulls that we introduced.
 1005|  61.8k|    nodes.erase(std::remove(nodes.begin(), nodes.end(), nullptr), nodes.end());
 1006|  61.8k|  }
 1007|    122|}
_ZN6hermes5regex4NodeC2Ev:
   60|  1.01M|  Node() = default;
_ZN6hermes5regex4NodeD2Ev:
   61|  1.01M|  virtual ~Node() = default;
_ZZN6hermes5regex15AlternationNode8emitStepERNS0_19RegexBytecodeStreamEENUlvE_clEv:
  395|  61.4k|      callNext_ = [this, altInsn, &bcs]() mutable {
  396|  61.4k|        jumps_.push_back(bcs.emit<Jump32Insn>());
  397|  61.4k|        altInsn->secondaryBranch = bcs.currentOffset();
  398|  61.4k|        return false;
  399|  61.4k|      };
_ZZN6hermes5regex15AlternationNode8emitStepERNS0_19RegexBytecodeStreamEENUlvE0_clEv:
  405|      4|    callNext_ = [this, &bcs]() mutable {
  406|       |      // Set the jump instruction for every
  407|       |      // alternation to jump to the end of the block.
  408|  61.4k|      for (auto &jump : jumps_) {
  ------------------
  |  Branch (408:23): [True: 61.4k, False: 4]
  ------------------
  409|  61.4k|        jump->target = bcs.currentOffset();
  410|  61.4k|      }
  411|      4|      return true;
  412|      4|    };
_ZZN6hermes5regex8LoopNode8emitStepERNS0_19RegexBytecodeStreamEENUlvE_clEv:
  251|  10.3k|        endLoop_ = [loopInsn, &bcs]() mutable {
  252|  10.3k|          loopInsn->notTakenTarget = bcs.currentOffset();
  253|  10.3k|        };
_ZZN6hermes5regex8LoopNode8emitStepERNS0_19RegexBytecodeStreamEENUlvE1_clEv:
  270|    136|        endLoop_ = [loopInsn, loopEntryPosition, &bcs]() mutable {
  271|    136|          bcs.emit<EndLoopInsn>()->target = loopEntryPosition;
  272|    136|          loopInsn->notTakenTarget = bcs.currentOffset();
  273|    136|        };
_ZN6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE8addClassENS0_14CharacterClassE:
  826|      4|  void addClass(CharacterClass cls) {
  827|      4|    classes_.push_back(cls);
  828|      4|  }
_ZN6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEEC2ERKS2_bNS0_11SyntaxFlagsE:
  811|    854|      : traits_(traits),
  812|    854|        negate_(negate),
  813|    854|        icase_(flags.ignoreCase),
  814|    854|        unicode_(flags.unicode) {}
_ZNK6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE26matchesExactlyOneCharacterEv:
  847|      4|  virtual bool matchesExactlyOneCharacter() const override {
  848|       |    // A unicode bracket may match a surrogate pair.
  849|      4|    return !unicode_;
  850|      4|  }
_ZNK6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE16matchConstraintsEv:
  836|    854|  virtual MatchConstraintSet matchConstraints() const override {
  837|    854|    MatchConstraintSet result = 0;
  838|    854|    if (!canMatchASCII())
  ------------------
  |  Branch (838:9): [True: 667, False: 187]
  ------------------
  839|    667|      result |= MatchConstraintNonASCII;
  840|       |
  841|    854|    if (!(codePointSet_.ranges().empty() && classes_.empty()))
  ------------------
  |  Branch (841:9): [True: 187, False: 667]
  |  Branch (841:11): [True: 671, False: 183]
  |  Branch (841:45): [True: 667, False: 4]
  ------------------
  842|    187|      result |= MatchConstraintNonEmpty;
  843|       |
  844|    854|    return result | Super::matchConstraints();
  845|    854|  }
_ZNK6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE13canMatchASCIIEv:
  741|    854|  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|    854|    if (icase_ && unicode_)
  ------------------
  |  Branch (749:9): [True: 53, False: 801]
  |  Branch (749:19): [True: 0, False: 53]
  ------------------
  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|    854|    if (negate_) {
  ------------------
  |  Branch (754:9): [True: 0, False: 854]
  ------------------
  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|    854|    } else {
  764|       |      // Not negated.
  765|       |      // All character classes \w, etc. can match ASCII. Also check for
  766|       |      // singletons.
  767|    854|      if (!classes_.empty())
  ------------------
  |  Branch (767:11): [True: 4, False: 850]
  ------------------
  768|      4|        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|    850|      for (const CodePointRange &range : codePointSet_.ranges()) {
  ------------------
  |  Branch (773:40): [True: 183, False: 667]
  ------------------
  774|    183|        if (isASCII(range.first))
  ------------------
  |  Branch (774:13): [True: 183, False: 0]
  ------------------
  775|    183|          return true;
  776|    183|      }
  777|       |
  778|       |      // None of our components can match ASCII.
  779|    667|      return false;
  780|    850|    }
  781|    854|  }
_ZN6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE8emitStepERNS0_19RegexBytecodeStreamE:
  853|    854|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  854|    854|    if (unicode_) {
  ------------------
  |  Branch (854:9): [True: 0, False: 854]
  ------------------
  855|      0|      populateInstruction(bcs, bcs.emit<U16BracketInsn>());
  856|    854|    } else {
  857|    854|      populateInstruction(bcs, bcs.emit<BracketInsn>());
  858|    854|    }
  859|    854|    return nullptr;
  860|    854|  }
_ZNK6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE19populateInstructionINS0_19RegexBytecodeStream18InstructionWrapperINS0_11BracketInsnEEEEEvRS5_T_:
  787|    854|  void populateInstruction(RegexBytecodeStream &bcs, Insn insn) const {
  788|    854|    insn->negate = negate_;
  789|    854|    for (CharacterClass cc : classes_) {
  ------------------
  |  Branch (789:28): [True: 4, False: 854]
  ------------------
  790|      4|      if (!cc.inverted_) {
  ------------------
  |  Branch (790:11): [True: 3, False: 1]
  ------------------
  791|      3|        insn->positiveCharClasses |= cc.type_;
  792|      3|      } else {
  793|      1|        insn->negativeCharClasses |= cc.type_;
  794|      1|      }
  795|      4|    }
  796|       |
  797|       |    // Canonicalize our code point set if needed.
  798|    854|    CodePointSet cps = icase_
  ------------------
  |  Branch (798:24): [True: 53, False: 801]
  ------------------
  799|    854|        ? makeCanonicallyEquivalent(codePointSet_, unicode_)
  800|    854|        : codePointSet_;
  801|  1.00k|    for (const CodePointRange &range : cps.ranges()) {
  ------------------
  |  Branch (801:38): [True: 1.00k, False: 854]
  ------------------
  802|  1.00k|      assert(range.length > 0 && "Ranges should never be empty");
  803|  1.00k|      bcs.emitBracketRange(
  804|  1.00k|          BracketRange32{range.first, range.first + range.length - 1});
  805|  1.00k|    }
  806|    854|    insn->rangeCount = cps.ranges().size();
  807|    854|  }
_ZN6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE7addCharEj:
  816|  1.57k|  void addChar(CodePoint c) {
  817|  1.57k|    codePointSet_.add(c);
  818|  1.57k|  }

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

_ZN6hermes5regex16UTF16RegexTraits16isWhiteSpaceCharEj:
   52|    122|  static bool isWhiteSpaceChar(CodePoint c) {
   53|    122|    return c == u'\u0009' || c == u'\u000B' || c == u'\u000C' ||
  ------------------
  |  Branch (53:12): [True: 0, False: 122]
  |  Branch (53:30): [True: 0, False: 122]
  |  Branch (53:48): [True: 0, False: 122]
  ------------------
   54|    122|        c == u'\u0020' || c == u'\u00A0' || c == u'\uFEFF' || c == u'\u1680' ||
  ------------------
  |  Branch (54:9): [True: 0, False: 122]
  |  Branch (54:27): [True: 0, False: 122]
  |  Branch (54:45): [True: 0, False: 122]
  |  Branch (54:63): [True: 0, False: 122]
  ------------------
   55|    122|        (c >= u'\u2000' && c <= u'\u200A') || c == u'\u202F' ||
  ------------------
  |  Branch (55:10): [True: 0, False: 122]
  |  Branch (55:28): [True: 0, False: 0]
  |  Branch (55:47): [True: 0, False: 122]
  ------------------
   56|    122|        c == u'\u205F' || c == u'\u3000';
  ------------------
  |  Branch (56:9): [True: 0, False: 122]
  |  Branch (56:27): [True: 0, False: 122]
  ------------------
   57|    122|  }
_ZN6hermes5regex16UTF16RegexTraits20isLineTerminatorCharEj:
   60|    122|  static bool isLineTerminatorChar(CodePoint c) {
   61|    122|    return c == u'\u000A' || c == u'\u000D' || c == u'\u2028' || c == u'\u2029';
  ------------------
  |  Branch (61:12): [True: 36, False: 86]
  |  Branch (61:30): [True: 0, False: 86]
  |  Branch (61:48): [True: 0, False: 86]
  |  Branch (61:66): [True: 0, False: 86]
  ------------------
   62|    122|  }
_ZNK6hermes5regex16UTF16RegexTraits16characterHasTypeEjNS0_14CharacterClass4TypeE:
   66|    122|  bool characterHasType(CodePoint c, regex::CharacterClass::Type type) const {
   67|    122|    switch (type) {
  ------------------
  |  Branch (67:13): [True: 0, False: 122]
  ------------------
   68|      0|      case regex::CharacterClass::Digits:
  ------------------
  |  Branch (68:7): [True: 0, False: 122]
  ------------------
   69|      0|        return u'0' <= c && c <= u'9';
  ------------------
  |  Branch (69:16): [True: 0, False: 0]
  |  Branch (69:29): [True: 0, False: 0]
  ------------------
   70|    122|      case regex::CharacterClass::Spaces:
  ------------------
  |  Branch (70:7): [True: 122, False: 0]
  ------------------
   71|    122|        return isWhiteSpaceChar(c) || isLineTerminatorChar(c);
  ------------------
  |  Branch (71:16): [True: 0, False: 122]
  |  Branch (71:39): [True: 36, False: 86]
  ------------------
   72|      0|      case regex::CharacterClass::Words:
  ------------------
  |  Branch (72:7): [True: 0, False: 122]
  ------------------
   73|      0|        return (u'a' <= c && c <= u'z') || (u'A' <= c && c <= u'Z') ||
  ------------------
  |  Branch (73:17): [True: 0, False: 0]
  |  Branch (73:30): [True: 0, False: 0]
  |  Branch (73:45): [True: 0, False: 0]
  |  Branch (73:58): [True: 0, False: 0]
  ------------------
   74|      0|            (u'0' <= c && c <= u'9') || (c == u'_');
  ------------------
  |  Branch (74:14): [True: 0, False: 0]
  |  Branch (74:27): [True: 0, False: 0]
  |  Branch (74:41): [True: 0, False: 0]
  ------------------
   75|    122|    }
   76|      0|    llvm_unreachable("Unknown character type");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   77|    122|  }
_ZN6hermes5regex16UTF16RegexTraits12canonicalizeEjb:
   82|   214k|  static CodePoint canonicalize(CodePoint c, bool unicode) {
   83|   214k|    static_assert(
   84|   214k|        std::numeric_limits<CodePoint>::min() == 0,
   85|   214k|        "CodePoint must be unsigned");
   86|       |    // If we are unicode, we want to case-fold, which is effectively lowercase
   87|       |    // form. If we are non-Unicode, we need the uppercase form.
   88|   214k|    if (LLVM_LIKELY(c <= 127)) {
  ------------------
  |  |  188|   214k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 214k, False: 38]
  |  |  ------------------
  ------------------
   89|       |      // ASCII fast path.
   90|   214k|      if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
  ------------------
  |  Branch (90:12): [True: 203k, False: 11.4k]
  |  Branch (90:24): [True: 203k, False: 2]
  |  Branch (90:38): [True: 9.71k, False: 1.71k]
  |  Branch (90:50): [True: 9.35k, False: 361]
  ------------------
   91|       |        // It's a letter. Make it lowercase (uppercase) if Unicode is set
   92|       |        // (unset).
   93|   212k|        c &= ~(1u << 5); // uppercase
   94|   212k|        c |= ((uint32_t)unicode << 5); // lowercase if Unicode is set.
   95|   212k|      }
   96|   214k|      return c;
   97|   214k|    }
   98|     38|    return hermes::canonicalize(c, unicode);
   99|   214k|  }
_ZNK6hermes5regex16UTF16RegexTraits13rangesContainEN4llvh8ArrayRefINS0_14BracketRange32EEEj:
  104|     86|  bool rangesContain(llvh::ArrayRef<BracketRange32> ranges, CodePoint c) const {
  105|     86|    return anyRangeContainsChar(ranges, c);
  106|     86|  }
_ZN6hermes5regex20anyRangeContainsCharEN4llvh8ArrayRefINS0_14BracketRange32EEEj:
   30|     86|    uint32_t c) {
   31|     86|  for (const auto &r : ranges) {
  ------------------
  |  Branch (31:22): [True: 0, False: 86]
  ------------------
   32|      0|    if (r.start <= c && c <= r.end) {
  ------------------
  |  Branch (32:9): [True: 0, False: 0]
  |  Branch (32:25): [True: 0, False: 0]
  ------------------
   33|      0|      return true;
   34|      0|    }
   35|      0|  }
   36|     86|  return false;
   37|     86|}

_ZN6hermes5regex14CharacterClassC2ENS1_4TypeEb:
  217|      4|  CharacterClass(Type type, bool invert) : type_(type), inverted_(invert) {}
_ZNK6hermes5regex11SyntaxFlags6toByteEv:
  262|    121|  uint8_t toByte() const {
  263|    121|    uint8_t ret = 0;
  264|    121|    if (global)
  ------------------
  |  Branch (264:9): [True: 1, False: 120]
  ------------------
  265|      1|      ret |= GLOBAL;
  266|    121|    if (ignoreCase)
  ------------------
  |  Branch (266:9): [True: 4, False: 117]
  ------------------
  267|      4|      ret |= ICASE;
  268|    121|    if (multiline)
  ------------------
  |  Branch (268:9): [True: 0, False: 121]
  ------------------
  269|      0|      ret |= MULTILINE;
  270|    121|    if (unicode)
  ------------------
  |  Branch (270:9): [True: 0, False: 121]
  ------------------
  271|      0|      ret |= UCODE;
  272|    121|    if (sticky)
  ------------------
  |  Branch (272:9): [True: 0, False: 121]
  ------------------
  273|      0|      ret |= STICKY;
  274|    121|    if (dotAll)
  ------------------
  |  Branch (274:9): [True: 3, False: 118]
  ------------------
  275|      3|      ret |= DOTALL;
  276|    121|    if (hasIndices)
  ------------------
  |  Branch (276:9): [True: 0, False: 121]
  ------------------
  277|      0|      ret |= INDICES;
  278|    121|    return ret;
  279|    121|  }
_ZN6hermes5regex11SyntaxFlags8fromByteEh:
  284|     94|  static SyntaxFlags fromByte(uint8_t byte) {
  285|     94|    SyntaxFlags ret = {};
  286|     94|    if (byte & GLOBAL)
  ------------------
  |  Branch (286:9): [True: 1, False: 93]
  ------------------
  287|      1|      ret.global = 1;
  288|     94|    if (byte & ICASE)
  ------------------
  |  Branch (288:9): [True: 3, False: 91]
  ------------------
  289|      3|      ret.ignoreCase = 1;
  290|     94|    if (byte & MULTILINE)
  ------------------
  |  Branch (290:9): [True: 0, False: 94]
  ------------------
  291|      0|      ret.multiline = 1;
  292|     94|    if (byte & UCODE)
  ------------------
  |  Branch (292:9): [True: 0, False: 94]
  ------------------
  293|      0|      ret.unicode = 1;
  294|     94|    if (byte & STICKY)
  ------------------
  |  Branch (294:9): [True: 0, False: 94]
  ------------------
  295|      0|      ret.sticky = 1;
  296|     94|    if (byte & DOTALL)
  ------------------
  |  Branch (296:9): [True: 2, False: 92]
  ------------------
  297|      2|      ret.dotAll = 1;
  298|     94|    if (byte & INDICES)
  ------------------
  |  Branch (298:9): [True: 0, False: 94]
  ------------------
  299|      0|      ret.hasIndices = 1;
  300|     94|    return ret;
  301|     94|  }
_ZN6hermes5regex11SyntaxFlags10fromStringEN4llvh8ArrayRefIDsEE:
  331|    122|      const llvh::ArrayRef<char16_t> flags) {
  332|       |    // A flags string may contain i,m,g, in any order, but at most once each
  333|    122|    auto error = llvh::NoneType::None;
  334|    122|    SyntaxFlags ret = {};
  335|    122|    for (auto c : flags) {
  ------------------
  |  Branch (335:17): [True: 9, False: 122]
  ------------------
  336|      9|      switch (c) {
  337|      4|        case u'i':
  ------------------
  |  Branch (337:9): [True: 4, False: 5]
  ------------------
  338|      4|          if (ret.ignoreCase)
  ------------------
  |  Branch (338:15): [True: 0, False: 4]
  ------------------
  339|      0|            return error;
  340|      4|          ret.ignoreCase = 1;
  341|      4|          break;
  342|      0|        case u'm':
  ------------------
  |  Branch (342:9): [True: 0, False: 9]
  ------------------
  343|      0|          if (ret.multiline)
  ------------------
  |  Branch (343:15): [True: 0, False: 0]
  ------------------
  344|      0|            return error;
  345|      0|          ret.multiline = 1;
  346|      0|          break;
  347|      1|        case u'g':
  ------------------
  |  Branch (347:9): [True: 1, False: 8]
  ------------------
  348|      1|          if (ret.global)
  ------------------
  |  Branch (348:15): [True: 0, False: 1]
  ------------------
  349|      0|            return error;
  350|      1|          ret.global = 1;
  351|      1|          break;
  352|      1|        case u'u':
  ------------------
  |  Branch (352:9): [True: 1, False: 8]
  ------------------
  353|      1|          if (ret.unicode)
  ------------------
  |  Branch (353:15): [True: 0, False: 1]
  ------------------
  354|      0|            return error;
  355|      1|          ret.unicode = 1;
  356|      1|          break;
  357|      0|        case u'y':
  ------------------
  |  Branch (357:9): [True: 0, False: 9]
  ------------------
  358|      0|          if (ret.sticky)
  ------------------
  |  Branch (358:15): [True: 0, False: 0]
  ------------------
  359|      0|            return error;
  360|      0|          ret.sticky = 1;
  361|      0|          break;
  362|      3|        case u's':
  ------------------
  |  Branch (362:9): [True: 3, False: 6]
  ------------------
  363|      3|          if (ret.dotAll)
  ------------------
  |  Branch (363:15): [True: 0, False: 3]
  ------------------
  364|      0|            return error;
  365|      3|          ret.dotAll = 1;
  366|      3|          break;
  367|      0|        case u'd':
  ------------------
  |  Branch (367:9): [True: 0, False: 9]
  ------------------
  368|      0|          if (ret.hasIndices)
  ------------------
  |  Branch (368:15): [True: 0, False: 0]
  ------------------
  369|      0|            return error;
  370|      0|          ret.hasIndices = 1;
  371|      0|          break;
  372|      0|        default:
  ------------------
  |  Branch (372:9): [True: 0, False: 9]
  ------------------
  373|      0|          return error;
  374|      9|      }
  375|      9|    }
  376|    122|    return ret;
  377|    122|  }
_ZN6hermes5regex9constants15messageForErrorENS1_9ErrorTypeE:
  135|      1|inline const char *messageForError(ErrorType error) {
  136|      1|  switch (error) {
  ------------------
  |  Branch (136:11): [True: 0, False: 1]
  ------------------
  137|      0|    case ErrorType::EscapeOverflow:
  ------------------
  |  Branch (137:5): [True: 0, False: 1]
  ------------------
  138|      0|      return "Escaped value too large";
  139|      0|    case ErrorType::EscapeIncomplete:
  ------------------
  |  Branch (139:5): [True: 0, False: 1]
  ------------------
  140|      0|      return "Incomplete escape";
  141|      0|    case ErrorType::EscapeInvalid:
  ------------------
  |  Branch (141:5): [True: 0, False: 1]
  ------------------
  142|      0|      return "Invalid escape";
  143|      0|    case ErrorType::UnbalancedBracket:
  ------------------
  |  Branch (143:5): [True: 0, False: 1]
  ------------------
  144|      0|      return "Character class not closed";
  145|      0|    case ErrorType::UnbalancedParenthesis:
  ------------------
  |  Branch (145:5): [True: 0, False: 1]
  ------------------
  146|      0|      return "Parenthesized expression not closed";
  147|      0|    case ErrorType::BraceRange:
  ------------------
  |  Branch (147:5): [True: 0, False: 1]
  ------------------
  148|      0|      return "Quantifier range out of order";
  149|      0|    case ErrorType::CharacterRange:
  ------------------
  |  Branch (149:5): [True: 0, False: 1]
  ------------------
  150|      0|      return "Character class range out of order";
  151|      0|    case ErrorType::InvalidQuantifierBracket:
  ------------------
  |  Branch (151:5): [True: 0, False: 1]
  ------------------
  152|      0|      return "Invalid quantifier bracket";
  153|      0|    case ErrorType::InvalidRepeat:
  ------------------
  |  Branch (153:5): [True: 0, False: 1]
  ------------------
  154|      0|      return "Quantifier has nothing to repeat";
  155|      0|    case ErrorType::PatternExceedsParseLimits:
  ------------------
  |  Branch (155:5): [True: 0, False: 1]
  ------------------
  156|      0|      return "Pattern exceeds parse limits";
  157|      0|    case ErrorType::InvalidFlags:
  ------------------
  |  Branch (157:5): [True: 0, False: 1]
  ------------------
  158|      0|      return "Invalid flags";
  159|      0|    case ErrorType::InvalidCaptureGroupName:
  ------------------
  |  Branch (159:5): [True: 0, False: 1]
  ------------------
  160|      0|      return "Invalid capture group name";
  161|      0|    case ErrorType::DuplicateCaptureGroupName:
  ------------------
  |  Branch (161:5): [True: 0, False: 1]
  ------------------
  162|      0|      return "Duplicate capture group name";
  163|      0|    case ErrorType::InvalidNamedReference:
  ------------------
  |  Branch (163:5): [True: 0, False: 1]
  ------------------
  164|      0|      return "Invalid named reference";
  165|      1|    case ErrorType::NonexistentNamedCaptureReference:
  ------------------
  |  Branch (165:5): [True: 1, False: 0]
  ------------------
  166|      1|      return "Nonexistent named capture reference";
  167|      0|    case ErrorType::InvalidPropertyName:
  ------------------
  |  Branch (167:5): [True: 0, False: 1]
  ------------------
  168|      0|      return "Invalid property name";
  169|      0|    case ErrorType::None:
  ------------------
  |  Branch (169:5): [True: 0, False: 1]
  ------------------
  170|      0|      return "No error";
  171|      1|  }
  172|      1|  llvm_unreachable("Unknown error");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  173|      0|  return nullptr;
  174|      1|}
_ZN6hermes5regex7isASCIIEj:
  202|  2.35M|inline bool isASCII(uint32_t c) {
  203|  2.35M|  return c <= 127;
  204|  2.35M|}

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

_ZN6hermes28BacktrackingBumpPtrAllocator5StateC2EPS1_:
   61|    327|        : slab(previous->slab), offset(previous->offset), previous(previous) {}
_ZN6hermes28BacktrackingBumpPtrAllocator5StateC2Ev:
   63|    494|    State() : slab(0), offset(0), previous(nullptr) {}
_ZN6hermes28BacktrackingBumpPtrAllocator12allocateHugeEm:
   70|     64|  void *allocateHuge(size_t size) {
   71|     64|    auto *ptr = checkedMalloc(size);
   72|     64|    state_->hugeAllocs.push_back(
   73|     64|        std::unique_ptr<void, decltype(free) *>(ptr, free));
   74|     64|    return ptr;
   75|     64|  }
_ZN6hermes28BacktrackingBumpPtrAllocator11alignOffsetEmmm:
   79|  14.8M|  alignOffset(uintptr_t base, uintptr_t offset, uintptr_t alignment) {
   80|  14.8M|    return llvh::alignTo(base + offset, alignment) - base;
   81|  14.8M|  }
_ZN6hermes28BacktrackingBumpPtrAllocatorC2Ev:
   87|    494|  explicit BacktrackingBumpPtrAllocator() {
   88|    494|    state_ = new State();
   89|    494|    slabs_.push_back(std::make_unique<Slab>());
   90|    494|  }
_ZN6hermes28BacktrackingBumpPtrAllocatorD2Ev:
   91|    494|  ~BacktrackingBumpPtrAllocator() {
   92|    988|    while (state_)
  ------------------
  |  Branch (92:12): [True: 494, False: 494]
  ------------------
   93|    494|      popScope();
   94|    494|  }
_ZN6hermes28BacktrackingBumpPtrAllocator9pushScopeEv:
   98|    327|  void pushScope() {
   99|    327|    state_ = new State(state_);
  100|    327|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8popScopeEv:
  103|    821|  void popScope() {
  104|    821|    assert(state_ && "No previous allocation scope pushed");
  105|    821|    auto *top = state_;
  106|    821|    state_ = state_->previous;
  107|    821|    delete top;
  108|       |    // We could also clean up unnecessary slabs, but we're likely to need
  109|       |    // then again so don't bother.
  110|    821|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateEmm:
  126|  14.8M|      size_t alignment = kDefaultPlatformAlignment) {
  127|  14.8M|    auto currentSlab =
  128|  14.8M|        reinterpret_cast<uintptr_t>(&slabs_[state_->slab].get()->data);
  129|  14.8M|    state_->offset = alignOffset(currentSlab, state_->offset, alignment);
  130|       |
  131|  14.8M|    if (LLVM_UNLIKELY(size > SlabSize || state_->offset + size > SlabSize)) {
  ------------------
  |  |  189|  29.7M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 3.64k, False: 14.8M]
  |  |  |  Branch (189:53): [True: 64, False: 14.8M]
  |  |  |  Branch (189:53): [True: 3.58k, False: 14.8M]
  |  |  ------------------
  ------------------
  132|  3.64k|      return allocateNewSlab(size, alignment);
  133|  3.64k|    }
  134|       |
  135|  14.8M|    auto *ptr = (void *)(currentSlab + state_->offset);
  136|  14.8M|    state_->offset += size;
  137|  14.8M|    return ptr;
  138|  14.8M|  }
_ZN6hermes15AllocationScopeC2ERNS_28BacktrackingBumpPtrAllocatorE:
  149|    327|      : allocator_(allocator) {
  150|    327|    allocator_.pushScope();
  151|    327|  }
_ZN6hermes15AllocationScopeD2Ev:
  152|    327|  ~AllocationScope() {
  153|    327|    allocator_.popScope();
  154|    327|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateINS_12UniqueStringEEEPT_mm:
  114|   292k|  inline T *Allocate(size_t num = 1, size_t alignment = sizeof(double)) {
  115|       |    // Calculate the maximum value for num that will not overflow.
  116|   292k|    constexpr size_t maxNum = std::numeric_limits<size_t>::max() / sizeof(T);
  117|   292k|    if (LLVM_UNLIKELY(num > maxNum))
  ------------------
  |  |  189|   292k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 292k]
  |  |  ------------------
  ------------------
  118|      0|      hermes_fatal("Allocation size overflow.");
  119|   292k|    size_t size = sizeof(T) * num;
  120|   292k|    return static_cast<T *>(Allocate(size, alignment));
  121|   292k|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateIcEEPT_mm:
  114|   292k|  inline T *Allocate(size_t num = 1, size_t alignment = sizeof(double)) {
  115|       |    // Calculate the maximum value for num that will not overflow.
  116|   292k|    constexpr size_t maxNum = std::numeric_limits<size_t>::max() / sizeof(T);
  117|   292k|    if (LLVM_UNLIKELY(num > maxNum))
  ------------------
  |  |  189|   292k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 292k]
  |  |  ------------------
  ------------------
  118|      0|      hermes_fatal("Allocation size overflow.");
  119|   292k|    size_t size = sizeof(T) * num;
  120|   292k|    return static_cast<T *>(Allocate(size, alignment));
  121|   292k|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateINS_6parser13RegExpLiteralEEEPT_mm:
  114|    240|  inline T *Allocate(size_t num = 1, size_t alignment = sizeof(double)) {
  115|       |    // Calculate the maximum value for num that will not overflow.
  116|    240|    constexpr size_t maxNum = std::numeric_limits<size_t>::max() / sizeof(T);
  117|    240|    if (LLVM_UNLIKELY(num > maxNum))
  ------------------
  |  |  189|    240|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 240]
  |  |  ------------------
  ------------------
  118|      0|      hermes_fatal("Allocation size overflow.");
  119|    240|    size_t size = sizeof(T) * num;
  120|    240|    return static_cast<T *>(Allocate(size, alignment));
  121|    240|  }

_ZN6hermes6bigint23numDigitsForSizeInBytesEj:
  102|  1.56M|inline uint32_t numDigitsForSizeInBytes(uint32_t v) {
  103|  1.56M|  return static_cast<uint32_t>(llvh::alignTo(v, BigIntDigitSizeInBytes)) /
  104|  1.56M|      BigIntDigitSizeInBytes;
  105|  1.56M|}
_ZN6hermes6bigint13tooManyDigitsEj:
   85|   390k|inline constexpr bool tooManyDigits(uint32_t numDigits) {
   86|   390k|  return BigIntMaxSizeInDigits < numDigits;
   87|   390k|}
_ZNK6hermes6bigint12ParsedBigInt8getBytesEv:
  224|     25|  llvh::ArrayRef<uint8_t> getBytes() const {
  225|     25|    return dropExtraSignBits(storage_);
  226|     25|  }
_ZN6hermes6bigint12ParsedBigIntC2EN4llvh8ArrayRefIhEE:
  233|      5|  ParsedBigInt(llvh::ArrayRef<uint8_t> bytes) : storage_(bytes) {}
_ZN6hermes6bigint19UniquingBigIntTable9addBigIntENS0_12ParsedBigIntE:
  472|      5|  uint32_t addBigInt(ParsedBigInt bigint) {
  473|      5|    auto iter = keysToIndex_.find(keyFor(bigint));
  474|      5|    if (iter != keysToIndex_.end()) {
  ------------------
  |  Branch (474:9): [True: 0, False: 5]
  ------------------
  475|      0|      return iter->second;
  476|      0|    }
  477|       |
  478|      5|    const uint32_t index = bigints_.size();
  479|      5|    bigints_.push_back(std::move(bigint));
  480|      5|    keysToIndex_[keyFor(bigints_.back())] = index;
  481|      5|    return index;
  482|      5|  }
_ZN6hermes6bigint19UniquingBigIntTable6keyForERKNS0_12ParsedBigIntE:
  496|     10|  static KeyType keyFor(const ParsedBigInt &parsedBigInt) {
  497|     10|    return parsedBigInt.getBytes();
  498|     10|  }
_ZN6hermes6bigint12tooManyBytesEj:
   91|      5|inline constexpr bool tooManyBytes(uint32_t numBytes) {
   92|      5|  return BigIntMaxSizeInBytes < numBytes;
   93|      5|}
_ZN6hermes6bigint22numDigitsForSizeInBitsEj:
   96|      5|inline uint32_t numDigitsForSizeInBits(uint32_t v) {
   97|      5|  return static_cast<uint32_t>(llvh::alignTo(v, BigIntDigitSizeInBits)) /
   98|      5|      BigIntDigitSizeInBits;
   99|      5|}
_ZN6hermes6bigint23maxCharsPerDigitInRadixEh:
  108|   781k|inline uint32_t constexpr maxCharsPerDigitInRadix(uint8_t radix) {
  109|       |  // To compute the lower bound of bits in a BigIntDigitType "covered" by a
  110|       |  // char. For power of 2 radixes, it is known (exactly) that each character
  111|       |  // covers log2(radix) bits. For non-power of 2 radixes, a lower bound is
  112|       |  // log2(greatest power of 2 that is less than radix).
  113|   781k|  uint32_t minNumBitsPerChar = radix < 4 ? 1
  ------------------
  |  Branch (113:32): [True: 0, False: 781k]
  ------------------
  114|   781k|      : radix < 8                        ? 2
  ------------------
  |  Branch (114:9): [True: 0, False: 781k]
  ------------------
  115|   781k|      : radix < 16                       ? 3
  ------------------
  |  Branch (115:9): [True: 781k, False: 0]
  ------------------
  116|   781k|      : radix < 32                       ? 4
  ------------------
  |  Branch (116:9): [True: 0, False: 0]
  ------------------
  117|      0|                                         : 5;
  118|       |
  119|       |  // With minNumBitsPerChar being the lower bound estimate of how many bits each
  120|       |  // char can represent, the upper bound of how many chars "fit" in a bigint
  121|       |  // digit is ceil(sizeofInBits(bigint digit) / minNumBitsPerChar).
  122|   781k|  uint32_t numCharsPerDigits = BigIntDigitSizeInBits / (1 << minNumBitsPerChar);
  123|       |
  124|   781k|  return numCharsPerDigits;
  125|   781k|}
_ZN6hermes6bigint19UniquingBigIntTableC2Ev:
  468|    196|  UniquingBigIntTable() = default;
_ZN6hermes6bigint12ParsedBigIntC2EOS1_:
  201|     25|  ParsedBigInt(ParsedBigInt &&) = default;
_ZN6hermes6bigint15getSignExtValueIhhhEENSt3__19enable_ifIXsr3stdE13is_integral_vIT0_EET_E4typeERKS4_:
  137|  2.73M|    const T &value) {
  138|  2.73M|  uint32_t UnsignedTSizeInBits = sizeof(UT) * 8;
  139|  2.73M|  UT unsignedValue = value;
  140|       |
  141|       |  // We rely on the unsigned (i.e., "logical") shift right to convert the sign
  142|       |  // bit to [0, 1], then do 0 - [0, 1] to get 0ull or ~0ull as the sign
  143|       |  // extension value.
  144|  2.73M|  uint64_t signExtValue = 0ull - (unsignedValue >> (UnsignedTSizeInBits - 1));
  145|       |
  146|       |  // But still possibly truncate the value as requested by the caller.
  147|  2.73M|  return static_cast<D>(signExtValue);
  148|  2.73M|}
_ZN6hermes6bigint15getSignExtValueImmmEENSt3__19enable_ifIXsr3stdE13is_integral_vIT0_EET_E4typeERKS4_:
  137|      1|    const T &value) {
  138|      1|  uint32_t UnsignedTSizeInBits = sizeof(UT) * 8;
  139|      1|  UT unsignedValue = value;
  140|       |
  141|       |  // We rely on the unsigned (i.e., "logical") shift right to convert the sign
  142|       |  // bit to [0, 1], then do 0 - [0, 1] to get 0ull or ~0ull as the sign
  143|       |  // extension value.
  144|      1|  uint64_t signExtValue = 0ull - (unsignedValue >> (UnsignedTSizeInBits - 1));
  145|       |
  146|       |  // But still possibly truncate the value as requested by the caller.
  147|      1|  return static_cast<D>(signExtValue);
  148|      1|}

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

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

_ZN6hermes15truncateToInt32Ed:
   37|      2|inline int32_t truncateToInt32(double d) {
   38|       |  /// ARM64 has different behavior when the double value can't fit into
   39|       |  /// int64_t (results in 2^63-1 instead of -2^63 on x86-64), and 2^63-1 can't
   40|       |  /// be represented precisely in double, so it's converted to 2^63. The result
   41|       |  /// is that a double value 2^63 still goes through the fast path and
   42|       |  /// eventually is casted to int32_t and -1 is returned, which is wrong. The
   43|       |  /// solution is to use smaller width integer (so every value can be
   44|       |  /// represented in double). In constant path, we check the range of
   45|       |  /// [-2^53, 2^53], where 53 is the number of precision bits for double. In
   46|       |  /// non-constant fast path, we do a left shift followed by right shift of 1
   47|       |  /// bit to avoid imprecise conversion between double and int64_t on 2^63 (
   48|       |  /// the top 2 bits "10" becomes "00" after the shifting).
   49|       |  /// On 32bit platform, this non-constant path produces less efficient code,
   50|       |  /// so instead, we use conversion to int32_t directly.
   51|       |  /// In addition, use __builtin_constant_p() to avoid UB caused by constant
   52|       |  /// propagation.
   53|       |
   54|      2|  if constexpr (sizeof(void *) == 8) {
   55|       |    // Use this builtin to avoid undefined behavior caused by constant
   56|       |    // propagation when \p d can't fit into int64_t.
   57|      2|#if defined(__GNUC__) || defined(__clang__)
   58|      2|    if (__builtin_constant_p(d)) {
  ------------------
  |  Branch (58:9): [True: 0, False: 2]
  ------------------
   59|      0|#endif
   60|       |      // Be aggressive on constant path, use the maximum precision bits
   61|       |      // of double type for range check.
   62|      0|      if (d >= (int64_t)(-1ULL << 53) && d <= (1LL << 53)) {
  ------------------
  |  Branch (62:11): [True: 0, False: 0]
  |  Branch (62:42): [True: 0, False: 0]
  ------------------
   63|      0|        return (int32_t)(int64_t)d;
   64|      0|      }
   65|      0|#if defined(__GNUC__) || defined(__clang__)
   66|      2|    } else {
   67|      2|      int64_t fast = (int64_t)((uint64_t)d << 1) >> 1;
   68|      2|      if (LLVM_LIKELY(fast == d))
  ------------------
  |  |  188|      2|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1, False: 1]
  |  |  ------------------
  ------------------
   69|      1|        return (int32_t)fast;
   70|      2|    }
   71|      2|#endif
   72|       |  } else {
   73|       |#if defined(__GNUC__) || defined(__clang__)
   74|       |    if (__builtin_constant_p(d)) {
   75|       |#endif
   76|       |      // Converted to int32_t directly on 32bit arch for efficiency.
   77|       |      // Many uint32_t values may fall to slow path though.
   78|       |      if (d >= (int64_t)(-1ULL << 53) && d <= (1LL << 53)) {
   79|       |        return (int32_t)(int64_t)d;
   80|       |      }
   81|       |#if defined(__GNUC__) || defined(__clang__)
   82|       |    } else {
   83|       |      int32_t fast = (int32_t)d;
   84|       |      if (LLVM_LIKELY(fast == d))
   85|       |        return fast;
   86|       |    }
   87|       |#endif
   88|       |  }
   89|      1|  return truncateToInt32SlowPath(d);
   90|      2|}
_ZN6hermes12toArrayIndexEN4llvh9StringRefE:
  142|   546k|inline OptValue<uint32_t> toArrayIndex(llvh::StringRef str) {
  143|   546k|  return toArrayIndex(str.begin(), str.end());
  144|   546k|}
_ZN6hermes18doubleToArrayIndexEd:
  149|  7.20M|inline OptValue<uint32_t> doubleToArrayIndex(double d) {
  150|  7.20M|  uint32_t index = (uint32_t)d;
  151|  7.20M|  if (index == d && index != 0xFFFFFFFFu)
  ------------------
  |  Branch (151:7): [True: 7.20M, False: 0]
  |  Branch (151:21): [True: 7.20M, False: 0]
  ------------------
  152|  7.20M|    return index;
  153|      0|  return llvh::None;
  154|  7.20M|}
_ZN6hermes12toArrayIndexIPKcEENS_8OptValueIjEET_S5_:
  107|  1.43M|OptValue<uint32_t> toArrayIndex(IT first, IT last) {
  108|       |  /// Empty string is invalid.
  109|  1.43M|  if (first == last)
  ------------------
  |  Branch (109:7): [True: 0, False: 1.43M]
  ------------------
  110|      0|    return llvh::None;
  111|       |
  112|       |  // Leading 0 is special.
  113|  1.43M|  if (*first == '0') {
  ------------------
  |  Branch (113:7): [True: 35, False: 1.43M]
  ------------------
  114|     35|    ++first;
  115|       |    // Just "0"?
  116|     35|    if (first == last)
  ------------------
  |  Branch (116:9): [True: 35, False: 0]
  ------------------
  117|     35|      return 0;
  118|       |    // Leading 0 is invalid otherwise.
  119|      0|    return llvh::None;
  120|     35|  }
  121|       |
  122|  1.43M|  uint32_t res = 0;
  123|  3.82M|  do {
  124|  3.82M|    auto ch = *first;
  125|  3.82M|    if (ch < '0' || ch > '9')
  ------------------
  |  Branch (125:9): [True: 22.3k, False: 3.80M]
  |  Branch (125:21): [True: 709k, False: 3.09M]
  ------------------
  126|   732k|      return llvh::None;
  127|  3.09M|    uint64_t tmp = (uint64_t)res * 10 + (ch - '0');
  128|       |    // Check for overflow.
  129|  3.09M|    if (tmp & ((uint64_t)0xFFFFFFFFu << 32))
  ------------------
  |  Branch (129:9): [True: 0, False: 3.09M]
  ------------------
  130|      0|      return llvh::None;
  131|  3.09M|    res = (uint32_t)tmp;
  132|  3.09M|  } while (++first != last);
  ------------------
  |  Branch (132:12): [True: 2.39M, False: 702k]
  ------------------
  133|       |
  134|       |  // 0xFFFFFFFF is not a valid array index.
  135|   702k|  if (res == 0xFFFFFFFFu)
  ------------------
  |  Branch (135:7): [True: 0, False: 702k]
  ------------------
  136|      0|    return llvh::None;
  137|       |
  138|   702k|  return res;
  139|   702k|}
_ZN6hermes17charLetterToLowerIcEET_S1_:
  168|  5.10M|inline T charLetterToLower(T ch) {
  169|  5.10M|  return ch | 32;
  170|  5.10M|}
JSLexer.cpp:_ZN6hermes23parseIntWithRadixDigitsILb1EN4llvh8ArrayRefIcEEZNS_6parser7JSLexer10scanNumberENS5_14GrammarContextEE3$_0EEbT0_iT1_:
  179|     55|bool parseIntWithRadixDigits(Iterable str, int radix, Callback digitCallback) {
  180|     55|  assert(
  181|     55|      radix >= 2 && radix <= 36 && "Invalid radix passed to parseIntWithRadix");
  182|     55|  assert(str.begin() != str.end() && "Empty string");
  183|    145|  for (auto it = str.begin(); it != str.end(); ++it) {
  ------------------
  |  Branch (183:31): [True: 90, False: 55]
  ------------------
  184|     90|    auto c = *it;
  185|     90|    auto cLow = charLetterToLower(c);
  186|     90|    if ('0' <= c && c <= '9' && c < '0' + radix) {
  ------------------
  |  Branch (186:9): [True: 90, False: 0]
  |  Branch (186:21): [True: 90, False: 0]
  |  Branch (186:33): [True: 90, False: 0]
  ------------------
  187|     90|      digitCallback(c - '0');
  188|     90|    } else if ('a' <= cLow && cLow < 'a' + radix - 10) {
  ------------------
  |  Branch (188:16): [True: 0, False: 0]
  |  Branch (188:31): [True: 0, False: 0]
  ------------------
  189|      0|      digitCallback(cLow - 'a' + 0xa);
  190|      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 (190:16): [Folded - Ignored]
  ------------------
  191|       |      // Ensure the '_' is in a valid location.
  192|       |      // It can only be between two existing digits.
  193|      0|      if (it == str.begin() || it == str.end() - 1) {
  ------------------
  |  Branch (193:11): [True: 0, False: 0]
  |  Branch (193:32): [True: 0, False: 0]
  ------------------
  194|      0|        return false;
  195|      0|      }
  196|       |      // Note that the previous character must not be '_' if the current
  197|       |      // character is '_', because we would have returned None.
  198|       |      // So just check if the next character is '_'.
  199|      0|      char next = *(it + 1);
  200|      0|      if (next == '_') {
  ------------------
  |  Branch (200:11): [True: 0, False: 0]
  ------------------
  201|      0|        return false;
  202|      0|      }
  203|      0|    } else {
  204|      0|      return false;
  205|      0|    }
  206|     90|  }
  207|     55|  return true;
  208|     55|}
_ZN6hermes17parseIntWithRadixILb1EN4llvh8ArrayRefIcEEEENS_8OptValueIdEET0_i:
  216|  3.19M|OptValue<double> parseIntWithRadix(Iterable str, int radix) {
  217|  3.19M|  double result = 0;
  218|  3.19M|  bool success = parseIntWithRadixDigits<AllowNumericSeparator>(
  219|  3.19M|      str, radix, [&result, radix](uint8_t d) {
  220|  3.19M|        result *= radix;
  221|  3.19M|        result += d;
  222|  3.19M|      });
  223|  3.19M|  if (!success)
  ------------------
  |  Branch (223:7): [True: 0, False: 3.19M]
  ------------------
  224|      0|    return llvh::None;
  225|       |
  226|       |  // The largest value that fits in the 53-bit mantissa (2**53).
  227|  3.19M|  const double MAX_MANTISSA = 9007199254740992.0;
  228|  3.19M|  if (result >= MAX_MANTISSA && llvh::isPowerOf2_32(radix)) {
  ------------------
  |  Branch (228:7): [True: 294, False: 3.19M]
  |  Branch (228:33): [True: 0, False: 294]
  ------------------
  229|       |    // If the result is too high, manually reconstruct the double if
  230|       |    // the radix is 2, 4, 8, 16, 32.
  231|       |    // Go through the digits bit by bit, and manually round when necessary.
  232|      0|    result = 0;
  233|       |
  234|       |    // Keep track of how far along parsing is using this enum.
  235|      0|    enum Mode {
  236|      0|      LEADING_ZERO, // Haven't seen a set bit yet.
  237|      0|      MANTISSA, // Lower bits that allow exact representation.
  238|      0|      EXP_LOW_BIT, // Lowest bit of the exponent (determine rounding).
  239|      0|      EXP_LEADING_ZERO, // Zeros in the exponent.
  240|      0|      EXPONENT, // Seen a set bit in the exponent.
  241|      0|    };
  242|       |
  243|      0|    size_t remainingMantissa = 53;
  244|      0|    double expFactor = 0.0;
  245|      0|    size_t curDigit = 0;
  246|       |
  247|      0|    bool lastMantissaBit = false;
  248|      0|    bool lowestExponentBit = false;
  249|       |
  250|      0|    Mode curMode = Mode::LEADING_ZERO;
  251|      0|    auto itr = str.begin();
  252|      0|    auto e = str.end();
  253|      0|    for (size_t bitMask = 0;;) {
  254|      0|      if (bitMask == 0) {
  ------------------
  |  Branch (254:11): [True: 0, False: 0]
  ------------------
  255|       |        // Only need to do this check every log2(radix) iterations.
  256|      0|        if (itr == e) {
  ------------------
  |  Branch (256:13): [True: 0, False: 0]
  ------------------
  257|      0|          break;
  258|      0|        }
  259|       |        // We know it fits in 7 bits after the first pass.
  260|      0|        char c = (char)*itr;
  261|      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 (261:13): [Folded - Ignored]
  ------------------
  262|      0|          ++itr;
  263|      0|          continue;
  264|      0|        }
  265|      0|        auto cLow = charLetterToLower(c);
  266|      0|        if ('0' <= c && c <= '9') {
  ------------------
  |  Branch (266:13): [True: 0, False: 0]
  |  Branch (266:25): [True: 0, False: 0]
  ------------------
  267|      0|          curDigit = c - '0';
  268|      0|        } else {
  269|       |          // Must be valid, else we would have returned NaN on first pass.
  270|      0|          assert('a' <= cLow && cLow < 'a' + radix - 10);
  271|      0|          curDigit = cLow - 'a' + 0xa;
  272|      0|        }
  273|      0|        ++itr;
  274|       |        // Reset bitmask to look at the first bit.
  275|      0|        bitMask = radix >> 1;
  276|      0|      }
  277|      0|      bool curBit = (curDigit & bitMask) != 0;
  278|      0|      bitMask >>= 1;
  279|       |
  280|      0|      switch (curMode) {
  ------------------
  |  Branch (280:15): [True: 0, False: 0]
  ------------------
  281|      0|        case Mode::LEADING_ZERO:
  ------------------
  |  Branch (281:9): [True: 0, False: 0]
  ------------------
  282|       |          // Go through the string until we hit a nonzero bit.
  283|      0|          if (curBit) {
  ------------------
  |  Branch (283:15): [True: 0, False: 0]
  ------------------
  284|      0|            --remainingMantissa;
  285|      0|            result = 1;
  286|       |            // No more leading zeros.
  287|      0|            curMode = Mode::MANTISSA;
  288|      0|          }
  289|      0|          break;
  290|      0|        case Mode::MANTISSA:
  ------------------
  |  Branch (290:9): [True: 0, False: 0]
  ------------------
  291|       |          // Read into the lower bits of the mantissa (plain binary).
  292|      0|          result *= 2;
  293|      0|          result += curBit;
  294|      0|          --remainingMantissa;
  295|      0|          if (remainingMantissa == 0) {
  ------------------
  |  Branch (295:15): [True: 0, False: 0]
  ------------------
  296|       |            // Out of bits, set the last bit and go to the next curMode.
  297|      0|            lastMantissaBit = curBit;
  298|      0|            curMode = Mode::EXP_LOW_BIT;
  299|      0|          }
  300|      0|          break;
  301|      0|        case Mode::EXP_LOW_BIT:
  ------------------
  |  Branch (301:9): [True: 0, False: 0]
  ------------------
  302|      0|          lowestExponentBit = curBit;
  303|      0|          expFactor = 2.0;
  304|      0|          curMode = Mode::EXP_LEADING_ZERO;
  305|      0|          break;
  306|      0|        case Mode::EXP_LEADING_ZERO:
  ------------------
  |  Branch (306:9): [True: 0, False: 0]
  ------------------
  307|      0|          if (curBit) {
  ------------------
  |  Branch (307:15): [True: 0, False: 0]
  ------------------
  308|      0|            curMode = Mode::EXPONENT;
  309|      0|          }
  310|      0|          expFactor *= 2.0;
  311|      0|          break;
  312|      0|        case Mode::EXPONENT:
  ------------------
  |  Branch (312:9): [True: 0, False: 0]
  ------------------
  313|      0|          expFactor *= 2.0;
  314|      0|          break;
  315|      0|      }
  316|      0|    }
  317|      0|    switch (curMode) {
  ------------------
  |  Branch (317:13): [True: 0, False: 0]
  ------------------
  318|      0|      case Mode::LEADING_ZERO:
  ------------------
  |  Branch (318:7): [True: 0, False: 0]
  ------------------
  319|      0|      case Mode::MANTISSA:
  ------------------
  |  Branch (319:7): [True: 0, False: 0]
  ------------------
  320|      0|      case Mode::EXP_LOW_BIT:
  ------------------
  |  Branch (320:7): [True: 0, False: 0]
  ------------------
  321|       |        // Nothing to do here, already read those in.
  322|      0|        break;
  323|      0|      case Mode::EXP_LEADING_ZERO:
  ------------------
  |  Branch (323:7): [True: 0, False: 0]
  ------------------
  324|       |        // Rounding up.
  325|      0|        result += lowestExponentBit && lastMantissaBit;
  ------------------
  |  Branch (325:19): [True: 0, False: 0]
  |  Branch (325:40): [True: 0, False: 0]
  ------------------
  326|      0|        result *= expFactor;
  327|      0|        break;
  328|      0|      case Mode::EXPONENT:
  ------------------
  |  Branch (328:7): [True: 0, False: 0]
  ------------------
  329|       |        // Rounding up.
  330|      0|        result += lowestExponentBit;
  331|      0|        result *= expFactor;
  332|      0|        break;
  333|      0|    }
  334|      0|  }
  335|  3.19M|  return result;
  336|  3.19M|}
_ZN6hermes23parseIntWithRadixDigitsILb1EN4llvh8ArrayRefIcEEZNS_17parseIntWithRadixILb1ES3_EENS_8OptValueIdEET0_iEUlhE_EEbS7_iT1_:
  179|  3.19M|bool parseIntWithRadixDigits(Iterable str, int radix, Callback digitCallback) {
  180|  3.19M|  assert(
  181|  3.19M|      radix >= 2 && radix <= 36 && "Invalid radix passed to parseIntWithRadix");
  182|  3.19M|  assert(str.begin() != str.end() && "Empty string");
  183|  8.30M|  for (auto it = str.begin(); it != str.end(); ++it) {
  ------------------
  |  Branch (183:31): [True: 5.10M, False: 3.19M]
  ------------------
  184|  5.10M|    auto c = *it;
  185|  5.10M|    auto cLow = charLetterToLower(c);
  186|  5.10M|    if ('0' <= c && c <= '9' && c < '0' + radix) {
  ------------------
  |  Branch (186:9): [True: 5.10M, False: 0]
  |  Branch (186:21): [True: 5.10M, False: 0]
  |  Branch (186:33): [True: 5.10M, False: 0]
  ------------------
  187|  5.10M|      digitCallback(c - '0');
  188|  5.10M|    } else if ('a' <= cLow && cLow < 'a' + radix - 10) {
  ------------------
  |  Branch (188:16): [True: 0, False: 0]
  |  Branch (188:31): [True: 0, False: 0]
  ------------------
  189|      0|      digitCallback(cLow - 'a' + 0xa);
  190|      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 (190:16): [Folded - Ignored]
  ------------------
  191|       |      // Ensure the '_' is in a valid location.
  192|       |      // It can only be between two existing digits.
  193|      0|      if (it == str.begin() || it == str.end() - 1) {
  ------------------
  |  Branch (193:11): [True: 0, False: 0]
  |  Branch (193:32): [True: 0, False: 0]
  ------------------
  194|      0|        return false;
  195|      0|      }
  196|       |      // Note that the previous character must not be '_' if the current
  197|       |      // character is '_', because we would have returned None.
  198|       |      // So just check if the next character is '_'.
  199|      0|      char next = *(it + 1);
  200|      0|      if (next == '_') {
  ------------------
  |  Branch (200:11): [True: 0, False: 0]
  ------------------
  201|      0|        return false;
  202|      0|      }
  203|      0|    } else {
  204|      0|      return false;
  205|      0|    }
  206|  5.10M|  }
  207|  3.19M|  return true;
  208|  3.19M|}
_ZZN6hermes17parseIntWithRadixILb1EN4llvh8ArrayRefIcEEEENS_8OptValueIdEET0_iENKUlhE_clEh:
  219|  5.10M|      str, radix, [&result, radix](uint8_t d) {
  220|  5.10M|        result *= radix;
  221|  5.10M|        result += d;
  222|  5.10M|      });

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

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

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

_ZN6hermes17OwnedMemoryBufferC2ENSt3__110unique_ptrIN4llvh12MemoryBufferENS1_14default_deleteIS4_EEEE:
   32|     87|      : MemoryBuffer(buffer.get()), data_(std::move(buffer)) {}
_ZN6hermes12MemoryBufferC2EPKN4llvh12MemoryBufferE:
   19|     87|  MemoryBuffer(const llvh::MemoryBuffer *buffer) : buffer_(buffer) {
   20|     87|    data_ = reinterpret_cast<const uint8_t *>(buffer_->getBufferStart());
   21|     87|    size_ = buffer_->getBufferSize();
   22|     87|  }
_ZN6hermes22HermesLLVMMemoryBufferC2ENSt3__110unique_ptrINS_6BufferENS1_14default_deleteIS3_EEEEN4llvh9StringRefEb:
   45|    247|      : name_(name), data_(std::move(buffer)) {
   46|    247|    auto start = reinterpret_cast<const char *>(data_->data());
   47|    247|    auto end = start + data_->size();
   48|    247|    init(start, end, requiresNullTerminator);
   49|    247|  }
_ZNK6hermes22HermesLLVMMemoryBuffer19getBufferIdentifierEv:
   53|    916|  virtual llvh::StringRef getBufferIdentifier() const override {
   54|    916|    return name_;
   55|    916|  }

_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEcvbEv:
   53|  23.4M|  explicit operator bool() const {
   54|  23.4M|    return hasValue_;
   55|  23.4M|  }
_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEE8hasValueEv:
   50|  18.8M|  bool hasValue() const {
   51|  18.8M|    return hasValue_;
   52|  18.8M|  }
_ZNK6hermes8OptValueIjEcvbEv:
   53|  16.7M|  explicit operator bool() const {
   54|  16.7M|    return hasValue_;
   55|  16.7M|  }
_ZN6hermes8OptValueIbEC2EN4llvh8NoneTypeE:
   81|  3.05k|  OptValue(llvh::NoneType) : value_(-1) {}
_ZN6hermes8OptValueIbEC2Eb:
   83|  1.11M|  OptValue(bool v) : value_(v ? 1 : 0) {}
  ------------------
  |  Branch (83:29): [True: 1.11M, False: 3.42k]
  ------------------
_ZNK6hermes8OptValueIbE8hasValueEv:
   89|  2.24M|  bool hasValue() const {
   90|  2.24M|    return value_ >= 0;
   91|  2.24M|  }
_ZNK6hermes8OptValueIbE8getValueEv:
   96|  1.11M|  bool getValue() const {
   97|  1.11M|    assert(hasValue());
   98|  1.11M|    return value_ > 0;
   99|  1.11M|  }
_ZNK6hermes8OptValueIjE8hasValueEv:
   50|  27.2M|  bool hasValue() const {
   51|  27.2M|    return hasValue_;
   52|  27.2M|  }
_ZNK6hermes8OptValueIjEdeEv:
   61|  13.5M|  const T &operator*() const {
   62|  13.5M|    return getValue();
   63|  13.5M|  }
_ZNK6hermes8OptValueIjE8getValueEv:
   57|  14.3M|  const T &getValue() const {
   58|  14.3M|    assert(hasValue());
   59|  14.3M|    return value_;
   60|  14.3M|  }
_ZNK6hermes8OptValueImEcvbEv:
   53|    431|  explicit operator bool() const {
   54|    431|    return hasValue_;
   55|    431|  }
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEEptEv:
   65|  87.4k|  const T *operator->() const {
   66|  87.4k|    return &getValue();
   67|  87.4k|  }
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEE8getValueEv:
   57|   174k|  const T &getValue() const {
   58|   174k|    assert(hasValue());
   59|   174k|    return value_;
   60|   174k|  }
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEE8hasValueEv:
   50|   174k|  bool hasValue() const {
   51|   174k|    return hasValue_;
   52|   174k|  }
_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEdeEv:
   61|  12.4M|  const T &operator*() const {
   62|  12.4M|    return getValue();
   63|  12.4M|  }
_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEE8getValueEv:
   57|  12.4M|  const T &getValue() const {
   58|  12.4M|    assert(hasValue());
   59|  12.4M|    return value_;
   60|  12.4M|  }
_ZN6hermes8OptValueIjEC2ERKj:
   44|  8.84M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEEcvbEv:
   53|  87.3k|  explicit operator bool() const {
   54|  87.3k|    return hasValue_;
   55|  87.3k|  }
_ZN6hermes8OptValueIjEC2EN4llvh8NoneTypeE:
   42|  6.23M|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueINS_3hbc19DebugSourceLocationEEC2ERKS2_:
   44|  87.3k|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueIjEC2Ev:
   43|  6.02M|  explicit OptValue() : hasValue_(false) {}
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEEcvbEv:
   53|  15.9M|  explicit operator bool() const {
   54|  15.9M|    return hasValue_;
   55|  15.9M|  }
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEEdeEv:
   61|  1.92M|  const T &operator*() const {
   62|  1.92M|    return getValue();
   63|  1.92M|  }
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEE8getValueEv:
   57|  1.92M|  const T &getValue() const {
   58|  1.92M|    assert(hasValue());
   59|  1.92M|    return value_;
   60|  1.92M|  }
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEE8hasValueEv:
   50|  1.92M|  bool hasValue() const {
   51|  1.92M|    return hasValue_;
   52|  1.92M|  }
_ZN6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEC2EN4llvh8NoneTypeE:
   42|  16.3M|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEC2ERKS3_:
   44|  12.4M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueINS_2vm13PropertyFlagsEEC2ERKS2_:
   44|  1.68M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueINS_2vm13PropertyFlagsEEC2EN4llvh8NoneTypeE:
   42|  2.61M|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueINS_2vm8SymbolIDEEC2Ev:
   43|     52|  explicit OptValue() : hasValue_(false) {}
_ZNK6hermes8OptValueINS_2vm13PropertyFlagsEEcvbEv:
   53|  4.29M|  explicit operator bool() const {
   54|  4.29M|    return hasValue_;
   55|  4.29M|  }
_ZNK6hermes8OptValueINS_2vm13PropertyFlagsEEptEv:
   65|   840k|  const T *operator->() const {
   66|   840k|    return &getValue();
   67|   840k|  }
_ZNK6hermes8OptValueINS_2vm13PropertyFlagsEE8getValueEv:
   57|  1.68M|  const T &getValue() const {
   58|  1.68M|    assert(hasValue());
   59|  1.68M|    return value_;
   60|  1.68M|  }
_ZNK6hermes8OptValueINS_2vm13PropertyFlagsEE8hasValueEv:
   50|  1.68M|  bool hasValue() const {
   51|  1.68M|    return hasValue_;
   52|  1.68M|  }
_ZNK6hermes8OptValueINS_2vm13PropertyFlagsEEdeEv:
   61|   840k|  const T &operator*() const {
   62|   840k|    return getValue();
   63|   840k|  }
_ZN6hermes8OptValueIdEC2ERKd:
   44|  3.19M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueIdE8getValueEv:
   57|  3.19M|  const T &getValue() const {
   58|  3.19M|    assert(hasValue());
   59|  3.19M|    return value_;
   60|  3.19M|  }
_ZNK6hermes8OptValueIdE8hasValueEv:
   50|  3.19M|  bool hasValue() const {
   51|  3.19M|    return hasValue_;
   52|  3.19M|  }
_ZNK6hermes8OptValueIdEcvbEv:
   53|  3.19M|  explicit operator bool() const {
   54|  3.19M|    return hasValue_;
   55|  3.19M|  }
_ZN6hermes8OptValueIN8facebook6hermes8debugger8StepModeEEC2EN4llvh8NoneTypeE:
   42|    160|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZNK6hermes8OptValueIN4llvh9StringRefEE8hasValueEv:
   50|    745|  bool hasValue() const {
   51|    745|    return hasValue_;
   52|    745|  }
_ZNK6hermes8OptValueIN4llvh9StringRefEE8getValueEv:
   57|    744|  const T &getValue() const {
   58|    744|    assert(hasValue());
   59|    744|    return value_;
   60|    744|  }
_ZNK6hermes8OptValueIN4llvh9StringRefEEdeEv:
   61|    744|  const T &operator*() const {
   62|    744|    return getValue();
   63|    744|  }
_ZN6hermes8OptValueINS_2vm8Metadata9ArrayDataEEC2Ev:
   43|    316|  explicit OptValue() : hasValue_(false) {}
_ZN6hermes8OptValueINS_2vm8Metadata9ArrayDataEEC2ERKS3_:
   44|      8|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueImEdeEv:
   61|    318|  const T &operator*() const {
   62|    318|    return getValue();
   63|    318|  }
_ZNK6hermes8OptValueImE8getValueEv:
   57|    318|  const T &getValue() const {
   58|    318|    assert(hasValue());
   59|    318|    return value_;
   60|    318|  }
_ZNK6hermes8OptValueImE8hasValueEv:
   50|    318|  bool hasValue() const {
   51|    318|    return hasValue_;
   52|    318|  }
_ZN6hermes8OptValueImEC2EN4llvh8NoneTypeE:
   42|    113|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueImEC2ERKm:
   44|    318|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEEdeEv:
   61|  87.2k|  const T &operator*() const {
   62|  87.2k|    return getValue();
   63|  87.2k|  }
_ZN6hermes8OptValueIN4llvh9StringRefEEC2ERKS2_:
   44|  2.89M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueIN4llvh9StringRefEEC2ENS1_8NoneTypeE:
   42|      1|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZNK6hermes8OptValueIN4llvh9StringRefEEcvbEv:
   53|  1.44M|  explicit operator bool() const {
   54|  1.44M|    return hasValue_;
   55|  1.44M|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEE8hasValueEv:
   50|    912|  bool hasValue() const {
   51|    912|    return hasValue_;
   52|    912|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEEdeEv:
   61|    106|  const T &operator*() const {
   62|    106|    return getValue();
   63|    106|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEE8getValueEv:
   57|    106|  const T &getValue() const {
   58|    106|    assert(hasValue());
   59|    106|    return value_;
   60|    106|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEEcvbEv:
   53|    105|  explicit operator bool() const {
   54|    105|    return hasValue_;
   55|    105|  }
_ZN6hermes8OptValueINS_9SubsystemEEC2ERKS1_:
   44|    600|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueINS_6parser9TokenKindEEC2ERKS2_:
   44|    725|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueINS_6parser9TokenKindEEC2EN4llvh8NoneTypeE:
   42|    971|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermeseqINS_6parser9TokenKindES2_EEbRKNS_8OptValueIT_EERKNS3_IT0_EE:
  110|    104|bool operator==(const OptValue<T> &a, const OptValue<U> &b) {
  111|    104|  if (a && b)
  ------------------
  |  Branch (111:7): [True: 1, False: 103]
  |  Branch (111:12): [True: 1, False: 0]
  ------------------
  112|      1|    return *a == *b;
  113|    103|  return a.hasValue() == b.hasValue();
  114|    104|}
_ZN6hermes8OptValueIcEC2Ev:
   43|    188|  explicit OptValue() : hasValue_(false) {}
_ZN6hermes8OptValueIcEC2ERKc:
   44|     82|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueIcEcvbEv:
   53|    140|  explicit operator bool() const {
   54|    140|    return hasValue_;
   55|    140|  }
_ZNK6hermes8OptValueIcEdeEv:
   61|     77|  const T &operator*() const {
   62|     77|    return getValue();
   63|     77|  }
_ZNK6hermes8OptValueIcE8getValueEv:
   57|     77|  const T &getValue() const {
   58|     77|    assert(hasValue());
   59|     77|    return value_;
   60|     77|  }
_ZNK6hermes8OptValueIcE8hasValueEv:
   50|    125|  bool hasValue() const {
   51|    125|    return hasValue_;
   52|    125|  }
_ZN6hermes8OptValueINS_9SubsystemEEC2EN4llvh8NoneTypeE:
   42|    247|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZNK6hermes8OptValueINS_9SubsystemEEcvbEv:
   53|    746|  explicit operator bool() const {
   54|    746|    return hasValue_;
   55|    746|  }

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

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

_ZNK6hermes18SourceErrorManager12SourceCoords7isValidEv:
   87|     12|    bool isValid() const {
   88|     12|      return bufId != 0;
   89|     12|    }
_ZNK6hermes18SourceErrorManager12SourceCoords18isSameSourceLineAsERKS1_:
   91|     11|    bool isSameSourceLineAs(const SourceCoords &c) const {
   92|     11|      return isValid() && bufId == c.bufId && line == c.line;
  ------------------
  |  Branch (92:14): [True: 11, False: 0]
  |  Branch (92:27): [True: 11, False: 0]
  |  Branch (92:47): [True: 10, False: 1]
  ------------------
   93|     11|    }
_ZN6hermes18SourceErrorManager11MessageDataC2ENS0_8DiagKindEN4llvh5SMLocENS3_7SMRangeEONSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
  207|     16|        : dk(dk), loc(loc), sm(sm), msg(std::move(msg)) {}
_ZN6hermes18SourceErrorManager16isWarningEnabledENS_7WarningE:
  250|    670|  bool isWarningEnabled(Warning warning) {
  251|    670|    return warningStatuses_.test((unsigned)warning);
  252|    670|  }
_ZN6hermes18SourceErrorManager13setErrorLimitEj:
  271|    494|  void setErrorLimit(unsigned errorLimit) {
  272|    494|    errorLimit_ = errorLimit == 0 ? UINT_MAX : errorLimit;
  ------------------
  |  Branch (272:19): [True: 247, False: 247]
  ------------------
  273|    494|  }
_ZNK6hermes18SourceErrorManager13getErrorLimitEv:
  275|    247|  unsigned int getErrorLimit() const {
  276|    247|    return errorLimit_ == UINT_MAX ? 0 : errorLimit_;
  ------------------
  |  Branch (276:12): [True: 247, False: 0]
  ------------------
  277|    247|  }
_ZNK6hermes18SourceErrorManager19isErrorLimitReachedEv:
  280|     25|  bool isErrorLimitReached() const {
  281|     25|    return errorLimitReached_;
  282|     25|  }
_ZN6hermes18SourceErrorManager22clearErrorLimitReachedEv:
  285|    494|  void clearErrorLimitReached() {
  286|    494|    messageCount_[DK_Error] = 0;
  287|    494|    errorLimitReached_ = false;
  288|    494|  }
_ZNK6hermes18SourceErrorManager16isWarningAnErrorENS_7WarningE:
  292|    670|  bool isWarningAnError(Warning warning) const {
  293|    670|    return warningsAreErrors_.test((unsigned)warning);
  294|    670|  }
_ZN6hermes18SourceErrorManager16setWarningStatusENS_7WarningEb:
  316|    247|  void setWarningStatus(Warning warning, bool enabled) {
  317|    247|    warningStatuses_[(unsigned)warning] = enabled;
  318|    247|  }
_ZN6hermes18SourceErrorManager14setDiagHandlerEPFvRKN4llvh12SMDiagnosticEPvES5_:
  330|    494|  void setDiagHandler(DiagHandlerTy DH, void *ctx = nullptr) {
  331|    494|    sm_.setDiagHandler(DH, ctx);
  332|    494|  }
_ZNK6hermes18SourceErrorManager14getDiagHandlerEv:
  335|    247|  DiagHandlerTy getDiagHandler() const {
  336|    247|    return sm_.getDiagHandler();
  337|    247|  }
_ZNK6hermes18SourceErrorManager14getDiagContextEv:
  340|    247|  void *getDiagContext() const {
  341|    247|    return sm_.getDiagContext();
  342|    247|  }
_ZNK6hermes18SourceErrorManager17isVirtualBufferIdEj:
  363|  1.21k|  inline bool isVirtualBufferId(unsigned bufId) const {
  364|  1.21k|    return (bufId & kVirtualBufIdTag) != 0;
  365|  1.21k|  }
_ZNK6hermes18SourceErrorManager15getSourceBufferEj:
  370|    610|  const llvh::MemoryBuffer *getSourceBuffer(unsigned bufId) const {
  371|    610|    assert(!isVirtualBufferId(bufId) && "virtual buffers cannot be accessed");
  372|    610|    return sm_.getMemoryBuffer(bufId);
  373|    610|  }
_ZNK6hermes18SourceErrorManager19getSourceMappingUrlEj:
  386|    196|  llvh::StringRef getSourceMappingUrl(unsigned bufId) const {
  387|    196|    const auto it = sourceMappingUrls_.find(bufId);
  388|    196|    if (it == sourceMappingUrls_.end()) {
  ------------------
  |  Branch (388:9): [True: 196, False: 0]
  ------------------
  389|    196|      return "";
  390|    196|    }
  391|      0|    return it->second;
  392|    196|  }
_ZN6hermes18SourceErrorManager12setSourceUrlEjN4llvh9StringRefE:
  396|      2|  void setSourceUrl(unsigned bufId, llvh::StringRef url) {
  397|      2|    if (!url.empty())
  ------------------
  |  Branch (397:9): [True: 2, False: 0]
  ------------------
  398|      2|      sourceUrls_[bufId] = url;
  399|      0|    else
  400|      0|      sourceUrls_.erase(bufId);
  401|      2|  }
_ZNK6hermes18SourceErrorManager12getSourceUrlEj:
  405|    196|  llvh::StringRef getSourceUrl(unsigned bufId) const {
  406|    196|    const auto it = sourceUrls_.find(bufId);
  407|    196|    if (it != sourceUrls_.end()) {
  ------------------
  |  Branch (407:9): [True: 1, False: 195]
  ------------------
  408|      1|      return it->second;
  409|      1|    }
  410|    195|    return getBufferFileName(bufId);
  411|    196|  }
_ZN6hermes18SourceErrorManager5errorEN4llvh5SMLocENS1_7SMRangeERKNS1_5TwineENS_9SubsystemE:
  479|     10|      Subsystem subsystem = Subsystem::Unspecified) {
  480|     10|    message(DK_Error, loc, rng, msg, subsystem);
  481|     10|  }
_ZN6hermes18SourceErrorManager5errorEN4llvh7SMRangeERKNS1_5TwineENS_9SubsystemE:
  508|      9|      Subsystem subsystem = Subsystem::Unspecified) {
  509|      9|    message(DK_Error, rng, msg, subsystem);
  510|      9|  }
_ZN6hermes18SourceErrorManager7warningEN4llvh7SMRangeERKNS1_5TwineENS_9SubsystemE:
  514|    670|      Subsystem subsystem = Subsystem::Unspecified) {
  515|    670|    warning(Warning::Misc, rng, msg, subsystem);
  516|    670|  }
_ZN6hermes18SourceErrorManager7warningENS_7WarningEN4llvh7SMRangeERKNS2_5TwineENS_9SubsystemE:
  521|    670|      Subsystem subsystem = Subsystem::Unspecified) {
  522|    670|    message(DK_Warning, rng.Start, rng, msg, w, subsystem);
  523|    670|  }
_ZN6hermes18SourceErrorManager5errorEN4llvh5SMLocERKNS1_5TwineENS_9SubsystemE:
  534|     45|      Subsystem subsystem = Subsystem::Unspecified) {
  535|     45|    message(DK_Error, loc, msg, subsystem);
  536|     45|  }
_ZN6hermes18SourceErrorManager4noteEN4llvh5SMLocERKNS1_5TwineENS_9SubsystemE:
  553|     12|      Subsystem subsystem = Subsystem::Unspecified) {
  554|     12|    message(DK_Note, loc, msg, subsystem);
  555|     12|  }
_ZNK6hermes18SourceErrorManager15getMessageCountENS0_8DiagKindE:
  557|  1.38k|  unsigned getMessageCount(DiagKind dk) const {
  558|  1.38k|    assert(dk <= DK_Note);
  559|  1.38k|    return messageCount_[dk];
  560|  1.38k|  }
_ZNK6hermes18SourceErrorManager13getErrorCountEv:
  562|  1.38k|  unsigned getErrorCount() const {
  563|  1.38k|    return getMessageCount(DK_Error);
  564|  1.38k|  }
_ZN6hermes18SourceErrorManager16combineIntoRangeEN4llvh5SMLocES2_:
  573|     10|  static SMRange combineIntoRange(SMLoc a, SMLoc b) {
  574|     10|    if (a.getPointer() < b.getPointer())
  ------------------
  |  Branch (574:9): [True: 10, False: 0]
  ------------------
  575|     10|      return SMRange(a, SMLoc::getFromPointer(b.getPointer() + 1));
  576|      0|    else
  577|      0|      return SMRange(b, SMLoc::getFromPointer(a.getPointer() + 1));
  578|     10|  }
_ZN6hermes18SourceErrorManager23SaveAndSuppressMessagesC2EPS0_NS_9SubsystemE:
  594|    600|        : sm_(sm), messagesSuppressed_(sm->suppressMessages_) {
  595|    600|      sm->suppressMessages_ = subsystem;
  596|    600|    }
_ZN6hermes18SourceErrorManager23SaveAndSuppressMessagesD2Ev:
  597|    600|    ~SaveAndSuppressMessages() {
  598|    600|      sm_->suppressMessages_ = messagesSuppressed_;
  599|    600|    }
_ZN6hermes18SourceErrorManager21SaveAndBufferMessagesC2EPS0_:
  608|    204|    SaveAndBufferMessages(SourceErrorManager *sm) : sm_(sm) {
  609|    204|      sm->enableBuffering();
  610|    204|    }
_ZN6hermes18SourceErrorManager21SaveAndBufferMessagesD2Ev:
  611|    204|    ~SaveAndBufferMessages() {
  612|    204|      sm_->disableBuffering();
  613|    204|    }
_ZN6hermes18SourceErrorManager12SourceCoordsC2Ev:
   83|  4.28M|    SourceCoords() = default;

_ZN6hermes18StackOverflowGuard13isOverflowingEv:
   59|  6.11M|  inline bool isOverflowing() {
   60|       |    // Check for overflow by subtracting the sp from the high pointer.
   61|       |    // If the sp is outside the valid stack range, the difference will
   62|       |    // be greater than the known stack size.
   63|       |    // This is clearly true when 0 < sp < nativeStackHigh_ - size.
   64|       |    // If nativeStackHigh_ < sp, then the subtraction will wrap around.
   65|       |    // We know that nativeStackSize_ <= nativeStackHigh_
   66|       |    // (because otherwise the stack wouldn't fit in the memory),
   67|       |    // so the overflowed difference will be greater than nativeStackSize_.
   68|  6.11M|    if (LLVM_LIKELY(!(
  ------------------
  |  |  188|  6.11M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 6.11M, False: 160]
  |  |  ------------------
  ------------------
   69|  6.11M|            (uintptr_t)nativeStackHigh - (uintptr_t)__builtin_frame_address(0) >
   70|  6.11M|            nativeStackSize))) {
   71|       |      // Fast path: quickly check the stored stack bounds.
   72|       |      // NOTE: It is possible to have a false negative here (highly unlikely).
   73|       |      // If the program creates many threads and destroys them, a new
   74|       |      // thread's stack could overlap the saved stack so we'd be checking
   75|       |      // against the wrong bounds.
   76|  6.11M|      return false;
   77|  6.11M|    }
   78|       |    // Slow path: might be overflowing, but update the stack bounds first
   79|       |    // in case execution has changed threads.
   80|    160|    return isStackOverflowingSlowPath();
   81|  6.11M|  }
_ZN6hermes18StackOverflowGuard26isStackOverflowingSlowPathEv:
   94|    160|  bool isStackOverflowingSlowPath() {
   95|    160|    auto [highPtr, size] = oscompat::thread_stack_bounds(nativeStackGap);
   96|    160|    nativeStackHigh = (const char *)highPtr;
   97|    160|    nativeStackSize = size;
   98|    160|    return LLVM_UNLIKELY(
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  ------------------
   99|    160|        (uintptr_t)nativeStackHigh - (uintptr_t)__builtin_frame_address(0) >
  100|    160|        nativeStackSize);
  101|    160|  }
_ZN6hermes18StackOverflowGuardC2Ej:
   40|    160|  explicit StackOverflowGuard(unsigned stackGap) : nativeStackGap(stackGap) {}
_ZN6hermes18StackOverflowGuard16nativeStackGuardEj:
   52|    160|  static StackOverflowGuard nativeStackGuard(unsigned stackGap) {
   53|    160|    return StackOverflowGuard(stackGap);
   54|    160|  }
_ZN6hermes18StackOverflowGuard16clearStackBoundsEv:
   84|     52|  inline void clearStackBounds() {
   85|     52|    nativeStackHigh = nullptr;
   86|     52|    nativeStackSize = 0;
   87|     52|  }

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

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

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

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

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

_ZN6hermes11isUTF8StartEc:
   28|  34.6M|inline bool isUTF8Start(char ch) {
   29|  34.6M|  return (ch & 0x80) != 0;
   30|  34.6M|}
_ZN6hermes10isAllASCIIEPKcS1_:
   68|  1.17M|inline bool isAllASCII(const char *start, const char *end) {
   69|  1.17M|  return isAllASCII((const uint8_t *)start, (const uint8_t *)end);
   70|  1.17M|}
_ZN6hermes10decodeUTF8ILb0EZNS_6parser7JSLexer10decodeUTF8EvEUlRKN4llvh5TwineEE_EEjRPKcT0_:
  188|    105|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|    105|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|    105|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4, False: 101]
  |  |  ------------------
  ------------------
  190|      4|    return *from++;
  191|       |
  192|    101|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|    105|}
_ZN6hermes19_decodeUTF8SlowPathILb0EZNS_6parser7JSLexer10decodeUTF8EvEUlRKN4llvh5TwineEE_EEjRPKcT0_:
   77|    101|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|    101|  uint32_t ch = (uint32_t)from[0];
   79|    101|  uint32_t result;
   80|       |
   81|    101|  assert(isUTF8Start(ch));
   82|       |
   83|    101|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|    101|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7, False: 94]
  |  |  ------------------
  ------------------
   84|      7|    uint32_t ch1 = (uint32_t)from[1];
   85|      7|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|      7|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 6]
  |  |  ------------------
  ------------------
   86|      1|      from += 1;
   87|      1|      error("Invalid UTF-8 continuation byte");
   88|      1|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      1|    }
   90|       |
   91|      6|    from += 2;
   92|      6|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|      6|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|      6|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|     94|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|     94|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 82, False: 12]
  |  |  ------------------
  ------------------
   99|     82|    uint32_t ch1 = (uint32_t)from[1];
  100|     82|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|    164|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 82]
  |  |  |  Branch (189:53): [True: 0, False: 82]
  |  |  |  Branch (189:53): [True: 0, False: 82]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|     82|    uint32_t ch2 = (uint32_t)from[2];
  106|     82|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|    164|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 82]
  |  |  |  Branch (189:53): [True: 0, False: 82]
  |  |  |  Branch (189:53): [True: 0, False: 82]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|     82|    from += 3;
  112|     82|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|     82|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|     82|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 82]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|     82|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    165|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 82]
  |  |  |  Branch (189:53): [True: 1, False: 81]
  |  |  |  Branch (189:53): [True: 0, False: 1]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|     82|            result >= UNICODE_SURROGATE_FIRST &&
  119|     82|            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|     82|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 11, False: 1]
  ------------------
  125|     11|    uint32_t ch1 = (uint32_t)from[1];
  126|     11|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|     22|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 10]
  |  |  |  Branch (189:53): [True: 0, False: 11]
  |  |  |  Branch (189:53): [True: 1, False: 10]
  |  |  ------------------
  ------------------
  127|      1|      from += 1;
  128|      1|      error("Invalid UTF-8 continuation byte");
  129|      1|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      1|    }
  131|     10|    uint32_t ch2 = (uint32_t)from[2];
  132|     10|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|     20|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  |  Branch (189:53): [True: 0, False: 10]
  |  |  |  Branch (189:53): [True: 0, False: 10]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|     10|    uint32_t ch3 = (uint32_t)from[3];
  138|     10|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|     20|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  |  Branch (189:53): [True: 0, False: 10]
  |  |  |  Branch (189:53): [True: 0, False: 10]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|     10|    from += 4;
  144|     10|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|     10|        (ch3 & 0x3F);
  146|     10|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|     10|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|     10|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|     10|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|     10|  } else {
  156|      1|    from += 1;
  157|      1|    error("Invalid UTF-8 lead byte 0x" + llvh::Twine::utohexstr((uint8_t)ch));
  158|      1|    return UNICODE_REPLACEMENT_CHARACTER;
  159|      1|  }
  160|       |
  161|     98|  return result;
  162|    101|}
_ZN6hermes19_decodeUTF8SlowPathILb0EZNS_6parser7JSLexer19_decodeUTF8SlowPathERPKcEUlRKN4llvh5TwineEE_EEjS5_T0_:
   77|  3.74k|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|  3.74k|  uint32_t ch = (uint32_t)from[0];
   79|  3.74k|  uint32_t result;
   80|       |
   81|  3.74k|  assert(isUTF8Start(ch));
   82|       |
   83|  3.74k|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|  3.74k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.28k, False: 2.45k]
  |  |  ------------------
  ------------------
   84|  1.28k|    uint32_t ch1 = (uint32_t)from[1];
   85|  1.28k|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|  1.28k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 1.28k]
  |  |  ------------------
  ------------------
   86|      1|      from += 1;
   87|      1|      error("Invalid UTF-8 continuation byte");
   88|      1|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      1|    }
   90|       |
   91|  1.28k|    from += 2;
   92|  1.28k|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|  1.28k|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|  1.28k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.28k]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|  2.45k|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|  2.45k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.10k, False: 1.35k]
  |  |  ------------------
  ------------------
   99|  1.10k|    uint32_t ch1 = (uint32_t)from[1];
  100|  1.10k|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.21k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.10k]
  |  |  |  Branch (189:53): [True: 0, False: 1.10k]
  |  |  |  Branch (189:53): [True: 0, False: 1.10k]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|  1.10k|    uint32_t ch2 = (uint32_t)from[2];
  106|  1.10k|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.21k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.10k]
  |  |  |  Branch (189:53): [True: 0, False: 1.10k]
  |  |  |  Branch (189:53): [True: 0, False: 1.10k]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|  1.10k|    from += 3;
  112|  1.10k|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|  1.10k|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|  1.10k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.10k]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|  1.10k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  2.21k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 1.10k]
  |  |  |  Branch (189:53): [True: 7, False: 1.09k]
  |  |  |  Branch (189:53): [True: 1, False: 6]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|  1.10k|            result >= UNICODE_SURROGATE_FIRST &&
  119|  1.10k|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      1|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      1|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      1|    }
  123|       |
  124|  1.35k|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 1.35k, False: 0]
  ------------------
  125|  1.35k|    uint32_t ch1 = (uint32_t)from[1];
  126|  1.35k|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.70k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.35k]
  |  |  |  Branch (189:53): [True: 0, False: 1.35k]
  |  |  |  Branch (189:53): [True: 0, False: 1.35k]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|  1.35k|    uint32_t ch2 = (uint32_t)from[2];
  132|  1.35k|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.70k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.35k]
  |  |  |  Branch (189:53): [True: 0, False: 1.35k]
  |  |  |  Branch (189:53): [True: 0, False: 1.35k]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|  1.35k|    uint32_t ch3 = (uint32_t)from[3];
  138|  1.35k|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.70k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.35k]
  |  |  |  Branch (189:53): [True: 0, False: 1.35k]
  |  |  |  Branch (189:53): [True: 0, False: 1.35k]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|  1.35k|    from += 4;
  144|  1.35k|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|  1.35k|        (ch3 & 0x3F);
  146|  1.35k|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|  1.35k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.35k]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|  1.35k|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|  1.35k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.35k]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|  1.35k|  } 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|  3.73k|  return result;
  162|  3.74k|}
_ZN6hermes19_decodeUTF8SlowPathILb0EZNKS_6parser7JSLexer9_peekUTF8EPKcEUlRKN4llvh5TwineEE_EEjRS4_T0_:
   77|  16.1k|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|  16.1k|  uint32_t ch = (uint32_t)from[0];
   79|  16.1k|  uint32_t result;
   80|       |
   81|  16.1k|  assert(isUTF8Start(ch));
   82|       |
   83|  16.1k|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|  16.1k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 14.7k, False: 1.38k]
  |  |  ------------------
  ------------------
   84|  14.7k|    uint32_t ch1 = (uint32_t)from[1];
   85|  14.7k|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|  14.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14.7k]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|  14.7k|    from += 2;
   92|  14.7k|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|  14.7k|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|  14.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14.7k]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|  14.7k|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|  1.38k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 77, False: 1.31k]
  |  |  ------------------
  ------------------
   99|     77|    uint32_t ch1 = (uint32_t)from[1];
  100|     77|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|    154|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 77]
  |  |  |  Branch (189:53): [True: 0, False: 77]
  |  |  |  Branch (189:53): [True: 0, False: 77]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|     77|    uint32_t ch2 = (uint32_t)from[2];
  106|     77|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|    154|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 77]
  |  |  |  Branch (189:53): [True: 0, False: 77]
  |  |  |  Branch (189:53): [True: 0, False: 77]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|     77|    from += 3;
  112|     77|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|     77|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|     77|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 77]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|     77|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    202|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 77]
  |  |  |  Branch (189:53): [True: 48, False: 29]
  |  |  |  Branch (189:53): [True: 0, False: 48]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|     77|            result >= UNICODE_SURROGATE_FIRST &&
  119|     77|            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|  1.31k|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 1.31k, False: 0]
  ------------------
  125|  1.31k|    uint32_t ch1 = (uint32_t)from[1];
  126|  1.31k|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.62k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 1.30k]
  |  |  |  Branch (189:53): [True: 0, False: 1.31k]
  |  |  |  Branch (189:53): [True: 1, False: 1.30k]
  |  |  ------------------
  ------------------
  127|      1|      from += 1;
  128|      1|      error("Invalid UTF-8 continuation byte");
  129|      1|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      1|    }
  131|  1.30k|    uint32_t ch2 = (uint32_t)from[2];
  132|  1.30k|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.61k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.30k]
  |  |  |  Branch (189:53): [True: 0, False: 1.30k]
  |  |  |  Branch (189:53): [True: 0, False: 1.30k]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|  1.30k|    uint32_t ch3 = (uint32_t)from[3];
  138|  1.30k|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.61k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.30k]
  |  |  |  Branch (189:53): [True: 0, False: 1.30k]
  |  |  |  Branch (189:53): [True: 0, False: 1.30k]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|  1.30k|    from += 4;
  144|  1.30k|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|  1.30k|        (ch3 & 0x3F);
  146|  1.30k|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|  1.30k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.30k]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|  1.30k|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|  1.30k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.30k]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|  1.30k|  } 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|  16.1k|  return result;
  162|  16.1k|}
_ZN6hermes32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEET_S7_PKcS9_:
  219|    120|    const char *end8) {
  220|   959k|  while (begin8 < end8)
  ------------------
  |  Branch (220:10): [True: 959k, False: 120]
  ------------------
  221|   959k|    encodeUTF16(dest, decodeUTF8<true>(begin8, [](const llvh::Twine &) {
  222|   959k|                  llvm_unreachable("invalid UTF-8");
  223|   959k|                }));
  224|    120|  return dest;
  225|    120|}
_ZN6hermes11encodeUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEEvRT_j:
  198|   959k|inline void encodeUTF16(OutIt &dest, uint32_t cp) {
  199|   959k|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|   959k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 959k, False: 0]
  |  |  ------------------
  ------------------
  200|   959k|    *dest = (uint16_t)cp;
  201|   959k|    ++dest; // Use pre-increment in case this is an iterator.
  202|   959k|  } 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|   959k|}
_ZN6hermes10decodeUTF8ILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEET_S8_PKcSA_EUlRKNS4_5TwineEE_EEjRSA_T0_:
  188|   959k|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|   959k|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|   959k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 959k, False: 21]
  |  |  ------------------
  ------------------
  190|   959k|    return *from++;
  191|       |
  192|     21|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|   959k|}
_ZN6hermes19_decodeUTF8SlowPathILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEET_S8_PKcSA_EUlRKNS4_5TwineEE_EEjRSA_T0_:
   77|     21|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|     21|  uint32_t ch = (uint32_t)from[0];
   79|     21|  uint32_t result;
   80|       |
   81|     21|  assert(isUTF8Start(ch));
   82|       |
   83|     21|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|     21|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 10, False: 11]
  |  |  ------------------
  ------------------
   84|     10|    uint32_t ch1 = (uint32_t)from[1];
   85|     10|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|     10|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|     10|    from += 2;
   92|     10|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|     10|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|     10|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|     11|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|     11|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 11, False: 0]
  |  |  ------------------
  ------------------
   99|     11|    uint32_t ch1 = (uint32_t)from[1];
  100|     11|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|     22|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  |  Branch (189:53): [True: 0, False: 11]
  |  |  |  Branch (189:53): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|     11|    uint32_t ch2 = (uint32_t)from[2];
  106|     11|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|     22|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  |  Branch (189:53): [True: 0, False: 11]
  |  |  |  Branch (189:53): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|     11|    from += 3;
  112|     11|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|     11|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|     11|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|     11|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     30|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  |  Branch (189:53): [True: 4, False: 7]
  |  |  |  Branch (189:53): [True: 4, False: 0]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|     11|            result >= UNICODE_SURROGATE_FIRST &&
  119|     11|            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|     11|  } 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|     21|  return result;
  162|     21|}
_ZN6hermes10isAllASCIIIPKDsEEbT_S3_:
   56|   390k|inline bool isAllASCII(Iter begin, Iter end) {
   57|  10.9M|  while (begin < end) {
  ------------------
  |  Branch (57:10): [True: 10.5M, False: 390k]
  ------------------
   58|  10.5M|    if (!isASCII(*begin))
  ------------------
  |  Branch (58:9): [True: 3, False: 10.5M]
  ------------------
   59|      3|      return false;
   60|  10.5M|    ++begin;
   61|  10.5M|  }
   62|   390k|  return true;
   63|   390k|}
_ZN6hermes7isASCIIIDsEEbT_:
   46|  10.5M|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|  10.5M|  constexpr uint32_t asciiMask = 0x7f;
   51|  10.5M|  return (c & static_cast<Char>(~asciiMask)) == 0;
   52|  10.5M|}
BytecodeGenerator.cpp:_ZN6hermes10decodeUTF8ILb0EZNS_3hbc12_GLOBAL__N_119ensureUTF8IdentiferERNS_11StringTableENS_10IdentifierERNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEE3$_0EEjRPKcT0_:
  188|   167k|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|   167k|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|   167k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 167k, False: 4]
  |  |  ------------------
  ------------------
  190|   167k|    return *from++;
  191|       |
  192|      4|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|   167k|}
BytecodeGenerator.cpp:_ZN6hermes19_decodeUTF8SlowPathILb0EZNS_3hbc12_GLOBAL__N_119ensureUTF8IdentiferERNS_11StringTableENS_10IdentifierERNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEE3$_0EEjRPKcT0_:
   77|      4|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|      4|  uint32_t ch = (uint32_t)from[0];
   79|      4|  uint32_t result;
   80|       |
   81|      4|  assert(isUTF8Start(ch));
   82|       |
   83|      4|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|      4|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 4]
  |  |  ------------------
  ------------------
   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|      4|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|      4|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4, False: 0]
  |  |  ------------------
  ------------------
   99|      4|    uint32_t ch1 = (uint32_t)from[1];
  100|      4|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|      4|    uint32_t ch2 = (uint32_t)from[2];
  106|      4|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|      4|    from += 3;
  112|      4|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|      4|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|      4|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     16|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 0]
  |  |  |  Branch (189:53): [True: 4, False: 0]
  |  |  |  Branch (189:53): [True: 4, False: 0]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|      4|            result >= UNICODE_SURROGATE_FIRST &&
  119|      4|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      4|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      4|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      4|    }
  123|       |
  124|      4|  } 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|      0|  return result;
  162|      4|}
_ZN6hermes32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorINS1_6vectorIDsNS1_9allocatorIDsEEEEEEEET_S8_PKcSA_:
  219|    388|    const char *end8) {
  220|  1.60M|  while (begin8 < end8)
  ------------------
  |  Branch (220:10): [True: 1.60M, False: 388]
  ------------------
  221|  1.60M|    encodeUTF16(dest, decodeUTF8<true>(begin8, [](const llvh::Twine &) {
  222|  1.60M|                  llvm_unreachable("invalid UTF-8");
  223|  1.60M|                }));
  224|    388|  return dest;
  225|    388|}
_ZN6hermes11encodeUTF16INSt3__120back_insert_iteratorINS1_6vectorIDsNS1_9allocatorIDsEEEEEEEEvRT_j:
  198|  1.60M|inline void encodeUTF16(OutIt &dest, uint32_t cp) {
  199|  1.60M|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|  1.60M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.60M, False: 50]
  |  |  ------------------
  ------------------
  200|  1.60M|    *dest = (uint16_t)cp;
  201|  1.60M|    ++dest; // Use pre-increment in case this is an iterator.
  202|  1.60M|  } else {
  203|     50|    assert(cp <= UNICODE_MAX_VALUE && "invalid Unicode value");
  204|     50|    cp -= 0x10000;
  205|     50|    *dest = UTF16_HIGH_SURROGATE + ((cp >> 10) & 0x3FF);
  206|     50|    ++dest;
  207|     50|    *dest = UTF16_LOW_SURROGATE + (cp & 0x3FF);
  208|     50|    ++dest;
  209|     50|  }
  210|  1.60M|}
_ZN6hermes10decodeUTF8ILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorINS2_6vectorIDsNS2_9allocatorIDsEEEEEEEET_S9_PKcSB_EUlRKN4llvh5TwineEE_EEjRSB_T0_:
  188|  1.60M|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|  1.60M|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|  1.60M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.60M, False: 962]
  |  |  ------------------
  ------------------
  190|  1.60M|    return *from++;
  191|       |
  192|    962|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|  1.60M|}
_ZN6hermes19_decodeUTF8SlowPathILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorINS2_6vectorIDsNS2_9allocatorIDsEEEEEEEET_S9_PKcSB_EUlRKN4llvh5TwineEE_EEjRSB_T0_:
   77|    962|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|    962|  uint32_t ch = (uint32_t)from[0];
   79|    962|  uint32_t result;
   80|       |
   81|    962|  assert(isUTF8Start(ch));
   82|       |
   83|    962|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|    962|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 263, False: 699]
  |  |  ------------------
  ------------------
   84|    263|    uint32_t ch1 = (uint32_t)from[1];
   85|    263|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|    263|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 263]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|    263|    from += 2;
   92|    263|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|    263|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|    263|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 263]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|    699|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|    699|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 649, False: 50]
  |  |  ------------------
  ------------------
   99|    649|    uint32_t ch1 = (uint32_t)from[1];
  100|    649|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|  1.29k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 649]
  |  |  |  Branch (189:53): [True: 0, False: 649]
  |  |  |  Branch (189:53): [True: 0, False: 649]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|    649|    uint32_t ch2 = (uint32_t)from[2];
  106|    649|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|  1.29k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 649]
  |  |  |  Branch (189:53): [True: 0, False: 649]
  |  |  |  Branch (189:53): [True: 0, False: 649]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|    649|    from += 3;
  112|    649|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|    649|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|    649|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 649]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|    649|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  2.22k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 649]
  |  |  |  Branch (189:53): [True: 467, False: 182]
  |  |  |  Branch (189:53): [True: 464, False: 3]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|    649|            result >= UNICODE_SURROGATE_FIRST &&
  119|    649|            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|    649|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 50, False: 0]
  ------------------
  125|     50|    uint32_t ch1 = (uint32_t)from[1];
  126|     50|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|    100|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 50]
  |  |  |  Branch (189:53): [True: 0, False: 50]
  |  |  |  Branch (189:53): [True: 0, False: 50]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|     50|    uint32_t ch2 = (uint32_t)from[2];
  132|     50|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|    100|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 50]
  |  |  |  Branch (189:53): [True: 0, False: 50]
  |  |  |  Branch (189:53): [True: 0, False: 50]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|     50|    uint32_t ch3 = (uint32_t)from[3];
  138|     50|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|    100|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 50]
  |  |  |  Branch (189:53): [True: 0, False: 50]
  |  |  |  Branch (189:53): [True: 0, False: 50]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|     50|    from += 4;
  144|     50|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|     50|        (ch3 & 0x3F);
  146|     50|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|     50|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 50]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|     50|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|     50|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 50]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|     50|  } 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|    962|  return result;
  162|    962|}
DebugInfo.cpp:_ZN6hermes10decodeUTF8ILb0EZNS_3hbc18DebugInfoGenerator12appendStringERNSt3__16vectorIhNS3_9allocatorIhEEEENS_10IdentifierEE3$_0EEjRPKcT0_:
  188|  1.17k|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|  1.17k|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|  1.17k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.16k, False: 10]
  |  |  ------------------
  ------------------
  190|  1.16k|    return *from++;
  191|       |
  192|     10|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|  1.17k|}
DebugInfo.cpp:_ZN6hermes19_decodeUTF8SlowPathILb0EZNS_3hbc18DebugInfoGenerator12appendStringERNSt3__16vectorIhNS3_9allocatorIhEEEENS_10IdentifierEE3$_0EEjRPKcT0_:
   77|     10|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|     10|  uint32_t ch = (uint32_t)from[0];
   79|     10|  uint32_t result;
   80|       |
   81|     10|  assert(isUTF8Start(ch));
   82|       |
   83|     10|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|     10|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2, False: 8]
  |  |  ------------------
  ------------------
   84|      2|    uint32_t ch1 = (uint32_t)from[1];
   85|      2|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|      2|    from += 2;
   92|      2|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|      2|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
   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: 4, False: 4]
  |  |  ------------------
  ------------------
   99|      4|    uint32_t ch1 = (uint32_t)from[1];
  100|      4|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|      4|    uint32_t ch2 = (uint32_t)from[2];
  106|      4|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|      4|    from += 3;
  112|      4|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|      4|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|      4|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|      4|            result >= UNICODE_SURROGATE_FIRST &&
  119|      4|            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|      4|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 4, False: 0]
  ------------------
  125|      4|    uint32_t ch1 = (uint32_t)from[1];
  126|      4|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|      4|    uint32_t ch2 = (uint32_t)from[2];
  132|      4|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|      4|    uint32_t ch3 = (uint32_t)from[3];
  138|      4|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|      4|    from += 4;
  144|      4|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|      4|        (ch3 & 0x3F);
  146|      4|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|      4|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  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|      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|  return result;
  162|     10|}
ESTreeIRGen-expr.cpp:_ZN6hermesL22isUTF8ContinuationByteEc:
   39|  2.89M|inline static bool isUTF8ContinuationByte(char ch) {
   40|  2.89M|  return (ch & 0xC0) == 0x80;
   41|  2.89M|}
_ZN6hermes32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj6EEEEEEET_S7_PKcS9_:
  219|    120|    const char *end8) {
  220|    129|  while (begin8 < end8)
  ------------------
  |  Branch (220:10): [True: 9, False: 120]
  ------------------
  221|      9|    encodeUTF16(dest, decodeUTF8<true>(begin8, [](const llvh::Twine &) {
  222|      9|                  llvm_unreachable("invalid UTF-8");
  223|      9|                }));
  224|    120|  return dest;
  225|    120|}
_ZN6hermes11encodeUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj6EEEEEEEvRT_j:
  198|      9|inline void encodeUTF16(OutIt &dest, uint32_t cp) {
  199|      9|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|      9|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 9, False: 0]
  |  |  ------------------
  ------------------
  200|      9|    *dest = (uint16_t)cp;
  201|      9|    ++dest; // Use pre-increment in case this is an iterator.
  202|      9|  } 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|      9|}
_ZN6hermes10decodeUTF8ILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj6EEEEEEET_S8_PKcSA_EUlRKNS4_5TwineEE_EEjRSA_T0_:
  188|      9|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|      9|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|      9|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 9, False: 0]
  |  |  ------------------
  ------------------
  190|      9|    return *from++;
  191|       |
  192|      0|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|      9|}
SourceErrorManager.cpp:_ZN6hermesL22isUTF8ContinuationByteEc:
   39|  4.28M|inline static bool isUTF8ContinuationByte(char ch) {
   40|  4.28M|  return (ch & 0xC0) == 0x80;
   41|  4.28M|}
_ZN6hermes32convertUTF8WithSurrogatesToUTF16IPDsEET_S2_PKcS4_:
  219|      4|    const char *end8) {
  220|     12|  while (begin8 < end8)
  ------------------
  |  Branch (220:10): [True: 8, False: 4]
  ------------------
  221|      8|    encodeUTF16(dest, decodeUTF8<true>(begin8, [](const llvh::Twine &) {
  222|      8|                  llvm_unreachable("invalid UTF-8");
  223|      8|                }));
  224|      4|  return dest;
  225|      4|}
_ZN6hermes11encodeUTF16IPDsEEvRT_j:
  198|      8|inline void encodeUTF16(OutIt &dest, uint32_t cp) {
  199|      8|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|      8|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 8, False: 0]
  |  |  ------------------
  ------------------
  200|      8|    *dest = (uint16_t)cp;
  201|      8|    ++dest; // Use pre-increment in case this is an iterator.
  202|      8|  } 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|      8|}
_ZN6hermes10decodeUTF8ILb1EZNS_32convertUTF8WithSurrogatesToUTF16IPDsEET_S3_PKcS5_EUlRKN4llvh5TwineEE_EEjRS5_T0_:
  188|      8|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|      8|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|      8|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  190|      0|    return *from++;
  191|       |
  192|      8|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|      8|}
_ZN6hermes19_decodeUTF8SlowPathILb1EZNS_32convertUTF8WithSurrogatesToUTF16IPDsEET_S3_PKcS5_EUlRKN4llvh5TwineEE_EEjRS5_T0_:
   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|     32|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 8]
  |  |  |  Branch (189:53): [True: 8, False: 0]
  |  |  |  Branch (189:53): [True: 8, 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|}

_ZN6hermes25BytecodeGenerationOptionsC2ENS_16OutputFormatKindE:
   63|    247|      : format(format) {}
_ZN6hermes25BytecodeGenerationOptions8defaultsEv:
   65|    247|  static BytecodeGenerationOptions defaults() {
   66|    247|    return {Execute};
   67|    247|  }

_ZN6hermes2vm18AlignedHeapSegment5allocEj:
  306|  8.14M|AllocResult AlignedHeapSegment::alloc(uint32_t size) {
  307|  8.14M|  assert(lowLim() != nullptr && "Cannot allocate in a null segment");
  308|  8.14M|  assert(size >= sizeof(GCCell) && "cell must be larger than GCCell");
  309|  8.14M|  assert(isSizeHeapAligned(size) && "size must be heap aligned");
  310|       |
  311|  8.14M|  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|  8.14M|  if (sizeof(void *) == 8) {
  ------------------
  |  Branch (317:7): [Folded - Ignored]
  ------------------
  318|       |    // Calculate the new level_ once.
  319|  8.14M|    char *newLevel = level_ + size;
  320|  8.14M|    if (LLVM_UNLIKELY(newLevel > effectiveEnd())) {
  ------------------
  |  |  189|  8.14M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 113, False: 8.14M]
  |  |  ------------------
  ------------------
  321|    113|      return {nullptr, false};
  322|    113|    }
  323|  8.14M|    cellPtr = level_;
  324|  8.14M|    level_ = newLevel;
  325|  8.14M|  } 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|  8.14M|  __asan_unpoison_memory_region(cellPtr, size);
  334|  8.14M|#ifndef NDEBUG
  335|  8.14M|  checkUnwritten(cellPtr, cellPtr + size);
  336|  8.14M|#endif
  337|       |
  338|  8.14M|  auto *cell = reinterpret_cast<GCCell *>(cellPtr);
  339|  8.14M|  return {cell, true};
  340|  8.14M|}
_ZNK6hermes2vm18AlignedHeapSegment6lowLimEv:
  391|  61.3M|char *AlignedHeapSegment::lowLim() const {
  392|  61.3M|  return storage_.lowLim();
  393|  61.3M|}
_ZNK6hermes2vm18AlignedHeapSegment12effectiveEndEv:
  403|  8.14M|char *AlignedHeapSegment::effectiveEnd() const {
  404|  8.14M|  return effectiveEnd_;
  405|  8.14M|}
_ZN6hermes2vm18AlignedHeapSegment16HeapCellIteratorC2EPNS0_6GCCellE:
  131|  2.12k|    HeapCellIterator(GCCell *cell) : cell_(cell) {}
_ZNK6hermes2vm18AlignedHeapSegment16HeapCellIteratoreqERKS2_:
  133|  16.4M|    bool operator==(const HeapCellIterator &R) const {
  134|  16.4M|      return cell_ == R.cell_;
  135|  16.4M|    }
_ZNK6hermes2vm18AlignedHeapSegment16HeapCellIteratordeEv:
  137|  16.4M|    GCCell *const &operator*() const {
  138|  16.4M|      return cell_;
  139|  16.4M|    }
_ZN6hermes2vm18AlignedHeapSegment16HeapCellIteratorppEv:
  141|  16.4M|    HeapCellIterator &operator++() {
  142|  16.4M|      cell_ = cell_->nextCell();
  143|  16.4M|      return *this;
  144|  16.4M|    }
_ZN6hermes2vm18AlignedHeapSegment20markBitArrayCoveringEPKv:
  343|   763k|MarkBitArrayNC *AlignedHeapSegment::markBitArrayCovering(const void *ptr) {
  344|   763k|  return &contents(AlignedStorage::start(ptr))->markBitArray_;
  345|   763k|}
_ZN6hermes2vm18AlignedHeapSegment14setCellMarkBitEPKNS0_6GCCellE:
  348|   585k|void AlignedHeapSegment::setCellMarkBit(const GCCell *cell) {
  349|   585k|  MarkBitArrayNC *markBits = markBitArrayCovering(cell);
  350|   585k|  size_t ind = markBits->addressToIndex(cell);
  351|   585k|  markBits->mark(ind);
  352|   585k|}
_ZN6hermes2vm18AlignedHeapSegment14getCellMarkBitEPKNS0_6GCCellE:
  355|   178k|bool AlignedHeapSegment::getCellMarkBit(const GCCell *cell) {
  356|   178k|  MarkBitArrayNC *markBits = markBitArrayCovering(cell);
  357|   178k|  size_t ind = markBits->addressToIndex(cell);
  358|   178k|  return markBits->at(ind);
  359|   178k|}
_ZN6hermes2vm18AlignedHeapSegment8contentsEPv:
  362|  3.14M|    void *lowLim) {
  363|  3.14M|  return reinterpret_cast<Contents *>(lowLim);
  364|  3.14M|}
_ZN6hermes2vm18AlignedHeapSegment17cardTableCoveringEPKv:
  371|  2.37M|/* static */ CardTable *AlignedHeapSegment::cardTableCovering(const void *ptr) {
  372|  2.37M|  return &AlignedHeapSegment::contents(AlignedStorage::start(ptr))->cardTable_;
  373|  2.37M|}
_ZN6hermes2vm18AlignedHeapSegment7maxSizeEv:
  375|  1.29M|/* static */ constexpr size_t AlignedHeapSegment::maxSize() {
  376|  1.29M|  return AlignedStorage::size() - offsetof(Contents, allocRegion_);
  377|  1.29M|}
_ZNK6hermes2vm18AlignedHeapSegment4usedEv:
  383|    386|size_t AlignedHeapSegment::used() const {
  384|    386|  return level() - start();
  385|    386|}
_ZNK6hermes2vm18AlignedHeapSegment9availableEv:
  387|    441|size_t AlignedHeapSegment::available() const {
  388|    441|  return effectiveEnd() - level();
  389|    441|}
_ZNK6hermes2vm18AlignedHeapSegment5hiLimEv:
  395|    320|char *AlignedHeapSegment::hiLim() const {
  396|    320|  return storage_.hiLim();
  397|    320|}
_ZNK6hermes2vm18AlignedHeapSegment5startEv:
  399|  5.22k|char *AlignedHeapSegment::start() const {
  400|  5.22k|  return contents()->allocRegion_;
  401|  5.22k|}
_ZNK6hermes2vm18AlignedHeapSegment3endEv:
  407|  1.74k|char *AlignedHeapSegment::end() const {
  408|  1.74k|  return start() + maxSize();
  409|  1.74k|}
_ZNK6hermes2vm18AlignedHeapSegment5levelEv:
  411|  2.89k|char *AlignedHeapSegment::level() const {
  412|  2.89k|  return level_;
  413|  2.89k|}
_ZN6hermes2vm18AlignedHeapSegment5cellsEv:
  416|  1.06k|AlignedHeapSegment::cells() {
  417|  1.06k|  return {
  418|  1.06k|      HeapCellIterator(reinterpret_cast<GCCell *>(start())),
  419|  1.06k|      HeapCellIterator(reinterpret_cast<GCCell *>(level()))};
  420|  1.06k|}
_ZNK6hermes2vm18AlignedHeapSegment9cardTableEv:
  427|    611|CardTable &AlignedHeapSegment::cardTable() const {
  428|    611|  return contents()->cardTable_;
  429|    611|}
_ZNK6hermes2vm18AlignedHeapSegment12markBitArrayEv:
  431|    772|MarkBitArrayNC &AlignedHeapSegment::markBitArray() const {
  432|    772|  return contents()->markBitArray_;
  433|    772|}
_ZNK6hermes2vm18AlignedHeapSegment8contentsEv:
  435|  7.88k|AlignedHeapSegment::Contents *AlignedHeapSegment::contents() const {
  436|  7.88k|  return contents(lowLim());
  437|  7.88k|}
_ZNK6hermes2vm18AlignedHeapSegmentcvbEv:
  439|    866|AlignedHeapSegment::operator bool() const {
  440|    866|  return static_cast<bool>(storage_);
  441|    866|}
_ZNK6hermes2vm18AlignedHeapSegment8containsEPKv:
  443|  15.9M|bool AlignedHeapSegment::contains(const void *ptr) const {
  444|  15.9M|  return storage_.contains(ptr);
  445|  15.9M|}
_ZN6hermes2vm18AlignedHeapSegmentC2Ev:
   59|    160|  AlignedHeapSegment() = default;
_ZN6hermes2vm18AlignedHeapSegmentC2EOS1_:
   60|  1.12k|  AlignedHeapSegment(AlignedHeapSegment &&) = default;
_ZN6hermes2vm18AlignedHeapSegmentaSEOS1_:
   61|    320|  AlignedHeapSegment &operator=(AlignedHeapSegment &&) = default;

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

_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE7classofEPKNS0_6GCCellE:
   69|  5.78M|  static bool classof(const GCCell *cell) {
   70|  5.78M|    return cell->getKind() == getCellKind();
   71|  5.78M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE11getCellKindEv:
   73|  5.96M|  static constexpr CellKind getCellKind() {
   74|  5.96M|    static_assert(
   75|  5.96M|        std::is_same<HVType, HermesValue>::value ||
   76|  5.96M|            std::is_same<HVType, SmallHermesValue>::value,
   77|  5.96M|        "Illegal HVType.");
   78|  5.96M|    return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (78:12): [Folded - Ignored]
  ------------------
   79|  5.96M|        ? CellKind::ArrayStorageKind
   80|  5.96M|        : CellKind::ArrayStorageSmallKind;
   81|  5.96M|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE2atILNS3_6InlineE0EEES2_j:
  149|  1.13M|  HVType at(size_type index) const {
  150|  1.13M|    assert(index < size() && "index out of range");
  151|  1.13M|    return data()[index];
  152|  1.13M|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE4sizeEv:
  171|  6.69M|  size_type size() const {
  172|  6.69M|    return size_.load(std::memory_order_relaxed);
  173|  6.69M|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE4dataEv:
  138|  2.09M|  const GCHVType *data() const {
  139|  2.09M|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  140|  2.09M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE14allocationSizeEj:
   53|    480|  static constexpr uint32_t allocationSize(size_type capacity) {
   54|    480|    return ArrayStorageBase::template totalSizeToAlloc<GCHVType>(capacity);
   55|    480|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE25capacityForAllocationSizeEj:
   59|    320|  static constexpr size_type capacityForAllocationSize(uint32_t allocSize) {
   60|    320|    return (allocSize - allocationSize(0)) / sizeof(HVType);
   61|    320|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE11maxElementsEv:
   65|    160|  static constexpr size_type maxElements() {
   66|    160|    return capacityForAllocationSize(GC::maxAllocationSize());
   67|    160|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE14allocationSizeEj:
   53|  2.02M|  static constexpr uint32_t allocationSize(size_type capacity) {
   54|  2.02M|    return ArrayStorageBase::template totalSizeToAlloc<GCHVType>(capacity);
   55|  2.02M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE25capacityForAllocationSizeEj:
   59|  1.93M|  static constexpr size_type capacityForAllocationSize(uint32_t allocSize) {
   60|  1.93M|    return (allocSize - allocationSize(0)) / sizeof(HVType);
   61|  1.93M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE11maxElementsEv:
   65|   119k|  static constexpr size_type maxElements() {
   66|   119k|    return capacityForAllocationSize(GC::maxAllocationSize());
   67|   119k|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE2atILNS3_6InlineE1EEES2_j:
  149|   960k|  HVType at(size_type index) const {
  150|   960k|    assert(index < size() && "index out of range");
  151|   960k|    return data()[index];
  152|   960k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE4dataEv:
  135|  3.69M|  GCHVType *data() {
  136|  3.69M|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  137|  3.69M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE3setILNS3_6InlineE0EEEvjS2_RNS0_7HadesGCE:
  156|  1.77M|  void set(size_type index, HVType val, GC &gc) {
  157|  1.77M|    assert(index < size() && "index out of range");
  158|  1.77M|    data()[index].set(val, gc);
  159|  1.77M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEjj:
  123|    160|  create(Runtime &runtime, size_type capacity, size_type size) {
  124|    160|    auto arrRes = create(runtime, capacity);
  125|    160|    if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  126|      0|      return ExecutionStatus::EXCEPTION;
  127|      0|    }
  128|       |
  129|    160|    resizeWithinCapacity(
  130|    160|        vmcast<ArrayStorageBase<HVType>>(*arrRes), runtime, size);
  131|    160|    return arrRes;
  132|    160|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEj:
   84|  90.6k|  static CallResult<HermesValue> create(Runtime &runtime, size_type capacity) {
   85|  90.6k|    if (LLVM_UNLIKELY(capacity > maxElements())) {
  ------------------
  |  |  189|  90.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 90.6k]
  |  |  ------------------
  ------------------
   86|      0|      return throwExcessiveCapacityError(runtime, capacity);
   87|      0|    }
   88|  90.6k|    const auto allocSize = allocationSize(capacity);
   89|  90.6k|    auto *cell = runtime.makeAVariable<ArrayStorageBase<HVType>>(allocSize);
   90|  90.6k|    return HermesValue::encodeObjectValue(cell);
   91|  90.6k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE20resizeWithinCapacityEPS3_RNS0_7RuntimeEj:
  265|   928k|      size_type newSize) {
  266|   928k|    resizeWithinCapacity(self, runtime.getHeap(), newSize);
  267|   928k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE11getCellKindEv:
   73|    480|  static constexpr CellKind getCellKind() {
   74|    480|    static_assert(
   75|    480|        std::is_same<HVType, HermesValue>::value ||
   76|    480|            std::is_same<HVType, SmallHermesValue>::value,
   77|    480|        "Illegal HVType.");
   78|    480|    return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (78:12): [Folded - Ignored]
  ------------------
   79|    480|        ? CellKind::ArrayStorageKind
   80|    480|        : CellKind::ArrayStorageSmallKind;
   81|    480|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE7classofEPKNS0_6GCCellE:
   69|    160|  static bool classof(const GCCell *cell) {
   70|    160|    return cell->getKind() == getCellKind();
   71|    160|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE4sizeEv:
  171|    160|  size_type size() const {
  172|    160|    return size_.load(std::memory_order_relaxed);
  173|    160|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE4dataEv:
  138|      1|  const GCHVType *data() const {
  139|      1|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  140|      1|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE4dataEv:
  135|    160|  GCHVType *data() {
  136|    160|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  137|    160|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EEC2Ev:
  273|  90.6k|  ArrayStorageBase() = default;
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE6createERNS0_7RuntimeEj:
   84|    160|  static CallResult<HermesValue> create(Runtime &runtime, size_type capacity) {
   85|    160|    if (LLVM_UNLIKELY(capacity > maxElements())) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
   86|      0|      return throwExcessiveCapacityError(runtime, capacity);
   87|      0|    }
   88|    160|    const auto allocSize = allocationSize(capacity);
   89|    160|    auto *cell = runtime.makeAVariable<ArrayStorageBase<HVType>>(allocSize);
   90|    160|    return HermesValue::encodeObjectValue(cell);
   91|    160|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEEC2Ev:
  273|    160|  ArrayStorageBase() = default;
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE9push_backERNS0_13MutableHandleIS3_EERNS0_7RuntimeENS0_6HandleIS2_EE:
  186|    160|      Handle<> value) {
  187|    160|    auto *self = selfHandle.get();
  188|    160|    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|    160|    auto hv = HVType::encodeHermesValue(value.get(), runtime);
  194|       |    // For SmallHermesValue, the above may allocate, so update self.
  195|    160|    if (std::is_same<HVType, SmallHermesValue>::value)
  ------------------
  |  Branch (195:9): [Folded - Ignored]
  ------------------
  196|      0|      self = selfHandle.get();
  197|    160|    if (LLVM_LIKELY(currSz < self->capacity())) {
  ------------------
  |  |  188|    160|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 160, False: 0]
  |  |  ------------------
  ------------------
  198|       |      // Use the constructor of GCHermesValue to use the correct write barrier
  199|       |      // for uninitialized memory.
  200|    160|      new (&self->data()[currSz]) GCHVType(hv, runtime.getHeap());
  201|    160|      self->size_.store(currSz + 1, std::memory_order_release);
  202|    160|      return ExecutionStatus::RETURNED;
  203|    160|    }
  204|      0|    return pushBackSlowPath(selfHandle, runtime, value);
  205|    160|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE8capacityEv:
  168|    160|  size_type capacity() const {
  169|    160|    return capacityForAllocationSize(getAllocatedSize());
  170|    160|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE9push_backERNS0_13MutableHandleIS3_EERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  186|     52|      Handle<> value) {
  187|     52|    auto *self = selfHandle.get();
  188|     52|    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|     52|    auto hv = HVType::encodeHermesValue(value.get(), runtime);
  194|       |    // For SmallHermesValue, the above may allocate, so update self.
  195|     52|    if (std::is_same<HVType, SmallHermesValue>::value)
  ------------------
  |  Branch (195:9): [Folded - Ignored]
  ------------------
  196|     52|      self = selfHandle.get();
  197|     52|    if (LLVM_LIKELY(currSz < self->capacity())) {
  ------------------
  |  |  188|     52|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 52, False: 0]
  |  |  ------------------
  ------------------
  198|       |      // Use the constructor of GCHermesValue to use the correct write barrier
  199|       |      // for uninitialized memory.
  200|     52|      new (&self->data()[currSz]) GCHVType(hv, runtime.getHeap());
  201|     52|      self->size_.store(currSz + 1, std::memory_order_release);
  202|     52|      return ExecutionStatus::RETURNED;
  203|     52|    }
  204|      0|    return pushBackSlowPath(selfHandle, runtime, value);
  205|     52|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE8capacityEv:
  168|  1.81M|  size_type capacity() const {
  169|  1.81M|    return capacityForAllocationSize(getAllocatedSize());
  170|  1.81M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE6resizeERNS0_13MutableHandleIS3_EERNS0_7RuntimeEj:
  237|  9.66k|      size_type newSize) {
  238|  9.66k|    return shift(selfHandle, runtime, 0, 0, newSize);
  239|  9.66k|  }

_ZNK6hermes2vm15BigIntPrimitive21getImmutableRefUnsafeEv:
  362|      1|  bigint::ImmutableBigIntRef getImmutableRefUnsafe() const {
  363|      1|    return bigint::ImmutableBigIntRef{
  364|      1|        getTrailingObjects<DigitType>(), numDigits};
  365|      1|  }
_ZN6hermes2vm15BigIntPrimitive9fromBytesERNS0_7RuntimeEN4llvh8ArrayRefIhEE:
  120|   390k|      llvh::ArrayRef<uint8_t> bytes) {
  121|   390k|    const uint32_t numDigits = bigint::numDigitsForSizeInBytes(bytes.size());
  122|       |
  123|   390k|    auto ret = createUninitializedWithNumDigits(runtime, numDigits);
  124|   390k|    if (LLVM_UNLIKELY(ret == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
  125|      0|      return ExecutionStatus::EXCEPTION;
  126|      0|    }
  127|       |
  128|   390k|    auto res = raiseOnError(
  129|   390k|        runtime, bigint::initWithBytes(ret->getMutableRef(runtime), bytes));
  130|       |
  131|   390k|    if (LLVM_UNLIKELY(res != ExecutionStatus::RETURNED)) {
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
  132|      0|      return res;
  133|      0|    }
  134|       |
  135|   390k|    return HermesValue::encodeBigIntValue(ret->getBigIntPrimitive());
  136|   390k|  }
_ZN6hermes2vm15BigIntPrimitive32createUninitializedWithNumDigitsERNS0_7RuntimeEj:
  417|   390k|  createUninitializedWithNumDigits(Runtime &runtime, uint32_t numDigits) {
  418|   390k|    if (bigint::tooManyDigits(numDigits)) {
  ------------------
  |  Branch (418:9): [True: 0, False: 390k]
  ------------------
  419|      0|      return raiseOnError(runtime, bigint::OperationStatus::TOO_MANY_DIGITS);
  420|      0|    }
  421|       |
  422|   390k|    const uint32_t cellSizeInBytes = calcCellSizeInBytes(numDigits);
  423|       |
  424|   390k|    UninitializedBigIntPrimitive ret{
  425|   390k|        runtime.makeAVariable<BigIntPrimitive>(cellSizeInBytes, numDigits)};
  426|   390k|    return ret;
  427|   390k|  }
_ZN6hermes2vm15BigIntPrimitive11getCellKindEv:
   66|   781k|  static constexpr CellKind getCellKind() {
   67|   781k|    return CellKind::BigIntPrimitiveKind;
   68|   781k|  }
_ZN6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitiveC2EPS1_:
  381|   390k|        : uninitialized(u) {}
_ZN6hermes2vm15BigIntPrimitive12raiseOnErrorERNS0_7RuntimeENS_6bigint15OperationStatusE:
  307|   390k|      bigint::OperationStatus status) {
  308|   390k|    switch (status) {
  ------------------
  |  Branch (308:13): [True: 0, False: 390k]
  ------------------
  309|   390k|      case bigint::OperationStatus::RETURNED:
  ------------------
  |  Branch (309:7): [True: 390k, False: 0]
  ------------------
  310|   390k|        return ExecutionStatus::RETURNED;
  311|      0|      case bigint::OperationStatus::DEST_TOO_SMALL:
  ------------------
  |  Branch (311:7): [True: 0, False: 390k]
  ------------------
  312|      0|        return runtime.raiseRangeError(
  313|      0|            "BigInt is too small for the operation result");
  314|      0|      case bigint::OperationStatus::TOO_MANY_DIGITS:
  ------------------
  |  Branch (314:7): [True: 0, False: 390k]
  ------------------
  315|      0|        return runtime.raiseRangeError("Maximum BigInt size exceeded");
  316|      0|      case bigint::OperationStatus::DIVISION_BY_ZERO:
  ------------------
  |  Branch (316:7): [True: 0, False: 390k]
  ------------------
  317|      0|        return runtime.raiseRangeError("Division by zero");
  318|      0|      case bigint::OperationStatus::NEGATIVE_EXPONENT:
  ------------------
  |  Branch (318:7): [True: 0, False: 390k]
  ------------------
  319|      0|        return runtime.raiseRangeError("Exponent must be positive");
  320|   390k|    }
  321|      0|    llvm_unreachable("No other OperationStatus.");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  322|   390k|  }
_ZN6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitive13getMutableRefERNS0_7RuntimeE:
  383|   390k|    SafeMutableBigIntRef getMutableRef(Runtime &rt) {
  384|   390k|#ifdef HERMES_SLOW_DEBUG
  385|   390k|      possiblyInitialized = true;
  386|   390k|#endif // HERMES_SLOW_DEBUG
  387|   390k|      return SafeMutableBigIntRef{
  388|   390k|          rt,
  389|   390k|          uninitialized->getTrailingObjects<DigitType>(),
  390|   390k|          uninitialized->numDigits};
  391|   390k|    }
_ZN6hermes2vm15BigIntPrimitive13SafeBigIntRefINS_6bigint16MutableBigIntRefEEC2IJPmRjEEERNS0_7RuntimeEDpOT_:
  337|   390k|        : BigIntRefTy{std::forward<Args>(args)...}, noAlloc(rt) {
  338|   390k|    }
_ZNK6hermes2vm15BigIntPrimitive28UninitializedBigIntPrimitive18getBigIntPrimitiveEv:
  393|   390k|    BigIntPrimitive *getBigIntPrimitive() const {
  394|   390k|#ifdef HERMES_SLOW_DEBUG
  395|   390k|      assert(
  396|   390k|          possiblyInitialized &&
  397|   390k|          "UninitializedBigIntPrimitive was never possibly-initialized.");
  398|   390k|#endif // HERMES_SLOW_DEBUG
  399|   390k|      return uninitialized;
  400|   390k|    }
_ZNK6hermes2vm15BigIntPrimitive16numTrailingBytesEv:
   50|   390k|  uint32_t numTrailingBytes() const {
   51|   390k|    return numDigits * DigitSizeInBytes;
   52|   390k|  }
_ZN6hermes2vm15BigIntPrimitive7classofEPKNS0_6GCCellE:
   62|   781k|  static bool classof(const GCCell *cell) {
   63|   781k|    return cell->getKind() == CellKind::BigIntPrimitiveKind;
   64|   781k|  }
_ZNK6hermes2vm15BigIntPrimitive15getImmutableRefERNS0_7RuntimeE:
  352|   781k|  SafeImmutableBigIntRef getImmutableRef(Runtime &rt) const {
  353|   781k|    return SafeImmutableBigIntRef(
  354|   781k|        rt, getTrailingObjects<DigitType>(), numDigits);
  355|   781k|  }
_ZN6hermes2vm15BigIntPrimitive13SafeBigIntRefINS_6bigint18ImmutableBigIntRefEEC2IJPKmRKjEEERNS0_7RuntimeEDpOT_:
  337|   781k|        : BigIntRefTy{std::forward<Args>(args)...}, noAlloc(rt) {
  338|   781k|    }
_ZNK6hermes2vm15BigIntPrimitive7compareIiEENSt3__19enable_ifIXsr3std9is_signedIT_EE5valueEiE4typeES5_:
  182|      1|  std::enable_if_t<std::is_signed<T>::value, int32_t> compare(T value) const {
  183|      1|    return bigint::compare(this->getImmutableRefUnsafe(), value);
  184|      1|  }

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

_ZN6hermes2vmeqINS0_11HermesValueEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  415|  20.4M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  20.4M|  return lhs.getStatus() == rhs;
  417|  20.4M|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|  3.35M|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|   390k|  ~CallResult() = default;
_ZNK6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EE9getStatusEv:
  219|  23.9M|  ExecutionStatus getStatus() const {
  220|  23.9M|    return (ExecutionStatus)status_;
  221|  23.9M|  }
_ZNK6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EEdeEv:
  215|  11.6M|  bool operator*() const {
  216|  11.6M|    return getValue();
  217|  11.6M|  }
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EE9getStatusEv:
  332|  10.1M|  ExecutionStatus getStatus() const {
  333|  10.1M|    return status_;
  334|  10.1M|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEptEv:
  346|  4.47M|  PseudoHandle<> *operator->() {
  347|  4.47M|    return &getValue();
  348|  4.47M|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EE8getValueEv:
  335|  10.1M|  PseudoHandle<> &getValue() {
  336|  10.1M|    assert(status_ == ExecutionStatus::RETURNED);
  337|  10.1M|    return storage_;
  338|  10.1M|  }
_ZNK6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EE8getValueEv:
  222|  11.6M|  bool getValue() const {
  223|  11.6M|    assert(getStatus() == ExecutionStatus::RETURNED);
  224|  11.6M|    return value_;
  225|  11.6M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|     15|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|  1.05M|  ~CallResult() = default;
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_11HermesValueEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  10.1M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  10.1M|  return lhs.getStatus() == rhs;
  417|  10.1M|}
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEdeEv:
  171|  10.6M|  const T &operator*() const {
  172|  10.6M|    return getValue();
  173|  10.6M|  }
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EE8getValueEv:
  178|  20.8M|  const T &getValue() const {
  179|  20.8M|    assert(status_ == ExecutionStatus::RETURNED);
  180|  20.8M|    return *reinterpret_cast<const T *>(&storage_);
  181|  20.8M|  }
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EE9getStatusEv:
  175|  20.8M|  ExecutionStatus getStatus() const {
  176|  20.8M|    return status_;
  177|  20.8M|  }
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|  6.71M|  ExecutionStatus getStatus() const {
  290|  6.71M|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 6.71M]
  ------------------
  291|  6.71M|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|  6.71M|        ? ExecutionStatus::EXCEPTION
  293|  6.71M|        : ExecutionStatus::RETURNED;
  294|  6.71M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|  3.35M|  Handle<T> &getValue() {
  296|  3.35M|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|  3.35M|    return valueOrStatus_;
  298|  3.35M|  }
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|  1.17M|  ExecutionStatus getStatus() const {
  290|  1.17M|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 1.17M]
  ------------------
  291|  1.17M|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|  1.17M|        ? ExecutionStatus::EXCEPTION
  293|  1.17M|        : ExecutionStatus::RETURNED;
  294|  1.17M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|   390k|  Handle<T> &getValue() {
  296|   390k|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|   390k|    return valueOrStatus_;
  298|   390k|  }
_ZN6hermes2vm10CallResultINS0_15BigIntPrimitive28UninitializedBigIntPrimitiveELNS0_6detail20CallResultSpecializeE0EEC2IS3_vEEOT_:
  109|   390k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vmeqINS0_15BigIntPrimitive28UninitializedBigIntPrimitiveEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS5_EE5valueEEENS0_15ExecutionStatusE:
  415|   390k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   390k|  return lhs.getStatus() == rhs;
  417|   390k|}
_ZNK6hermes2vm10CallResultINS0_15BigIntPrimitive28UninitializedBigIntPrimitiveELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  1.17M|  ExecutionStatus getStatus() const {
  125|  1.17M|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 1.17M, False: 0]
  ------------------
  126|  1.17M|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEC2ENS0_15ExecutionStatusE:
  167|    418|  /* implicit */ CallResult(ExecutionStatus status) : status_(status) {
  168|    418|    assert(status != ExecutionStatus::RETURNED);
  169|    418|  }
_ZN6hermes2vm10CallResultINS0_15BigIntPrimitive28UninitializedBigIntPrimitiveELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|   781k|  T *operator->() {
  136|   781k|    return &getValue();
  137|   781k|  }
_ZN6hermes2vm10CallResultINS0_15BigIntPrimitive28UninitializedBigIntPrimitiveELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|   781k|  T &getValue() {
  128|   781k|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|   781k|    return *value_;
  130|   781k|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEC2ES2_:
  163|  17.8M|  /* implicit */ CallResult(T value) : status_(ExecutionStatus::RETURNED) {
  164|  17.8M|    new (&storage_) T(value);
  165|  17.8M|  }
_ZN6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EEC2ENS0_15ExecutionStatusE:
  211|    356|  /* implicit */ CallResult(ExecutionStatus status) : status_((int)status) {
  212|    356|    assert(status != ExecutionStatus::RETURNED);
  213|    356|  }
_ZN6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EEC2Eb:
  209|  13.0M|      : status_((int)ExecutionStatus::RETURNED), value_(value) {}
_ZN6hermes2vmeqINS0_6HandleINS0_7JSArrayEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.05M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.05M|  return lhs.getStatus() == rhs;
  417|  1.05M|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|   391k|  Handle<T> &operator*() {
  282|   391k|    return getValue();
  283|   391k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|  1.05M|  Handle<T> &getValue() {
  296|  1.05M|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|  1.05M|    return valueOrStatus_;
  298|  1.05M|  }
_ZN6hermes2vmneIbEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  419|  3.32M|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  3.32M|  return lhs.getStatus() != rhs;
  421|  3.32M|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|  1.05M|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|  2.01k|  ExecutionStatus getStatus() const {
  401|  2.01k|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 2.01k]
  ------------------
  402|  2.01k|        ? ExecutionStatus::EXCEPTION
  403|  2.01k|        : ExecutionStatus::RETURNED;
  404|  2.01k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|  1.00k|  PseudoHandle<T> *operator->() {
  396|  1.00k|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|  1.00k|    return &valueOrStatus_;
  398|  1.00k|  }
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|     30|  ExecutionStatus getStatus() const {
  290|     30|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 30]
  ------------------
  291|     30|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|     30|        ? ExecutionStatus::EXCEPTION
  293|     30|        : ExecutionStatus::RETURNED;
  294|     30|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|     15|  Handle<T> &operator*() {
  282|     15|    return getValue();
  283|     15|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|     15|  Handle<T> &getValue() {
  296|     15|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|     15|    return valueOrStatus_;
  298|     15|  }
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|  2.77M|  ExecutionStatus getStatus() const {
  290|  2.77M|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 2.77M]
  ------------------
  291|  2.77M|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|  2.77M|        ? ExecutionStatus::EXCEPTION
  293|  2.77M|        : ExecutionStatus::RETURNED;
  294|  2.77M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EEptEv:
  284|   662k|  Handle<T> *operator->() {
  285|   662k|    assert(getStatus() == ExecutionStatus::RETURNED);
  286|   662k|    return &getValue();
  287|   662k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEC2EOS4_:
  319|  10.9M|      : status_(ExecutionStatus::RETURNED), storage_(std::move(value)) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEC2ENS0_15ExecutionStatusE:
  321|    408|  /* implicit */ CallResult(ExecutionStatus status) : status_(status) {
  322|    408|    assert(status != ExecutionStatus::RETURNED);
  323|    408|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEdeEv:
  325|  5.66M|  PseudoHandle<> &operator*() {
  326|  5.66M|    return getValue();
  327|  5.66M|  }
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EE23toCallResultHermesValueEv:
  350|  1.91M|  CallResult<HermesValue> toCallResultHermesValue() const {
  351|       |    // Use a private constructor in CallResult<HermesValue> to convert
  352|       |    // without having to branch.
  353|  1.91M|    return CallResult<HermesValue>{status_, storage_.getHermesValue()};
  354|  1.91M|  }
_ZN6hermes2vmeqINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  415|   796k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   796k|  return lhs.getStatus() == rhs;
  417|   796k|}
_ZNK6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  2.71M|  ExecutionStatus getStatus() const {
  125|  2.71M|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 2.71M, False: 0]
  ------------------
  126|  2.71M|  }
_ZN6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|  1.83M|  T *operator->() {
  136|  1.83M|    return &getValue();
  137|  1.83M|  }
_ZN6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|  1.83M|  T &getValue() {
  128|  1.83M|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|  1.83M|    return *value_;
  130|  1.83M|  }
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_15StringPrimitiveEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  7.27M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  7.27M|  return lhs.getStatus() == rhs;
  417|  7.27M|}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|  14.5M|  ExecutionStatus getStatus() const {
  401|  14.5M|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 14.5M]
  ------------------
  402|  14.5M|        ? ExecutionStatus::EXCEPTION
  403|  14.5M|        : ExecutionStatus::RETURNED;
  404|  14.5M|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEdeEv:
  392|  6.01M|  PseudoHandle<T> &operator*() {
  393|  6.01M|    return getValue();
  394|  6.01M|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EE8getValueEv:
  405|  6.07M|  PseudoHandle<T> &getValue() {
  406|  6.07M|    assert(getStatus() == ExecutionStatus::RETURNED);
  407|  6.07M|    return valueOrStatus_;
  408|  6.07M|  }
_ZN6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EEC2Ed:
  163|    241|  /* implicit */ CallResult(T value) : status_(ExecutionStatus::RETURNED) {
  164|    241|    new (&storage_) T(value);
  165|    241|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|    175|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEaSEOS7_:
  315|  1.78M|  CallResult &operator=(CallResult &&cr) = default;
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|  1.00k|      : valueOrStatus_(std::move(value)) {}
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEptEv:
  182|  5.12M|  const T *operator->() const {
  183|  5.12M|    return &getValue();
  184|  5.12M|  }
_ZN6hermes2vmeqImEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  415|   781k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   781k|  return lhs.getStatus() == rhs;
  417|   781k|}
_ZNK6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EE9getStatusEv:
  175|   781k|  ExecutionStatus getStatus() const {
  176|   781k|    return status_;
  177|   781k|  }
_ZNK6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EEdeEv:
  171|   781k|  const T &operator*() const {
  172|   781k|    return getValue();
  173|   781k|  }
_ZNK6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EE8getValueEv:
  178|   781k|  const T &getValue() const {
  179|   781k|    assert(status_ == ExecutionStatus::RETURNED);
  180|   781k|    return *reinterpret_cast<const T *>(&storage_);
  181|   781k|  }
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_8JSObjectEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.00k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.00k|  return lhs.getStatus() == rhs;
  417|  1.00k|}
_ZN6hermes2vmeqIbEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  415|  8.93M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  8.93M|  return lhs.getStatus() == rhs;
  417|  8.93M|}
_ZN6hermes2vmeqIdEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  415|    241|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|    241|  return lhs.getStatus() == rhs;
  417|    241|}
_ZNK6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EE9getStatusEv:
  175|    241|  ExecutionStatus getStatus() const {
  176|    241|    return status_;
  177|    241|  }
_ZNK6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EEdeEv:
  171|    401|  const T &operator*() const {
  172|    401|    return getValue();
  173|    401|  }
_ZNK6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EE8getValueEv:
  178|    401|  const T &getValue() const {
  179|    401|    assert(status_ == ExecutionStatus::RETURNED);
  180|    401|    return *reinterpret_cast<const T *>(&storage_);
  181|    401|  }
_ZN6hermes2vmeqINS0_6HandleINS0_8SymbolIDEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  3.35M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  3.35M|  return lhs.getStatus() == rhs;
  417|  3.35M|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|  3.35M|  Handle<T> &operator*() {
  282|  3.35M|    return getValue();
  283|  3.35M|  }
_ZN6hermes2vmeqINS0_6HandleINS0_8JSStringEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|    175|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|    175|  return lhs.getStatus() == rhs;
  417|    175|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|    365|  ExecutionStatus getStatus() const {
  290|    365|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 365]
  ------------------
  291|    365|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|    365|        ? ExecutionStatus::EXCEPTION
  293|    365|        : ExecutionStatus::RETURNED;
  294|    365|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|    175|  Handle<T> &getValue() {
  296|    175|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|    175|    return valueOrStatus_;
  298|    175|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEaSERKS5_:
  155|  2.03M|  CallResult &operator=(const CallResult &cr) {
  156|  2.03M|    status_ = cr.status_;
  157|       |    // GCC8 requires this no-op cast to avoid its -Wclass-memaccess warning.
  158|  2.03M|    std::memcpy(reinterpret_cast<void *>(&storage_), &cr.storage_, sizeof(T));
  159|  2.03M|    return *this;
  160|  2.03M|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EEC2IS7_vEEOT_:
  109|  1.15M|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vmneINS0_12PseudoHandleINS0_15DictPropertyMapEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  419|   192k|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|   192k|  return lhs.getStatus() != rhs;
  421|   192k|}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_15DictPropertyMapEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|   419k|  ExecutionStatus getStatus() const {
  401|   419k|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 419k]
  ------------------
  402|   419k|        ? ExecutionStatus::EXCEPTION
  403|   419k|        : ExecutionStatus::RETURNED;
  404|   419k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15DictPropertyMapEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|   209k|  PseudoHandle<T> *operator->() {
  396|   209k|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|   209k|    return &valueOrStatus_;
  398|   209k|  }
_ZN6hermes2vmneINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  419|  80.7k|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  80.7k|  return lhs.getStatus() != rhs;
  421|  80.7k|}
_ZN6hermes2vmeqINS0_8SymbolIDEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.83M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.83M|  return lhs.getStatus() == rhs;
  417|  1.83M|}
_ZNK6hermes2vm10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  1.83M|  ExecutionStatus getStatus() const {
  125|  1.83M|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 1.83M, False: 0]
  ------------------
  126|  1.83M|  }
_ZN6hermes2vm10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEdeEv:
  117|  1.83M|  T &operator*() {
  118|  1.83M|    return *value_;
  119|  1.83M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|  3.35M|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|  7.27M|      : valueOrStatus_(std::move(value)) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|  1.19M|  PseudoHandle<T> *operator->() {
  396|  1.19M|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|  1.19M|    return &valueOrStatus_;
  398|  1.19M|  }
_ZN6hermes2vm10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEC2IS2_vEEOT_:
  109|  1.83M|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_9ArgumentsEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|    356|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|     23|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|  2.30M|  T *operator->() {
  136|  2.30M|    return &getValue();
  137|  2.30M|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|  2.30M|  T &getValue() {
  128|  2.30M|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|  2.30M|    return *value_;
  130|  2.30M|  }
_ZNK6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  3.45M|  ExecutionStatus getStatus() const {
  125|  3.45M|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 3.45M, False: 0]
  ------------------
  126|  3.45M|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EED2Ev:
  115|  1.15M|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_9ArgumentsEEELNS0_6detail20CallResultSpecializeE4EEC2ENS0_15ExecutionStatusE:
  276|    356|      : valueOrStatus_(Handle<T>::unsafeCreate(
  277|    356|            reinterpret_cast<const PinnedHermesValue *>(-1))) {
  278|    356|    assert(status != ExecutionStatus::RETURNED);
  279|    356|  }
_ZN6hermes2vmeqINS0_6HandleINS0_8JSObjectEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|     23|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     23|  return lhs.getStatus() == rhs;
  417|     23|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|     46|  ExecutionStatus getStatus() const {
  290|     46|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 1, False: 45]
  ------------------
  291|     46|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|     46|        ? ExecutionStatus::EXCEPTION
  293|     46|        : ExecutionStatus::RETURNED;
  294|     46|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|     21|  Handle<T> &operator*() {
  282|     21|    return getValue();
  283|     21|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|     22|  Handle<T> &getValue() {
  296|     22|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|     22|    return valueOrStatus_;
  298|     22|  }
_ZN6hermes2vmeqINS0_6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  415|     15|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     15|  return lhs.getStatus() == rhs;
  417|     15|}
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  415|   663k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   663k|  return lhs.getStatus() == rhs;
  417|   663k|}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|  1.32M|  ExecutionStatus getStatus() const {
  401|  1.32M|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 1.32M]
  ------------------
  402|  1.32M|        ? ExecutionStatus::EXCEPTION
  403|  1.32M|        : ExecutionStatus::RETURNED;
  404|  1.32M|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EEdeEv:
  392|     15|  PseudoHandle<T> &operator*() {
  393|     15|    return getValue();
  394|     15|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EE8getValueEv:
  405|     15|  PseudoHandle<T> &getValue() {
  406|     15|    assert(getStatus() == ExecutionStatus::RETURNED);
  407|     15|    return valueOrStatus_;
  408|     15|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|   663k|  PseudoHandle<T> *operator->() {
  396|   663k|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|   663k|    return &valueOrStatus_;
  398|   663k|  }
_ZN6hermes2vmneINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS9_EE5valueEEENS0_15ExecutionStatusE:
  419|  1.92k|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  1.92k|  return lhs.getStatus() != rhs;
  421|  1.92k|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|     52|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EEC2IS2_vEEOT_:
  109|   781k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EED2Ev:
  115|   781k|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|     52|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vmeqINS0_6HandleINS0_7JSErrorEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|     52|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     52|  return lhs.getStatus() == rhs;
  417|     52|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|    104|  ExecutionStatus getStatus() const {
  290|    104|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 104]
  ------------------
  291|    104|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|    104|        ? ExecutionStatus::EXCEPTION
  293|    104|        : ExecutionStatus::RETURNED;
  294|    104|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|     52|  Handle<T> &operator*() {
  282|     52|    return getValue();
  283|     52|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|     52|  Handle<T> &getValue() {
  296|     52|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|     52|    return valueOrStatus_;
  298|     52|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|   390k|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vmeqINS0_13StringBuilderEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  415|   781k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   781k|  return lhs.getStatus() == rhs;
  417|   781k|}
_ZNK6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  3.44M|  ExecutionStatus getStatus() const {
  125|  3.44M|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 3.44M, False: 0]
  ------------------
  126|  3.44M|  }
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EEdeEv:
  117|     52|  T &operator*() {
  118|     52|    return *value_;
  119|     52|  }
_ZN6hermes2vmeqINS0_6HandleINS0_15StringPrimitiveEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|   390k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   390k|  return lhs.getStatus() == rhs;
  417|   390k|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EEptEv:
  284|   390k|  Handle<T> *operator->() {
  285|   390k|    assert(getStatus() == ExecutionStatus::RETURNED);
  286|   390k|    return &getValue();
  287|   390k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|  2.80M|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|  2.80M|  ~CallResult() = default;
_ZN6hermes2vm10CallResultIjLNS0_6detail20CallResultSpecializeE2EEC2Ej:
  163|     15|  /* implicit */ CallResult(T value) : status_(ExecutionStatus::RETURNED) {
  164|     15|    new (&storage_) T(value);
  165|     15|  }
_ZN6hermes2vmeqINS0_6HandleINS0_11HermesValueEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  2.80M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  2.80M|  return lhs.getStatus() == rhs;
  417|  2.80M|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|  5.60M|  ExecutionStatus getStatus() const {
  290|  5.60M|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 5.60M]
  ------------------
  291|  5.60M|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|  5.60M|        ? ExecutionStatus::EXCEPTION
  293|  5.60M|        : ExecutionStatus::RETURNED;
  294|  5.60M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|  2.80M|  Handle<T> &operator*() {
  282|  2.80M|    return getValue();
  283|  2.80M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|  2.80M|  Handle<T> &getValue() {
  296|  2.80M|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|  2.80M|    return valueOrStatus_;
  298|  2.80M|  }
_ZN6hermes2vmeqINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS9_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.27k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.27k|  return lhs.getStatus() == rhs;
  417|  1.27k|}
_ZNK6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  6.07k|  ExecutionStatus getStatus() const {
  125|  6.07k|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 6.07k, False: 0]
  ------------------
  126|  6.07k|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|  4.79k|  T *operator->() {
  136|  4.79k|    return &getValue();
  137|  4.79k|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|  4.79k|  T &getValue() {
  128|  4.79k|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|  4.79k|    return *value_;
  130|  4.79k|  }
_ZN6hermes2vmeqINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS9_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.14M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.14M|  return lhs.getStatus() == rhs;
  417|  1.14M|}
_ZN6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EEC2IS7_vEEOT_:
  109|  1.27k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE4EEC2ES6_:
  273|     15|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  415|    153|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|    153|  return lhs.getStatus() == rhs;
  417|    153|}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|    306|  ExecutionStatus getStatus() const {
  401|    306|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 306]
  ------------------
  402|    306|        ? ExecutionStatus::EXCEPTION
  403|    306|        : ExecutionStatus::RETURNED;
  404|    306|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE6EEdeEv:
  392|    153|  PseudoHandle<T> &operator*() {
  393|    153|    return getValue();
  394|    153|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE6EE8getValueEv:
  405|    153|  PseudoHandle<T> &getValue() {
  406|    153|    assert(getStatus() == ExecutionStatus::RETURNED);
  407|    153|    return valueOrStatus_;
  408|    153|  }
_ZN6hermes2vmeqIjEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  415|     15|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     15|  return lhs.getStatus() == rhs;
  417|     15|}
_ZNK6hermes2vm10CallResultIjLNS0_6detail20CallResultSpecializeE2EE9getStatusEv:
  175|     15|  ExecutionStatus getStatus() const {
  176|     15|    return status_;
  177|     15|  }
_ZNK6hermes2vm10CallResultIjLNS0_6detail20CallResultSpecializeE2EEdeEv:
  171|     30|  const T &operator*() const {
  172|     30|    return getValue();
  173|     30|  }
_ZNK6hermes2vm10CallResultIjLNS0_6detail20CallResultSpecializeE2EE8getValueEv:
  178|     30|  const T &getValue() const {
  179|     30|    assert(status_ == ExecutionStatus::RETURNED);
  180|     30|    return *reinterpret_cast<const T *>(&storage_);
  181|     30|  }
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_14OrderedHashMapEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|    160|  ExecutionStatus getStatus() const {
  401|    160|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 160]
  ------------------
  402|    160|        ? ExecutionStatus::EXCEPTION
  403|    160|        : ExecutionStatus::RETURNED;
  404|    160|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEC2ENS0_15ExecutionStatusES2_:
  190|  1.91M|      : status_(status), storage_(value) {
  191|  1.91M|    static_assert(
  192|  1.91M|        std::is_same<T, HermesValue>::value,
  193|  1.91M|        "private constructor is for constructing CallResult<HermesValue>");
  194|  1.91M|  }
_ZN6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EEC2Em:
  163|   781k|  /* implicit */ CallResult(T value) : status_(ExecutionStatus::RETURNED) {
  164|   781k|    new (&storage_) T(value);
  165|   781k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EEC2ENS0_15ExecutionStatusE:
  276|      1|      : valueOrStatus_(Handle<T>::unsafeCreate(
  277|      1|            reinterpret_cast<const PinnedHermesValue *>(-1))) {
  278|      1|    assert(status != ExecutionStatus::RETURNED);
  279|      1|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|     22|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EEptEv:
  284|     15|  Handle<T> *operator->() {
  285|     15|    assert(getStatus() == ExecutionStatus::RETURNED);
  286|     15|    return &getValue();
  287|     15|  }
_ZN6hermes2vmneINS0_12PseudoHandleINS0_11HermesValueEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  419|    160|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|    160|  return lhs.getStatus() != rhs;
  421|    160|}
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|  2.65M|  T *operator->() {
  136|  2.65M|    return &getValue();
  137|  2.65M|  }
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|  2.65M|  T &getValue() {
  128|  2.65M|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|  2.65M|    return *value_;
  130|  2.65M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|    175|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vmeqIPNS0_13RuntimeModuleEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS5_EE5valueEEENS0_15ExecutionStatusE:
  415|    356|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|    356|  return lhs.getStatus() == rhs;
  417|    356|}
_ZNK6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EE9getStatusEv:
  252|    712|  ExecutionStatus getStatus() const {
  253|    712|    return reinterpret_cast<intptr_t>(valueOrStatus_) == -1
  ------------------
  |  Branch (253:12): [True: 0, False: 712]
  ------------------
  254|    712|        ? ExecutionStatus::EXCEPTION
  255|    712|        : ExecutionStatus::RETURNED;
  256|    712|  }
_ZN6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EEdeEv:
  245|    356|  T *&operator*() {
  246|    356|    return getValue();
  247|    356|  }
_ZN6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EE8getValueEv:
  257|    356|  T *&getValue() {
  258|    356|    assert(getStatus() == ExecutionStatus::RETURNED);
  259|    356|    return valueOrStatus_;
  260|    356|  }
_ZN6hermes2vmneINS0_11HermesValueEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  419|    480|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|    480|  return lhs.getStatus() != rhs;
  421|    480|}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_14OrderedHashMapEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|    160|  PseudoHandle<T> *operator->() {
  396|    160|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|    160|    return &valueOrStatus_;
  398|    160|  }
_ZN6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EEC2ES3_:
  238|    356|  /* implicit */ CallResult(T *value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEELNS0_6detail20CallResultSpecializeE6EEC2EOS6_:
  378|    153|      : valueOrStatus_(std::move(value)) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EEC2EOS6_:
  378|   663k|      : valueOrStatus_(std::move(value)) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EEptEv:
  284|      1|  Handle<T> *operator->() {
  285|      1|    assert(getStatus() == ExecutionStatus::RETURNED);
  286|      1|    return &getValue();
  287|      1|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSRegExpEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|      1|  ~CallResult() = default;
_ZN6hermes2vmeqINS0_6HandleINS0_8JSRegExpEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|      1|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|      1|  return lhs.getStatus() == rhs;
  417|      1|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_8JSRegExpEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|      2|  ExecutionStatus getStatus() const {
  290|      2|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 2]
  ------------------
  291|      2|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|      2|        ? ExecutionStatus::EXCEPTION
  293|      2|        : ExecutionStatus::RETURNED;
  294|      2|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSRegExpEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|      1|  Handle<T> &getValue() {
  296|      1|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      1|    return valueOrStatus_;
  298|      1|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSRegExpEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|      1|  Handle<T> &operator*() {
  282|      1|    return getValue();
  283|      1|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSRegExpEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|      1|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15DictPropertyMapEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|   209k|      : valueOrStatus_(std::move(value)) {}
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_15DictPropertyMapEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  16.7k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  16.7k|  return lhs.getStatus() == rhs;
  417|  16.7k|}
_ZN6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EEC2IS6_vEEOT_:
  109|   877k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_14OrderedHashMapEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|    160|      : valueOrStatus_(std::move(value)) {}

_ZN6hermes2vm8Callable4callENS0_6HandleIS1_EERNS0_7RuntimeE:
  248|  2.66M|      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|  2.66M|    runtime.potentiallyMoveHeap();
  253|  2.66M|    return selfHandle->getVT()->call(selfHandle, runtime);
  254|  2.66M|  }
_ZNK6hermes2vm8Callable5getVTEv:
  141|  2.66M|  const CallableVTable *getVT() const {
  142|  2.66M|    return static_cast<const CallableVTable *>(GCCell::getVT());
  143|  2.66M|  }
_ZN6hermes2vm11Environment7classofEPKNS0_6GCCellE:
   45|  19.9k|  static bool classof(const GCCell *cell) {
   46|  19.9k|    return cell->getKind() == CellKind::EnvironmentKind;
   47|  19.9k|  }
_ZN6hermes2vm8Callable7classofEPKNS0_6GCCellE:
  134|  3.02M|  static bool classof(const GCCell *cell) {
  135|  3.02M|    return kindInRange(
  136|  3.02M|        cell->getKind(),
  137|  3.02M|        CellKind::CallableKind_first,
  138|  3.02M|        CellKind::CallableKind_last);
  139|  3.02M|  }
_ZN6hermes2vm11Environment11getCellKindEv:
   42|  1.67k|  static constexpr CellKind getCellKind() {
   43|  1.67k|    return CellKind::EnvironmentKind;
   44|  1.67k|  }
_ZN6hermes2vm11Environment6createERNS0_7RuntimeENS0_6HandleIS1_EEj:
   53|    836|      uint32_t size) {
   54|    836|    auto *cell = runtime.makeAVariable<Environment>(
   55|    836|        allocationSize(size), runtime, parentEnvironment, size);
   56|    836|    return HermesValue::encodeObjectValue(cell);
   57|    836|  }
_ZNK6hermes2vm11Environment7getSizeEv:
   66|  8.01k|  uint32_t getSize() const {
   67|  8.01k|    return size_.load(std::memory_order_relaxed);
   68|  8.01k|  }
_ZN6hermes2vm11Environment4slotEj:
   70|  8.01k|  GCHermesValue &slot(uint32_t index) {
   71|  8.01k|    assert(index < getSize() && "invalid Environment slot index");
   72|  8.01k|    return getSlots()[index];
   73|  8.01k|  }
_ZN6hermes2vm11Environment14allocationSizeEj:
   76|    836|  static uint32_t allocationSize(uint32_t size) {
   77|    836|    return totalSizeToAlloc<GCHermesValue>(size);
   78|    836|  }
_ZN6hermes2vm11EnvironmentC2ERNS0_7RuntimeENS0_6HandleIS1_EEj:
   88|    836|      : parentEnvironment_(runtime, parentEnvironment.get(), runtime.getHeap()),
   89|    836|        size_(size) {
   90|       |    // Initialize all slots to 'undefined'.
   91|    836|    GCHermesValue::uninitialized_fill(
   92|    836|        getSlots(),
   93|    836|        getSlots() + size,
   94|    836|        HermesValue::encodeUndefinedValue(),
   95|    836|        runtime.getHeap());
   96|    836|  }
_ZN6hermes2vm11Environment8getSlotsEv:
  100|  9.69k|  GCHermesValue *getSlots() {
  101|  9.69k|    return getTrailingObjects<GCHermesValue>();
  102|  9.69k|  }
_ZNK6hermes2vm11Environment8getSlotsEv:
  103|      1|  const GCHermesValue *getSlots() const {
  104|      1|    return getTrailingObjects<GCHermesValue>();
  105|      1|  }
_ZNK6hermes2vm8Callable14getEnvironmentERNS0_7RuntimeE:
  146|  2.91k|  Environment *getEnvironment(Runtime &runtime) const {
  147|  2.91k|    return environment_.get(runtime);
  148|  2.91k|  }
_ZN6hermes2vm8Callable9newObjectENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_8JSObjectEEE:
  241|    960|      Handle<JSObject> parentHandle) {
  242|    960|    return selfHandle->getVT()->newObject(selfHandle, runtime, parentHandle);
  243|    960|  }
_ZN6hermes2vm8CallableC2ERNS0_7RuntimeEPNS0_8JSObjectEPNS0_11HiddenClassENS0_6HandleINS0_11EnvironmentEEE:
  314|  6.19k|      : JSObject(runtime, parent, clazz),
  315|  6.19k|        environment_(runtime, *env, runtime.getHeap()) {}
_ZN6hermes2vm8CallableC2ERNS0_7RuntimeEPNS0_8JSObjectEPNS0_11HiddenClassE:
  317|  77.4k|      : JSObject(runtime, parent, clazz), environment_() {}
_ZN6hermes2vm13BoundFunction11getCellKindEv:
  346|    320|  static constexpr CellKind getCellKind() {
  347|    320|    return CellKind::BoundFunctionKind;
  348|    320|  }
_ZN6hermes2vm13BoundFunction7classofEPKNS0_6GCCellE:
  349|    161|  static bool classof(const GCCell *cell) {
  350|    161|    return cell->getKind() == CellKind::BoundFunctionKind;
  351|    161|  }
_ZN6hermes2vm13BoundFunctionC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEENS4_INS0_8CallableEEENS4_INS0_16ArrayStorageBaseINS0_11HermesValueEEEEE:
  397|    160|      : Callable(runtime, *parent, *clazz),
  398|    160|        target_(runtime, *target, runtime.getHeap()),
  399|    160|        argStorage_(runtime, *argStorage, runtime.getHeap()) {}
_ZN6hermes2vm14NativeFunction11getCellKindEv:
  444|   141k|  static constexpr CellKind getCellKind() {
  445|   141k|    return CellKind::NativeFunctionKind;
  446|   141k|  }
_ZN6hermes2vm14NativeFunction7classofEPKNS0_6GCCellE:
  447|  3.92M|  static bool classof(const GCCell *cell) {
  448|  3.92M|    return kindInRange(
  449|  3.92M|        cell->getKind(),
  450|  3.92M|        CellKind::NativeFunctionKind_first,
  451|  3.92M|        CellKind::NativeFunctionKind_last);
  452|  3.92M|  }
_ZN6hermes2vm14NativeFunction11_nativeCallEPS1_RNS0_7RuntimeE:
  483|  3.44M|      Runtime &runtime) {
  484|  3.44M|    ScopedNativeDepthTracker depthTracker{runtime};
  485|  3.44M|    if (LLVM_UNLIKELY(depthTracker.overflowed())) {
  ------------------
  |  |  189|  3.44M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.44M]
  |  |  ------------------
  ------------------
  486|      0|      return runtime.raiseStackOverflow(
  487|      0|          Runtime::StackOverflowKind::NativeStack);
  488|      0|    }
  489|       |
  490|  3.44M|    auto newFrame = runtime.setCurrentFrameToTopOfStack();
  491|  3.44M|    runtime.saveCallerIPInStackFrame();
  492|       |    // Allocate the "reserved" registers in the new frame.
  493|  3.44M|    if (LLVM_UNLIKELY(!runtime.checkAndAllocStack(
  ------------------
  |  |  189|  3.44M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.44M]
  |  |  ------------------
  ------------------
  494|  3.44M|            StackFrameLayout::CalleeExtraRegistersAtStart,
  495|  3.44M|            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|  3.44M|    auto res =
  507|  3.44M|        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|  3.44M|    runtime.restoreStackAndPreviousFrame(newFrame);
  514|  3.44M|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  3.44M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 5, False: 3.44M]
  |  |  ------------------
  ------------------
  515|      5|      return ExecutionStatus::EXCEPTION;
  516|      5|    }
  517|  3.44M|    return createPseudoHandle(*res);
  518|  3.44M|  }
_ZN6hermes2vm14NativeFunction22createWithoutPrototypeERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S3_NS0_10NativeArgsEENS0_8SymbolIDEjj:
  576|  2.40k|      unsigned additionalSlotCount = 0) {
  577|  2.40k|    return create(
  578|  2.40k|        runtime,
  579|  2.40k|        parentHandle,
  580|  2.40k|        context,
  581|  2.40k|        functionPtr,
  582|  2.40k|        name,
  583|  2.40k|        paramCount,
  584|  2.40k|        runtime.makeNullHandle<JSObject>(),
  585|  2.40k|        additionalSlotCount);
  586|  2.40k|  }
_ZN6hermes2vm14NativeFunction22createWithoutPrototypeERNS0_7RuntimeEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES4_S3_NS0_10NativeArgsEENS0_8SymbolIDEjj:
  603|  2.40k|      unsigned additionalSlotCount = 0) {
  604|  2.40k|    return createWithoutPrototype(
  605|  2.40k|        runtime,
  606|  2.40k|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  607|  2.40k|        context,
  608|  2.40k|        functionPtr,
  609|  2.40k|        name,
  610|  2.40k|        paramCount,
  611|  2.40k|        additionalSlotCount);
  612|  2.40k|  }
_ZN6hermes2vm14NativeFunctionC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES9_S3_NS0_10NativeArgsEE:
  644|  77.2k|      : Callable(runtime, *parent, *clazz),
  645|  77.2k|        context_(context),
  646|  77.2k|        functionPtr_(functionPtr) {}
_ZN6hermes2vm17NativeConstructor11getCellKindEv:
  700|  13.4k|  static constexpr CellKind getCellKind() {
  701|  13.4k|    return CellKind::NativeConstructorKind;
  702|  13.4k|  }
_ZN6hermes2vm17NativeConstructor7classofEPKNS0_6GCCellE:
  703|  6.72k|  static bool classof(const GCCell *cell) {
  704|  6.72k|    return cell->getKind() == CellKind::NativeConstructorKind;
  705|  6.72k|  }
_ZN6hermes2vm17NativeConstructor6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S3_NS0_10NativeArgsEEjPFNS8_INS0_12PseudoHandleIS5_EELSB_6EEES3_S6_S7_ENS0_8CellKindE:
  724|  6.72k|      CellKind targetKind) {
  725|  6.72k|    auto *cell = runtime.makeAFixed<NativeConstructor>(
  726|  6.72k|        runtime,
  727|  6.72k|        parentHandle,
  728|  6.72k|        runtime.getHiddenClassForPrototype(
  729|  6.72k|            *parentHandle, numOverlapSlots<NativeConstructor>()),
  730|  6.72k|        context,
  731|  6.72k|        functionPtr,
  732|  6.72k|        creator,
  733|  6.72k|        targetKind);
  734|  6.72k|    return JSObjectInit::initToPseudoHandle(runtime, cell);
  735|  6.72k|  }
_ZN6hermes2vm17NativeConstructorC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES9_S3_NS0_10NativeArgsEEPFNSA_INS0_12PseudoHandleIS5_EELSD_6EEES3_S6_S9_ENS0_8CellKindE:
  782|  6.72k|      : NativeFunction(runtime, parent, clazz, context, functionPtr),
  783|       |#ifndef NDEBUG
  784|  6.72k|        targetKind_(targetKind),
  785|       |#endif
  786|  6.72k|        creator_(creator) {
  787|  6.72k|  }
_ZN6hermes2vm10JSFunctionC2ERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS4_INS0_8JSObjectEEENS4_INS0_11HiddenClassEEENS4_INS0_11EnvironmentEEEPNS0_9CodeBlockE:
  853|  6.19k|      : Callable(runtime, *parent, *clazz, environment),
  854|  6.19k|        codeBlock_(runtime, codeBlock),
  855|  6.19k|        domain_(runtime, *domain, runtime.getHeap()) {
  856|  6.19k|    assert(
  857|  6.19k|        !vt.finalize_ == (kHasFinalizer != HasFinalizer::Yes) &&
  858|  6.19k|        "kHasFinalizer invalid value");
  859|  6.19k|  }
_ZN6hermes2vm10JSFunction11getCellKindEv:
  864|  12.3k|  static constexpr CellKind getCellKind() {
  865|  12.3k|    return CellKind::JSFunctionKind;
  866|  12.3k|  }
_ZN6hermes2vm10JSFunction7classofEPKNS0_6GCCellE:
  867|   404k|  static bool classof(const GCCell *cell) {
  868|   404k|    return kindInRange(
  869|   404k|        cell->getKind(),
  870|   404k|        CellKind::CodeBlockFunctionKind_first,
  871|   404k|        CellKind::CodeBlockFunctionKind_last);
  872|   404k|  }
_ZNK6hermes2vm10JSFunction12getCodeBlockERNS0_7RuntimeE:
  906|  3.07k|  CodeBlock *getCodeBlock(Runtime &runtime) const {
  907|  3.07k|    return codeBlock_.get(runtime);
  908|  3.07k|  }
_ZN6hermes2vm15JSAsyncFunction7classofEPKNS0_6GCCellE:
  972|     85|  static bool classof(const GCCell *cell) {
  973|     85|    return cell->getKind() == CellKind::JSAsyncFunctionKind;
  974|     85|  }
_ZN6hermes2vm19JSGeneratorFunction7classofEPKNS0_6GCCellE:
 1026|  7.55k|  static bool classof(const GCCell *cell) {
 1027|  7.55k|    return cell->getKind() == CellKind::JSGeneratorFunctionKind;
 1028|  7.55k|  }

_ZN6hermes2vm9CardTable8Boundary4bumpEv:
  278|  1.37M|inline void CardTable::Boundary::bump() {
  279|  1.37M|  index_++;
  280|  1.37M|  address_ += kCardSize;
  281|  1.37M|}
_ZNK6hermes2vm9CardTable8Boundary5indexEv:
  283|  1.41M|inline size_t CardTable::Boundary::index() const {
  284|  1.41M|  return index_;
  285|  1.41M|}
_ZNK6hermes2vm9CardTable8Boundary7addressEv:
  287|  2.12M|inline const char *CardTable::Boundary::address() const {
  288|  2.12M|  return address_;
  289|  2.12M|}
_ZNK6hermes2vm9CardTable14addressToIndexEPKv:
  294|  2.41M|inline size_t CardTable::addressToIndex(const void *addr) const {
  295|  2.41M|  auto addrPtr = reinterpret_cast<const char *>(addr);
  296|  2.41M|  assert(
  297|  2.41M|      base() <= addrPtr &&
  298|  2.41M|      addrPtr < (static_cast<const char *>(AlignedStorage::end(base())) +
  299|  2.41M|                 kCardSize) &&
  300|  2.41M|      "address is required to be within range.");
  301|  2.41M|  return (addrPtr - base()) >> kLogCardSize;
  302|  2.41M|}
_ZNK6hermes2vm9CardTable14indexToAddressEm:
  304|  4.21M|inline const char *CardTable::indexToAddress(size_t index) const {
  305|  4.21M|  assert(index <= kValidIndices && "index must be within the index range");
  306|  4.21M|  const char *res = base() + (index << kLogCardSize);
  307|  4.21M|  assert(
  308|  4.21M|      base() <= res && res <= AlignedStorage::end(base()) &&
  309|  4.21M|      "result must be within the covered range");
  310|  4.21M|  return res;
  311|  4.21M|}
_ZN6hermes2vm9CardTable19dirtyCardForAddressEPKv:
  313|  1.78M|inline void CardTable::dirtyCardForAddress(const void *addr) {
  314|  1.78M|  cards_[addressToIndex(addr)].store(
  315|  1.78M|      CardStatus::Dirty, std::memory_order_relaxed);
  316|  1.78M|}
_ZNK6hermes2vm9CardTable21isCardForAddressDirtyEPKv:
  318|  1.63k|inline bool CardTable::isCardForAddressDirty(const void *addr) const {
  319|  1.63k|  return isCardForIndexDirty(addressToIndex(addr));
  320|  1.63k|}
_ZNK6hermes2vm9CardTable19isCardForIndexDirtyEm:
  322|  1.95k|inline bool CardTable::isCardForIndexDirty(size_t index) const {
  323|  1.95k|  assert(index < kValidIndices && "index is required to be in range.");
  324|  1.95k|  return cards_[index].load(std::memory_order_relaxed) == CardStatus::Dirty;
  325|  1.95k|}
_ZNK6hermes2vm9CardTable17findNextDirtyCardEmm:
  329|    272|    size_t endIndex) const {
  330|    272|  return findNextCardWithStatus(CardStatus::Dirty, fromIndex, endIndex);
  331|    272|}
_ZNK6hermes2vm9CardTable17findNextCleanCardEmm:
  335|    159|    size_t endIndex) const {
  336|    159|  return findNextCardWithStatus(CardStatus::Clean, fromIndex, endIndex);
  337|    159|}
_ZNK6hermes2vm9CardTable12nextBoundaryEPKc:
  339|   585k|inline CardTable::Boundary CardTable::nextBoundary(const char *level) const {
  340|   585k|  assert(level != nullptr);
  341|   585k|  size_t ix = addressToIndex(level - 1) + 1;
  342|   585k|  const char *addr = indexToAddress(ix);
  343|       |
  344|   585k|  return {ix, addr};
  345|   585k|}
_ZNK6hermes2vm9CardTable4baseEv:
  347|  19.9M|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|  19.9M|  return reinterpret_cast<const char *>(this);
  352|  19.9M|}
_ZN6hermes2vm9CardTable9encodeExpEa:
  354|  1.33M|/* static */ inline int8_t CardTable::encodeExp(int8_t exp) {
  355|  1.33M|  return -(exp + 1);
  356|  1.33M|}
_ZN6hermes2vm9CardTable9decodeExpEa:
  358|  9.37M|/* static */ inline int8_t CardTable::decodeExp(int8_t encodedVal) {
  359|  9.37M|  return -encodedVal - 1;
  360|  9.37M|}
_ZN6hermes2vm9CardTable13isCardAlignedEPKv:
  362|    226|/* static */ inline bool CardTable::isCardAligned(const void *ptr) {
  363|    226|  return (reinterpret_cast<intptr_t>(ptr) & (kCardSize - 1)) == 0;
  364|    226|}
_ZN6hermes2vm9CardTableC2Ev:
   98|    320|  CardTable() = default;
_ZN6hermes2vm9CardTable8BoundaryC2EmPKc:
  292|   585k|    : index_(index), address_(address) {}

_ZN6hermes2vm6vmcastINS0_15StringPrimitiveEEEPT_NS0_11HermesValueE:
   42|  8.31M|ToType *vmcast(HermesValue val) {
   43|  8.31M|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  8.31M|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  8.31M|}
_ZN6hermes2vm6vmcastINS0_15StringPrimitiveEEEPT_PNS0_6GCCellE:
   29|  9.79M|ToType *vmcast(GCCell *cell) {
   30|  9.79M|  return llvh::cast<ToType>(cell);
   31|  9.79M|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIcEEEEPKT_PKNS0_6GCCellE:
   35|     93|const ToType *vmcast(const GCCell *cell) {
   36|     93|  return llvh::cast<ToType>(cell);
   37|     93|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIcLb1EEEEEbPKNS0_6GCCellE:
  116|  12.8M|bool vmisa(const GCCell *cell) {
  117|  12.8M|  return llvh::isa<ToType>(cell);
  118|  12.8M|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIcLb1EEEEEPKT_PKNS0_6GCCellE:
   35|  9.64M|const ToType *vmcast(const GCCell *cell) {
   36|  9.64M|  return llvh::cast<ToType>(cell);
   37|  9.64M|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIcLb0EEEEEbPKNS0_6GCCellE:
  116|  3.19M|bool vmisa(const GCCell *cell) {
  117|  3.19M|  return llvh::isa<ToType>(cell);
  118|  3.19M|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIcLb0EEEEEPKT_PKNS0_6GCCellE:
   35|  3.19M|const ToType *vmcast(const GCCell *cell) {
   36|  3.19M|  return llvh::cast<ToType>(cell);
   37|  3.19M|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIcEEEEPT_PNS0_6GCCellE:
   29|     28|ToType *vmcast(GCCell *cell) {
   30|     28|  return llvh::cast<ToType>(cell);
   31|     28|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIDsEEEEPKT_PKNS0_6GCCellE:
   35|   213k|const ToType *vmcast(const GCCell *cell) {
   36|   213k|  return llvh::cast<ToType>(cell);
   37|   213k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIDsLb1EEEEEbPKNS0_6GCCellE:
  116|  1.17M|bool vmisa(const GCCell *cell) {
  117|  1.17M|  return llvh::isa<ToType>(cell);
  118|  1.17M|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIDsLb1EEEEEPKT_PKNS0_6GCCellE:
   35|   391k|const ToType *vmcast(const GCCell *cell) {
   36|   391k|  return llvh::cast<ToType>(cell);
   37|   391k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIDsLb0EEEEEbPKNS0_6GCCellE:
  116|   781k|bool vmisa(const GCCell *cell) {
  117|   781k|  return llvh::isa<ToType>(cell);
  118|   781k|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIDsLb0EEEEEPKT_PKNS0_6GCCellE:
   35|   781k|const ToType *vmcast(const GCCell *cell) {
   36|   781k|  return llvh::cast<ToType>(cell);
   37|   781k|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIDsEEEEPT_NS0_11HermesValueE:
   42|     60|ToType *vmcast(HermesValue val) {
   43|     60|  assert(val.isPointer() && "vmcast with non-pointer");
   44|     60|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     60|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIDsEEEEPT_PNS0_6GCCellE:
   29|  92.4k|ToType *vmcast(GCCell *cell) {
   30|  92.4k|  return llvh::cast<ToType>(cell);
   31|  92.4k|}
_ZN6hermes2vm6vmcastINS0_11HiddenClassEEEPT_PNS0_6GCCellE:
   29|  22.3M|ToType *vmcast(GCCell *cell) {
   30|  22.3M|  return llvh::cast<ToType>(cell);
   31|  22.3M|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEPT_PNS0_6GCCellE:
   29|  5.76M|ToType *vmcast(GCCell *cell) {
   30|  5.76M|  return llvh::cast<ToType>(cell);
   31|  5.76M|}
_ZN6hermes2vm6vmcastINS0_7JSArrayEEEPT_NS0_11HermesValueE:
   42|  1.49M|ToType *vmcast(HermesValue val) {
   43|  1.49M|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  1.49M|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  1.49M|}
_ZN6hermes2vm6vmcastINS0_7JSArrayEEEPT_PNS0_6GCCellE:
   29|  1.49M|ToType *vmcast(GCCell *cell) {
   30|  1.49M|  return llvh::cast<ToType>(cell);
   31|  1.49M|}
_ZN6hermes2vm14vmcast_or_nullINS0_11EnvironmentEEEPT_NS0_11HermesValueE:
   60|  1.19k|ToType *vmcast_or_null(HermesValue val) {
   61|  1.19k|  assert(val.isPointer() && "vmcast with non-pointer");
   62|  1.19k|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|  1.19k|}
_ZN6hermes2vm14vmcast_or_nullINS0_11EnvironmentEEEPT_PNS0_6GCCellE:
   49|  4.11k|ToType *vmcast_or_null(GCCell *cell) {
   50|  4.11k|#ifndef NDEBUG
   51|  4.11k|  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.11k|}
_ZN6hermes2vm6vmcastINS0_8CallableEEEPT_NS0_11HermesValueE:
   42|  4.89k|ToType *vmcast(HermesValue val) {
   43|  4.89k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  4.89k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  4.89k|}
_ZN6hermes2vm6vmcastINS0_8CallableEEEPT_PNS0_6GCCellE:
   29|  4.89k|ToType *vmcast(GCCell *cell) {
   30|  4.89k|  return llvh::cast<ToType>(cell);
   31|  4.89k|}
_ZN6hermes2vm5vmisaINS0_8JSObjectEEEbNS0_11HermesValueE:
  103|  1.07k|bool vmisa(HermesValue val) {
  104|  1.07k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 1.07k, False: 0]
  ------------------
  105|  1.07k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 1.07k, False: 0]
  ------------------
  106|  1.07k|}
_ZN6hermes2vm14vmcast_or_nullINS0_8JSObjectEEEPT_NS0_11HermesValueE:
   60|  71.0k|ToType *vmcast_or_null(HermesValue val) {
   61|  71.0k|  assert(val.isPointer() && "vmcast with non-pointer");
   62|  71.0k|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|  71.0k|}
_ZN6hermes2vm14vmcast_or_nullINS0_8JSObjectEEEPT_PNS0_6GCCellE:
   49|  5.51M|ToType *vmcast_or_null(GCCell *cell) {
   50|  5.51M|#ifndef NDEBUG
   51|  5.51M|  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.51M|}
_ZN6hermes2vm6vmcastINS0_10HostObjectEEEPT_PNS0_6GCCellE:
   29|   390k|ToType *vmcast(GCCell *cell) {
   30|   390k|  return llvh::cast<ToType>(cell);
   31|   390k|}
_ZN6hermes2vm6vmcastINS0_8JSObjectEEEPT_NS0_11HermesValueE:
   42|  11.2M|ToType *vmcast(HermesValue val) {
   43|  11.2M|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  11.2M|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  11.2M|}
_ZN6hermes2vm6vmcastINS0_8JSObjectEEEPT_PNS0_6GCCellE:
   29|  14.2M|ToType *vmcast(GCCell *cell) {
   30|  14.2M|  return llvh::cast<ToType>(cell);
   31|  14.2M|}
_ZN6hermes2vm5vmisaINS0_7JSArrayEEEbNS0_11HermesValueE:
  103|  1.53M|bool vmisa(HermesValue val) {
  104|  1.53M|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 1.53M, False: 0]
  ------------------
  105|  1.53M|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 1.53M, False: 0]
  ------------------
  106|  1.53M|}
_ZN6hermes2vm5vmisaINS0_8CallableEEEbNS0_11HermesValueE:
  103|  4.15M|bool vmisa(HermesValue val) {
  104|  4.15M|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 3.02M, False: 1.13M]
  ------------------
  105|  4.15M|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 2.66M, False: 356k]
  ------------------
  106|  4.15M|}
_ZN6hermes2vm6vmcastINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEEEPT_PNS0_6GCCellE:
   29|  8.99M|ToType *vmcast(GCCell *cell) {
   30|  8.99M|  return llvh::cast<ToType>(cell);
   31|  8.99M|}
_ZN6hermes2vm5vmisaINS0_15StringPrimitiveEEEbNS0_11HermesValueE:
  103|    105|bool vmisa(HermesValue val) {
  104|    105|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 105, False: 0]
  ------------------
  105|    105|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 53, False: 52]
  ------------------
  106|    105|}
_ZN6hermes2vm14vmcast_or_nullINS0_15StringPrimitiveEEEPT_NS0_11HermesValueE:
   60|  58.1k|ToType *vmcast_or_null(HermesValue val) {
   61|  58.1k|  assert(val.isPointer() && "vmcast with non-pointer");
   62|  58.1k|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|  58.1k|}
_ZN6hermes2vm14vmcast_or_nullINS0_15StringPrimitiveEEEPT_PNS0_6GCCellE:
   49|  1.73M|ToType *vmcast_or_null(GCCell *cell) {
   50|  1.73M|#ifndef NDEBUG
   51|  1.73M|  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.73M|}
_ZN6hermes2vm6vmcastINS0_15BigIntPrimitiveEEEPT_NS0_11HermesValueE:
   42|   781k|ToType *vmcast(HermesValue val) {
   43|   781k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|   781k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   781k|}
_ZN6hermes2vm5vmisaINS0_21SymbolStringPrimitiveEEEbPKNS0_6GCCellE:
  116|   416k|bool vmisa(const GCCell *cell) {
  117|   416k|  return llvh::isa<ToType>(cell);
  118|   416k|}
_ZN6hermes2vm6vmcastINS0_21SymbolStringPrimitiveEEEPT_PNS0_6GCCellE:
   29|   416k|ToType *vmcast(GCCell *cell) {
   30|   416k|  return llvh::cast<ToType>(cell);
   31|   416k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIcLb1EEEEEbPNS0_6GCCellE:
  110|  2.34M|bool vmisa(GCCell *cell) {
  111|  2.34M|  return llvh::isa<ToType>(cell);
  112|  2.34M|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIcLb0EEEEEPT_PNS0_6GCCellE:
   29|  2.34M|ToType *vmcast(GCCell *cell) {
   30|  2.34M|  return llvh::cast<ToType>(cell);
   31|  2.34M|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIDsLb1EEEEEbPNS0_6GCCellE:
  110|  1.00M|bool vmisa(GCCell *cell) {
  111|  1.00M|  return llvh::isa<ToType>(cell);
  112|  1.00M|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIDsLb0EEEEEPT_PNS0_6GCCellE:
   29|  1.00M|ToType *vmcast(GCCell *cell) {
   30|  1.00M|  return llvh::cast<ToType>(cell);
   31|  1.00M|}
_ZN6hermes2vm6vmcastINS0_21SymbolStringPrimitiveEEEPKT_PKNS0_6GCCellE:
   35|   390k|const ToType *vmcast(const GCCell *cell) {
   36|   390k|  return llvh::cast<ToType>(cell);
   37|   390k|}
_ZN6hermes2vm6vmcastINS0_15BigIntPrimitiveEEEPT_PNS0_6GCCellE:
   29|   781k|ToType *vmcast(GCCell *cell) {
   30|   781k|  return llvh::cast<ToType>(cell);
   31|   781k|}
_ZN6hermes2vm5vmisaINS0_15StringPrimitiveEEEbPNS0_6GCCellE:
  110|   276k|bool vmisa(GCCell *cell) {
  111|   276k|  return llvh::isa<ToType>(cell);
  112|   276k|}
_ZN6hermes2vm6vmcastINS0_15DictPropertyMapEEEPT_PNS0_6GCCellE:
   29|  16.1M|ToType *vmcast(GCCell *cell) {
   30|  16.1M|  return llvh::cast<ToType>(cell);
   31|  16.1M|}
_ZN6hermes2vm14vmcast_or_nullINS0_11HiddenClassEEEPT_PNS0_6GCCellE:
   49|  2.56M|ToType *vmcast_or_null(GCCell *cell) {
   50|  2.56M|#ifndef NDEBUG
   51|  2.56M|  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.56M|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEPT_NS0_11HermesValueE:
   42|  90.7k|ToType *vmcast(HermesValue val) {
   43|  90.7k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  90.7k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  90.7k|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEPT_PNS0_6GCCellE:
   29|    160|ToType *vmcast(GCCell *cell) {
   30|    160|  return llvh::cast<ToType>(cell);
   31|    160|}
_ZN6hermes2vm6vmcastINS0_11HiddenClassEEEPT_NS0_11HermesValueE:
   42|  1.59M|ToType *vmcast(HermesValue val) {
   43|  1.59M|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  1.59M|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  1.59M|}
_ZN6hermes2vm14vmcast_or_nullINS0_8CallableEEEPT_PNS0_6GCCellE:
   49|    122|ToType *vmcast_or_null(GCCell *cell) {
   50|    122|#ifndef NDEBUG
   51|    122|  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|    122|}
_ZN6hermes2vm6vmcastINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEEPT_PNS0_6GCCellE:
   29|  16.7M|ToType *vmcast(GCCell *cell) {
   30|  16.7M|  return llvh::cast<ToType>(cell);
   31|  16.7M|}
_ZN6hermes2vm14vmcast_or_nullINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEEPT_PNS0_6GCCellE:
   49|  7.63M|ToType *vmcast_or_null(GCCell *cell) {
   50|  7.63M|#ifndef NDEBUG
   51|  7.63M|  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|  7.63M|}
_ZN6hermes2vm5vmisaINS0_10JSFunctionEEEbNS0_11HermesValueE:
  103|    454|bool vmisa(HermesValue val) {
  104|    454|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 454, False: 0]
  ------------------
  105|    454|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 454, False: 0]
  ------------------
  106|    454|}
_ZN6hermes2vm5vmisaINS0_19JSGeneratorFunctionEEEbPNS0_6GCCellE:
  110|  7.55k|bool vmisa(GCCell *cell) {
  111|  7.55k|  return llvh::isa<ToType>(cell);
  112|  7.55k|}
_ZN6hermes2vm6vmcastINS0_16PropertyAccessorEEEPT_NS0_11HermesValueE:
   42|  7.68k|ToType *vmcast(HermesValue val) {
   43|  7.68k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  7.68k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  7.68k|}
_ZN6hermes2vm6vmcastINS0_16PropertyAccessorEEEPT_PNS0_6GCCellE:
   29|  7.75k|ToType *vmcast(GCCell *cell) {
   30|  7.75k|  return llvh::cast<ToType>(cell);
   31|  7.75k|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEPT_S3_:
   42|    160|ToType *vmcast(HermesValue val) {
   43|    160|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    160|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    160|}
_ZN6hermes2vm10dyn_vmcastINS0_13BoundFunctionEEEPT_PNS0_6GCCellE:
   68|      1|ToType *dyn_vmcast(GCCell *cell) {
   69|      1|  return llvh::dyn_cast<ToType>(cell);
   70|      1|}
_ZN6hermes2vm6vmcastINS0_14NativeFunctionEEEPT_PNS0_6GCCellE:
   29|  3.06M|ToType *vmcast(GCCell *cell) {
   30|  3.06M|  return llvh::cast<ToType>(cell);
   31|  3.06M|}
_ZN6hermes2vm6vmcastINS0_10JSFunctionEEEPT_PNS0_6GCCellE:
   29|    242|ToType *vmcast(GCCell *cell) {
   30|    242|  return llvh::cast<ToType>(cell);
   31|    242|}
_ZN6hermes2vm6vmcastINS0_6DomainEEEPT_PNS0_6GCCellE:
   29|    676|ToType *vmcast(GCCell *cell) {
   30|    676|  return llvh::cast<ToType>(cell);
   31|    676|}
_ZN6hermes2vm10dyn_vmcastINS0_15StringPrimitiveEEEPT_PNS0_6GCCellE:
   68|     57|ToType *dyn_vmcast(GCCell *cell) {
   69|     57|  return llvh::dyn_cast<ToType>(cell);
   70|     57|}
_ZN6hermes2vm14vmcast_or_nullINS0_11HiddenClassEEEPT_NS0_11HermesValueE:
   60|    396|ToType *vmcast_or_null(HermesValue val) {
   61|    396|  assert(val.isPointer() && "vmcast with non-pointer");
   62|    396|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|    396|}
_ZN6hermes2vm14vmcast_or_nullINS0_15DictPropertyMapEEEPT_PNS0_6GCCellE:
   49|  1.58M|ToType *vmcast_or_null(GCCell *cell) {
   50|  1.58M|#ifndef NDEBUG
   51|  1.58M|  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.58M|}
_ZN6hermes2vm10dyn_vmcastINS0_14NativeFunctionEEEPT_NS0_11HermesValueE:
   81|   391k|ToType *dyn_vmcast(HermesValue val) {
   82|   391k|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 391k, False: 0]
  ------------------
   83|   391k|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|   391k|      : nullptr;
   85|   391k|}
_ZN6hermes2vm10dyn_vmcastINS0_14NativeFunctionEEEPT_PNS0_6GCCellE:
   68|   391k|ToType *dyn_vmcast(GCCell *cell) {
   69|   391k|  return llvh::dyn_cast<ToType>(cell);
   70|   391k|}
_ZN6hermes2vm10dyn_vmcastINS0_13BoundFunctionEEEPT_NS0_11HermesValueE:
   81|      1|ToType *dyn_vmcast(HermesValue val) {
   82|      1|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 1, False: 0]
  ------------------
   83|      1|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|      1|      : nullptr;
   85|      1|}
_ZN6hermes2vm10dyn_vmcastINS0_10JSFunctionEEEPT_NS0_11HermesValueE:
   81|   394k|ToType *dyn_vmcast(HermesValue val) {
   82|   394k|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 394k, False: 0]
  ------------------
   83|   394k|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|   394k|      : nullptr;
   85|   394k|}
_ZN6hermes2vm10dyn_vmcastINS0_10JSFunctionEEEPT_PNS0_6GCCellE:
   68|   394k|ToType *dyn_vmcast(GCCell *cell) {
   69|   394k|  return llvh::dyn_cast<ToType>(cell);
   70|   394k|}
_ZN6hermes2vm6vmcastINS0_11EnvironmentEEEPT_NS0_11HermesValueE:
   42|  13.8k|ToType *vmcast(HermesValue val) {
   43|  13.8k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  13.8k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  13.8k|}
_ZN6hermes2vm6vmcastINS0_11EnvironmentEEEPT_PNS0_6GCCellE:
   29|  13.8k|ToType *vmcast(GCCell *cell) {
   30|  13.8k|  return llvh::cast<ToType>(cell);
   31|  13.8k|}
_ZN6hermes2vm5vmisaINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEEbS3_:
  103|   840k|bool vmisa(HermesValue val) {
  104|   840k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 840k, False: 0]
  ------------------
  105|   840k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 840k, False: 0]
  ------------------
  106|   840k|}
_ZN6hermes2vm6vmcastINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEEPT_S3_:
   42|   840k|ToType *vmcast(HermesValue val) {
   43|   840k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|   840k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   840k|}
_ZN6hermes2vm6vmcastINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEEPT_PNS0_6GCCellE:
   29|   840k|ToType *vmcast(GCCell *cell) {
   30|   840k|  return llvh::cast<ToType>(cell);
   31|   840k|}
_ZN6hermes2vm6vmcastINS0_8JSRegExpEEEPT_NS0_11HermesValueE:
   42|     23|ToType *vmcast(HermesValue val) {
   43|     23|  assert(val.isPointer() && "vmcast with non-pointer");
   44|     23|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     23|}
_ZN6hermes2vm6vmcastINS0_8JSRegExpEEEPT_PNS0_6GCCellE:
   29|     31|ToType *vmcast(GCCell *cell) {
   30|     31|  return llvh::cast<ToType>(cell);
   31|     31|}
_ZN6hermes2vm10dyn_vmcastINS0_7JSErrorEEEPT_NS0_11HermesValueE:
   81|     52|ToType *dyn_vmcast(HermesValue val) {
   82|     52|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 52, False: 0]
  ------------------
   83|     52|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|     52|      : nullptr;
   85|     52|}
_ZN6hermes2vm10dyn_vmcastINS0_7JSErrorEEEPT_PNS0_6GCCellE:
   68|     52|ToType *dyn_vmcast(GCCell *cell) {
   69|     52|  return llvh::dyn_cast<ToType>(cell);
   70|     52|}
_ZN6hermes2vm6vmcastINS0_7JSErrorEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|     99|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm6vmcastINS0_7JSErrorEEEPT_PNS0_6GCCellE:
   29|    152|ToType *vmcast(GCCell *cell) {
   30|    152|  return llvh::cast<ToType>(cell);
   31|    152|}
_ZN6hermes2vm6vmcastINS0_9ArrayImplEEEPT_PNS0_6GCCellE:
   29|  8.80M|ToType *vmcast(GCCell *cell) {
   30|  8.80M|  return llvh::cast<ToType>(cell);
   31|  8.80M|}
_ZN6hermes2vm6vmcastINS0_9ArrayImplEEEPT_NS0_11HermesValueE:
   42|   582k|ToType *vmcast(HermesValue val) {
   43|   582k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|   582k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   582k|}
_ZN6hermes2vm14vmcast_or_nullINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEPT_PNS0_6GCCellE:
   49|  9.60k|ToType *vmcast_or_null(GCCell *cell) {
   50|  9.60k|#ifndef NDEBUG
   51|  9.60k|  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|  9.60k|}
_ZN6hermes2vm5vmisaINS0_7JSErrorEEEbPNS0_6GCCellE:
  110|     52|bool vmisa(GCCell *cell) {
  111|     52|  return llvh::isa<ToType>(cell);
  112|     52|}
_ZN6hermes2vm14vmcast_or_nullINS0_8CallableEEEPT_NS0_11HermesValueE:
   60|     52|ToType *vmcast_or_null(HermesValue val) {
   61|     52|  assert(val.isPointer() && "vmcast with non-pointer");
   62|     52|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|     52|}
_ZN6hermes2vm10dyn_vmcastINS0_15StringPrimitiveEEEPT_NS0_11HermesValueE:
   81|     57|ToType *dyn_vmcast(HermesValue val) {
   82|     57|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 57, False: 0]
  ------------------
   83|     57|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|     57|      : nullptr;
   85|     57|}
_ZN6hermes2vm5vmisaINS0_8CallableEEEbPNS0_6GCCellE:
  110|    454|bool vmisa(GCCell *cell) {
  111|    454|  return llvh::isa<ToType>(cell);
  112|    454|}
_ZN6hermes2vm10dyn_vmcastINS0_7JSArrayEEEPT_PNS0_6GCCellE:
   68|   271k|ToType *dyn_vmcast(GCCell *cell) {
   69|   271k|  return llvh::dyn_cast<ToType>(cell);
   70|   271k|}
_ZN6hermes2vm5vmisaINS0_7JSArrayEEEbPNS0_6GCCellE:
  110|   898k|bool vmisa(GCCell *cell) {
  111|   898k|  return llvh::isa<ToType>(cell);
  112|   898k|}
_ZN6hermes2vm6vmcastINS0_15DecoratedObjectEEEPT_PNS0_6GCCellE:
   29|    160|ToType *vmcast(GCCell *cell) {
   30|    160|  return llvh::cast<ToType>(cell);
   31|    160|}
_ZN6hermes2vm5vmisaINS0_14NativeFunctionEEEbPNS0_6GCCellE:
  110|     85|bool vmisa(GCCell *cell) {
  111|     85|  return llvh::isa<ToType>(cell);
  112|     85|}
_ZN6hermes2vm5vmisaINS0_8JSRegExpEEEbNS0_11HermesValueE:
  103|   355k|bool vmisa(HermesValue val) {
  104|   355k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 355k, False: 0]
  ------------------
  105|   355k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 17, False: 355k]
  ------------------
  106|   355k|}
_ZN6hermes2vm6vmcastINS0_8JSStringEEEPT_PNS0_6GCCellE:
   29|  1.68M|ToType *vmcast(GCCell *cell) {
   30|  1.68M|  return llvh::cast<ToType>(cell);
   31|  1.68M|}
_ZN6hermes2vm6vmcastINS0_6DomainEEEPT_NS0_11HermesValueE:
   42|    160|ToType *vmcast(HermesValue val) {
   43|    160|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    160|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    160|}
_ZN6hermes2vm5vmisaINS0_14NativeFunctionEEEbNS0_11HermesValueE:
  103|  5.92k|bool vmisa(HermesValue val) {
  104|  5.92k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 5.92k, False: 0]
  ------------------
  105|  5.92k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 5.92k, False: 0]
  ------------------
  106|  5.92k|}
_ZN6hermes2vm6vmcastINS0_14NativeFunctionEEEPT_NS0_11HermesValueE:
   42|  6.56k|ToType *vmcast(HermesValue val) {
   43|  6.56k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|  6.56k|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  6.56k|}
_ZN6hermes2vm6vmcastINS0_10JSFunctionEEEPT_NS0_11HermesValueE:
   42|    242|ToType *vmcast(HermesValue val) {
   43|    242|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    242|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    242|}
_ZN6hermes2vm10dyn_vmcastINS0_23BufferedStringPrimitiveIDsEEEEPT_PNS0_6GCCellE:
   68|     31|ToType *dyn_vmcast(GCCell *cell) {
   69|     31|  return llvh::dyn_cast<ToType>(cell);
   70|     31|}
_ZN6hermes2vm6vmcastINS0_23BufferedStringPrimitiveIDsEEEEPT_NS0_11HermesValueE:
   42|     29|ToType *vmcast(HermesValue val) {
   43|     29|  assert(val.isPointer() && "vmcast with non-pointer");
   44|     29|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     29|}
_ZN6hermes2vm6vmcastINS0_23BufferedStringPrimitiveIDsEEEEPT_PNS0_6GCCellE:
   29|     29|ToType *vmcast(GCCell *cell) {
   30|     29|  return llvh::cast<ToType>(cell);
   31|     29|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE60EEEEEPT_NS0_11HermesValueE:
   42|    160|ToType *vmcast(HermesValue val) {
   43|    160|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    160|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    160|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE60EEEEEPT_PNS0_6GCCellE:
   29|    160|ToType *vmcast(GCCell *cell) {
   30|    160|  return llvh::cast<ToType>(cell);
   31|    160|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE59EEEEEPT_NS0_11HermesValueE:
   42|    160|ToType *vmcast(HermesValue val) {
   43|    160|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    160|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    160|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE59EEEEEPT_PNS0_6GCCellE:
   29|    160|ToType *vmcast(GCCell *cell) {
   30|    160|  return llvh::cast<ToType>(cell);
   31|    160|}
_ZN6hermes2vm5vmisaINS0_8JSNumberEEEbNS0_11HermesValueE:
  103|   355k|bool vmisa(HermesValue val) {
  104|   355k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 355k, False: 0]
  ------------------
  105|   355k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 0, False: 355k]
  ------------------
  106|   355k|}
_ZN6hermes2vm5vmisaINS0_8JSStringEEEbNS0_11HermesValueE:
  103|   355k|bool vmisa(HermesValue val) {
  104|   355k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 355k, False: 0]
  ------------------
  105|   355k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 0, False: 355k]
  ------------------
  106|   355k|}
_ZN6hermes2vm5vmisaINS0_9ArgumentsEEEbNS0_11HermesValueE:
  103|   355k|bool vmisa(HermesValue val) {
  104|   355k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 355k, False: 0]
  ------------------
  105|   355k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 0, False: 355k]
  ------------------
  106|   355k|}
_ZN6hermes2vm5vmisaINS0_7JSErrorEEEbNS0_11HermesValueE:
  103|   355k|bool vmisa(HermesValue val) {
  104|   355k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 355k, False: 0]
  ------------------
  105|   355k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 0, False: 355k]
  ------------------
  106|   355k|}
_ZN6hermes2vm5vmisaINS0_9JSBooleanEEEbNS0_11HermesValueE:
  103|   355k|bool vmisa(HermesValue val) {
  104|   355k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 355k, False: 0]
  ------------------
  105|   355k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 0, False: 355k]
  ------------------
  106|   355k|}
_ZN6hermes2vm5vmisaINS0_6JSDateEEEbNS0_11HermesValueE:
  103|   355k|bool vmisa(HermesValue val) {
  104|   355k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 355k, False: 0]
  ------------------
  105|   355k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 0, False: 355k]
  ------------------
  106|   355k|}
_ZN6hermes2vm6vmcastINS0_8JSStringEEEPT_NS0_11HermesValueE:
   42|    160|ToType *vmcast(HermesValue val) {
   43|    160|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    160|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    160|}
_ZN6hermes2vm5vmisaINS0_15JSAsyncFunctionEEEbPNS0_6GCCellE:
  110|     85|bool vmisa(GCCell *cell) {
  111|     85|  return llvh::isa<ToType>(cell);
  112|     85|}
_ZN6hermes2vm6vmcastINS0_8JSNumberEEEPT_NS0_11HermesValueE:
   42|    160|ToType *vmcast(HermesValue val) {
   43|    160|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    160|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    160|}
_ZN6hermes2vm6vmcastINS0_8JSNumberEEEPT_PNS0_6GCCellE:
   29|    160|ToType *vmcast(GCCell *cell) {
   30|    160|  return llvh::cast<ToType>(cell);
   31|    160|}
_ZN6hermes2vm6vmcastINS0_9JSBooleanEEEPT_NS0_11HermesValueE:
   42|    160|ToType *vmcast(HermesValue val) {
   43|    160|  assert(val.isPointer() && "vmcast with non-pointer");
   44|    160|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    160|}
_ZN6hermes2vm6vmcastINS0_9JSBooleanEEEPT_PNS0_6GCCellE:
   29|    160|ToType *vmcast(GCCell *cell) {
   30|    160|  return llvh::cast<ToType>(cell);
   31|    160|}
_ZN6hermes2vm14vmcast_or_nullINS0_8JSRegExpEEEPT_NS0_11HermesValueE:
   60|      1|ToType *vmcast_or_null(HermesValue val) {
   61|      1|  assert(val.isPointer() && "vmcast with non-pointer");
   62|      1|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|      1|}
_ZN6hermes2vm14vmcast_or_nullINS0_8JSRegExpEEEPT_PNS0_6GCCellE:
   49|      1|ToType *vmcast_or_null(GCCell *cell) {
   50|      1|#ifndef NDEBUG
   51|      1|  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|}
_ZN6hermes2vm6vmcastINS0_7HadesGC6OldGen12FreelistCellEEEPT_PNS0_6GCCellE:
   29|   585k|ToType *vmcast(GCCell *cell) {
   30|   585k|  return llvh::cast<ToType>(cell);
   31|   585k|}
_ZN6hermes2vm5vmisaINS0_7HadesGC6OldGen12FreelistCellEEEbPNS0_6GCCellE:
  110|  16.4M|bool vmisa(GCCell *cell) {
  111|  16.4M|  return llvh::isa<ToType>(cell);
  112|  16.4M|}

_ZN6hermes2vm11kindInRangeENS0_8CellKindES1_S1_:
   27|  93.8M|inline bool kindInRange(CellKind value, CellKind from, CellKind to) {
   28|  93.8M|  return value >= from && value <= to;
  ------------------
  |  Branch (28:10): [True: 93.1M, False: 748k]
  |  Branch (28:27): [True: 92.8M, False: 276k]
  ------------------
   29|  93.8M|}

_ZN6hermes2vm9CodeBlock13propertyCacheEv:
   77|  2.10M|  PropertyCacheEntry *propertyCache() {
   78|  2.10M|    return getTrailingObjects<PropertyCacheEntry>();
   79|  2.10M|  }
_ZN6hermes2vm9CodeBlockC2EPNS0_13RuntimeModuleENS_3hbc21RuntimeFunctionHeaderEPKhjjj:
   92|  6.51k|      : runtimeModule_(runtimeModule),
   93|  6.51k|        functionHeader_(header),
   94|  6.51k|        bytecode_(bytecode),
   95|  6.51k|        functionID_(functionID),
   96|  6.51k|        propertyCacheSize_(cacheSize),
   97|  6.51k|        writePropCacheOffset_(writePropCacheOffset) {
   98|  6.51k|    std::uninitialized_fill_n(propertyCache(), cacheSize, PropertyCacheEntry{});
   99|  6.51k|  }
_ZN6hermes2vm9CodeBlock6createEPNS0_13RuntimeModuleENS_3hbc21RuntimeFunctionHeaderEPKhjjj:
  118|  6.51k|      uint32_t writePropCacheOffset) {
  119|  6.51k|    auto allocSize = totalSizeToAlloc<PropertyCacheEntry>(cacheSize);
  120|  6.51k|    void *mem = checkedMalloc(allocSize);
  121|  6.51k|    return new (mem) CodeBlock(
  122|  6.51k|        runtimeModule,
  123|  6.51k|        header,
  124|  6.51k|        bytecode,
  125|  6.51k|        functionID,
  126|  6.51k|        cacheSize,
  127|  6.51k|        writePropCacheOffset);
  128|  6.51k|  }
_ZN6hermes2vm9CodeBlockdlEPv:
  132|  6.51k|  static void operator delete(void *cb) {
  133|  6.51k|    free(cb);
  134|  6.51k|  }
_ZNK6hermes2vm9CodeBlock13getParamCountEv:
  138|    454|  uint32_t getParamCount() const {
  139|    454|    return functionHeader_.paramCount();
  140|    454|  }
_ZNK6hermes2vm9CodeBlock12getFrameSizeEv:
  141|  2.75k|  uint32_t getFrameSize() const {
  142|  2.75k|    return functionHeader_.frameSize();
  143|  2.75k|  }
_ZNK6hermes2vm9CodeBlock18getEnvironmentSizeEv:
  144|    836|  uint32_t getEnvironmentSize() const {
  145|    836|    return functionHeader_.environmentSize();
  146|    836|  }
_ZNK6hermes2vm9CodeBlock16getRuntimeModuleEv:
  173|  2.87M|  RuntimeModule *getRuntimeModule() const {
  174|  2.87M|    return runtimeModule_;
  175|  2.87M|  }
_ZNK6hermes2vm9CodeBlock14getHeaderFlagsEv:
  177|  3.21k|  hbc::FunctionHeaderFlag getHeaderFlags() const {
  178|  3.21k|    return functionHeader_.flags();
  179|  3.21k|  }
_ZNK6hermes2vm9CodeBlock12isStrictModeEv:
  181|  5.61k|  bool isStrictMode() const {
  182|  5.61k|    return functionHeader_.flags().strictMode;
  183|  5.61k|  }
_ZNK6hermes2vm9CodeBlock5beginEv:
  191|  21.8M|  const_iterator begin() const {
  192|  21.8M|    return bytecode_;
  193|  21.8M|  }
_ZNK6hermes2vm9CodeBlock3endEv:
  194|  21.8M|  const_iterator end() const {
  195|  21.8M|    return bytecode_ + functionHeader_.bytecodeSizeInBytes();
  196|  21.8M|  }
_ZNK6hermes2vm9CodeBlock8containsEPKNS_4inst4InstE:
  202|  21.8M|  bool contains(const inst::Inst *inst) const {
  203|  21.8M|    return begin() <= reinterpret_cast<const uint8_t *>(inst) &&
  ------------------
  |  Branch (203:12): [True: 21.8M, False: 0]
  ------------------
  204|  21.8M|        reinterpret_cast<const uint8_t *>(inst) < end();
  ------------------
  |  Branch (204:9): [True: 21.8M, False: 0]
  ------------------
  205|  21.8M|  }
_ZNK6hermes2vm9CodeBlock11getOffsetOfEPKNS_4inst4InstE:
  227|     53|  uint32_t getOffsetOf(const inst::Inst *inst) const {
  228|     53|    assert(
  229|     53|        reinterpret_cast<const uint8_t *>(inst) >= begin() &&
  230|     53|        "inst not in this codeBlock");
  231|     53|    uint32_t offset = reinterpret_cast<const uint8_t *>(inst) - begin();
  232|     53|    assert(begin() + offset < end() && "inst not in this codeBlock");
  233|     53|    return offset;
  234|     53|  }
_ZNK6hermes2vm9CodeBlock6isLazyEv:
  238|  3.21k|  bool isLazy() const {
  239|       |    // null bytecode_ indicates that this is a lazy code block.
  240|  3.21k|    return !bytecode_;
  241|  3.21k|  }
_ZN6hermes2vm9CodeBlock11lazyCompileERNS0_7RuntimeE:
  244|  2.75k|  ExecutionStatus lazyCompile(Runtime &runtime) {
  245|  2.75k|    if (LLVM_UNLIKELY(isLazy())) {
  ------------------
  |  |  189|  2.75k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.75k]
  |  |  ------------------
  ------------------
  246|      0|      return lazyCompileImpl(runtime);
  247|      0|    }
  248|  2.75k|    return ExecutionStatus::RETURNED;
  249|  2.75k|  }
_ZN6hermes2vm9CodeBlock17getReadCacheEntryEh:
  270|   964k|  inline PropertyCacheEntry *getReadCacheEntry(uint8_t idx) {
  271|   964k|    assert(idx < writePropCacheOffset_ && "idx out of ReadCache bound");
  272|   964k|    return &propertyCache()[idx];
  273|   964k|  }
_ZN6hermes2vm9CodeBlock18getWriteCacheEntryEh:
  275|  1.12M|  inline PropertyCacheEntry *getWriteCacheEntry(uint8_t idx) {
  276|  1.12M|    assert(
  277|  1.12M|        writePropCacheOffset_ + idx < propertyCacheSize_ &&
  278|  1.12M|        "idx out of WriteCache bound");
  279|  1.12M|    return &propertyCache()[writePropCacheOffset_ + idx];
  280|  1.12M|  }
_ZNK6hermes2vm9CodeBlock26getNumInstalledBreakpointsEv:
  312|  2.40k|  uint32_t getNumInstalledBreakpoints() const {
  313|  2.40k|    return numInstalledBreakpoints_;
  314|  2.40k|  }

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

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

_ZN6hermes2vm8DebuggerC2ERNS0_7RuntimeE:
  212|    160|  explicit Debugger(Runtime &runtime) : runtime_(runtime) {}
_ZN6hermes2vm8Debugger19setDidPauseCallbackENSt3__18functionIFNS0_12DebugCommandENS0_16InterpreterStateEN8facebook6hermes8debugger11PauseReasonENS0_11HermesValueERKNS1_18EvalResultMetadataEmEEE:
  274|    160|  void setDidPauseCallback(DidPauseCallback callback) {
  275|    160|    didPauseCallback_ = std::move(callback);
  276|    160|  }
_ZN6hermes2vm8Debugger29setBreakpointResolvedCallbackENSt3__18functionIFvmEEE:
  278|    160|  void setBreakpointResolvedCallback(BreakpointResolvedCallback callback) {
  279|    160|    breakpointResolvedCallback_ = std::move(callback);
  280|    160|  }
_ZNK6hermes2vm8Debugger26getShouldPauseOnScriptLoadEv:
  286|    356|  bool getShouldPauseOnScriptLoad() const {
  287|    356|    return pauseOnScriptLoad_;
  288|    356|  }
_ZNK6hermes2vm8Debugger19getPauseOnThrowModeEv:
  294|     52|  PauseOnThrowMode getPauseOnThrowMode() const {
  295|     52|    return pauseOnThrowMode_;
  296|     52|  }
_ZN6hermes2vm8Debugger18willEnterCodeBlockEPNS0_9CodeBlockE:
  404|  2.75k|  void willEnterCodeBlock(CodeBlock *codeBlock) {
  405|  2.75k|    if (LLVM_UNLIKELY(pauseOnAllCodeBlocks_)) {
  ------------------
  |  |  189|  2.75k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.75k]
  |  |  ------------------
  ------------------
  406|      0|      setEntryBreakpointForCodeBlock(codeBlock);
  407|      0|    }
  408|  2.75k|  }

_ZN6hermes2vm15DecoratedObject13getDecorationEv:
   49|   390k|  Decoration *getDecoration() {
   50|   390k|    return decoration_.get();
   51|   390k|  }
_ZN6hermes2vm15DecoratedObject7classofEPKNS0_6GCCellE:
   92|    160|  static bool classof(const GCCell *cell) {
   93|    160|    return kindInRange(
   94|    160|        cell->getKind(),
   95|    160|        CellKind::DecoratedObjectKind_first,
   96|    160|        CellKind::DecoratedObjectKind_last);
   97|    160|  }
_ZN6hermes2vm15DecoratedObjectC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEENSt3__110unique_ptrINS1_10DecorationENS9_14default_deleteISB_EEEE:
  107|    160|      : JSObject(runtime, *parent, *clazz),
  108|    160|        decoration_(std::move(decoration)) {}
_ZN6hermes2vm15DecoratedObjectD2Ev:
  100|    160|  ~DecoratedObject() = default;
_ZN6hermes2vm15DecoratedObject10DecorationD2Ev:
   28|    160|    virtual ~Decoration() = default;

_ZN6hermes2vm6detail11DPMHashPairC2Ev:
   78|   209k|  DPMHashPair() : idpart_(0), desc_(0) {}
_ZNK6hermes2vm6detail11DPMHashPair7isEmptyEv:
   79|  10.4M|  bool isEmpty() const {
   80|  10.4M|    return desc_ == EMPTY;
   81|  10.4M|  }
_ZNK6hermes2vm6detail11DPMHashPair9isDeletedEv:
   82|  2.97M|  bool isDeleted() const {
   83|  2.97M|    return desc_ == DELETED;
   84|  2.97M|  }
_ZNK6hermes2vm6detail11DPMHashPair7isValidEv:
   85|  71.0M|  bool isValid() const {
   86|  71.0M|    return desc_ >= FIRST_VALID;
   87|  71.0M|  }
_ZNK6hermes2vm6detail11DPMHashPair12getDescIndexEv:
   88|  15.2M|  uint32_t getDescIndex() const {
   89|  15.2M|    assert(isValid() && "asked for descriptor of invalid pair");
   90|  15.2M|    return desc_ - FIRST_VALID;
   91|  15.2M|  }
_ZNK6hermes2vm6detail11DPMHashPair5mayBeENS0_8SymbolIDE:
   93|  23.9M|  bool mayBe(SymbolID id) const {
   94|  23.9M|    assert(isValid() && "tried to match invalid pair");
   95|  23.9M|    return idpart_ == (id.unsafeGetRaw() & ID_MASK);
   96|  23.9M|  }
_ZN6hermes2vm6detail11DPMHashPair12setDescIndexEjNS0_8SymbolIDE:
   99|  2.09M|  bool setDescIndex(uint32_t idx, SymbolID id) {
  100|  2.09M|    assert(!isValid() && "overwriting a valid entry");
  101|  2.09M|    assert(canStore(idx) && "impossibly large descriptor index");
  102|  2.09M|    bool ret = isDeleted();
  103|  2.09M|    desc_ = idx + FIRST_VALID;
  104|  2.09M|    idpart_ = (id.unsafeGetRaw() & ID_MASK);
  105|  2.09M|    assert(isValid() && "failed to make a valid entry");
  106|  2.09M|    return ret;
  107|  2.09M|  }
_ZN6hermes2vm6detail11DPMHashPair8canStoreEj:
  118|  2.09M|  static constexpr bool canStore(uint32_t idx) {
  119|  2.09M|    return idx < ((1 << DESC_BITS) - FIRST_VALID);
  120|  2.09M|  }
_ZN6hermes2vm15DictPropertyMap11PropertyPosC2Ej:
  175|  6.79M|    PropertyPos(size_type hashPairIndex) : hashPairIndex(hashPairIndex) {}
_ZN6hermes2vm15DictPropertyMap11getCellKindEv:
  183|   419k|  static constexpr CellKind getCellKind() {
  184|   419k|    return CellKind::DictPropertyMapKind;
  185|   419k|  }
_ZN6hermes2vm15DictPropertyMap7classofEPKNS0_6GCCellE:
  186|  19.2M|  static bool classof(const GCCell *cell) {
  187|  19.2M|    return cell->getKind() == CellKind::DictPropertyMapKind;
  188|  19.2M|  }
_ZNK6hermes2vm15DictPropertyMap4sizeEv:
  199|     13|  size_type size() const {
  200|     13|    return numProperties_;
  201|     13|  }
_ZN6hermes2vm15DictPropertyMap16calcHashCapacityEj:
  320|   209k|  static size_type calcHashCapacity(size_type cap) {
  321|   209k|    assert(
  322|   209k|        (cap <= std::numeric_limits<size_type>::max() / 4) &&
  323|   209k|        "size will cause integer overflow in calcHashCapacity");
  324|       |
  325|   209k|    return llvh::PowerOf2Ceil(cap * 4 / 3 + 1);
  326|   209k|  }
_ZN6hermes2vm15DictPropertyMap4hashENS0_8SymbolIDE:
  341|  17.2M|  static unsigned hash(SymbolID symbolID) {
  342|  17.2M|    return symbolID.unsafeGetRaw();
  343|  17.2M|  }
_ZN6hermes2vm15DictPropertyMapC2Ejj:
  347|   209k|      : descriptorCapacity_(descriptorCapacity), hashCapacity_(hashCapacity) {
  348|       |    // Clear the hash table.
  349|   209k|    std::fill_n(getHashPairs(), hashCapacity_, HashPair{});
  350|   209k|  }
_ZN6hermes2vm15DictPropertyMap18getDescriptorPairsEv:
  353|  7.70M|  DescriptorPair *getDescriptorPairs() {
  354|  7.70M|    return getTrailingObjects<DescriptorPair>();
  355|  7.70M|  }
_ZNK6hermes2vm15DictPropertyMap18getDescriptorPairsEv:
  356|  8.48M|  const DescriptorPair *getDescriptorPairs() const {
  357|  8.48M|    return getTrailingObjects<DescriptorPair>();
  358|  8.48M|  }
_ZN6hermes2vm15DictPropertyMap12getHashPairsEv:
  359|  30.9M|  HashPair *getHashPairs() {
  360|  30.9M|    return getTrailingObjects<HashPair>();
  361|  30.9M|  }
_ZNK6hermes2vm15DictPropertyMap7isMatchEPKNS0_6detail11DPMHashPairENS0_8SymbolIDE:
  398|  17.1M|  bool isMatch(const HashPair *entry, SymbolID symbolID) const {
  399|  17.1M|    return entry->mayBe(symbolID) &&
  ------------------
  |  Branch (399:12): [True: 8.48M, False: 8.70M]
  ------------------
  400|  17.1M|        getDescriptorPairs()[entry->getDescIndex()].first == symbolID;
  ------------------
  |  Branch (400:9): [True: 6.79M, False: 1.69M]
  ------------------
  401|  17.1M|  }
_ZN6hermes2vm15DictPropertyMap14allocationSizeEjj:
  417|   209k|      size_type hashCapacity) {
  418|   209k|    return totalSizeToAlloc<DescriptorPair, HashPair>(
  419|   209k|        descriptorCapacity, hashCapacity);
  420|   209k|  }
_ZNK6hermes2vm15DictPropertyMap18numTrailingObjectsEN4llvh25trailing_objects_internal19TrailingObjectsBase13OverloadTokenINSt3__14pairINS0_10GCSymbolIDENS0_23NamedPropertyDescriptorEEEEE:
  484|  30.9M|  size_t numTrailingObjects(OverloadToken<DescriptorPair>) const {
  485|  30.9M|    return descriptorCapacity_;
  486|  30.9M|  }
_ZN6hermes2vm15DictPropertyMap17getDescriptorPairEPS1_NS1_11PropertyPosE:
  572|  6.79M|    PropertyPos pos) {
  573|  6.79M|  assert(
  574|  6.79M|      pos.hashPairIndex < self->hashCapacity_ && "property pos out of range");
  575|       |
  576|  6.79M|  auto *hashPair = self->getHashPairs() + pos.hashPairIndex;
  577|  6.79M|  auto descIndex = hashPair->getDescIndex();
  578|  6.79M|  assert(
  579|  6.79M|      descIndex < self->numDescriptors_.load(std::memory_order_relaxed) &&
  580|  6.79M|      "descriptor index out of range");
  581|       |
  582|  6.79M|  auto *res = self->getDescriptorPairs() + descIndex;
  583|  6.79M|  assert(hashPair->mayBe(res->first) && "accessing incorrect descriptor pair");
  584|  6.79M|  return res;
  585|  6.79M|}
_ZN6hermes2vm15DictPropertyMap4findEPKS1_NS0_8SymbolIDE:
  589|  15.0M|    SymbolID id) {
  590|       |  // We want to keep the public interface of find() clean, so it accepts a
  591|       |  // const self pointer, but internally we don't want to duplicate the code
  592|       |  // only to propagate the "constness". So we cast the const away and promise
  593|       |  // not to mutate it.
  594|  15.0M|  auto *mutableSelf = const_cast<DictPropertyMap *>(self);
  595|  15.0M|  auto found = lookupEntryFor(mutableSelf, id);
  596|  15.0M|  if (!found.first)
  ------------------
  |  Branch (596:7): [True: 8.29M, False: 6.79M]
  ------------------
  597|  8.29M|    return llvh::None;
  598|  6.79M|  return PropertyPos{(size_type)(found.second - mutableSelf->getHashPairs())};
  599|  15.0M|}
_ZN6hermes2vm15DictPropertyMap3addERNS0_13MutableHandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_23NamedPropertyDescriptorE:
  605|   796k|    NamedPropertyDescriptor desc) {
  606|   796k|  auto found = findOrAdd(selfHandleRef, runtime, id);
  607|   796k|  if (LLVM_UNLIKELY(found == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   796k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 796k]
  |  |  ------------------
  ------------------
  608|      0|    return ExecutionStatus::EXCEPTION;
  609|      0|  }
  610|   796k|  assert(found->second && "trying to add an existing property");
  611|   796k|  *found->first = desc;
  612|   796k|  return ExecutionStatus::RETURNED;
  613|   796k|}
JSObject.cpp:_ZN6hermes2vm15DictPropertyMap15forEachPropertyIZNS0_8JSObject18getOwnPropertyKeysENS0_6HandleIS3_EERNS0_7RuntimeENS0_12OwnKeysFlagsEE3$_0EEvNS4_IS1_EES7_RKT_:
  496|     45|    const CallbackFunction &callback) {
  497|       |  // Re-entering JS execution in this context can cause the property
  498|       |  // descriptors to change (e.g. T138148986)
  499|     45|  NoRJSScope scope{runtime};
  500|     45|  GCScopeMarkerRAII gcMarker{runtime};
  501|     45|  for (size_type
  502|     45|           i = 0,
  503|     45|           e = selfHandle->numDescriptors_.load(std::memory_order_relaxed);
  504|    840|       i != e;
  ------------------
  |  Branch (504:8): [True: 795, False: 45]
  ------------------
  505|    795|       ++i) {
  506|    795|    auto const *descPair = selfHandle->getDescriptorPairs() + i;
  507|    795|    if (descPair->first.isValid()) {
  ------------------
  |  Branch (507:9): [True: 795, False: 0]
  ------------------
  508|    795|      callback(descPair->first, descPair->second);
  509|    795|      gcMarker.flush();
  510|    795|    }
  511|    795|  }
  512|     45|}

_ZN6hermes2vm6Domain11getCellKindEv:
  109|  1.03k|  static constexpr CellKind getCellKind() {
  110|  1.03k|    return CellKind::DomainKind;
  111|  1.03k|  }
_ZN6hermes2vm6Domain7classofEPKNS0_6GCCellE:
  112|    676|  static bool classof(const GCCell *cell) {
  113|    676|    return cell->getKind() == CellKind::DomainKind;
  114|    676|  }
_ZN6hermes2vm6Domain16addRuntimeModuleENS0_6HandleIS1_EERNS0_7RuntimeEPNS0_13RuntimeModuleE:
  123|    597|      RuntimeModule *runtimeModule) {
  124|    597|    self->runtimeModules_.push_back(runtimeModule, runtime.getHeap());
  125|    597|  }
_ZN6hermes2vm6DomainD2Ev:
  221|    516|  ~Domain() = default;

_ZN6hermes2vm6GCBase13makeAVariableINS0_15BigIntPrimitiveELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
   40|   390k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   390k|  assert(
   43|   390k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|   390k|  assert(
   45|   390k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   390k|      "Cell is not variable size.");
   47|   390k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   390k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   390k|}
_ZN6hermes2vm6GCBase17minAllocationSizeEv:
  107|  21.6M|constexpr uint32_t GCBase::minAllocationSize() {
  108|  21.6M|  return GC::minAllocationSizeImpl();
  109|  21.6M|}
_ZN6hermes2vm6GCBase5makeAINS0_15BigIntPrimitiveELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
   57|   390k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   390k|  assert(
   59|   390k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|   390k|  assert(
   61|   390k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   390k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   390k|      "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|   390k|  T *ptr =
   71|   390k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   390k|          size, std::forward<Args>(args)...);
   73|   390k|#endif
   74|   390k|#ifndef NDEBUG
   75|   390k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   390k|#endif
   77|   390k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   390k|  newAlloc(ptr, size);
   79|   390k|#endif
   80|   390k|  return ptr;
   81|   390k|}
_ZN6hermes2vm6GCBase17maxAllocationSizeEv:
  103|   705k|constexpr uint32_t GCBase::maxAllocationSize() {
  104|   705k|  return std::min(GC::maxAllocationSizeImpl(), GCCell::maxSize());
  105|   705k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_11BoxedDoubleELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_DpOT2_:
   24|   818k|T *GCBase::makeAFixed(Args &&...args) {
   25|   818k|  static_assert(
   26|   818k|      cellSize<T>() >= minAllocationSize() &&
   27|   818k|          cellSize<T>() <= maxAllocationSize(),
   28|   818k|      "Cell size outside legal range.");
   29|   818k|  assert(
   30|   818k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|   818k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|   818k|      cellSize<T>(), std::forward<Args>(args)...);
   33|   818k|}
_ZN6hermes2vm6GCBase5makeAINS0_11BoxedDoubleELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_jDpOT3_:
   57|   818k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   818k|  assert(
   59|   818k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|   818k|  assert(
   61|   818k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   818k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   818k|      "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|   818k|  T *ptr =
   71|   818k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   818k|          size, std::forward<Args>(args)...);
   73|   818k|#endif
   74|   818k|#ifndef NDEBUG
   75|   818k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   818k|#endif
   77|   818k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   818k|  newAlloc(ptr, size);
   79|   818k|#endif
   80|   818k|  return ptr;
   81|   818k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_16ArrayStorageBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
   40|  90.6k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  90.6k|  assert(
   43|  90.6k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|  90.6k|  assert(
   45|  90.6k|      !VTable::getVTable(T::getCellKind())->size &&
   46|  90.6k|      "Cell is not variable size.");
   47|  90.6k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  90.6k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  90.6k|}
_ZN6hermes2vm6GCBase5makeAINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|  90.6k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  90.6k|  assert(
   59|  90.6k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  90.6k|  assert(
   61|  90.6k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  90.6k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  90.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|  90.6k|  T *ptr =
   71|  90.6k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  90.6k|          size, std::forward<Args>(args)...);
   73|  90.6k|#endif
   74|  90.6k|#ifndef NDEBUG
   75|  90.6k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  90.6k|#endif
   77|  90.6k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  90.6k|  newAlloc(ptr, size);
   79|  90.6k|#endif
   80|  90.6k|  return ptr;
   81|  90.6k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_11EnvironmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_jDpOT2_:
   40|    836|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    836|  assert(
   43|    836|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|    836|  assert(
   45|    836|      !VTable::getVTable(T::getCellKind())->size &&
   46|    836|      "Cell is not variable size.");
   47|    836|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    836|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    836|}
_ZN6hermes2vm6GCBase5makeAINS0_11EnvironmentELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_jDpOT3_:
   57|    836|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    836|  assert(
   59|    836|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    836|  assert(
   61|    836|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    836|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    836|      "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|    836|  T *ptr =
   71|    836|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    836|          size, std::forward<Args>(args)...);
   73|    836|#endif
   74|    836|#ifndef NDEBUG
   75|    836|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    836|#endif
   77|    836|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    836|  newAlloc(ptr, size);
   79|    836|#endif
   80|    836|  return ptr;
   81|    836|}
_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|  6.72k|T *GCBase::makeAFixed(Args &&...args) {
   25|  6.72k|  static_assert(
   26|  6.72k|      cellSize<T>() >= minAllocationSize() &&
   27|  6.72k|          cellSize<T>() <= maxAllocationSize(),
   28|  6.72k|      "Cell size outside legal range.");
   29|  6.72k|  assert(
   30|  6.72k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|  6.72k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  6.72k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  6.72k|}
_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|  6.72k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  6.72k|  assert(
   59|  6.72k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  6.72k|  assert(
   61|  6.72k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  6.72k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  6.72k|      "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|  6.72k|  T *ptr =
   71|  6.72k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  6.72k|          size, std::forward<Args>(args)...);
   73|  6.72k|#endif
   74|  6.72k|#ifndef NDEBUG
   75|  6.72k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  6.72k|#endif
   77|  6.72k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  6.72k|  newAlloc(ptr, size);
   79|  6.72k|#endif
   80|  6.72k|  return ptr;
   81|  6.72k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_16ArrayStorageBaseINS0_11HermesValueEEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
   40|    160|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    160|  assert(
   43|    160|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|    160|  assert(
   45|    160|      !VTable::getVTable(T::getCellKind())->size &&
   46|    160|      "Cell is not variable size.");
   47|    160|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    160|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    160|}
_ZN6hermes2vm6GCBase5makeAINS0_16ArrayStorageBaseINS0_11HermesValueEEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|    160|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    160|  assert(
   59|    160|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    160|  assert(
   61|    160|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    160|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    160|      "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|    160|  T *ptr =
   71|    160|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    160|          size, std::forward<Args>(args)...);
   73|    160|#endif
   74|    160|#ifndef NDEBUG
   75|    160|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    160|#endif
   77|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    160|  newAlloc(ptr, size);
   79|    160|#endif
   80|    160|  return ptr;
   81|    160|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_13BoundFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_DpOT2_:
   24|    160|T *GCBase::makeAFixed(Args &&...args) {
   25|    160|  static_assert(
   26|    160|      cellSize<T>() >= minAllocationSize() &&
   27|    160|          cellSize<T>() <= maxAllocationSize(),
   28|    160|      "Cell size outside legal range.");
   29|    160|  assert(
   30|    160|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    160|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    160|      cellSize<T>(), std::forward<Args>(args)...);
   33|    160|}
_ZN6hermes2vm6GCBase5makeAINS0_13BoundFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_jDpOT3_:
   57|    160|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    160|  assert(
   59|    160|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    160|  assert(
   61|    160|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    160|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    160|      "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|    160|  T *ptr =
   71|    160|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    160|          size, std::forward<Args>(args)...);
   73|    160|#endif
   74|    160|#ifndef NDEBUG
   75|    160|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    160|#endif
   77|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    160|  newAlloc(ptr, size);
   79|    160|#endif
   80|    160|  return ptr;
   81|    160|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_14NativeFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEEEEEPT_DpOT2_:
   24|  70.5k|T *GCBase::makeAFixed(Args &&...args) {
   25|  70.5k|  static_assert(
   26|  70.5k|      cellSize<T>() >= minAllocationSize() &&
   27|  70.5k|          cellSize<T>() <= maxAllocationSize(),
   28|  70.5k|      "Cell size outside legal range.");
   29|  70.5k|  assert(
   30|  70.5k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|  70.5k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  70.5k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  70.5k|}
_ZN6hermes2vm6GCBase5makeAINS0_14NativeFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEEEEEPT_jDpOT3_:
   57|  70.5k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  70.5k|  assert(
   59|  70.5k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  70.5k|  assert(
   61|  70.5k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  70.5k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  70.5k|      "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|  70.5k|  T *ptr =
   71|  70.5k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  70.5k|          size, std::forward<Args>(args)...);
   73|  70.5k|#endif
   74|  70.5k|#ifndef NDEBUG
   75|  70.5k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  70.5k|#endif
   77|  70.5k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  70.5k|  newAlloc(ptr, size);
   79|  70.5k|#endif
   80|  70.5k|  return ptr;
   81|  70.5k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_10JSFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS8_INS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_DpOT2_:
   24|  6.19k|T *GCBase::makeAFixed(Args &&...args) {
   25|  6.19k|  static_assert(
   26|  6.19k|      cellSize<T>() >= minAllocationSize() &&
   27|  6.19k|          cellSize<T>() <= maxAllocationSize(),
   28|  6.19k|      "Cell size outside legal range.");
   29|  6.19k|  assert(
   30|  6.19k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|  6.19k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  6.19k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  6.19k|}
_ZN6hermes2vm6GCBase5makeAINS0_10JSFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS8_INS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_jDpOT3_:
   57|  6.19k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  6.19k|  assert(
   59|  6.19k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  6.19k|  assert(
   61|  6.19k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  6.19k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  6.19k|      "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|  6.19k|  T *ptr =
   71|  6.19k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  6.19k|          size, std::forward<Args>(args)...);
   73|  6.19k|#endif
   74|  6.19k|#ifndef NDEBUG
   75|  6.19k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  6.19k|#endif
   77|  6.19k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  6.19k|  newAlloc(ptr, size);
   79|  6.19k|#endif
   80|  6.19k|  return ptr;
   81|  6.19k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_6DomainELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
   24|    516|T *GCBase::makeAFixed(Args &&...args) {
   25|    516|  static_assert(
   26|    516|      cellSize<T>() >= minAllocationSize() &&
   27|    516|          cellSize<T>() <= maxAllocationSize(),
   28|    516|      "Cell size outside legal range.");
   29|    516|  assert(
   30|    516|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    516|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    516|      cellSize<T>(), std::forward<Args>(args)...);
   33|    516|}
_ZN6hermes2vm6GCBase5makeAINS0_6DomainELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|    516|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    516|  assert(
   59|    516|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    516|  assert(
   61|    516|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    516|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    516|      "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|    516|  T *ptr =
   71|    516|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    516|          size, std::forward<Args>(args)...);
   73|    516|#endif
   74|    516|#ifndef NDEBUG
   75|    516|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    516|#endif
   77|    516|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    516|  newAlloc(ptr, size);
   79|    516|#endif
   80|    516|  return ptr;
   81|    516|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_11HiddenClassELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_DpOT2_:
   24|  94.2k|T *GCBase::makeAFixed(Args &&...args) {
   25|  94.2k|  static_assert(
   26|  94.2k|      cellSize<T>() >= minAllocationSize() &&
   27|  94.2k|          cellSize<T>() <= maxAllocationSize(),
   28|  94.2k|      "Cell size outside legal range.");
   29|  94.2k|  assert(
   30|  94.2k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|  94.2k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  94.2k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  94.2k|}
_ZN6hermes2vm6GCBase5makeAINS0_11HiddenClassELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_jDpOT3_:
   57|  94.2k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  94.2k|  assert(
   59|  94.2k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  94.2k|  assert(
   61|  94.2k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  94.2k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  94.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|  94.2k|  T *ptr =
   71|  94.2k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  94.2k|          size, std::forward<Args>(args)...);
   73|  94.2k|#endif
   74|  94.2k|#ifndef NDEBUG
   75|  94.2k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  94.2k|#endif
   77|  94.2k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  94.2k|  newAlloc(ptr, size);
   79|  94.2k|#endif
   80|  94.2k|  return ptr;
   81|  94.2k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_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|   415k|  assert(
   45|   415k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   415k|      "Cell is not variable size.");
   47|   415k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   415k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   415k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_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|   415k|  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|   415k|  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_22DynamicStringPrimitiveIDsLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT2_:
   40|    216|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    216|  assert(
   43|    216|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|    216|  assert(
   45|    216|      !VTable::getVTable(T::getCellKind())->size &&
   46|    216|      "Cell is not variable size.");
   47|    216|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    216|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    216|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT3_:
   57|    216|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    216|  assert(
   59|    216|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    216|  assert(
   61|    216|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    216|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    216|      "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|    216|  T *ptr =
   71|    216|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    216|          size, std::forward<Args>(args)...);
   73|    216|#endif
   74|    216|#ifndef NDEBUG
   75|    216|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    216|#endif
   77|    216|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    216|  newAlloc(ptr, size);
   79|    216|#endif
   80|    216|  return ptr;
   81|    216|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_7JSArrayELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
   24|  1.05M|T *GCBase::makeAFixed(Args &&...args) {
   25|  1.05M|  static_assert(
   26|  1.05M|      cellSize<T>() >= minAllocationSize() &&
   27|  1.05M|          cellSize<T>() <= maxAllocationSize(),
   28|  1.05M|      "Cell size outside legal range.");
   29|  1.05M|  assert(
   30|  1.05M|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|  1.05M|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  1.05M|      cellSize<T>(), std::forward<Args>(args)...);
   33|  1.05M|}
_ZN6hermes2vm6GCBase5makeAINS0_7JSArrayELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
   57|  1.05M|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  1.05M|  assert(
   59|  1.05M|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  1.05M|  assert(
   61|  1.05M|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  1.05M|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  1.05M|      "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|  1.05M|  T *ptr =
   71|  1.05M|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  1.05M|          size, std::forward<Args>(args)...);
   73|  1.05M|#endif
   74|  1.05M|#ifndef NDEBUG
   75|  1.05M|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  1.05M|#endif
   77|  1.05M|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  1.05M|  newAlloc(ptr, size);
   79|  1.05M|#endif
   80|  1.05M|  return ptr;
   81|  1.05M|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_7JSErrorELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERbEEEPT_DpOT2_:
   24|     53|T *GCBase::makeAFixed(Args &&...args) {
   25|     53|  static_assert(
   26|     53|      cellSize<T>() >= minAllocationSize() &&
   27|     53|          cellSize<T>() <= maxAllocationSize(),
   28|     53|      "Cell size outside legal range.");
   29|     53|  assert(
   30|     53|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|     53|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     53|      cellSize<T>(), std::forward<Args>(args)...);
   33|     53|}
_ZN6hermes2vm6GCBase5makeAINS0_7JSErrorELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERbEEEPT_jDpOT3_:
   57|     53|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     53|  assert(
   59|     53|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|     53|  assert(
   61|     53|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     53|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     53|      "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|     53|  T *ptr =
   71|     53|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     53|          size, std::forward<Args>(args)...);
   73|     53|#endif
   74|     53|#ifndef NDEBUG
   75|     53|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     53|#endif
   77|     53|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     53|  newAlloc(ptr, size);
   79|     53|#endif
   80|     53|  return ptr;
   81|     53|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSObjectELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EENS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
   24|   364k|T *GCBase::makeAFixed(Args &&...args) {
   25|   364k|  static_assert(
   26|   364k|      cellSize<T>() >= minAllocationSize() &&
   27|   364k|          cellSize<T>() <= maxAllocationSize(),
   28|   364k|      "Cell size outside legal range.");
   29|   364k|  assert(
   30|   364k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|   364k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|   364k|      cellSize<T>(), std::forward<Args>(args)...);
   33|   364k|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSObjectELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EENS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
   57|   364k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   364k|  assert(
   59|   364k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|   364k|  assert(
   61|   364k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   364k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   364k|      "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|   364k|  T *ptr =
   71|   364k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   364k|          size, std::forward<Args>(args)...);
   73|   364k|#endif
   74|   364k|#ifndef NDEBUG
   75|   364k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   364k|#endif
   77|   364k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   364k|  newAlloc(ptr, size);
   79|   364k|#endif
   80|   364k|  return ptr;
   81|   364k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSRegExpELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|      8|T *GCBase::makeAFixed(Args &&...args) {
   25|      8|  static_assert(
   26|      8|      cellSize<T>() >= minAllocationSize() &&
   27|      8|          cellSize<T>() <= maxAllocationSize(),
   28|      8|      "Cell size outside legal range.");
   29|      8|  assert(
   30|      8|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      8|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|      8|      cellSize<T>(), std::forward<Args>(args)...);
   33|      8|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSRegExpELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_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|      8|  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|      8|  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|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_10HostObjectELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSE_14default_deleteISG_EEEEEEEPT_DpOT2_:
   24|    160|T *GCBase::makeAFixed(Args &&...args) {
   25|    160|  static_assert(
   26|    160|      cellSize<T>() >= minAllocationSize() &&
   27|    160|          cellSize<T>() <= maxAllocationSize(),
   28|    160|      "Cell size outside legal range.");
   29|    160|  assert(
   30|    160|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    160|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    160|      cellSize<T>(), std::forward<Args>(args)...);
   33|    160|}
_ZN6hermes2vm6GCBase5makeAINS0_10HostObjectELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSE_14default_deleteISG_EEEEEEEPT_jDpOT3_:
   57|    160|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    160|  assert(
   59|    160|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    160|  assert(
   61|    160|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    160|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    160|      "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|    160|  T *ptr =
   71|    160|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    160|          size, std::forward<Args>(args)...);
   73|    160|#endif
   74|    160|#ifndef NDEBUG
   75|    160|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    160|#endif
   77|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    160|  newAlloc(ptr, size);
   79|    160|#endif
   80|    160|  return ptr;
   81|    160|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSStringELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS8_INS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|    175|T *GCBase::makeAFixed(Args &&...args) {
   25|    175|  static_assert(
   26|    175|      cellSize<T>() >= minAllocationSize() &&
   27|    175|          cellSize<T>() <= maxAllocationSize(),
   28|    175|      "Cell size outside legal range.");
   29|    175|  assert(
   30|    175|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    175|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    175|      cellSize<T>(), std::forward<Args>(args)...);
   33|    175|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSStringELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS8_INS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|    175|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    175|  assert(
   59|    175|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    175|  assert(
   61|    175|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    175|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    175|      "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|    175|  T *ptr =
   71|    175|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    175|          size, std::forward<Args>(args)...);
   73|    175|#endif
   74|    175|#ifndef NDEBUG
   75|    175|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    175|#endif
   77|    175|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    175|  newAlloc(ptr, size);
   79|    175|#endif
   80|    175|  return ptr;
   81|    175|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSNumberELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|    161|T *GCBase::makeAFixed(Args &&...args) {
   25|    161|  static_assert(
   26|    161|      cellSize<T>() >= minAllocationSize() &&
   27|    161|          cellSize<T>() <= maxAllocationSize(),
   28|    161|      "Cell size outside legal range.");
   29|    161|  assert(
   30|    161|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    161|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    161|      cellSize<T>(), std::forward<Args>(args)...);
   33|    161|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSNumberELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|    161|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    161|  assert(
   59|    161|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    161|  assert(
   61|    161|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    161|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    161|      "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|    161|  T *ptr =
   71|    161|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    161|          size, std::forward<Args>(args)...);
   73|    161|#endif
   74|    161|#ifndef NDEBUG
   75|    161|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    161|#endif
   77|    161|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    161|  newAlloc(ptr, size);
   79|    161|#endif
   80|    161|  return ptr;
   81|    161|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_9JSBooleanELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|    160|T *GCBase::makeAFixed(Args &&...args) {
   25|    160|  static_assert(
   26|    160|      cellSize<T>() >= minAllocationSize() &&
   27|    160|          cellSize<T>() <= maxAllocationSize(),
   28|    160|      "Cell size outside legal range.");
   29|    160|  assert(
   30|    160|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    160|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    160|      cellSize<T>(), std::forward<Args>(args)...);
   33|    160|}
_ZN6hermes2vm6GCBase5makeAINS0_9JSBooleanELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|    160|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    160|  assert(
   59|    160|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    160|  assert(
   61|    160|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    160|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    160|      "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|    160|  T *ptr =
   71|    160|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    160|          size, std::forward<Args>(args)...);
   73|    160|#endif
   74|    160|#ifndef NDEBUG
   75|    160|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    160|#endif
   77|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    160|  newAlloc(ptr, size);
   79|    160|#endif
   80|    160|  return ptr;
   81|    160|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_16PropertyAccessorELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEESB_EEEPT_DpOT2_:
   24|  7.36k|T *GCBase::makeAFixed(Args &&...args) {
   25|  7.36k|  static_assert(
   26|  7.36k|      cellSize<T>() >= minAllocationSize() &&
   27|  7.36k|          cellSize<T>() <= maxAllocationSize(),
   28|  7.36k|      "Cell size outside legal range.");
   29|  7.36k|  assert(
   30|  7.36k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|  7.36k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  7.36k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  7.36k|}
_ZN6hermes2vm6GCBase5makeAINS0_16PropertyAccessorELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEESB_EEEPT_jDpOT3_:
   57|  7.36k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  7.36k|  assert(
   59|  7.36k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  7.36k|  assert(
   61|  7.36k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  7.36k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  7.36k|      "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|  7.36k|  T *ptr =
   71|  7.36k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  7.36k|          size, std::forward<Args>(args)...);
   73|  7.36k|#endif
   74|  7.36k|#ifndef NDEBUG
   75|  7.36k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  7.36k|#endif
   77|  7.36k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  7.36k|  newAlloc(ptr, size);
   79|  7.36k|#endif
   80|  7.36k|  return ptr;
   81|  7.36k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
   24|    799|T *GCBase::makeAFixed(Args &&...args) {
   25|    799|  static_assert(
   26|    799|      cellSize<T>() >= minAllocationSize() &&
   27|    799|          cellSize<T>() <= maxAllocationSize(),
   28|    799|      "Cell size outside legal range.");
   29|    799|  assert(
   30|    799|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    799|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    799|      cellSize<T>(), std::forward<Args>(args)...);
   33|    799|}
_ZN6hermes2vm6GCBase5makeAINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|    799|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    799|  assert(
   59|    799|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    799|  assert(
   61|    799|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    799|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    799|      "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|    799|  T *ptr =
   71|    799|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    799|          size, std::forward<Args>(args)...);
   73|    799|#endif
   74|    799|#ifndef NDEBUG
   75|    799|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    799|#endif
   77|    799|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    799|  newAlloc(ptr, size);
   79|    799|#endif
   80|    799|  return ptr;
   81|    799|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_18SegmentedArrayBaseINS0_11HermesValueEEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
   40|    153|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    153|  assert(
   43|    153|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|    153|  assert(
   45|    153|      !VTable::getVTable(T::getCellKind())->size &&
   46|    153|      "Cell is not variable size.");
   47|    153|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    153|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    153|}
_ZN6hermes2vm6GCBase5makeAINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|    153|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    153|  assert(
   59|    153|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    153|  assert(
   61|    153|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    153|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    153|      "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|    153|  T *ptr =
   71|    153|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    153|          size, std::forward<Args>(args)...);
   73|    153|#endif
   74|    153|#ifndef NDEBUG
   75|    153|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    153|#endif
   77|    153|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    153|  newAlloc(ptr, size);
   79|    153|#endif
   80|    153|  return ptr;
   81|    153|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
   24|  2.23k|T *GCBase::makeAFixed(Args &&...args) {
   25|  2.23k|  static_assert(
   26|  2.23k|      cellSize<T>() >= minAllocationSize() &&
   27|  2.23k|          cellSize<T>() <= maxAllocationSize(),
   28|  2.23k|      "Cell size outside legal range.");
   29|  2.23k|  assert(
   30|  2.23k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|  2.23k|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  2.23k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  2.23k|}
_ZN6hermes2vm6GCBase5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|  2.23k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  2.23k|  assert(
   59|  2.23k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  2.23k|  assert(
   61|  2.23k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  2.23k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  2.23k|      "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|  2.23k|  T *ptr =
   71|  2.23k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  2.23k|          size, std::forward<Args>(args)...);
   73|  2.23k|#endif
   74|  2.23k|#ifndef NDEBUG
   75|  2.23k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  2.23k|#endif
   77|  2.23k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  2.23k|  newAlloc(ptr, size);
   79|  2.23k|#endif
   80|  2.23k|  return ptr;
   81|  2.23k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
   40|   663k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   663k|  assert(
   43|   663k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|   663k|  assert(
   45|   663k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   663k|      "Cell is not variable size.");
   47|   663k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   663k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   663k|}
_ZN6hermes2vm6GCBase5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|   663k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   663k|  assert(
   59|   663k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|   663k|  assert(
   61|   663k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   663k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   663k|      "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|   663k|  T *ptr =
   71|   663k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   663k|          size, std::forward<Args>(args)...);
   73|   663k|#endif
   74|   663k|#ifndef NDEBUG
   75|   663k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   663k|#endif
   77|   663k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   663k|  newAlloc(ptr, size);
   79|   663k|#endif
   80|   663k|  return ptr;
   81|   663k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
   40|      3|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|      3|  assert(
   43|      3|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      3|  assert(
   45|      3|      !VTable::getVTable(T::getCellKind())->size &&
   46|      3|      "Cell is not variable size.");
   47|      3|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|      3|      heapAlignSize(size), std::forward<Args>(args)...);
   49|      3|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
   57|      3|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|      3|  assert(
   59|      3|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      3|  assert(
   61|      3|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|      3|          (hasFinalizer == HasFinalizer::Yes) &&
   63|      3|      "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|      3|  T *ptr =
   71|      3|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|      3|          size, std::forward<Args>(args)...);
   73|      3|#endif
   74|      3|#ifndef NDEBUG
   75|      3|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|      3|#endif
   77|      3|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|      3|  newAlloc(ptr, size);
   79|      3|#endif
   80|      3|  return ptr;
   81|      3|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
   40|  20.4k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  20.4k|  assert(
   43|  20.4k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|  20.4k|  assert(
   45|  20.4k|      !VTable::getVTable(T::getCellKind())->size &&
   46|  20.4k|      "Cell is not variable size.");
   47|  20.4k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  20.4k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  20.4k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
   57|  20.4k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  20.4k|  assert(
   59|  20.4k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  20.4k|  assert(
   61|  20.4k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  20.4k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  20.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|  20.4k|  T *ptr =
   71|  20.4k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  20.4k|          size, std::forward<Args>(args)...);
   73|  20.4k|#endif
   74|  20.4k|#ifndef NDEBUG
   75|  20.4k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  20.4k|#endif
   77|  20.4k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  20.4k|  newAlloc(ptr, size);
   79|  20.4k|#endif
   80|  20.4k|  return ptr;
   81|  20.4k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
   40|   390k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   390k|  assert(
   43|   390k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|   390k|  assert(
   45|   390k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   390k|      "Cell is not variable size.");
   47|   390k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   390k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   390k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
   57|   390k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   390k|  assert(
   59|   390k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|   390k|  assert(
   61|   390k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   390k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   390k|      "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|   390k|  T *ptr =
   71|   390k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   390k|          size, std::forward<Args>(args)...);
   73|   390k|#endif
   74|   390k|#ifndef NDEBUG
   75|   390k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   390k|#endif
   77|   390k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   390k|  newAlloc(ptr, size);
   79|   390k|#endif
   80|   390k|  return ptr;
   81|   390k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
   40|  2.10M|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  2.10M|  assert(
   43|  2.10M|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|  2.10M|  assert(
   45|  2.10M|      !VTable::getVTable(T::getCellKind())->size &&
   46|  2.10M|      "Cell is not variable size.");
   47|  2.10M|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  2.10M|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  2.10M|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
   57|  2.10M|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  2.10M|  assert(
   59|  2.10M|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  2.10M|  assert(
   61|  2.10M|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  2.10M|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  2.10M|      "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|  2.10M|  T *ptr =
   71|  2.10M|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  2.10M|          size, std::forward<Args>(args)...);
   73|  2.10M|#endif
   74|  2.10M|#ifndef NDEBUG
   75|  2.10M|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  2.10M|#endif
   77|  2.10M|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  2.10M|  newAlloc(ptr, size);
   79|  2.10M|#endif
   80|  2.10M|  return ptr;
   81|  2.10M|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
   40|  20.4k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  20.4k|  assert(
   43|  20.4k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|  20.4k|  assert(
   45|  20.4k|      !VTable::getVTable(T::getCellKind())->size &&
   46|  20.4k|      "Cell is not variable size.");
   47|  20.4k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  20.4k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  20.4k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
   57|  20.4k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  20.4k|  assert(
   59|  20.4k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  20.4k|  assert(
   61|  20.4k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  20.4k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  20.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|  20.4k|  T *ptr =
   71|  20.4k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  20.4k|          size, std::forward<Args>(args)...);
   73|  20.4k|#endif
   74|  20.4k|#ifndef NDEBUG
   75|  20.4k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  20.4k|#endif
   77|  20.4k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  20.4k|  newAlloc(ptr, size);
   79|  20.4k|#endif
   80|  20.4k|  return ptr;
   81|  20.4k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
   40|  1.95M|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  1.95M|  assert(
   43|  1.95M|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|  1.95M|  assert(
   45|  1.95M|      !VTable::getVTable(T::getCellKind())->size &&
   46|  1.95M|      "Cell is not variable size.");
   47|  1.95M|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  1.95M|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  1.95M|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
   57|  1.95M|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  1.95M|  assert(
   59|  1.95M|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|  1.95M|  assert(
   61|  1.95M|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  1.95M|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  1.95M|      "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|  1.95M|  T *ptr =
   71|  1.95M|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  1.95M|          size, std::forward<Args>(args)...);
   73|  1.95M|#endif
   74|  1.95M|#ifndef NDEBUG
   75|  1.95M|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  1.95M|#endif
   77|  1.95M|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  1.95M|  newAlloc(ptr, size);
   79|  1.95M|#endif
   80|  1.95M|  return ptr;
   81|  1.95M|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
   40|     11|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|     11|  assert(
   43|     11|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|     11|  assert(
   45|     11|      !VTable::getVTable(T::getCellKind())->size &&
   46|     11|      "Cell is not variable size.");
   47|     11|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|     11|      heapAlignSize(size), std::forward<Args>(args)...);
   49|     11|}
_ZN6hermes2vm6GCBase5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
   57|     11|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     11|  assert(
   59|     11|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|     11|  assert(
   61|     11|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     11|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     11|      "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|     11|  T *ptr =
   71|     11|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     11|          size, std::forward<Args>(args)...);
   73|     11|#endif
   74|     11|#ifndef NDEBUG
   75|     11|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     11|#endif
   77|     11|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     11|  newAlloc(ptr, size);
   79|     11|#endif
   80|     11|  return ptr;
   81|     11|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23ExternalStringPrimitiveIcEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT2_:
   40|     28|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|     28|  assert(
   43|     28|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|     28|  assert(
   45|     28|      !VTable::getVTable(T::getCellKind())->size &&
   46|     28|      "Cell is not variable size.");
   47|     28|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|     28|      heapAlignSize(size), std::forward<Args>(args)...);
   49|     28|}
_ZN6hermes2vm6GCBase5makeAINS0_23ExternalStringPrimitiveIcEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT3_:
   57|     28|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     28|  assert(
   59|     28|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|     28|  assert(
   61|     28|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     28|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     28|      "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|     28|  T *ptr =
   71|     28|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     28|          size, std::forward<Args>(args)...);
   73|     28|#endif
   74|     28|#ifndef NDEBUG
   75|     28|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     28|#endif
   77|     28|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     28|  newAlloc(ptr, size);
   79|     28|#endif
   80|     28|  return ptr;
   81|     28|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
   40|    252|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    252|  assert(
   43|    252|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|    252|  assert(
   45|    252|      !VTable::getVTable(T::getCellKind())->size &&
   46|    252|      "Cell is not variable size.");
   47|    252|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    252|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    252|}
_ZN6hermes2vm6GCBase5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
   57|    252|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    252|  assert(
   59|    252|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    252|  assert(
   61|    252|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    252|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    252|      "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|    252|  T *ptr =
   71|    252|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    252|          size, std::forward<Args>(args)...);
   73|    252|#endif
   74|    252|#ifndef NDEBUG
   75|    252|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    252|#endif
   77|    252|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    252|  newAlloc(ptr, size);
   79|    252|#endif
   80|    252|  return ptr;
   81|    252|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23BufferedStringPrimitiveIDsEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT2_:
   40|     31|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|     31|  assert(
   43|     31|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|     31|  assert(
   45|     31|      !VTable::getVTable(T::getCellKind())->size &&
   46|     31|      "Cell is not variable size.");
   47|     31|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|     31|      heapAlignSize(size), std::forward<Args>(args)...);
   49|     31|}
_ZN6hermes2vm6GCBase5makeAINS0_23BufferedStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT3_:
   57|     31|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     31|  assert(
   59|     31|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|     31|  assert(
   61|     31|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     31|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     31|      "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|     31|  T *ptr =
   71|     31|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     31|          size, std::forward<Args>(args)...);
   73|     31|#endif
   74|     31|#ifndef NDEBUG
   75|     31|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     31|#endif
   77|     31|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     31|  newAlloc(ptr, size);
   79|     31|#endif
   80|     31|  return ptr;
   81|     31|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_12SingleObjectILNS0_8CellKindE60EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|    160|T *GCBase::makeAFixed(Args &&...args) {
   25|    160|  static_assert(
   26|    160|      cellSize<T>() >= minAllocationSize() &&
   27|    160|          cellSize<T>() <= maxAllocationSize(),
   28|    160|      "Cell size outside legal range.");
   29|    160|  assert(
   30|    160|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    160|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    160|      cellSize<T>(), std::forward<Args>(args)...);
   33|    160|}
_ZN6hermes2vm6GCBase5makeAINS0_12SingleObjectILNS0_8CellKindE60EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|    160|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    160|  assert(
   59|    160|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    160|  assert(
   61|    160|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    160|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    160|      "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|    160|  T *ptr =
   71|    160|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    160|          size, std::forward<Args>(args)...);
   73|    160|#endif
   74|    160|#ifndef NDEBUG
   75|    160|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    160|#endif
   77|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    160|  newAlloc(ptr, size);
   79|    160|#endif
   80|    160|  return ptr;
   81|    160|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_12SingleObjectILNS0_8CellKindE59EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|    160|T *GCBase::makeAFixed(Args &&...args) {
   25|    160|  static_assert(
   26|    160|      cellSize<T>() >= minAllocationSize() &&
   27|    160|          cellSize<T>() <= maxAllocationSize(),
   28|    160|      "Cell size outside legal range.");
   29|    160|  assert(
   30|    160|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    160|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    160|      cellSize<T>(), std::forward<Args>(args)...);
   33|    160|}
_ZN6hermes2vm6GCBase5makeAINS0_12SingleObjectILNS0_8CellKindE59EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|    160|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    160|  assert(
   59|    160|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    160|  assert(
   61|    160|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    160|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    160|      "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|    160|  T *ptr =
   71|    160|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    160|          size, std::forward<Args>(args)...);
   73|    160|#endif
   74|    160|#ifndef NDEBUG
   75|    160|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    160|#endif
   77|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    160|  newAlloc(ptr, size);
   79|    160|#endif
   80|    160|  return ptr;
   81|    160|}
_ZN6hermes2vm6GCBase19markCellWithinRangeINS0_7HadesGC12EvacAcceptorILb0EEEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindEPKcSE_:
  135|    318|    const char *end) {
  136|    318|  visitor.visitWithinRange(
  137|    318|      cell,
  138|    318|      Metadata::metadataTable[static_cast<size_t>(kind)].offsets,
  139|    318|      begin,
  140|    318|      end);
  141|    318|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb0EEEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  124|  63.5k|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  125|  63.5k|  visitor.visit(
  126|  63.5k|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  127|  63.5k|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb0EEEEEvPNS0_6GCCellERT_:
  112|  34.2k|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  113|  34.2k|  markCell(cell, cell->getKind(), acceptor);
  114|  34.2k|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb0EEEEEvPNS0_6GCCellENS0_8CellKindERT_:
  117|  34.2k|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  118|  34.2k|  SlotVisitor<Acceptor> visitor(acceptor);
  119|  34.2k|  markCell(visitor, cell, kind);
  120|  34.2k|}
_ZN6hermes2vm6GCBase8markCellINS0_27CheckHeapWellFormedAcceptorEEEvPNS0_6GCCellERT_:
  112|  7.95M|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  113|  7.95M|  markCell(cell, cell->getKind(), acceptor);
  114|  7.95M|}
_ZN6hermes2vm6GCBase8markCellINS0_27CheckHeapWellFormedAcceptorEEEvPNS0_6GCCellENS0_8CellKindERT_:
  117|  7.95M|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  118|  7.95M|  SlotVisitor<Acceptor> visitor(acceptor);
  119|  7.95M|  markCell(visitor, cell, kind);
  120|  7.95M|}
_ZN6hermes2vm6GCBase8markCellINS0_27CheckHeapWellFormedAcceptorEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  124|  7.95M|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  125|  7.95M|  visitor.visit(
  126|  7.95M|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  127|  7.95M|}
HadesGC.cpp:_ZN6hermes2vm6GCBase8markCellIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvPNS0_6GCCellERT_:
  112|  7.95M|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  113|  7.95M|  markCell(cell, cell->getKind(), acceptor);
  114|  7.95M|}
HadesGC.cpp:_ZN6hermes2vm6GCBase8markCellIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvPNS0_6GCCellENS0_8CellKindERT_:
  117|  7.95M|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  118|  7.95M|  SlotVisitor<Acceptor> visitor(acceptor);
  119|  7.95M|  markCell(visitor, cell, kind);
  120|  7.95M|}
HadesGC.cpp:_ZN6hermes2vm6GCBase8markCellIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  124|  7.95M|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  125|  7.95M|  visitor.visit(
  126|  7.95M|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  127|  7.95M|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_15DictPropertyMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT2_:
   40|   209k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   209k|  assert(
   43|   209k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|   209k|  assert(
   45|   209k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   209k|      "Cell is not variable size.");
   47|   209k|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   209k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   209k|}
_ZN6hermes2vm6GCBase5makeAINS0_15DictPropertyMapELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT3_:
   57|   209k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   209k|  assert(
   59|   209k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|   209k|  assert(
   61|   209k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   209k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   209k|      "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|   209k|  T *ptr =
   71|   209k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   209k|          size, std::forward<Args>(args)...);
   73|   209k|#endif
   74|   209k|#ifndef NDEBUG
   75|   209k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   209k|#endif
   77|   209k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   209k|  newAlloc(ptr, size);
   79|   209k|#endif
   80|   209k|  return ptr;
   81|   209k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_14OrderedHashMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_DpOT2_:
   24|    160|T *GCBase::makeAFixed(Args &&...args) {
   25|    160|  static_assert(
   26|    160|      cellSize<T>() >= minAllocationSize() &&
   27|    160|          cellSize<T>() <= maxAllocationSize(),
   28|    160|      "Cell size outside legal range.");
   29|    160|  assert(
   30|    160|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|    160|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    160|      cellSize<T>(), std::forward<Args>(args)...);
   33|    160|}
_ZN6hermes2vm6GCBase5makeAINS0_14OrderedHashMapELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_jDpOT3_:
   57|    160|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    160|  assert(
   59|    160|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|    160|  assert(
   61|    160|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    160|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    160|      "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|    160|  T *ptr =
   71|    160|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    160|          size, std::forward<Args>(args)...);
   73|    160|#endif
   74|    160|#ifndef NDEBUG
   75|    160|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    160|#endif
   77|    160|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    160|  newAlloc(ptr, size);
   79|    160|#endif
   80|    160|  return ptr;
   81|    160|}

_ZNK6hermes2vm6GCBase7getNameEv:
  838|    113|  const std::string &getName() const {
  839|    113|    return name_;
  840|    113|  }
_ZN6hermes2vm6GCBase13constructCellINS0_15BigIntPrimitiveEJRjEEEPT_PvjDpOT0_:
 1299|   390k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|   390k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|   390k|    constexpr auto kind = T::getCellKind();
 1302|   390k|    cell->setKindAndSize({kind, size});
 1303|   390k|    return cell;
 1304|   390k|  }
_ZN6hermes2vm6GCBase9IDTracker8reservedENS2_16ReservedObjectIDE:
  602|    160|    static constexpr HeapSnapshot::NodeID reserved(ReservedObjectID id) {
  603|       |      // All reserved IDs should be odd numbers to signify that they're JS
  604|       |      // objects and not native objects. This follows v8's output.
  605|    160|      return static_cast<std::underlying_type<ReservedObjectID>::type>(id) * 2 +
  606|    160|          1;
  607|    160|    }
_ZN6hermes2vm6GCBase33SamplingAllocationLocationTrackerC2EPS1_:
  515|    160|    explicit inline SamplingAllocationLocationTracker(GCBase *gc) : gc_(gc) {}
_ZNK6hermes2vm6GCBase33SamplingAllocationLocationTracker9isEnabledEv:
  518|  8.69M|    bool isEnabled() const {
  519|  8.69M|      return !!dist_;
  520|  8.69M|    }
_ZN6hermes2vm6GCBaseD2Ev:
  804|    160|  virtual ~GCBase() {
  805|    160|    assert(
  806|    160|        weakMapEntrySlots_.sizeForTests() == 0 &&
  807|    160|        "weakMapEntrySlots_ must all be freed");
  808|    160|    assert(weakSlots_.sizeForTests() == 0 && "weakSlots_ must all be freed");
  809|    160|  }
_ZNK6hermes2vm6GCBase14getPointerBaseEv:
  846|  13.7M|  PointerBase &getPointerBase() const {
  847|  13.7M|    return pointerBase_;
  848|  13.7M|  }
_ZNK6hermes2vm6GCBase12getCallbacksEv:
  850|  4.69M|  GCCallbacks &getCallbacks() const {
  851|  4.69M|    return gcCallbacks_;
  852|  4.69M|  }
_ZNK6hermes2vm6GCBase4inGCEv:
 1136|  1.15M|  bool inGC() const {
 1137|  1.15M|    return inGC_;
 1138|  1.15M|  }
_ZN6hermes2vm6GCBase13isTrackingIDsEv:
 1147|    226|  bool isTrackingIDs() {
 1148|    226|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1149|    226|    return getIDTracker().hasTrackedObjectIDs() ||
  ------------------
  |  Branch (1149:12): [True: 0, False: 226]
  ------------------
 1150|    226|        getAllocationLocationTracker().isEnabled() ||
  ------------------
  |  Branch (1150:9): [True: 0, False: 226]
  ------------------
 1151|    226|        getSamplingAllocationTracker().isEnabled();
  ------------------
  |  Branch (1151:9): [True: 0, False: 226]
  ------------------
 1152|       |#else
 1153|       |    return getIDTracker().hasTrackedObjectIDs();
 1154|       |#endif
 1155|    226|  }
_ZN6hermes2vm6GCBase12getIDTrackerEv:
 1157|  10.4k|  IDTracker &getIDTracker() {
 1158|  10.4k|    return idTracker_;
 1159|  10.4k|  }
_ZN6hermes2vm6GCBase28getAllocationLocationTrackerEv:
 1162|    226|  AllocationLocationTracker &getAllocationLocationTracker() {
 1163|    226|    return allocationLocationTracker_;
 1164|    226|  }
_ZN6hermes2vm6GCBase28getSamplingAllocationTrackerEv:
 1166|    226|  SamplingAllocationLocationTracker &getSamplingAllocationTracker() {
 1167|    226|    return samplingAllocationTracker_;
 1168|    226|  }
_ZN6hermes2vm6GCBase9markRootsERNS0_28RootAndSlotAcceptorWithNamesEb:
 1257|    339|  void markRoots(RootAndSlotAcceptorWithNames &acceptor, bool markLongLived) {
 1258|    339|    gcCallbacks_.markRoots(acceptor, markLongLived);
 1259|    339|  }
_ZN6hermes2vm6GCBase13markWeakRootsERNS0_16WeakRootAcceptorEb:
 1263|    339|  void markWeakRoots(WeakRootAcceptor &acceptor, bool markLongLived) {
 1264|    339|    gcCallbacks_.markWeakRoots(acceptor, markLongLived);
 1265|    339|    acceptor.beginRootSection(RootAcceptor::Section::WeakRefSlots);
 1266|    339|    weakSlots_.forEach(
 1267|    339|        [&acceptor](WeakRefSlot &slot) { slot.markWeakRoots(acceptor); });
 1268|       |
 1269|    339|    weakMapEntrySlots_.forEach(
 1270|    339|        [&acceptor](WeakMapEntrySlot &slot) { slot.markWeakRoots(acceptor); });
 1271|    339|    acceptor.endRootSection();
 1272|    339|  }
_ZN6hermes2vm6GCBase13constructCellINS0_11BoxedDoubleEJRdEEEPT_PvjDpOT0_:
 1299|   818k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|   818k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|   818k|    constexpr auto kind = T::getCellKind();
 1302|   818k|    cell->setKindAndSize({kind, size});
 1303|   818k|    return cell;
 1304|   818k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_16ArrayStorageBaseINS0_13HermesValue32EEEJEEEPT_PvjDpOT0_:
 1299|  90.6k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  90.6k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  90.6k|    constexpr auto kind = T::getCellKind();
 1302|  90.6k|    cell->setKindAndSize({kind, size});
 1303|  90.6k|    return cell;
 1304|  90.6k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_11EnvironmentEJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_PvjDpOT0_:
 1299|    836|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    836|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    836|    constexpr auto kind = T::getCellKind();
 1302|    836|    cell->setKindAndSize({kind, size});
 1303|    836|    return cell;
 1304|    836|  }
_ZN6hermes2vm6GCBase13constructCellINS0_17NativeConstructorEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESC_S5_NS0_10NativeArgsEERPFNSE_INS0_12PseudoHandleIS7_EELSH_6EEES5_S8_SC_ERNS0_8CellKindEEEEPT_SC_jDpOT0_:
 1299|  6.72k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  6.72k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  6.72k|    constexpr auto kind = T::getCellKind();
 1302|  6.72k|    cell->setKindAndSize({kind, size});
 1303|  6.72k|    return cell;
 1304|  6.72k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_16ArrayStorageBaseINS0_11HermesValueEEEJEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }
_ZN6hermes2vm6GCBase13constructCellINS0_13BoundFunctionEJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERNS6_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }
_ZN6hermes2vm6GCBase13constructCellINS0_14NativeFunctionEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESC_S5_NS0_10NativeArgsEEEEEPT_SC_jDpOT0_:
 1299|  70.5k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  70.5k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  70.5k|    constexpr auto kind = T::getCellKind();
 1302|  70.5k|    cell->setKindAndSize({kind, size});
 1303|  70.5k|    return cell;
 1304|  70.5k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_10JSFunctionEJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS6_INS0_8JSObjectEEENS6_INS0_11HiddenClassEEERNS6_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_PvjDpOT0_:
 1299|  6.19k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  6.19k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  6.19k|    constexpr auto kind = T::getCellKind();
 1302|  6.19k|    cell->setKindAndSize({kind, size});
 1303|  6.19k|    return cell;
 1304|  6.19k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_6DomainEJEEEPT_PvjDpOT0_:
 1299|    516|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    516|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    516|    constexpr auto kind = T::getCellKind();
 1302|    516|    cell->setKindAndSize({kind, size});
 1303|    516|    return cell;
 1304|    516|  }
_ZZN6hermes2vm6GCBase13markWeakRootsERNS0_16WeakRootAcceptorEbENKUlRNS0_11WeakRefSlotEE_clES5_:
 1267|   199k|        [&acceptor](WeakRefSlot &slot) { slot.markWeakRoots(acceptor); });
_ZN6hermes2vm6GCBase13constructCellINS0_11HiddenClassEJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_PvjDpOT0_:
 1299|  94.2k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  94.2k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  94.2k|    constexpr auto kind = T::getCellKind();
 1302|  94.2k|    cell->setKindAndSize({kind, size});
 1303|  94.2k|    return cell;
 1304|  94.2k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIcLb1EEEJRmEEEPT_PvjDpOT0_:
 1299|   415k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|   415k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|   415k|    constexpr auto kind = T::getCellKind();
 1302|   415k|    cell->setKindAndSize({kind, size});
 1303|   415k|    return cell;
 1304|   415k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIDsLb1EEEJRmEEEPT_PvjDpOT0_:
 1299|    216|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    216|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    216|    constexpr auto kind = T::getCellKind();
 1302|    216|    cell->setKindAndSize({kind, size});
 1303|    216|    return cell;
 1304|    216|  }
_ZN6hermes2vm6GCBase13constructCellINS0_7JSArrayEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS6_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_PvjDpOT0_:
 1299|  1.05M|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  1.05M|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  1.05M|    constexpr auto kind = T::getCellKind();
 1302|  1.05M|    cell->setKindAndSize({kind, size});
 1303|  1.05M|    return cell;
 1304|  1.05M|  }
_ZN6hermes2vm6GCBase13constructCellINS0_7JSErrorEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERbEEEPT_PvjDpOT0_:
 1299|     53|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|     53|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|     53|    constexpr auto kind = T::getCellKind();
 1302|     53|    cell->setKindAndSize({kind, size});
 1303|     53|    return cell;
 1304|     53|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSObjectEJRNS0_7RuntimeERNS0_6HandleIS3_EENS6_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_PvjDpOT0_:
 1299|   364k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|   364k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|   364k|    constexpr auto kind = T::getCellKind();
 1302|   364k|    cell->setKindAndSize({kind, size});
 1303|   364k|    return cell;
 1304|   364k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSRegExpEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1299|      8|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|      8|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|      8|    constexpr auto kind = T::getCellKind();
 1302|      8|    cell->setKindAndSize({kind, size});
 1303|      8|    return cell;
 1304|      8|  }
_ZN6hermes2vm6GCBase13constructCellINS0_10HostObjectEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSC_14default_deleteISE_EEEEEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSStringEJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS6_INS0_8JSObjectEEERNS6_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1299|    175|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    175|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    175|    constexpr auto kind = T::getCellKind();
 1302|    175|    cell->setKindAndSize({kind, size});
 1303|    175|    return cell;
 1304|    175|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSNumberEJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS7_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1299|    161|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    161|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    161|    constexpr auto kind = T::getCellKind();
 1302|    161|    cell->setKindAndSize({kind, size});
 1303|    161|    return cell;
 1304|    161|  }
_ZN6hermes2vm6GCBase13constructCellINS0_9JSBooleanEJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS7_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }
_ZN6hermes2vm6GCBase13constructCellINS0_16PropertyAccessorEJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEES9_EEEPT_PvjDpOT0_:
 1299|  7.36k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  7.36k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  7.36k|    constexpr auto kind = T::getCellKind();
 1302|  7.36k|    cell->setKindAndSize({kind, size});
 1303|  7.36k|    return cell;
 1304|  7.36k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEJEEEPT_PvjDpOT0_:
 1299|    799|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    799|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    799|    constexpr auto kind = T::getCellKind();
 1302|    799|    cell->setKindAndSize({kind, size});
 1303|    799|    return cell;
 1304|    799|  }
_ZN6hermes2vm6GCBase13constructCellINS0_18SegmentedArrayBaseINS0_11HermesValueEEEJEEEPT_PvjDpOT0_:
 1299|    153|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    153|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    153|    constexpr auto kind = T::getCellKind();
 1302|    153|    cell->setKindAndSize({kind, size});
 1303|    153|    return cell;
 1304|    153|  }
_ZN6hermes2vm6GCBase13constructCellINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEJEEEPT_PvjDpOT0_:
 1299|  2.23k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  2.23k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  2.23k|    constexpr auto kind = T::getCellKind();
 1302|  2.23k|    cell->setKindAndSize({kind, size});
 1303|  2.23k|    return cell;
 1304|  2.23k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEJEEEPT_PvjDpOT0_:
 1299|   663k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|   663k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|   663k|    constexpr auto kind = T::getCellKind();
 1302|   663k|    cell->setKindAndSize({kind, size});
 1303|   663k|    return cell;
 1304|   663k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIDsLb0EEEJRN4llvh8ArrayRefIDsEEEEEPT_PvjDpOT0_:
 1299|  20.4k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  20.4k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  20.4k|    constexpr auto kind = T::getCellKind();
 1302|  20.4k|    cell->setKindAndSize({kind, size});
 1303|  20.4k|    return cell;
 1304|  20.4k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIDsLb0EEEJRjEEEPT_PvjDpOT0_:
 1299|   390k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|   390k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|   390k|    constexpr auto kind = T::getCellKind();
 1302|   390k|    cell->setKindAndSize({kind, size});
 1303|   390k|    return cell;
 1304|   390k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIcLb0EEEJRN4llvh8ArrayRefIcEEEEEPT_PvjDpOT0_:
 1299|  2.12M|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  2.12M|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  2.12M|    constexpr auto kind = T::getCellKind();
 1302|  2.12M|    cell->setKindAndSize({kind, size});
 1303|  2.12M|    return cell;
 1304|  2.12M|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIcLb0EEEJRjEEEPT_PvjDpOT0_:
 1299|  1.95M|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|  1.95M|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|  1.95M|    constexpr auto kind = T::getCellKind();
 1302|  1.95M|    cell->setKindAndSize({kind, size});
 1303|  1.95M|    return cell;
 1304|  1.95M|  }
_ZN6hermes2vm6GCBase13constructCellINS0_23ExternalStringPrimitiveIDsEEJNSt3__112basic_stringIDsNS5_11char_traitsIDsEENS5_9allocatorIDsEEEEEEEPT_PvjDpOT0_:
 1299|    263|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    263|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    263|    constexpr auto kind = T::getCellKind();
 1302|    263|    cell->setKindAndSize({kind, size});
 1303|    263|    return cell;
 1304|    263|  }
_ZN6hermes2vm6GCBase13constructCellINS0_23ExternalStringPrimitiveIcEEJNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEPT_PvjDpOT0_:
 1299|     28|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|     28|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|     28|    constexpr auto kind = T::getCellKind();
 1302|     28|    cell->setKindAndSize({kind, size});
 1303|     28|    return cell;
 1304|     28|  }
_ZN6hermes2vm6GCBase13constructCellINS0_23BufferedStringPrimitiveIDsEEJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_PvjDpOT0_:
 1299|     31|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|     31|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|     31|    constexpr auto kind = T::getCellKind();
 1302|     31|    cell->setKindAndSize({kind, size});
 1303|     31|    return cell;
 1304|     31|  }
_ZN6hermes2vm6GCBase13constructCellINS0_12SingleObjectILNS0_8CellKindE60EEEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }
_ZN6hermes2vm6GCBase13constructCellINS0_12SingleObjectILNS0_8CellKindE59EEEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }
_ZN6hermes2vm6GCBase13constructCellINS0_7HadesGC6OldGen12FreelistCellEJEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }
_ZN6hermes2vm6GCBase13constructCellINS0_15DictPropertyMapEJRjS4_EEEPT_PvjDpOT0_:
 1299|   209k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|   209k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|   209k|    constexpr auto kind = T::getCellKind();
 1302|   209k|    cell->setKindAndSize({kind, size});
 1303|   209k|    return cell;
 1304|   209k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_14OrderedHashMapEJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_PvjDpOT0_:
 1299|    160|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1300|    160|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1301|    160|    constexpr auto kind = T::getCellKind();
 1302|    160|    cell->setKindAndSize({kind, size});
 1303|    160|    return cell;
 1304|    160|  }

_ZNK6hermes2vm6GCCell7getKindEv:
  145|   261M|  CellKind getKind() const {
  146|   261M|    return kindAndSize_.getKind();
  147|   261M|  }
_ZNK6hermes2vm11KindAndSize7getKindEv:
   48|   261M|  CellKind getKind() const {
   49|   261M|    return static_cast<CellKind>(kind_);
   50|   261M|  }
_ZNK6hermes2vm6GCCell5getVTEv:
  151|  9.77M|  const VTable *getVT() const {
  152|  9.77M|    assert(isValid() && "Called getVT() on an invalid cell");
  153|  9.77M|    return kindAndSize_.getVT();
  154|  9.77M|  }
_ZNK6hermes2vm6GCCell7isValidEv:
  235|  41.0M|  bool isValid() const {
  236|  41.0M|#ifndef NDEBUG
  237|       |    // We only do the cell magic number check in debug builds.
  238|  41.0M|    return magic_ == kMagic && kindAndSize_.getVT()->isValid();
  ------------------
  |  Branch (238:12): [True: 41.0M, False: 0]
  |  Branch (238:32): [True: 41.0M, False: 0]
  ------------------
  239|       |#else
  240|       |    return kindAndSize_.getVT()->isValid();
  241|       |#endif
  242|  41.0M|  }
_ZNK6hermes2vm11KindAndSize5getVTEv:
   51|  50.8M|  const VTable *getVT() const {
   52|  50.8M|    return VTable::vtableArray[kind_];
   53|  50.8M|  }
_ZN6hermes2vm6GCCellnwEmPv:
  251|  8.69M|  static void *operator new(size_t, void *p) {
  252|  8.69M|    return p;
  253|  8.69M|  }
_ZN6hermes2vm6GCCell14setKindAndSizeENS0_11KindAndSizeE:
  164|  9.27M|  void setKindAndSize(KindAndSize kindAndSize) {
  165|  9.27M|    kindAndSize_ = kindAndSize;
  166|  9.27M|  }
_ZN6hermes2vm11KindAndSizeC2ENS0_8CellKindEm:
   56|  9.27M|      : size_(sz), kind_(static_cast<uint8_t>(kind)) {
   57|  9.27M|    assert((sz & 1) == 0 && "LSB of size must always be zero.");
   58|  9.27M|    assert(sz <= maxSize() && "Size is too large.");
   59|  9.27M|  }
_ZN6hermes2vm11KindAndSize7maxSizeEv:
   61|  9.98M|  static constexpr uint32_t maxSize() {
   62|  9.98M|    return (1ULL << kNumSizeBits) - 1;
   63|  9.98M|  }
_ZN6hermes2vm6GCCell24setDebugAllocationIdInGCEj:
  270|  8.69M|  void setDebugAllocationIdInGC(uint32_t id) {
  271|  8.69M|    _debugAllocationId_ = id;
  272|  8.69M|  }
_ZNK6hermes2vm6GCCell16getAllocatedSizeEv:
  117|  51.1M|  uint32_t getAllocatedSize() const {
  118|  51.1M|    return kindAndSize_.getSize();
  119|  51.1M|  }
_ZNK6hermes2vm11KindAndSize7getSizeEv:
   45|  51.1M|  size_t getSize() const {
   46|  51.1M|    return size_;
   47|  51.1M|  }
_ZNK6hermes2vm6GCCell14isVariableSizeEv:
  134|   585k|  bool isVariableSize() const {
  135|   585k|    return isVariableSize(getVT());
  136|   585k|  }
_ZN6hermes2vm6GCCell14isVariableSizeEPKNS0_6VTableE:
  140|   585k|  static bool isVariableSize(const VTable *vtp) {
  141|   585k|    return vtp->size == 0;
  142|   585k|  }
_ZN6hermes2vm6GCCell26setMarkedForwardingPointerENS0_17CompressedPointerE:
  202|  34.2k|  void setMarkedForwardingPointer(CompressedPointer cell) {
  203|  34.2k|    forwardingPointer_ = CompressedPointer::fromRaw(cell.getRaw() | 0x1);
  204|  34.2k|  }
_ZNK6hermes2vm6GCCell26getMarkedForwardingPointerEv:
  210|  57.1k|  CompressedPointer getMarkedForwardingPointer() const {
  211|  57.1k|    assert(isMarked());
  212|  57.1k|    return CompressedPointer::fromRaw(forwardingPointer_.getRaw() - 0x1);
  213|  57.1k|  }
_ZNK6hermes2vm6GCCell26hasMarkedForwardingPointerEv:
  217|  92.5k|  bool hasMarkedForwardingPointer() const {
  218|  92.5k|    return isMarked();
  219|  92.5k|  }
_ZN6hermes2vm6GCCell8nextCellEv:
  225|  16.5M|  GCCell *nextCell() {
  226|  16.5M|    return reinterpret_cast<GCCell *>(
  227|  16.5M|        reinterpret_cast<char *>(this) + getAllocatedSize());
  228|  16.5M|  }
_ZNK6hermes2vm6GCCell8isMarkedEv:
  276|   149k|  bool isMarked() const {
  277|   149k|    return forwardingPointer_.getRaw() & 0x1;
  278|   149k|  }
_ZN6hermes2vm6GCCell7maxSizeEv:
  280|   705k|  static constexpr uint32_t maxSize() {
  281|   705k|    return KindAndSize::maxSize();
  282|   705k|  }
_ZN6hermes2vm23VariableSizeRuntimeCell13setSizeFromGCEj:
  297|   585k|  void setSizeFromGC(uint32_t sz) {
  298|   585k|    assert(
  299|   585k|        isVariableSize() &&
  300|   585k|        "Cannot call setSizeFromGC on a non-variable size cell");
  301|   585k|    assert(
  302|   585k|        sz >= sizeof(VariableSizeRuntimeCell) &&
  303|   585k|        "Should not allocate a VariableSizeRuntimeCell of size less than "
  304|   585k|        "the size of a cell");
  305|   585k|    setKindAndSize(KindAndSize{getKind(), sz});
  306|   585k|  }
_ZN6hermes2vm6GCCell12cellSizeImplINS0_11BoxedDoubleEEEjv:
  123|   818k|  static constexpr uint32_t cellSizeImpl() {
  124|   818k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  125|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  126|       |    // but it's actually fixed-size.
  127|   818k|    static_assert(
  128|   818k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  129|   818k|        "must be fixed-size");
  130|   818k|    return sizeof(C);
  131|   818k|  }
_ZN6hermes2vm6GCCellC2Ev:
  110|  8.69M|  GCCell() = default;
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_11BoxedDoubleEEEjv:
   37|   818k|static constexpr uint32_t cellSize() {
   38|   818k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|   818k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|   818k|}
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_13BoundFunctionEEEjv:
   37|    160|static constexpr uint32_t cellSize() {
   38|    160|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    160|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    160|}
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_14NativeFunctionEEEjv:
   37|  70.5k|static constexpr uint32_t cellSize() {
   38|  70.5k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  70.5k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  70.5k|}
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_10JSFunctionEEEjv:
   37|  6.19k|static constexpr uint32_t cellSize() {
   38|  6.19k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  6.19k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  6.19k|}
Domain.cpp:_ZN6hermes2vmL8cellSizeINS0_6DomainEEEjv:
   37|    516|static constexpr uint32_t cellSize() {
   38|    516|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    516|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    516|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_6DomainEEEjv:
  123|    516|  static constexpr uint32_t cellSizeImpl() {
  124|    516|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  125|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  126|       |    // but it's actually fixed-size.
  127|    516|    static_assert(
  128|    516|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  129|    516|        "must be fixed-size");
  130|    516|    return sizeof(C);
  131|    516|  }
HiddenClass.cpp:_ZN6hermes2vmL8cellSizeINS0_11HiddenClassEEEjv:
   37|  94.2k|static constexpr uint32_t cellSize() {
   38|  94.2k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  94.2k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  94.2k|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_11HiddenClassEEEjv:
  123|  94.2k|  static constexpr uint32_t cellSizeImpl() {
  124|  94.2k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  125|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  126|       |    // but it's actually fixed-size.
  127|  94.2k|    static_assert(
  128|  94.2k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  129|  94.2k|        "must be fixed-size");
  130|  94.2k|    return sizeof(C);
  131|  94.2k|  }
JSArray.cpp:_ZN6hermes2vmL8cellSizeINS0_7JSArrayEEEjv:
   37|  1.05M|static constexpr uint32_t cellSize() {
   38|  1.05M|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  1.05M|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  1.05M|}
JSError.cpp:_ZN6hermes2vmL8cellSizeINS0_7JSErrorEEEjv:
   37|     53|static constexpr uint32_t cellSize() {
   38|     53|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     53|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     53|}
JSObject.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSObjectEEEjv:
   37|   364k|static constexpr uint32_t cellSize() {
   38|   364k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|   364k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|   364k|}
JSRegExp.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSRegExpEEEjv:
   37|      8|static constexpr uint32_t cellSize() {
   38|      8|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|      8|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|      8|}
HostModel.cpp:_ZN6hermes2vmL8cellSizeINS0_10HostObjectEEEjv:
   37|    160|static constexpr uint32_t cellSize() {
   38|    160|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    160|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    160|}
PrimitiveBox.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSStringEEEjv:
   37|    175|static constexpr uint32_t cellSize() {
   38|    175|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    175|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    175|}
PrimitiveBox.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSNumberEEEjv:
   37|    161|static constexpr uint32_t cellSize() {
   38|    161|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    161|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    161|}
PrimitiveBox.cpp:_ZN6hermes2vmL8cellSizeINS0_9JSBooleanEEEjv:
   37|    160|static constexpr uint32_t cellSize() {
   38|    160|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    160|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    160|}
PropertyAccessor.cpp:_ZN6hermes2vmL8cellSizeINS0_16PropertyAccessorEEEjv:
   37|  7.36k|static constexpr uint32_t cellSize() {
   38|  7.36k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  7.36k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  7.36k|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_16PropertyAccessorEEEjv:
  123|  7.36k|  static constexpr uint32_t cellSizeImpl() {
  124|  7.36k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  125|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  126|       |    // but it's actually fixed-size.
  127|  7.36k|    static_assert(
  128|  7.36k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  129|  7.36k|        "must be fixed-size");
  130|  7.36k|    return sizeof(C);
  131|  7.36k|  }
SegmentedArray.cpp:_ZN6hermes2vmL8cellSizeINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEEEjv:
   37|    799|static constexpr uint32_t cellSize() {
   38|    799|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    799|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    799|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEEEjv:
  123|    799|  static constexpr uint32_t cellSizeImpl() {
  124|    799|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  125|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  126|       |    // but it's actually fixed-size.
  127|    799|    static_assert(
  128|    799|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  129|    799|        "must be fixed-size");
  130|    799|    return sizeof(C);
  131|    799|  }
SegmentedArray.cpp:_ZN6hermes2vmL8cellSizeINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEEjv:
   37|  2.23k|static constexpr uint32_t cellSize() {
   38|  2.23k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  2.23k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  2.23k|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEEjv:
  123|  2.23k|  static constexpr uint32_t cellSizeImpl() {
  124|  2.23k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  125|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  126|       |    // but it's actually fixed-size.
  127|  2.23k|    static_assert(
  128|  2.23k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  129|  2.23k|        "must be fixed-size");
  130|  2.23k|    return sizeof(C);
  131|  2.23k|  }
AsyncFunction.cpp:_ZN6hermes2vmL8cellSizeINS0_17NativeConstructorEEEjv:
   37|  6.72k|static constexpr uint32_t cellSize() {
   38|  6.72k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  6.72k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  6.72k|}
Math.cpp:_ZN6hermes2vmL8cellSizeINS0_12SingleObjectILNS0_8CellKindE60EEEEEjv:
   37|    160|static constexpr uint32_t cellSize() {
   38|    160|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    160|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    160|}
JSON.cpp:_ZN6hermes2vmL8cellSizeINS0_12SingleObjectILNS0_8CellKindE59EEEEEjv:
   37|    160|static constexpr uint32_t cellSize() {
   38|    160|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    160|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    160|}
OrderedHashMap.cpp:_ZN6hermes2vmL8cellSizeINS0_14OrderedHashMapEEEjv:
   37|    160|static constexpr uint32_t cellSize() {
   38|    160|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    160|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    160|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_14OrderedHashMapEEEjv:
  123|    160|  static constexpr uint32_t cellSizeImpl() {
  124|    160|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  125|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  126|       |    // but it's actually fixed-size.
  127|    160|    static_assert(
  128|    160|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  129|    160|        "must be fixed-size");
  130|    160|    return sizeof(C);
  131|    160|  }

_ZN6hermes2vm4impl10DebugMutexC2Ev:
   95|    640|  DebugMutex() : tid_() {}
_ZNK6hermes2vm4impl10DebugMutexcvbEv:
   98|  1.13M|  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|  1.13M|    return tid_.load(std::memory_order_relaxed) == std::this_thread::get_id();
  102|  1.13M|  }
_ZN6hermes2vm4impl10DebugMutex4lockEv:
  104|   562k|  void lock() {
  105|   562k|    inner_.lock();
  106|   562k|    depth_++;
  107|   562k|    tid_.store(std::this_thread::get_id(), std::memory_order_relaxed);
  108|   562k|  }
_ZN6hermes2vm4impl10DebugMutex6unlockEv:
  110|   562k|  void unlock() {
  111|   562k|    assert(depth_ && "Should not unlock an unlocked mutex");
  112|   562k|    assert(
  113|   562k|        tid_.load(std::memory_order_relaxed) == std::this_thread::get_id() &&
  114|   562k|        "Mutex should be acquired and unlocked on the same thread");
  115|   562k|    depth_--;
  116|   562k|    if (!depth_) {
  ------------------
  |  Branch (116:9): [True: 562k, False: 526]
  ------------------
  117|   562k|      tid_.store(std::thread::id{}, std::memory_order_relaxed);
  118|   562k|    }
  119|   562k|    inner_.unlock();
  120|   562k|  }
_ZN6hermes2vm4impl10DebugMutexD2Ev:
   96|    640|  ~DebugMutex() = default;

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

_ZNK6hermes2vm9GCPointerINS0_11HiddenClassEE10getNonNullERNS0_11PointerBaseE:
   85|  18.8M|  T *getNonNull(PointerBase &base) const {
   86|  18.8M|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|  18.8M|  }
_ZNK6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE10getNonNullERNS0_11PointerBaseE:
   85|  5.67M|  T *getNonNull(PointerBase &base) const {
   86|  5.67M|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|  5.67M|  }
_ZN6hermes2vm13GCPointerBaseC2EDn:
   25|  2.82M|  explicit GCPointerBase(std::nullptr_t) : CompressedPointer(nullptr) {}
_ZNK6hermes2vm9GCPointerINS0_15DictPropertyMapEE10getNonNullERNS0_11PointerBaseE:
   85|  16.1M|  T *getNonNull(PointerBase &base) const {
   86|  16.1M|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|  16.1M|  }
_ZNK6hermes2vm9GCPointerINS0_8JSObjectEE3getERNS0_11PointerBaseE:
   82|  5.44M|  T *get(PointerBase &base) const {
   83|  5.44M|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  5.44M|  }
_ZNK6hermes2vm9GCPointerINS0_11HiddenClassEE3getERNS0_11PointerBaseE:
   82|  2.56M|  T *get(PointerBase &base) const {
   83|  2.56M|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  2.56M|  }
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE10setNonNullERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   96|  90.3k|  void setNonNull(PointerBase &base, T *ptr, GC &gc) {
   97|  90.3k|    GCPointerBase::setNonNull(base, ptr, gc);
   98|  90.3k|  }
_ZNK6hermes2vm9GCPointerINS0_15StringPrimitiveEE3getERNS0_11PointerBaseE:
   82|  1.68M|  T *get(PointerBase &base) const {
   83|  1.68M|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  1.68M|  }
_ZNK6hermes2vm9GCPointerINS0_11EnvironmentEE3getERNS0_11PointerBaseE:
   82|  2.91k|  T *get(PointerBase &base) const {
   83|  2.91k|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  2.91k|  }
_ZNK6hermes2vm9GCPointerINS0_8CallableEE3getERNS0_11PointerBaseE:
   82|     70|  T *get(PointerBase &base) const {
   83|     70|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|     70|  }
_ZNK6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3getERNS0_11PointerBaseE:
   82|  7.63M|  T *get(PointerBase &base) const {
   83|  7.63M|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  7.63M|  }
_ZN6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3setERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   93|   936k|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|   936k|    GCPointerBase::set(base, ptr, gc);
   95|   936k|  }
_ZN6hermes2vm9GCPointerINS0_8JSObjectEEC2INS0_13GCPointerBase10NoBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  1.50M|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEEC2INS0_13GCPointerBase10NoBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  1.50M|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2EDn:
   58|  1.50M|  GCPointer(std::nullptr_t) : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_11EnvironmentEEC2Ev:
   56|  77.4k|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_8CallableEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  14.8k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_8CallableEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  14.8k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   72|    160|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS4_RNS0_7HadesGCET_:
   66|    160|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_11EnvironmentEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  7.03k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_11EnvironmentEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  7.03k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_6DomainEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  6.19k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_6DomainEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  6.19k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2Ev:
   56|    516|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_14NativeFunctionEEC2Ev:
   56|    516|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_15StringPrimitiveEE3setERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   93|      8|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|      8|    GCPointerBase::set(base, ptr, gc);
   95|      8|  }
_ZN6hermes2vm9GCPointerINS0_15DictPropertyMapEEC2Ev:
   56|  94.2k|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  94.2k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  94.2k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2Ev:
   56|  94.2k|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_15DictPropertyMapEE3setERNS0_11PointerBaseERKS3_RNS0_7HadesGCE:
  101|  96.1k|  void set(PointerBase &base, const GCPointer<T> &ptr, GC &gc) {
  102|  96.1k|    GCPointerBase::set(base, ptr, gc);
  103|  96.1k|  }
_ZNK6hermes2vm9GCPointerINS0_15DictPropertyMapEE3getERNS0_11PointerBaseE:
   82|  1.58M|  T *get(PointerBase &base) const {
   83|  1.58M|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  1.58M|  }
_ZN6hermes2vm9GCPointerINS0_15DictPropertyMapEE10setNonNullERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   96|   989k|  void setNonNull(PointerBase &base, T *ptr, GC &gc) {
   97|   989k|    GCPointerBase::setNonNull(base, ptr, gc);
   98|   989k|  }
_ZN6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2Ev:
   56|  1.05M|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2Ev:
   56|    106|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3setERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   93|    104|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|    104|    GCPointerBase::set(base, ptr, gc);
   95|    104|  }
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEE10setNonNullERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   96|  1.15M|  void setNonNull(PointerBase &base, T *ptr, GC &gc) {
   97|  1.15M|    GCPointerBase::setNonNull(base, ptr, gc);
   98|  1.15M|  }
_ZN6hermes2vm9GCPointerINS0_8JSObjectEE3setERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   93|    160|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|    160|    GCPointerBase::set(base, ptr, gc);
   95|    160|  }
_ZNK6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3getERNS0_11PointerBaseE:
   82|  9.60k|  T *get(PointerBase &base) const {
   83|  9.60k|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  9.60k|  }
_ZNK6hermes2vm9GCPointerINS0_8JSObjectEE10getNonNullERNS0_11PointerBaseE:
   85|  3.02M|  T *getNonNull(PointerBase &base) const {
   86|  3.02M|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|  3.02M|  }
_ZN6hermes2vm9GCPointerINS0_15StringPrimitiveEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|    183|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_15StringPrimitiveEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|    183|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_8JSObjectEEC2EDn:
   58|      8|  GCPointer(std::nullptr_t) : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_12HashMapEntryEEC2EDn:
   58|    320|  GCPointer(std::nullptr_t) : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   72|    160|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS4_RNS0_7HadesGCET_:
   66|    160|      : GCPointerBase(base, ptr, gc, needsBarriers) {}

_ZN6hermes2vm9GCStorage3getEv:
   65|  51.0M|  GC *get() {
   66|       |#ifdef HERMESVM_GC_RUNTIME
   67|       |    return reinterpret_cast<GC *>(&storage_);
   68|       |#else
   69|  51.0M|    return &heap_;
   70|  51.0M|#endif
   71|  51.0M|  }
_ZN6hermes2vm9GCStorageC2ERNS0_6GCBase11GCCallbacksERNS0_11PointerBaseERKNS0_8GCConfigENSt3__110shared_ptrINS0_12CrashManagerEEENSB_INS0_15StorageProviderEEEj:
   28|    160|      : heap_(
   29|    160|            gcCallbacks,
   30|    160|            pointerBase,
   31|    160|            gcConfig,
   32|    160|            crashMgr,
   33|    160|            provider,
   34|    160|            vmExperimentFlags) {
   35|    160|  }

_ZN6hermes2vm7HadesGC21minAllocationSizeImplEv:
   82|  21.6M|  static constexpr uint32_t minAllocationSizeImpl() {
   83|  21.6M|    return heapAlignSize(
   84|  21.6M|        std::max(sizeof(OldGen::FreelistCell), sizeof(CopyListCell)));
   85|  21.6M|  }
_ZN6hermes2vm7HadesGC5makeAINS0_15BigIntPrimitiveELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
 1083|   390k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|   390k|  assert(
 1085|   390k|      isSizeHeapAligned(size) &&
 1086|   390k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|   390k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|   390k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|   390k|  return constructCell<T>(
 1095|   390k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|   390k|      size,
 1097|   390k|      std::forward<Args>(args)...);
 1098|   390k|}
_ZN6hermes2vm7HadesGC9allocWorkILb0ELNS0_12HasFinalizerE0EEEPvj:
 1101|  5.80M|void *HadesGC::allocWork(uint32_t sz) {
 1102|  5.80M|  assert(
 1103|  5.80M|      isSizeHeapAligned(sz) &&
 1104|  5.80M|      "Should be aligned before entering this function");
 1105|  5.80M|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1106|  5.80M|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1106:7): [Folded - Ignored]
  ------------------
 1107|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1108|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1109|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1110|       |    // more interesting aspect of Hades which is concurrent background
 1111|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1112|       |    // oldGenCollection if one is not already running.
 1113|      0|    youngGenCollection(
 1114|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1115|      0|  }
 1116|  5.80M|  AllocResult res = youngGen().alloc(sz);
 1117|  5.80M|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|  5.80M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 67, False: 5.80M]
  |  |  ------------------
  ------------------
 1118|  5.80M|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1118:7): [Folded - Ignored]
  ------------------
 1119|      0|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1120|  5.80M|  return resPtr;
 1121|  5.80M|}
_ZN6hermes2vm7HadesGC8youngGenEv:
 1019|  8.14M|  HeapSegment &youngGen() {
 1020|  8.14M|    return youngGen_;
 1021|  8.14M|  }
_ZN6hermes2vm7HadesGC21maxAllocationSizeImplEv:
   76|   705k|  static constexpr uint32_t maxAllocationSizeImpl() {
   77|       |    // The largest allocation allowable in Hades is the max size a single
   78|       |    // segment supports.
   79|   705k|    return HeapSegment::maxSize();
   80|   705k|  }
_ZN6hermes2vm7HadesGC12writeBarrierEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEES3_:
  155|  6.44k|  void writeBarrier(const GCHermesValue *loc, HermesValue value) {
  156|  6.44k|    assert(
  157|  6.44k|        !calledByBackgroundThread() &&
  158|  6.44k|        "Write barrier invoked by background thread.");
  159|       |    // A pointer that lives in YG never needs any write barriers.
  160|  6.44k|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|  6.44k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6.44k]
  |  |  ------------------
  ------------------
  161|      0|      writeBarrierSlow(loc, value);
  162|  6.44k|  }
_ZN6hermes2vm7HadesGC12writeBarrierEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEES3_:
  165|  7.63M|  void writeBarrier(const GCSmallHermesValue *loc, SmallHermesValue value) {
  166|  7.63M|    assert(
  167|  7.63M|        !calledByBackgroundThread() &&
  168|  7.63M|        "Write barrier invoked by background thread.");
  169|       |    // A pointer that lives in YG never needs any write barriers.
  170|  7.63M|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|  7.63M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 975k, False: 6.65M]
  |  |  ------------------
  ------------------
  171|   975k|      writeBarrierSlow(loc, value);
  172|  7.63M|  }
_ZN6hermes2vm7HadesGC12writeBarrierEPKNS0_13GCPointerBaseEPKNS0_6GCCellE:
  179|  3.26M|  void writeBarrier(const GCPointerBase *loc, const GCCell *value) {
  180|  3.26M|    assert(
  181|  3.26M|        !calledByBackgroundThread() &&
  182|  3.26M|        "Write barrier invoked by background thread.");
  183|       |    // A pointer that lives in YG never needs any write barriers.
  184|  3.26M|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|  3.26M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.19M, False: 2.06M]
  |  |  ------------------
  ------------------
  185|  1.19M|      writeBarrierSlow(loc, value);
  186|  3.26M|  }
_ZN6hermes2vm7HadesGC23constructorWriteBarrierEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEES3_:
  191|   840k|  void constructorWriteBarrier(const GCHermesValue *loc, HermesValue value) {
  192|       |    // A pointer that lives in YG never needs any write barriers.
  193|   840k|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|   840k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 840k]
  |  |  ------------------
  ------------------
  194|      0|      constructorWriteBarrierSlow(loc, value);
  195|   840k|  }
_ZN6hermes2vm7HadesGC23constructorWriteBarrierEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEES3_:
  200|     52|      SmallHermesValue value) {
  201|       |    // A pointer that lives in YG never needs any write barriers.
  202|     52|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  203|      0|      constructorWriteBarrierSlow(loc, value);
  204|     52|  }
_ZN6hermes2vm7HadesGC23constructorWriteBarrierEPKNS0_13GCPointerBaseEPKNS0_6GCCellE:
  209|   122k|  void constructorWriteBarrier(const GCPointerBase *loc, const GCCell *value) {
  210|       |    // A pointer that lives in YG never needs any write barriers.
  211|   122k|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|   122k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 94.2k, False: 28.6k]
  |  |  ------------------
  ------------------
  212|  94.2k|      relocationWriteBarrier(loc, value);
  213|   122k|  }
_ZN6hermes2vm7HadesGC28constructorWriteBarrierRangeEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEEj:
  217|    138|      uint32_t numHVs) {
  218|       |    // A pointer that lives in YG never needs any write barriers.
  219|    138|    if (LLVM_UNLIKELY(!inYoungGen(start)))
  ------------------
  |  |  189|    138|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 138]
  |  |  ------------------
  ------------------
  220|      0|      constructorWriteBarrierRangeSlow(start, numHVs);
  221|    138|  }
_ZN6hermes2vm7HadesGC28constructorWriteBarrierRangeEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEEj:
  228|  9.61k|      uint32_t numHVs) {
  229|       |    // A pointer that lives in YG never needs any write barriers.
  230|  9.61k|    if (LLVM_UNLIKELY(!inYoungGen(start)))
  ------------------
  |  |  189|  9.61k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 9.61k]
  |  |  ------------------
  ------------------
  231|      0|      constructorWriteBarrierRangeSlow(start, numHVs);
  232|  9.61k|  }
_ZN6hermes2vm7HadesGC20snapshotWriteBarrierEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
  237|    320|  void snapshotWriteBarrier(const GCHermesValue *loc) {
  238|    320|    if (LLVM_UNLIKELY(!inYoungGen(loc) && ogMarkingBarriers_))
  ------------------
  |  |  189|    320|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  239|      0|      snapshotWriteBarrierInternal(*loc);
  240|    320|  }
_ZN6hermes2vm7HadesGC20snapshotWriteBarrierEPKNS0_13GCPointerBaseE:
  245|   447k|  void snapshotWriteBarrier(const GCPointerBase *loc) {
  246|   447k|    if (LLVM_UNLIKELY(!inYoungGen(loc) && ogMarkingBarriers_))
  ------------------
  |  |  189|   895k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 447k]
  |  |  |  Branch (189:53): [True: 447k, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 447k]
  |  |  ------------------
  ------------------
  247|      0|      if (CompressedPointer cp = *loc)
  ------------------
  |  Branch (247:29): [True: 0, False: 0]
  ------------------
  248|      0|        snapshotWriteBarrierInternal(cp);
  249|   447k|  }
_ZN6hermes2vm7HadesGC20snapshotWriteBarrierEPKNS0_10GCSymbolIDE:
  250|   877k|  void snapshotWriteBarrier(const GCSymbolID *loc) {
  251|   877k|    if (LLVM_UNLIKELY(!inYoungGen(loc) && ogMarkingBarriers_))
  ------------------
  |  |  189|   987k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 877k]
  |  |  |  Branch (189:53): [True: 110k, False: 766k]
  |  |  |  Branch (189:53): [True: 0, False: 110k]
  |  |  ------------------
  ------------------
  252|      0|      snapshotWriteBarrierInternal(*loc);
  253|   877k|  }
_ZN6hermes2vm7HadesGC25snapshotWriteBarrierRangeEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEEj:
  255|     15|  void snapshotWriteBarrierRange(const GCHermesValue *start, uint32_t numHVs) {
  256|     15|    if (LLVM_UNLIKELY(!inYoungGen(start) && ogMarkingBarriers_))
  ------------------
  |  |  189|     15|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15]
  |  |  |  Branch (189:53): [True: 0, False: 15]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  257|      0|      snapshotWriteBarrierRangeSlow(start, numHVs);
  258|     15|  }
_ZNK6hermes2vm7HadesGC10inYoungGenEPKv:
  299|  53.2M|  bool inYoungGen(const void *p) const override {
  300|  53.2M|    return youngGen_.lowLim() == AlignedStorage::start(p);
  301|  53.2M|  }
_ZNK6hermes2vm7HadesGC10inYoungGenENS0_17CompressedPointerE:
  302|   644k|  bool inYoungGen(CompressedPointer p) const {
  303|   644k|    return p.getSegmentStart() == youngGenCP_;
  304|   644k|  }
_ZNK6hermes2vm7HadesGC10calledByGCEv:
  319|  1.14M|  bool calledByGC() const override {
  320|       |    // Check if this is called by the background thread or the inGC flag is
  321|       |    // set.
  322|  1.14M|    return calledByBackgroundThread() || inGC();
  ------------------
  |  Branch (322:12): [True: 0, False: 1.14M]
  |  Branch (322:42): [True: 1.14M, False: 0]
  ------------------
  323|  1.14M|  }
_ZN6hermes2vm7HadesGC11HeapSegmentC2ENS0_14AlignedStorageE:
  360|    320|        : AlignedHeapSegment(std::move(storage)) {}
_ZN6hermes2vm7HadesGC6OldGen20creditExternalMemoryEj:
  433|    312|    void creditExternalMemory(uint32_t size) {
  434|    312|      assert(
  435|    312|          gc_.gcMutex_ && "OG external bytes must be accessed under gcMutex_.");
  436|    312|      externalBytes_ += size;
  437|    312|    }
_ZN6hermes2vm7HadesGC6OldGen19debitExternalMemoryEj:
  440|     74|    void debitExternalMemory(uint32_t size) {
  441|     74|      assert(
  442|     74|          externalBytes_ >= size && "Debiting more memory than was credited");
  443|     74|      assert(
  444|     74|          gc_.gcMutex_ && "OG external bytes must be accessed under gcMutex_.");
  445|     74|      externalBytes_ -= size;
  446|     74|    }
_ZN6hermes2vm7HadesGC6OldGen12FreelistCell7classofEPKNS0_6GCCellE:
  468|  17.0M|      static bool classof(const GCCell *cell) {
  469|  17.0M|        return cell->getKind() == CellKind::FreelistKind;
  470|  17.0M|      }
_ZNK6hermes2vm7HadesGC14CompacteeState8containsEPKv:
  779|  15.9M|    bool contains(const void *p) const {
  780|  15.9M|      return start == AlignedStorage::start(p);
  781|  15.9M|    }
_ZNK6hermes2vm7HadesGC14CompacteeState12evacContainsEPKv:
  788|  18.2M|    bool evacContains(const void *p) const {
  789|  18.2M|      return evacStart == AlignedStorage::start(p);
  790|  18.2M|    }
_ZNK6hermes2vm7HadesGC14CompacteeState10evacActiveEv:
  796|    226|    bool evacActive() const {
  797|    226|      return evacStart != reinterpret_cast<void *>(kInvalidCompacteeStart);
  798|    226|    }
_ZN6hermes2vm7HadesGC26ensureBackgroundTaskPausedEv:
  922|   551k|  LLVM_NODISCARD std::lock_guard<Mutex> ensureBackgroundTaskPaused() {
  923|   551k|    if constexpr (kConcurrentGC) {
  924|   551k|      return pauseBackgroundTask();
  925|   551k|    }
  926|      0|    return std::lock_guard(gcMutex_);
  927|   551k|  }
_ZN6hermes2vm7HadesGC5makeAINS0_11BoxedDoubleELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_jDpOT3_:
 1083|   818k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|   818k|  assert(
 1085|   818k|      isSizeHeapAligned(size) &&
 1086|   818k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|   818k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|   818k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|   818k|  return constructCell<T>(
 1095|   818k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|   818k|      size,
 1097|   818k|      std::forward<Args>(args)...);
 1098|   818k|}
_ZN6hermes2vm7HadesGC9allocWorkILb1ELNS0_12HasFinalizerE0EEEPvj:
 1101|  2.33M|void *HadesGC::allocWork(uint32_t sz) {
 1102|  2.33M|  assert(
 1103|  2.33M|      isSizeHeapAligned(sz) &&
 1104|  2.33M|      "Should be aligned before entering this function");
 1105|  2.33M|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1106|  2.33M|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1106:7): [Folded - Ignored]
  ------------------
 1107|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1108|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1109|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1110|       |    // more interesting aspect of Hades which is concurrent background
 1111|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1112|       |    // oldGenCollection if one is not already running.
 1113|      0|    youngGenCollection(
 1114|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1115|      0|  }
 1116|  2.33M|  AllocResult res = youngGen().alloc(sz);
 1117|  2.33M|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|  2.33M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 22, False: 2.33M]
  |  |  ------------------
  ------------------
 1118|  2.33M|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1118:7): [Folded - Ignored]
  ------------------
 1119|      0|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1120|  2.33M|  return resPtr;
 1121|  2.33M|}
_ZN6hermes2vm7HadesGC5makeAINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1083|  90.6k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  90.6k|  assert(
 1085|  90.6k|      isSizeHeapAligned(size) &&
 1086|  90.6k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  90.6k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  90.6k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  90.6k|  return constructCell<T>(
 1095|  90.6k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  90.6k|      size,
 1097|  90.6k|      std::forward<Args>(args)...);
 1098|  90.6k|}
_ZN6hermes2vm7HadesGC5makeAINS0_11EnvironmentELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_jDpOT3_:
 1083|    836|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    836|  assert(
 1085|    836|      isSizeHeapAligned(size) &&
 1086|    836|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    836|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    836|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    836|  return constructCell<T>(
 1095|    836|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    836|      size,
 1097|    836|      std::forward<Args>(args)...);
 1098|    836|}
_ZN6hermes2vm7HadesGC5makeAINS0_17NativeConstructorELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEERPFNSG_INS0_12PseudoHandleIS9_EELSJ_6EEES7_SA_SE_ERNS0_8CellKindEEEEPT_jDpOT3_:
 1083|  6.72k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  6.72k|  assert(
 1085|  6.72k|      isSizeHeapAligned(size) &&
 1086|  6.72k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  6.72k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  6.72k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  6.72k|  return constructCell<T>(
 1095|  6.72k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  6.72k|      size,
 1097|  6.72k|      std::forward<Args>(args)...);
 1098|  6.72k|}
_ZN6hermes2vm7HadesGC5makeAINS0_16ArrayStorageBaseINS0_11HermesValueEEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1083|    160|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    160|  assert(
 1085|    160|      isSizeHeapAligned(size) &&
 1086|    160|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    160|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    160|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    160|  return constructCell<T>(
 1095|    160|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    160|      size,
 1097|    160|      std::forward<Args>(args)...);
 1098|    160|}
_ZN6hermes2vm7HadesGC5makeAINS0_13BoundFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_jDpOT3_:
 1083|    160|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    160|  assert(
 1085|    160|      isSizeHeapAligned(size) &&
 1086|    160|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    160|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    160|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    160|  return constructCell<T>(
 1095|    160|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    160|      size,
 1097|    160|      std::forward<Args>(args)...);
 1098|    160|}
_ZN6hermes2vm7HadesGC5makeAINS0_14NativeFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEEEEEPT_jDpOT3_:
 1083|  70.5k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  70.5k|  assert(
 1085|  70.5k|      isSizeHeapAligned(size) &&
 1086|  70.5k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  70.5k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  70.5k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  70.5k|  return constructCell<T>(
 1095|  70.5k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  70.5k|      size,
 1097|  70.5k|      std::forward<Args>(args)...);
 1098|  70.5k|}
_ZN6hermes2vm7HadesGC5makeAINS0_10JSFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS8_INS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_jDpOT3_:
 1083|  6.19k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  6.19k|  assert(
 1085|  6.19k|      isSizeHeapAligned(size) &&
 1086|  6.19k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  6.19k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  6.19k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  6.19k|  return constructCell<T>(
 1095|  6.19k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  6.19k|      size,
 1097|  6.19k|      std::forward<Args>(args)...);
 1098|  6.19k|}
_ZN6hermes2vm7HadesGC5makeAINS0_6DomainELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1083|    516|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    516|  assert(
 1085|    516|      isSizeHeapAligned(size) &&
 1086|    516|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    516|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    516|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    516|  return constructCell<T>(
 1095|    516|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    516|      size,
 1097|    516|      std::forward<Args>(args)...);
 1098|    516|}
_ZN6hermes2vm7HadesGC9allocWorkILb1ELNS0_12HasFinalizerE1EEEPvj:
 1101|    737|void *HadesGC::allocWork(uint32_t sz) {
 1102|    737|  assert(
 1103|    737|      isSizeHeapAligned(sz) &&
 1104|    737|      "Should be aligned before entering this function");
 1105|    737|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1106|    737|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1106:7): [Folded - Ignored]
  ------------------
 1107|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1108|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1109|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1110|       |    // more interesting aspect of Hades which is concurrent background
 1111|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1112|       |    // oldGenCollection if one is not already running.
 1113|      0|    youngGenCollection(
 1114|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1115|      0|  }
 1116|    737|  AllocResult res = youngGen().alloc(sz);
 1117|    737|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|    737|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 10, False: 727]
  |  |  ------------------
  ------------------
 1118|    737|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1118:7): [Folded - Ignored]
  ------------------
 1119|    737|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1120|    737|  return resPtr;
 1121|    737|}
_ZN6hermes2vm7HadesGC5makeAINS0_11HiddenClassELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_jDpOT3_:
 1083|  94.2k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  94.2k|  assert(
 1085|  94.2k|      isSizeHeapAligned(size) &&
 1086|  94.2k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  94.2k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  94.2k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|  94.2k|    auto lk = ensureBackgroundTaskPaused();
 1090|  94.2k|    return constructCell<T>(
 1091|  94.2k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|  94.2k|  }
 1093|       |
 1094|      0|  return constructCell<T>(
 1095|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      0|      size,
 1097|      0|      std::forward<Args>(args)...);
 1098|  94.2k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT3_:
 1083|   415k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|   415k|  assert(
 1085|   415k|      isSizeHeapAligned(size) &&
 1086|   415k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|   415k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|   415k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|   415k|    auto lk = ensureBackgroundTaskPaused();
 1090|   415k|    return constructCell<T>(
 1091|   415k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|   415k|  }
 1093|       |
 1094|      0|  return constructCell<T>(
 1095|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      0|      size,
 1097|      0|      std::forward<Args>(args)...);
 1098|   415k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT3_:
 1083|    216|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    216|  assert(
 1085|    216|      isSizeHeapAligned(size) &&
 1086|    216|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    216|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    216|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|    216|    auto lk = ensureBackgroundTaskPaused();
 1090|    216|    return constructCell<T>(
 1091|    216|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|    216|  }
 1093|       |
 1094|      0|  return constructCell<T>(
 1095|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      0|      size,
 1097|      0|      std::forward<Args>(args)...);
 1098|    216|}
_ZN6hermes2vm7HadesGC5makeAINS0_7JSArrayELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
 1083|  1.05M|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  1.05M|  assert(
 1085|  1.05M|      isSizeHeapAligned(size) &&
 1086|  1.05M|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  1.05M|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  1.05M|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  1.05M|  return constructCell<T>(
 1095|  1.05M|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  1.05M|      size,
 1097|  1.05M|      std::forward<Args>(args)...);
 1098|  1.05M|}
_ZN6hermes2vm7HadesGC5makeAINS0_7JSErrorELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERbEEEPT_jDpOT3_:
 1083|     53|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|     53|  assert(
 1085|     53|      isSizeHeapAligned(size) &&
 1086|     53|      "Call to makeA must use a size aligned to HeapAlign");
 1087|     53|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|     53|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|     53|  return constructCell<T>(
 1095|     53|      allocWork<fixedSize, hasFinalizer>(size),
 1096|     53|      size,
 1097|     53|      std::forward<Args>(args)...);
 1098|     53|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSObjectELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EENS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
 1083|   364k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|   364k|  assert(
 1085|   364k|      isSizeHeapAligned(size) &&
 1086|   364k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|   364k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|   364k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|   364k|  return constructCell<T>(
 1095|   364k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|   364k|      size,
 1097|   364k|      std::forward<Args>(args)...);
 1098|   364k|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSRegExpELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1083|      8|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|      8|  assert(
 1085|      8|      isSizeHeapAligned(size) &&
 1086|      8|      "Call to makeA must use a size aligned to HeapAlign");
 1087|      8|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|      8|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|      8|  return constructCell<T>(
 1095|      8|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      8|      size,
 1097|      8|      std::forward<Args>(args)...);
 1098|      8|}
_ZN6hermes2vm7HadesGC5makeAINS0_10HostObjectELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSE_14default_deleteISG_EEEEEEEPT_jDpOT3_:
 1083|    160|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    160|  assert(
 1085|    160|      isSizeHeapAligned(size) &&
 1086|    160|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    160|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    160|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    160|  return constructCell<T>(
 1095|    160|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    160|      size,
 1097|    160|      std::forward<Args>(args)...);
 1098|    160|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSStringELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS8_INS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1083|    175|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    175|  assert(
 1085|    175|      isSizeHeapAligned(size) &&
 1086|    175|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    175|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    175|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    175|  return constructCell<T>(
 1095|    175|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    175|      size,
 1097|    175|      std::forward<Args>(args)...);
 1098|    175|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSNumberELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1083|    161|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    161|  assert(
 1085|    161|      isSizeHeapAligned(size) &&
 1086|    161|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    161|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    161|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    161|  return constructCell<T>(
 1095|    161|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    161|      size,
 1097|    161|      std::forward<Args>(args)...);
 1098|    161|}
_ZN6hermes2vm7HadesGC5makeAINS0_9JSBooleanELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1083|    160|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    160|  assert(
 1085|    160|      isSizeHeapAligned(size) &&
 1086|    160|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    160|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    160|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    160|  return constructCell<T>(
 1095|    160|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    160|      size,
 1097|    160|      std::forward<Args>(args)...);
 1098|    160|}
_ZN6hermes2vm7HadesGC5makeAINS0_16PropertyAccessorELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEESB_EEEPT_jDpOT3_:
 1083|  7.36k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  7.36k|  assert(
 1085|  7.36k|      isSizeHeapAligned(size) &&
 1086|  7.36k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  7.36k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  7.36k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  7.36k|  return constructCell<T>(
 1095|  7.36k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  7.36k|      size,
 1097|  7.36k|      std::forward<Args>(args)...);
 1098|  7.36k|}
_ZN6hermes2vm7HadesGC5makeAINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1083|    799|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    799|  assert(
 1085|    799|      isSizeHeapAligned(size) &&
 1086|    799|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    799|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    799|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    799|  return constructCell<T>(
 1095|    799|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    799|      size,
 1097|    799|      std::forward<Args>(args)...);
 1098|    799|}
_ZN6hermes2vm7HadesGC5makeAINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1083|    153|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    153|  assert(
 1085|    153|      isSizeHeapAligned(size) &&
 1086|    153|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    153|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    153|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    153|  return constructCell<T>(
 1095|    153|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    153|      size,
 1097|    153|      std::forward<Args>(args)...);
 1098|    153|}
_ZN6hermes2vm7HadesGC5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1083|  2.23k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  2.23k|  assert(
 1085|  2.23k|      isSizeHeapAligned(size) &&
 1086|  2.23k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  2.23k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  2.23k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  2.23k|  return constructCell<T>(
 1095|  2.23k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  2.23k|      size,
 1097|  2.23k|      std::forward<Args>(args)...);
 1098|  2.23k|}
_ZN6hermes2vm7HadesGC5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1083|   663k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|   663k|  assert(
 1085|   663k|      isSizeHeapAligned(size) &&
 1086|   663k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|   663k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|   663k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|   663k|  return constructCell<T>(
 1095|   663k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|   663k|      size,
 1097|   663k|      std::forward<Args>(args)...);
 1098|   663k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
 1083|      3|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|      3|  assert(
 1085|      3|      isSizeHeapAligned(size) &&
 1086|      3|      "Call to makeA must use a size aligned to HeapAlign");
 1087|      3|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|      3|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|      3|  return constructCell<T>(
 1095|      3|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      3|      size,
 1097|      3|      std::forward<Args>(args)...);
 1098|      3|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
 1083|  20.4k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  20.4k|  assert(
 1085|  20.4k|      isSizeHeapAligned(size) &&
 1086|  20.4k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  20.4k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  20.4k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|  20.4k|    auto lk = ensureBackgroundTaskPaused();
 1090|  20.4k|    return constructCell<T>(
 1091|  20.4k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|  20.4k|  }
 1093|       |
 1094|      0|  return constructCell<T>(
 1095|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      0|      size,
 1097|      0|      std::forward<Args>(args)...);
 1098|  20.4k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
 1083|   390k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|   390k|  assert(
 1085|   390k|      isSizeHeapAligned(size) &&
 1086|   390k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|   390k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|   390k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|   390k|  return constructCell<T>(
 1095|   390k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|   390k|      size,
 1097|   390k|      std::forward<Args>(args)...);
 1098|   390k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
 1083|  2.10M|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  2.10M|  assert(
 1085|  2.10M|      isSizeHeapAligned(size) &&
 1086|  2.10M|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  2.10M|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  2.10M|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  2.10M|  return constructCell<T>(
 1095|  2.10M|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  2.10M|      size,
 1097|  2.10M|      std::forward<Args>(args)...);
 1098|  2.10M|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
 1083|  20.4k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  20.4k|  assert(
 1085|  20.4k|      isSizeHeapAligned(size) &&
 1086|  20.4k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  20.4k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  20.4k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|  20.4k|    auto lk = ensureBackgroundTaskPaused();
 1090|  20.4k|    return constructCell<T>(
 1091|  20.4k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|  20.4k|  }
 1093|       |
 1094|      0|  return constructCell<T>(
 1095|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      0|      size,
 1097|      0|      std::forward<Args>(args)...);
 1098|  20.4k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
 1083|  1.95M|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|  1.95M|  assert(
 1085|  1.95M|      isSizeHeapAligned(size) &&
 1086|  1.95M|      "Call to makeA must use a size aligned to HeapAlign");
 1087|  1.95M|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|  1.95M|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|  1.95M|  return constructCell<T>(
 1095|  1.95M|      allocWork<fixedSize, hasFinalizer>(size),
 1096|  1.95M|      size,
 1097|  1.95M|      std::forward<Args>(args)...);
 1098|  1.95M|}
_ZN6hermes2vm7HadesGC5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
 1083|     11|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|     11|  assert(
 1085|     11|      isSizeHeapAligned(size) &&
 1086|     11|      "Call to makeA must use a size aligned to HeapAlign");
 1087|     11|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|     11|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|     11|    auto lk = ensureBackgroundTaskPaused();
 1090|     11|    return constructCell<T>(
 1091|     11|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|     11|  }
 1093|       |
 1094|      0|  return constructCell<T>(
 1095|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      0|      size,
 1097|      0|      std::forward<Args>(args)...);
 1098|     11|}
_ZN6hermes2vm7HadesGC5makeAINS0_23ExternalStringPrimitiveIcEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT3_:
 1083|     28|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|     28|  assert(
 1085|     28|      isSizeHeapAligned(size) &&
 1086|     28|      "Call to makeA must use a size aligned to HeapAlign");
 1087|     28|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|     28|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|     28|    auto lk = ensureBackgroundTaskPaused();
 1090|     28|    return constructCell<T>(
 1091|     28|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|     28|  }
 1093|       |
 1094|      0|  return constructCell<T>(
 1095|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1096|      0|      size,
 1097|      0|      std::forward<Args>(args)...);
 1098|     28|}
_ZN6hermes2vm7HadesGC9allocWorkILb0ELNS0_12HasFinalizerE1EEEPvj:
 1101|    252|void *HadesGC::allocWork(uint32_t sz) {
 1102|    252|  assert(
 1103|    252|      isSizeHeapAligned(sz) &&
 1104|    252|      "Should be aligned before entering this function");
 1105|    252|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1106|    252|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1106:7): [Folded - Ignored]
  ------------------
 1107|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1108|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1109|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1110|       |    // more interesting aspect of Hades which is concurrent background
 1111|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1112|       |    // oldGenCollection if one is not already running.
 1113|      0|    youngGenCollection(
 1114|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1115|      0|  }
 1116|    252|  AllocResult res = youngGen().alloc(sz);
 1117|    252|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|    252|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 14, False: 238]
  |  |  ------------------
  ------------------
 1118|    252|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1118:7): [Folded - Ignored]
  ------------------
 1119|    252|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1120|    252|  return resPtr;
 1121|    252|}
_ZN6hermes2vm7HadesGC5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
 1083|    252|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    252|  assert(
 1085|    252|      isSizeHeapAligned(size) &&
 1086|    252|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    252|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    252|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    252|  return constructCell<T>(
 1095|    252|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    252|      size,
 1097|    252|      std::forward<Args>(args)...);
 1098|    252|}
_ZN6hermes2vm7HadesGC5makeAINS0_23BufferedStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT3_:
 1083|     31|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|     31|  assert(
 1085|     31|      isSizeHeapAligned(size) &&
 1086|     31|      "Call to makeA must use a size aligned to HeapAlign");
 1087|     31|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|     31|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|     31|  return constructCell<T>(
 1095|     31|      allocWork<fixedSize, hasFinalizer>(size),
 1096|     31|      size,
 1097|     31|      std::forward<Args>(args)...);
 1098|     31|}
_ZN6hermes2vm7HadesGC5makeAINS0_12SingleObjectILNS0_8CellKindE60EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1083|    160|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    160|  assert(
 1085|    160|      isSizeHeapAligned(size) &&
 1086|    160|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    160|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    160|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    160|  return constructCell<T>(
 1095|    160|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    160|      size,
 1097|    160|      std::forward<Args>(args)...);
 1098|    160|}
_ZN6hermes2vm7HadesGC5makeAINS0_12SingleObjectILNS0_8CellKindE59EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1083|    160|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    160|  assert(
 1085|    160|      isSizeHeapAligned(size) &&
 1086|    160|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    160|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    160|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    160|  return constructCell<T>(
 1095|    160|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    160|      size,
 1097|    160|      std::forward<Args>(args)...);
 1098|    160|}
_ZN6hermes2vm7HadesGC11HeapSegmentC2Ev:
  361|    160|    HeapSegment() = default;
_ZN6hermes2vm7HadesGC5makeAINS0_15DictPropertyMapELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT3_:
 1083|   209k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|   209k|  assert(
 1085|   209k|      isSizeHeapAligned(size) &&
 1086|   209k|      "Call to makeA must use a size aligned to HeapAlign");
 1087|   209k|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|   209k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|   209k|  return constructCell<T>(
 1095|   209k|      allocWork<fixedSize, hasFinalizer>(size),
 1096|   209k|      size,
 1097|   209k|      std::forward<Args>(args)...);
 1098|   209k|}
_ZN6hermes2vm7HadesGC5makeAINS0_14OrderedHashMapELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_jDpOT3_:
 1083|    160|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1084|    160|  assert(
 1085|    160|      isSizeHeapAligned(size) &&
 1086|    160|      "Call to makeA must use a size aligned to HeapAlign");
 1087|    160|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1088|    160|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1088:7): [Folded - Ignored]
  ------------------
 1089|      0|    auto lk = ensureBackgroundTaskPaused();
 1090|      0|    return constructCell<T>(
 1091|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1092|      0|  }
 1093|       |
 1094|    160|  return constructCell<T>(
 1095|    160|      allocWork<fixedSize, hasFinalizer>(size),
 1096|    160|      size,
 1097|    160|      std::forward<Args>(args)...);
 1098|    160|}

_ZN6hermes2vm10HandleBaseD2Ev:
   54|   258M|inline HandleBase::~HandleBase() {
   55|   258M|  if (gcScope_) {
  ------------------
  |  Branch (55:7): [True: 186M, False: 71.5M]
  ------------------
   56|   186M|    --gcScope_->numActiveHandles_;
   57|   186M|  }
   58|   258M|}
_ZN6hermes2vm10HandleBaseC2ERKS1_:
   45|   190M|inline HandleBase::HandleBase(const HandleBase &sc) : handle_(sc.handle_) {
   46|   190M|  gcScope_ = sc.gcScope_;
   47|   190M|  if (gcScope_) {
  ------------------
  |  Branch (47:7): [True: 143M, False: 46.4M]
  ------------------
   48|   143M|    ++gcScope_->numActiveHandles_;
   49|   143M|  }
   50|   190M|}
_ZN6hermes2vm10HandleBaseC2ERNS0_15HandleRootOwnerENS0_11HermesValueE:
   37|  43.1M|    : handle_(runtime.newPinnedHermesValue(value)) {
   38|  43.1M|#ifndef NDEBUG
   39|  43.1M|  gcScope_ = runtime.getTopGCScope();
   40|  43.1M|  ++gcScope_->numActiveHandles_;
   41|  43.1M|#endif
   42|  43.1M|}
_ZN6hermes2vm6HandleINS0_8JSObjectEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|     52|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|     52|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 52, False: 0]
  ------------------
   75|     52|      ? Handle<T>(other, true)
   76|     52|      : HandleRootOwner::makeNullHandle<T>();
   77|     52|}
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|    105|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|    105|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 53, False: 52]
  ------------------
   75|    105|      ? Handle<T>(other, true)
   76|    105|      : HandleRootOwner::makeNullHandle<T>();
   77|    105|}
_ZN6hermes2vm10HandleBaseaSERKS1_:
   62|  1.83M|inline HandleBase &HandleBase::operator=(const HandleBase &other) {
   63|  1.83M|  if (gcScope_)
  ------------------
  |  Branch (63:7): [True: 1.83M, False: 372]
  ------------------
   64|  1.83M|    --gcScope_->numActiveHandles_;
   65|  1.83M|  if ((gcScope_ = other.gcScope_) != nullptr)
  ------------------
  |  Branch (65:7): [True: 1.83M, False: 0]
  ------------------
   66|  1.83M|    ++gcScope_->numActiveHandles_;
   67|  1.83M|  handle_ = other.handle_;
   68|  1.83M|  return *this;
   69|  1.83M|}
_ZN6hermes2vm6HandleINS0_10JSFunctionEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|    454|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|    454|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 454, False: 0]
  ------------------
   75|    454|      ? Handle<T>(other, true)
   76|    454|      : HandleRootOwner::makeNullHandle<T>();
   77|    454|}
_ZN6hermes2vm6HandleINS0_8CallableEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|  2.66M|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|  2.66M|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 2.66M, False: 52]
  ------------------
   75|  2.66M|      ? Handle<T>(other, true)
   76|  2.66M|      : HandleRootOwner::makeNullHandle<T>();
   77|  2.66M|}
_ZN6hermes2vm6HandleINS0_7JSArrayEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|  1.53M|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|  1.53M|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 1.53M, False: 0]
  ------------------
   75|  1.53M|      ? Handle<T>(other, true)
   76|  1.53M|      : HandleRootOwner::makeNullHandle<T>();
   77|  1.53M|}
_ZN6hermes2vm6HandleINS0_8JSRegExpEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|      2|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|      2|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 1, False: 1]
  ------------------
   75|      2|      ? Handle<T>(other, true)
   76|      2|      : HandleRootOwner::makeNullHandle<T>();
   77|      2|}

_ZN6hermes2vm6HandleINS0_11HermesValueEEC2EPKNS0_17PinnedHermesValueE:
  324|  8.25M|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {
  325|  8.25M|    static_assert(
  326|  8.25M|        std::is_same<value_type, HermesValue>::value,
  327|  8.25M|        "This constructor can only be used for Handle<HermesValue>");
  328|  8.25M|  }
_ZN6hermes2vm10HandleBaseC2EPKNS0_17PinnedHermesValueE:
  214|  15.6M|      : handle_(const_cast<PinnedHermesValue *>(valueAddr)) {
  215|  15.6M|#ifndef NDEBUG
  216|  15.6M|    gcScope_ = nullptr;
  217|  15.6M|#endif
  218|  15.6M|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEEC2ERKS3_:
  337|  13.9k|  Handle(const Handle<T> &) = default;
_ZNK6hermes2vm10HandleBase14getHermesValueEv:
  248|   116M|  HermesValue getHermesValue() const {
  249|   116M|    return *handleRef();
  250|   116M|  }
_ZNK6hermes2vm10HandleBase9handleRefEv:
  198|   365M|  const PinnedHermesValue *handleRef() const {
  199|   365M|#ifdef HERMES_SLOW_DEBUG
  200|   365M|    assert(!handle_->isInvalid() && "Reading from flushed handle");
  201|   365M|#endif
  202|   365M|    return handle_;
  203|   365M|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  13.4M|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEEdeEv:
  372|  9.01M|  value_type operator*() const {
  373|  9.01M|    return get();
  374|  9.01M|  }
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEE3getEv:
  358|  10.5M|  value_type get() const {
  359|  10.5M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  10.5M|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2ERKS3_:
  337|  19.4M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    320|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    320|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    320|    return Handle<T>(valueAddr, true);
  392|    320|  }
_ZN6hermes2vm15HermesValueCastINS0_15StringPrimitiveELb1EE11assertValidENS0_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_15StringPrimitiveEEC2EPKNS0_17PinnedHermesValueEb:
  305|  58.4k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm18createPseudoHandleINS0_11HiddenClassEEENS0_12PseudoHandleIT_EEPS4_:
  503|  13.7M|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  13.7M|  return PseudoHandle<T>::create(ptr);
  505|  13.7M|}
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEE6createEPS2_:
  155|  13.7M|  static PseudoHandle<T> create(value_type value) {
  156|  13.7M|    return PseudoHandle<T>(value);
  157|  13.7M|  }
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEEC2EPS2_:
   67|  13.7M|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2ERKS3_:
  337|  70.7M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2ERKS3_:
  337|  53.9M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2ERKS5_:
  337|   842k|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_7JSArrayEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    320|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    320|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    320|    return Handle<T>(valueAddr, true);
  392|    320|  }
_ZN6hermes2vm15HermesValueCastINS0_7JSArrayELb1EE11assertValidENS0_11HermesValueE:
  275|  1.49M|  static void assertValid(HermesValue x) {
  276|  1.49M|#ifndef NDEBUG
  277|  1.49M|    (void)vmcast<T>(x);
  278|  1.49M|#endif
  279|  1.49M|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2EPKNS0_17PinnedHermesValueEb:
  305|    320|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2ERNS0_15HandleRootOwnerES2_:
  317|  8.46M|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm6HandleINS0_8CallableEEptEv:
  368|  4.54M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  4.54M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  4.54M|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2ERKS3_:
  337|  8.01M|  Handle(const Handle<T> &) = default;
_ZNK6hermes2vm6HandleINS0_8JSObjectEEptEv:
  368|  97.9M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  97.9M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  97.9M|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEE3getEv:
  126|  1.00M|  value_type get() const {
  127|  1.00M|    assert(valid_ && "Pseudo handle has been invalidated");
  128|  1.00M|    return value_;
  129|  1.00M|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  10.0M|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEE10invalidateEv:
  120|  1.34k|  void invalidate() {
  121|  1.34k|#ifndef NDEBUG
  122|  1.34k|    valid_ = false;
  123|  1.34k|#endif
  124|  1.34k|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEEC2ENS0_6HandleIS2_EE:
   91|   272k|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZNK6hermes2vm12PseudoHandleINS0_11HermesValueEE3getEv:
  126|  7.51M|  value_type get() const {
  127|  7.51M|    assert(valid_ && "Pseudo handle has been invalidated");
  128|  7.51M|    return value_;
  129|  7.51M|  }
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_8JSObjectEvEERKNS1_IT_EE:
  335|  9.83M|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_8JSObjectEEdeEv:
  372|  17.7M|  value_type operator*() const {
  373|  17.7M|    return get();
  374|  17.7M|  }
_ZNK6hermes2vm6HandleINS0_8JSObjectEE3getEv:
  358|  32.9M|  value_type get() const {
  359|  32.9M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  32.9M|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|  4.93M|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|  4.93M|    HermesValueCast<T>::assertValid(*valueAddr);
  391|  4.93M|    return Handle<T>(valueAddr, true);
  392|  4.93M|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSObjectELb1EE11assertValidENS0_11HermesValueE:
  275|  6.07M|  static void assertValid(HermesValue x) {
  276|  6.07M|#ifndef NDEBUG
  277|  6.07M|    (void)vmcast<T>(x);
  278|  6.07M|#endif
  279|  6.07M|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2EPKNS0_17PinnedHermesValueEb:
  305|  5.00M|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_11EnvironmentEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|    361|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|    361|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|    361|    return Handle<T>(valueAddr, true);
  399|    361|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEEC2EPKNS0_17PinnedHermesValueEb:
  305|  6.20k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_7JSArrayEvEERKNS1_IT_EE:
  335|   953k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_8CallableEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|  1.20k|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|  1.20k|    HermesValueCast<T>::assertValid(*valueAddr);
  391|  1.20k|    return Handle<T>(valueAddr, true);
  392|  1.20k|  }
_ZN6hermes2vm15HermesValueCastINS0_8CallableELb1EE11assertValidENS0_11HermesValueE:
  275|  1.65k|  static void assertValid(HermesValue x) {
  276|  1.65k|#ifndef NDEBUG
  277|  1.65k|    (void)vmcast<T>(x);
  278|  1.65k|#endif
  279|  1.65k|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2EPKNS0_17PinnedHermesValueEb:
  305|  1.25k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZNK6hermes2vm6HandleINS0_8CallableEE3getEv:
  358|  2.68M|  value_type get() const {
  359|  2.68M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  2.68M|  }
_ZNK6hermes2vm10HandleBase26unsafeGetPinnedHermesValueEv:
  256|  16.2M|  const PinnedHermesValue *unsafeGetPinnedHermesValue() const {
  257|       |    // Don't call handleRef() because it creates HermesValues in debug mode.
  258|  16.2M|    return handle_;
  259|  16.2M|  }
_ZN6hermes2vm18createPseudoHandleINS0_15StringPrimitiveEEENS0_12PseudoHandleIT_EEPS4_:
  503|  7.28M|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  7.28M|  return PseudoHandle<T>::create(ptr);
  505|  7.28M|}
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE6createEPS2_:
  155|  7.28M|  static PseudoHandle<T> create(value_type value) {
  156|  7.28M|    return PseudoHandle<T>(value);
  157|  7.28M|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEC2EPS2_:
   67|  7.28M|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm15HermesValueCastINS0_8SymbolIDELb0EE11assertValidENS0_11HermesValueE:
  286|  1.13M|  static void assertValid(HermesValue x) {
  287|  1.13M|#ifndef NDEBUG
  288|  1.13M|    (void)HermesValueTraits<T>::decode(x);
  289|  1.13M|#endif
  290|  1.13M|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEE14getHermesValueEv:
  142|   363k|  HermesValue getHermesValue() const {
  143|   363k|    assert(valid_ && "Pseudo handle has been invalidated");
  144|   363k|    return traits_type::encode(value_);
  145|   363k|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2ERKS3_:
  337|  1.98M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm13MutableHandleINS0_8SymbolIDEEC2ERNS0_15HandleRootOwnerES2_:
  450|  3.64M|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2ERNS0_15HandleRootOwnerES2_:
  317|  7.00M|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm13MutableHandleINS0_8SymbolIDEEaSES2_:
  466|   390k|  MutableHandle &operator=(value_type value) {
  467|   390k|    set(value);
  468|   390k|    return *this;
  469|   390k|  }
_ZN6hermes2vm13MutableHandleINS0_8SymbolIDEE3setES2_:
  475|   390k|  void set(value_type value) {
  476|   390k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|   390k|  }
_ZN6hermes2vm10HandleBase9handleRefEv:
  192|  17.9M|  PinnedHermesValue *&handleRef() {
  193|  17.9M|#ifdef HERMES_SLOW_DEBUG
  194|  17.9M|    assert(!handle_->isInvalid() && "Reading from flushed handle");
  195|  17.9M|#endif
  196|  17.9M|    return handle_;
  197|  17.9M|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_9ArrayImplEvEERKNS1_IT_EE:
  335|  1.58M|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_9ArrayImplEEC2INS0_7JSArrayEvEERKNS1_IT_EE:
  335|  1.58M|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_8SymbolIDEvEERKNS1_IT_EE:
  335|  1.13M|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2EOS3_:
  338|  1.05M|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm10HandleBaseC2EOS1_:
  229|  9.42M|  HandleBase(HandleBase &&sc) : handle_(sc.handle_) {
  230|  9.42M|    gcScope_ = sc.gcScope_;
  231|  9.42M|    sc.gcScope_ = nullptr;
  232|  9.42M|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2ERKNS0_10HandleBaseEb:
  307|  1.13M|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|  71.0k|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|  71.0k|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|  71.0k|    return Handle<T>(valueAddr, true);
  399|  71.0k|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEE14unsafeGetValueEv:
  150|  2.01k|  value_type unsafeGetValue() const {
  151|  2.01k|    return value_;
  152|  2.01k|  }
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_15StringPrimitiveEvEERKNS1_IT_EE:
  335|   826k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEptEv:
  368|  4.20M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  4.20M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  4.20M|  }
_ZNK6hermes2vm6HandleINS0_7JSArrayEEdeEv:
  372|  4.92M|  value_type operator*() const {
  373|  4.92M|    return get();
  374|  4.92M|  }
_ZNK6hermes2vm6HandleINS0_7JSArrayEE3getEv:
  358|  5.97M|  value_type get() const {
  359|  5.97M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  5.97M|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2ERKNS0_10HandleBaseEb:
  307|  1.13M|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|  58.1k|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|  58.1k|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|  58.1k|    return Handle<T>(valueAddr, true);
  399|  58.1k|  }
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEEcvbEv:
  364|  4.49M|  explicit operator bool() const {
  365|  4.49M|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 4.49M, False: 0]
  |  Branch (365:40): [True: 4.37M, False: 116k]
  ------------------
  366|  4.49M|  }
_ZNK6hermes2vm6HandleINS0_8JSObjectEEcvbEv:
  364|  9.16M|  explicit operator bool() const {
  365|  9.16M|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 9.16M, False: 0]
  |  Branch (365:40): [True: 5.37M, False: 3.79M]
  ------------------
  366|  9.16M|  }
_ZN6hermes2vm18createPseudoHandleENS0_11HermesValueE:
  508|  10.0M|inline PseudoHandle<> createPseudoHandle(HermesValue value) {
  509|  10.0M|  return PseudoHandle<>::create(value);
  510|  10.0M|}
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEE6createES2_:
  155|  11.1M|  static PseudoHandle<T> create(value_type value) {
  156|  11.1M|    return PseudoHandle<T>(value);
  157|  11.1M|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HermesValueEE14getHermesValueEv:
  142|  3.05M|  HermesValue getHermesValue() const {
  143|  3.05M|    assert(valid_ && "Pseudo handle has been invalidated");
  144|  3.05M|    return traits_type::encode(value_);
  145|  3.05M|  }
_ZNK6hermes2vm6HandleINS0_11HiddenClassEEdeEv:
  372|  3.32M|  value_type operator*() const {
  373|  3.32M|    return get();
  374|  3.32M|  }
_ZNK6hermes2vm6HandleINS0_11HiddenClassEE3getEv:
  358|  3.32M|  value_type get() const {
  359|  3.32M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  3.32M|  }
_ZNK6hermes2vm6HandleINS0_11HermesValueEEptEv:
  368|  62.6M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  62.6M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  62.6M|  }
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE14unsafeGetValueEv:
  150|  14.5M|  value_type unsafeGetValue() const {
  151|  14.5M|    return value_;
  152|  14.5M|  }
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE3getEv:
  126|  6.10M|  value_type get() const {
  127|  6.10M|    assert(valid_ && "Pseudo handle has been invalidated");
  128|  6.10M|    return value_;
  129|  6.10M|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE10invalidateEv:
  120|  5.63M|  void invalidate() {
  121|  5.63M|#ifndef NDEBUG
  122|  5.63M|    valid_ = false;
  123|  5.63M|#endif
  124|  5.63M|  }
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEEptEv:
  368|  27.9M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  27.9M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  27.9M|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEEptEv:
  131|   271k|  arrow_type operator->() const {
  132|   271k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|   271k|    return traits_type::arrow(value_);
  134|   271k|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEE6createEPS2_:
  155|  1.09M|  static PseudoHandle<T> create(value_type value) {
  156|  1.09M|    return PseudoHandle<T>(value);
  157|  1.09M|  }
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEE10invalidateEv:
  120|  4.17M|  void invalidate() {
  121|  4.17M|#ifndef NDEBUG
  122|  4.17M|    valid_ = false;
  123|  4.17M|#endif
  124|  4.17M|  }
_ZNK6hermes2vm6HandleINS0_11HermesValueEE3getEv:
  358|  33.8M|  value_type get() const {
  359|  33.8M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  33.8M|  }
_ZNK6hermes2vm6HandleINS0_6DomainEEptEv:
  368|    597|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    597|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    597|  }
_ZN6hermes2vm18createPseudoHandleINS0_8JSObjectEEENS0_12PseudoHandleIT_EEPS4_:
  503|  1.09M|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  1.09M|  return PseudoHandle<T>::create(ptr);
  505|  1.09M|}
_ZN6hermes2vm6HandleINS0_11HiddenClassEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|  1.50M|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|  1.50M|    HermesValueCast<T>::assertValid(*valueAddr);
  391|  1.50M|    return Handle<T>(valueAddr, true);
  392|  1.50M|  }
_ZN6hermes2vm15HermesValueCastINS0_11HiddenClassELb1EE11assertValidENS0_11HermesValueE:
  275|  1.50M|  static void assertValid(HermesValue x) {
  276|  1.50M|#ifndef NDEBUG
  277|  1.50M|    (void)vmcast<T>(x);
  278|  1.50M|#endif
  279|  1.50M|  }
_ZNK6hermes2vm6HandleINS0_11EnvironmentEE3getEv:
  358|  7.03k|  value_type get() const {
  359|  7.03k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  7.03k|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HermesValueEEptEv:
  131|  1.76M|  arrow_type operator->() const {
  132|  1.76M|    assert(valid_ && "Pseudo handle has been invalidated");
  133|  1.76M|    return traits_type::arrow(value_);
  134|  1.76M|  }
_ZNK6hermes2vm6HandleINS0_11HermesValueEEdeEv:
  372|  20.1M|  value_type operator*() const {
  373|  20.1M|    return get();
  374|  20.1M|  }
_ZNK6hermes2vm6HandleINS0_11EnvironmentEEdeEv:
  372|  6.19k|  value_type operator*() const {
  373|  6.19k|    return get();
  374|  6.19k|  }
_ZNK6hermes2vm6HandleINS0_8CallableEEdeEv:
  372|  22.2k|  value_type operator*() const {
  373|  22.2k|    return get();
  374|  22.2k|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEdeEv:
  372|    160|  value_type operator*() const {
  373|    160|    return get();
  374|    160|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEE3getEv:
  358|    320|  value_type get() const {
  359|    320|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    320|  }
_ZN6hermes2vm18createPseudoHandleINS0_17NativeConstructorEEENS0_12PseudoHandleIT_EEPS4_:
  503|  6.72k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  6.72k|  return PseudoHandle<T>::create(ptr);
  505|  6.72k|}
_ZN6hermes2vm12PseudoHandleINS0_17NativeConstructorEE6createEPS2_:
  155|  6.72k|  static PseudoHandle<T> create(value_type value) {
  156|  6.72k|    return PseudoHandle<T>(value);
  157|  6.72k|  }
_ZNK6hermes2vm6HandleINS0_6DomainEEdeEv:
  372|  6.79k|  value_type operator*() const {
  373|  6.79k|    return get();
  374|  6.79k|  }
_ZNK6hermes2vm6HandleINS0_6DomainEE3getEv:
  358|  6.79k|  value_type get() const {
  359|  6.79k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  6.79k|  }
_ZNK6hermes2vm12PseudoHandleINS0_6DomainEE3getEv:
  126|    356|  value_type get() const {
  127|    356|    assert(valid_ && "Pseudo handle has been invalidated");
  128|    356|    return value_;
  129|    356|  }
_ZN6hermes2vm12PseudoHandleINS0_6DomainEE10invalidateEv:
  120|    356|  void invalidate() {
  121|    356|#ifndef NDEBUG
  122|    356|    valid_ = false;
  123|    356|#endif
  124|    356|  }
_ZN6hermes2vm6HandleINS0_15BigIntPrimitiveEEC2ERKS3_:
  337|      2|  Handle(const Handle<T> &) = default;
_ZNK6hermes2vm12PseudoHandleINS0_15BigIntPrimitiveEEptEv:
  131|   781k|  arrow_type operator->() const {
  132|   781k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|   781k|    return traits_type::arrow(value_);
  134|   781k|  }
_ZNK6hermes2vm6HandleINS0_15BigIntPrimitiveEEptEv:
  368|      3|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|      3|    return HermesValueTraits<T>::arrow(*handleRef());
  370|      3|  }
_ZNK6hermes2vm6HandleINS0_15BigIntPrimitiveEEdeEv:
  372|   781k|  value_type operator*() const {
  373|   781k|    return get();
  374|   781k|  }
_ZNK6hermes2vm6HandleINS0_15BigIntPrimitiveEE3getEv:
  358|   781k|  value_type get() const {
  359|   781k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   781k|  }
_ZN6hermes2vm6HandleINS0_6DomainEEC2ERKS3_:
  337|  8.18k|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_6DomainEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  6.68k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2EPKNS0_17PinnedHermesValueEb:
  305|  1.50M|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_15BigIntPrimitiveEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|      1|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEC2Ev:
   90|    408|  constexpr PseudoHandle() : value_(traits_type::defaultValue()) {}
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEC2EOS3_:
   74|  10.9M|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|  10.9M|    hnd.valid_ = false;
   76|  10.9M|  }
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEC2ES2_:
   67|  11.1M|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEaSEOS3_:
   77|  1.78M|  PseudoHandle &operator=(PseudoHandle &&hnd) {
   78|  1.78M|    value_ = std::move(hnd.value_);
   79|  1.78M|    valid_ = hnd.valid_;
   80|  1.78M|    hnd.valid_ = false;
   81|  1.78M|    return *this;
   82|  1.78M|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEEC2EOS3_:
   74|   272k|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|   272k|    hnd.valid_ = false;
   76|   272k|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEEC2EPS2_:
   67|  1.09M|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm6HandleINS0_10JSFunctionEEC2ERKNS0_10HandleBaseEb:
  307|    454|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZNK6hermes2vm6HandleINS0_10JSFunctionEEcvbEv:
  364|    454|  explicit operator bool() const {
  365|    454|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 454, False: 0]
  |  Branch (365:40): [True: 454, False: 0]
  ------------------
  366|    454|  }
_ZNK6hermes2vm6HandleINS0_10JSFunctionEEptEv:
  368|    454|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    454|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    454|  }
_ZNK6hermes2vm6HandleINS0_10JSFunctionEEdeEv:
  372|    536|  value_type operator*() const {
  373|    536|    return get();
  374|    536|  }
_ZNK6hermes2vm6HandleINS0_10JSFunctionEE3getEv:
  358|    536|  value_type get() const {
  359|    536|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    536|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8CallableEvEERKNS1_IT_EE:
  335|   165k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_16PropertyAccessorEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    640|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    640|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    640|    return Handle<T>(valueAddr, true);
  392|    640|  }
_ZN6hermes2vm15HermesValueCastINS0_16PropertyAccessorELb1EE11assertValidENS0_11HermesValueE:
  275|    640|  static void assertValid(HermesValue x) {
  276|    640|#ifndef NDEBUG
  277|    640|    (void)vmcast<T>(x);
  278|    640|#endif
  279|    640|  }
_ZN6hermes2vm6HandleINS0_16PropertyAccessorEEC2EPKNS0_17PinnedHermesValueEb:
  305|    640|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_16PropertyAccessorEvEERKNS1_IT_EE:
  335|  8.16k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_8CallableEvEERKNS1_IT_EE:
  335|  7.33k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_9ArrayImplEEC2ERKNS0_10HandleBaseEb:
  307|   582k|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEEC2ERNS0_15HandleRootOwnerES2_:
  450|   394k|      : Handle<T>(runtime, value) {}
_ZNK6hermes2vm6HandleINS0_9ArrayImplEEptEv:
  368|   582k|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|   582k|    return HermesValueTraits<T>::arrow(*handleRef());
  370|   582k|  }
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEEaSES2_:
  466|  5.97M|  MutableHandle &operator=(value_type value) {
  467|  5.97M|    set(value);
  468|  5.97M|    return *this;
  469|  5.97M|  }
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEE3setES2_:
  475|  7.64M|  void set(value_type value) {
  476|  7.64M|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  7.64M|  }
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERNS0_15HandleRootOwnerEPS4_:
  450|    160|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|    160|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2EOS3_:
  338|    160|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2EOS3_:
  338|  1.60M|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERKS5_:
  337|    160|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_13BoundFunctionEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|    160|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8CallableEEC2INS0_13BoundFunctionEvEERKNS1_IT_EE:
  335|    160|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_8SymbolIDEEdeEv:
  372|  3.35M|  value_type operator*() const {
  373|  3.35M|    return get();
  374|  3.35M|  }
_ZNK6hermes2vm6HandleINS0_8SymbolIDEE3getEv:
  358|  3.35M|  value_type get() const {
  359|  3.35M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  3.35M|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|    390|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEE6vmcastERKNS0_10HandleBaseE:
  403|  1.13M|  static Handle<T> vmcast(const HandleBase &other) {
  404|  1.13M|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|  1.13M|    return Handle<T>(other, true);
  406|  1.13M|  }
_ZN6hermes2vm6HandleINS0_14NativeFunctionEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  85.1k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_14NativeFunctionEvEERKNS1_IT_EE:
  335|  70.7k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_8CallableEEC2INS0_14NativeFunctionEvEERKNS1_IT_EE:
  335|  85.2k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm12PseudoHandleINS0_7JSErrorEE3getEv:
  126|     53|  value_type get() const {
  127|     53|    assert(valid_ && "Pseudo handle has been invalidated");
  128|     53|    return value_;
  129|     53|  }
_ZN6hermes2vm12PseudoHandleINS0_7JSErrorEE10invalidateEv:
  120|     53|  void invalidate() {
  121|     53|#ifndef NDEBUG
  122|     53|    valid_ = false;
  123|     53|#endif
  124|     53|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8JSStringEvEERKNS1_IT_EE:
  335|  6.09k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm18createPseudoHandleINS0_10JSFunctionEEENS0_12PseudoHandleIT_EEPS4_:
  503|  6.19k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  6.19k|  return PseudoHandle<T>::create(ptr);
  505|  6.19k|}
_ZN6hermes2vm12PseudoHandleINS0_10JSFunctionEE6createEPS2_:
  155|  6.19k|  static PseudoHandle<T> create(value_type value) {
  156|  6.19k|    return PseudoHandle<T>(value);
  157|  6.19k|  }
_ZN6hermes2vm12PseudoHandleINS0_10JSFunctionEEC2EPS2_:
   67|  6.19k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm12PseudoHandleINS0_10JSFunctionEEptEv:
  131|  6.19k|  arrow_type operator->() const {
  132|  6.19k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|  6.19k|    return traits_type::arrow(value_);
  134|  6.19k|  }
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2ERKS3_:
  337|  3.78M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm18createPseudoHandleINS0_6DomainEEENS0_12PseudoHandleIT_EEPS4_:
  503|    516|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    516|  return PseudoHandle<T>::create(ptr);
  505|    516|}
_ZN6hermes2vm12PseudoHandleINS0_6DomainEE6createEPS2_:
  155|    516|  static PseudoHandle<T> create(value_type value) {
  156|    516|    return PseudoHandle<T>(value);
  157|    516|  }
_ZN6hermes2vm12PseudoHandleINS0_6DomainEEC2EPS2_:
   67|    516|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm6HandleINS0_14NativeFunctionEEdeEv:
  372|  2.56k|  value_type operator*() const {
  373|  2.56k|    return get();
  374|  2.56k|  }
_ZNK6hermes2vm6HandleINS0_14NativeFunctionEE3getEv:
  358|  9.92k|  value_type get() const {
  359|  9.92k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  9.92k|  }
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  1.79M|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_11HiddenClassEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|    396|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|    396|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|    396|    return Handle<T>(valueAddr, true);
  399|    396|  }
_ZNK6hermes2vm6HandleINS0_11HiddenClassEEptEv:
  368|  10.9M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  10.9M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  10.9M|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HiddenClassEEptEv:
  131|  27.4M|  arrow_type operator->() const {
  132|  27.4M|    assert(valid_ && "Pseudo handle has been invalidated");
  133|  27.4M|    return traits_type::arrow(value_);
  134|  27.4M|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HiddenClassEE3getEv:
  126|   192k|  value_type get() const {
  127|   192k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|   192k|    return value_;
  129|   192k|  }
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEE10invalidateEv:
  120|   192k|  void invalidate() {
  121|   192k|#ifndef NDEBUG
  122|   192k|    valid_ = false;
  123|   192k|#endif
  124|   192k|  }
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEEaSENS0_6HandleIS2_EE:
  101|   192k|  PseudoHandle &operator=(Handle<T> handle) {
  102|   192k|    value_ = *handle;
  103|   192k|#ifndef NDEBUG
  104|   192k|    valid_ = true;
  105|   192k|#endif
  106|   192k|    return *this;
  107|   192k|  }
_ZN6hermes2vm6HandleINS0_11HiddenClassEEaSERKS3_:
  350|    358|  Handle<T> &operator=(const Handle<T> &other) {
  351|    358|    HandleBase::operator=(other);
  352|    358|    return *this;
  353|    358|  }
_ZN6hermes2vm6HandleINS0_15DictPropertyMapEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|   989k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm13MutableHandleINS0_11HiddenClassEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|    160|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm13MutableHandleINS0_11HiddenClassEEaSEPS2_:
  466|  1.12k|  MutableHandle &operator=(value_type value) {
  467|  1.12k|    set(value);
  468|  1.12k|    return *this;
  469|  1.12k|  }
_ZN6hermes2vm13MutableHandleINS0_11HiddenClassEE3setEPS2_:
  475|  1.12k|  void set(value_type value) {
  476|  1.12k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  1.12k|  }
_ZNK6hermes2vm6HandleINS0_15DictPropertyMapEEptEv:
  368|    840|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    840|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    840|  }
_ZNK6hermes2vm6HandleINS0_15DictPropertyMapEEdeEv:
  372|  1.90M|  value_type operator*() const {
  373|  1.90M|    return get();
  374|  1.90M|  }
_ZNK6hermes2vm6HandleINS0_15DictPropertyMapEE3getEv:
  358|  1.90M|  value_type get() const {
  359|  1.90M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  1.90M|  }
_ZN6hermes2vm13MutableHandleINS0_15DictPropertyMapEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|   989k|      : Handle<T>(runtime, value) {}
_ZNK6hermes2vm12PseudoHandleINS0_15DictPropertyMapEE14unsafeGetValueEv:
  150|   419k|  value_type unsafeGetValue() const {
  151|   419k|    return value_;
  152|   419k|  }
_ZNK6hermes2vm12PseudoHandleINS0_15DictPropertyMapEE3getEv:
  126|   209k|  value_type get() const {
  127|   209k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|   209k|    return value_;
  129|   209k|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2EOS3_:
  338|  3.68M|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2ERKS3_:
  337|  4.20M|  Handle(const Handle<T> &) = default;
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEcvbEv:
  136|  2.22M|  explicit operator bool() const {
  137|  2.22M|    assert(valid_ && "Pseudo handle has been invalidated");
  138|  2.22M|    return value_ != nullptr;
  139|  2.22M|  }
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEptEv:
  131|  2.67M|  arrow_type operator->() const {
  132|  2.67M|    assert(valid_ && "Pseudo handle has been invalidated");
  133|  2.67M|    return traits_type::arrow(value_);
  134|  2.67M|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEaSERKS3_:
  350|  1.83M|  Handle<T> &operator=(const Handle<T> &other) {
  351|  1.83M|    HandleBase::operator=(other);
  352|  1.83M|    return *this;
  353|  1.83M|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEC2Ev:
   90|   416k|  constexpr PseudoHandle() : value_(traits_type::defaultValue()) {}
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEaSEOS3_:
   77|   416k|  PseudoHandle &operator=(PseudoHandle &&hnd) {
   78|   416k|    value_ = std::move(hnd.value_);
   79|   416k|    valid_ = hnd.valid_;
   80|   416k|    hnd.valid_ = false;
   81|   416k|    return *this;
   82|   416k|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEC2EOS3_:
   74|  11.7M|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|  11.7M|    hnd.valid_ = false;
   76|  11.7M|  }
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEEaSEPS2_:
  466|   743k|  MutableHandle &operator=(value_type value) {
  467|   743k|    set(value);
  468|   743k|    return *this;
  469|   743k|  }
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEE3setEPS2_:
  475|   743k|  void set(value_type value) {
  476|   743k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|   743k|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE6vmcastERKNS0_10HandleBaseE:
  403|  1.13M|  static Handle<T> vmcast(const HandleBase &other) {
  404|  1.13M|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|  1.13M|    return Handle<T>(other, true);
  406|  1.13M|  }
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|  4.53M|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_8SymbolIDEE6vmcastERKNS0_10HandleBaseE:
  403|  1.13M|  static Handle<T> vmcast(const HandleBase &other) {
  404|  1.13M|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|  1.13M|    return Handle<T>(other, true);
  406|  1.13M|  }
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2ERKNS0_10HandleBaseEb:
  307|  1.13M|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_9ArgumentsEE12unsafeCreateEPKNS0_17PinnedHermesValueE:
  419|    356|  static Handle<T> unsafeCreate(const PinnedHermesValue *valueAddr) {
  420|    356|    return Handle<T>(valueAddr, true);
  421|    356|  }
_ZN6hermes2vm6HandleINS0_9ArgumentsEEC2EPKNS0_17PinnedHermesValueEb:
  305|    356|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm13MutableHandleINS0_8JSObjectEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|  6.94M|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEE5clearEv:
  471|  1.66M|  void clear() {
  472|  1.66M|    set(HermesValueTraits<T>::defaultValue());
  473|  1.66M|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|  5.84k|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|  5.84k|    HermesValueCast<T>::assertValid(*valueAddr);
  391|  5.84k|    return Handle<T>(valueAddr, true);
  392|  5.84k|  }
_ZN6hermes2vm15HermesValueCastINS0_11EnvironmentELb1EE11assertValidENS0_11HermesValueE:
  275|  5.84k|  static void assertValid(HermesValue x) {
  276|  5.84k|#ifndef NDEBUG
  277|  5.84k|    (void)vmcast<T>(x);
  278|  5.84k|#endif
  279|  5.84k|  }
_ZNK6hermes2vm12PseudoHandleINS0_10JSFunctionEE14getHermesValueEv:
  142|  6.19k|  HermesValue getHermesValue() const {
  143|  6.19k|    assert(valid_ && "Pseudo handle has been invalidated");
  144|  6.19k|    return traits_type::encode(value_);
  145|  6.19k|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEE14vmcast_or_nullERKNS0_10HandleBaseE:
  410|    836|  static Handle<T> vmcast_or_null(const HandleBase &other) {
  411|    836|    (void)hermes::vm::vmcast_or_null<T>(other.getHermesValue());
  412|    836|    return Handle<T>(other, true);
  413|    836|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEEC2ERKNS0_10HandleBaseEb:
  307|    836|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|   840k|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|   840k|    HermesValueCast<T>::assertValid(*valueAddr);
  391|   840k|    return Handle<T>(valueAddr, true);
  392|   840k|  }
_ZN6hermes2vm15HermesValueCastINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb1EE11assertValidES3_:
  275|   840k|  static void assertValid(HermesValue x) {
  276|   840k|#ifndef NDEBUG
  277|   840k|    (void)vmcast<T>(x);
  278|   840k|#endif
  279|   840k|  }
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2EPKNS0_17PinnedHermesValueEb:
  305|   840k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE14getHermesValueEv:
  142|   840k|  HermesValue getHermesValue() const {
  143|   840k|    assert(valid_ && "Pseudo handle has been invalidated");
  144|   840k|    return traits_type::encode(value_);
  145|   840k|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSRegExpEE14getHermesValueEv:
  142|      8|  HermesValue getHermesValue() const {
  143|      8|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      8|    return traits_type::encode(value_);
  145|      8|  }
_ZN6hermes2vm6HandleINS0_8JSRegExpEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|     23|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|     23|    HermesValueCast<T>::assertValid(*valueAddr);
  391|     23|    return Handle<T>(valueAddr, true);
  392|     23|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSRegExpELb1EE11assertValidENS0_11HermesValueE:
  275|     23|  static void assertValid(HermesValue x) {
  276|     23|#ifndef NDEBUG
  277|     23|    (void)vmcast<T>(x);
  278|     23|#endif
  279|     23|  }
_ZN6hermes2vm6HandleINS0_8JSRegExpEEC2EPKNS0_17PinnedHermesValueEb:
  305|     24|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSRegExpEEC2ERKS3_:
  337|     11|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_7JSErrorEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|    100|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_7JSErrorEEC2ERKS3_:
  337|    476|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2EOS3_:
  338|  3.07M|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_16PropertyAccessorEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  7.04k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm6HandleINS0_7JSArrayEEptEv:
  368|  2.24M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  2.24M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  2.24M|  }
_ZNK6hermes2vm6HandleINS0_9ArrayImplEE3getEv:
  358|     14|  value_type get() const {
  359|     14|    return HermesValueTraits<T>::decode(getHermesValue());
  360|     14|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE14unsafeGetValueEv:
  150|  1.32M|  value_type unsafeGetValue() const {
  151|  1.32M|    return value_;
  152|  1.32M|  }
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|   274k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE10invalidateEv:
  120|  1.33k|  void invalidate() {
  121|  1.33k|#ifndef NDEBUG
  122|  1.33k|    valid_ = false;
  123|  1.33k|#endif
  124|  1.33k|  }
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3getEv:
  358|   547k|  value_type get() const {
  359|   547k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   547k|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  450|   273k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_9ArrayImplEE6vmcastERKNS0_10HandleBaseE:
  403|   582k|  static Handle<T> vmcast(const HandleBase &other) {
  404|   582k|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|   582k|    return Handle<T>(other, true);
  406|   582k|  }
_ZN6hermes2vm15HermesValueCastINS0_9ArrayImplELb1EE11assertValidENS0_11HermesValueE:
  275|   582k|  static void assertValid(HermesValue x) {
  276|   582k|#ifndef NDEBUG
  277|   582k|    (void)vmcast<T>(x);
  278|   582k|#endif
  279|   582k|  }
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEptEv:
  368|  1.37M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  1.37M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  1.37M|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3getEv:
  126|   664k|  value_type get() const {
  127|   664k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|   664k|    return value_;
  129|   664k|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  1.05M|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEEC2EOS3_:
  453|   781k|  MutableHandle(MutableHandle &&sc) : Handle<T>(std::move(sc)) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_6DomainEvEERKNS1_IT_EE:
  335|     52|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  450|  9.70k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|  19.4k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2EOS5_:
  338|     52|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_8JSObjectEEaSERKS3_:
  350|     52|  Handle<T> &operator=(const Handle<T> &other) {
  351|     52|    HandleBase::operator=(other);
  352|     52|    return *this;
  353|     52|  }
_ZN6hermes2vm6HandleINS0_7JSErrorEE6vmcastERKNS0_10HandleBaseE:
  403|     52|  static Handle<T> vmcast(const HandleBase &other) {
  404|     52|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|     52|    return Handle<T>(other, true);
  406|     52|  }
_ZN6hermes2vm15HermesValueCastINS0_7JSErrorELb1EE11assertValidENS0_11HermesValueE:
  275|     52|  static void assertValid(HermesValue x) {
  276|     52|#ifndef NDEBUG
  277|     52|    (void)vmcast<T>(x);
  278|     52|#endif
  279|     52|  }
_ZN6hermes2vm6HandleINS0_7JSErrorEEC2ERKNS0_10HandleBaseEb:
  307|     52|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm13MutableHandleINS0_8JSObjectEE3setEPS2_:
  475|  9.08M|  void set(value_type value) {
  476|  9.08M|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  9.08M|  }
_ZNK6hermes2vm6HandleINS0_7JSErrorEEptEv:
  368|    697|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    697|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    697|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2ERKNS0_10HandleBaseEb:
  307|  2.66M|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_8CallableEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|     52|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|     52|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|     52|    return Handle<T>(valueAddr, true);
  399|     52|  }
_ZNK6hermes2vm6HandleINS0_8CallableEEcvbEv:
  364|  2.66M|  explicit operator bool() const {
  365|  2.66M|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 2.66M, False: 0]
  |  Branch (365:40): [True: 2.66M, False: 52]
  ------------------
  366|  2.66M|  }
_ZN6hermes2vm18createPseudoHandleINS0_7JSErrorEEENS0_12PseudoHandleIT_EEPS4_:
  503|     53|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|     53|  return PseudoHandle<T>::create(ptr);
  505|     53|}
_ZN6hermes2vm12PseudoHandleINS0_7JSErrorEE6createEPS2_:
  155|     53|  static PseudoHandle<T> create(value_type value) {
  156|     53|    return PseudoHandle<T>(value);
  157|     53|  }
_ZN6hermes2vm12PseudoHandleINS0_7JSErrorEEC2EPS2_:
   67|     53|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_7JSErrorEvEERKNS1_IT_EE:
  335|     53|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEptEv:
  368|  38.6k|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  38.6k|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  38.6k|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3getEv:
  358|  38.8k|  value_type get() const {
  359|  38.8k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  38.8k|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEcvbEv:
  364|     52|  explicit operator bool() const {
  365|     52|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 52, False: 0]
  |  Branch (365:40): [True: 52, False: 0]
  ------------------
  366|     52|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEdeEv:
  372|  9.65k|  value_type operator*() const {
  373|  9.65k|    return get();
  374|  9.65k|  }
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2EOS5_:
  338|     15|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_8CallableEE6vmcastERKNS0_10HandleBaseE:
  403|    454|  static Handle<T> vmcast(const HandleBase &other) {
  404|    454|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|    454|    return Handle<T>(other, true);
  406|    454|  }
_ZN6hermes2vm13MutableHandleINS0_8JSObjectEEaSEPS2_:
  466|  9.08M|  MutableHandle &operator=(value_type value) {
  467|  9.08M|    set(value);
  468|  9.08M|    return *this;
  469|  9.08M|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2ERKNS0_10HandleBaseEb:
  307|  3.02M|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZNK6hermes2vm6HandleINS0_7JSArrayEEcvbEv:
  364|  1.53M|  explicit operator bool() const {
  365|  1.53M|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 1.53M, False: 0]
  |  Branch (365:40): [True: 1.53M, False: 0]
  ------------------
  366|  1.53M|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEE6vmcastERKNS0_10HandleBaseE:
  403|  1.49M|  static Handle<T> vmcast(const HandleBase &other) {
  404|  1.49M|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|  1.49M|    return Handle<T>(other, true);
  406|  1.49M|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2ERNS0_15HandleRootOwnerEPS4_:
  450|     15|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|    814|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEaSEPS4_:
  466|    138|  MutableHandle &operator=(value_type value) {
  467|    138|    set(value);
  468|    138|    return *this;
  469|    138|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEE3setEPS4_:
  475|    153|  void set(value_type value) {
  476|    153|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|    153|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEE14unsafeGetValueEv:
  150|    306|  value_type unsafeGetValue() const {
  151|    306|    return value_;
  152|    306|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEaSEONS0_12PseudoHandleIS4_EE:
  460|     15|  MutableHandle &operator=(PseudoHandle<T> &&other) {
  461|     15|    set(other.get());
  462|     15|    other.invalidate();
  463|     15|    return *this;
  464|     15|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEE3getEv:
  126|    952|  value_type get() const {
  127|    952|    assert(valid_ && "Pseudo handle has been invalidated");
  128|    952|    return value_;
  129|    952|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEE10invalidateEv:
  120|    814|  void invalidate() {
  121|    814|#ifndef NDEBUG
  122|    814|    valid_ = false;
  123|    814|#endif
  124|    814|  }
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEdeEv:
  372|   841k|  value_type operator*() const {
  373|   841k|    return get();
  374|   841k|  }
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEE3getEv:
  358|   841k|  value_type get() const {
  359|   841k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   841k|  }
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEC2ENS0_6HandleIS2_EE:
   91|      1|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZNK6hermes2vm12PseudoHandleINS0_14OrderedHashMapEE14unsafeGetValueEv:
  150|    160|  value_type unsafeGetValue() const {
  151|    160|    return value_;
  152|    160|  }
_ZN6hermes2vm18createPseudoHandleINS0_8JSRegExpEEENS0_12PseudoHandleIT_EEPS4_:
  503|      8|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|      8|  return PseudoHandle<T>::create(ptr);
  505|      8|}
_ZN6hermes2vm12PseudoHandleINS0_8JSRegExpEE6createEPS2_:
  155|      8|  static PseudoHandle<T> create(value_type value) {
  156|      8|    return PseudoHandle<T>(value);
  157|      8|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSRegExpEEC2EPS2_:
   67|      8|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm6HandleINS0_8JSRegExpEEptEv:
  368|     16|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|     16|    return HermesValueTraits<T>::arrow(*handleRef());
  370|     16|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8JSRegExpEvEERKNS1_IT_EE:
  335|      8|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_8JSRegExpEE3getEv:
  358|     16|  value_type get() const {
  359|     16|    return HermesValueTraits<T>::decode(getHermesValue());
  360|     16|  }
_ZN6hermes2vm6HandleINS0_15BigIntPrimitiveEE6vmcastERKNS0_10HandleBaseE:
  403|   781k|  static Handle<T> vmcast(const HandleBase &other) {
  404|   781k|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|   781k|    return Handle<T>(other, true);
  406|   781k|  }
_ZN6hermes2vm15HermesValueCastINS0_15BigIntPrimitiveELb1EE11assertValidENS0_11HermesValueE:
  275|   781k|  static void assertValid(HermesValue x) {
  276|   781k|#ifndef NDEBUG
  277|   781k|    (void)vmcast<T>(x);
  278|   781k|#endif
  279|   781k|  }
_ZN6hermes2vm6HandleINS0_15BigIntPrimitiveEEC2ERKNS0_10HandleBaseEb:
  307|   781k|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm12PseudoHandleINS0_15BigIntPrimitiveEEC2ENS0_6HandleIS2_EE:
   91|   781k|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEE12unsafeCreateEPKNS0_17PinnedHermesValueE:
  419|      1|  static Handle<T> unsafeCreate(const PinnedHermesValue *valueAddr) {
  420|      1|    return Handle<T>(valueAddr, true);
  421|      1|  }
_ZNK6hermes2vm12PseudoHandleINS0_9JSBooleanEE14getHermesValueEv:
  142|    160|  HermesValue getHermesValue() const {
  143|    160|    assert(valid_ && "Pseudo handle has been invalidated");
  144|    160|    return traits_type::encode(value_);
  145|    160|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSNumberEE14getHermesValueEv:
  142|    161|  HermesValue getHermesValue() const {
  143|    161|    assert(valid_ && "Pseudo handle has been invalidated");
  144|    161|    return traits_type::encode(value_);
  145|    161|  }
_ZN6hermes2vm6HandleINS0_8JSStringEEC2EOS3_:
  338|    335|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_8JSStringEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|    175|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSStringEEC2EPKNS0_17PinnedHermesValueEb:
  305|    160|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSStringEEC2ERKS3_:
  337|    175|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm18createPseudoHandleINS0_8JSNumberEEENS0_12PseudoHandleIT_EEPS4_:
  503|    161|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    161|  return PseudoHandle<T>::create(ptr);
  505|    161|}
_ZN6hermes2vm12PseudoHandleINS0_8JSNumberEE6createEPS2_:
  155|    161|  static PseudoHandle<T> create(value_type value) {
  156|    161|    return PseudoHandle<T>(value);
  157|    161|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSNumberEEC2EPS2_:
   67|    161|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_9JSBooleanEEENS0_12PseudoHandleIT_EEPS4_:
  503|    160|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    160|  return PseudoHandle<T>::create(ptr);
  505|    160|}
_ZN6hermes2vm12PseudoHandleINS0_9JSBooleanEE6createEPS2_:
  155|    160|  static PseudoHandle<T> create(value_type value) {
  156|    160|    return PseudoHandle<T>(value);
  157|    160|  }
_ZN6hermes2vm12PseudoHandleINS0_9JSBooleanEEC2EPS2_:
   67|    160|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm12PseudoHandleINS0_6DomainEE14getHermesValueEv:
  142|    160|  HermesValue getHermesValue() const {
  143|    160|    assert(valid_ && "Pseudo handle has been invalidated");
  144|    160|    return traits_type::encode(value_);
  145|    160|  }
_ZN6hermes2vm6HandleINS0_6DomainEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    160|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    160|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    160|    return Handle<T>(valueAddr, true);
  392|    160|  }
_ZN6hermes2vm15HermesValueCastINS0_6DomainELb1EE11assertValidENS0_11HermesValueE:
  275|    160|  static void assertValid(HermesValue x) {
  276|    160|#ifndef NDEBUG
  277|    160|    (void)vmcast<T>(x);
  278|    160|#endif
  279|    160|  }
_ZN6hermes2vm6HandleINS0_6DomainEEC2EPKNS0_17PinnedHermesValueEb:
  305|    160|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZNK6hermes2vm12PseudoHandleINS0_14OrderedHashMapEE14getHermesValueEv:
  142|    160|  HermesValue getHermesValue() const {
  143|    160|    assert(valid_ && "Pseudo handle has been invalidated");
  144|    160|    return traits_type::encode(value_);
  145|    160|  }
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2EOS3_:
  338|  7.44k|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ERKS5_:
  337|   276k|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm18createPseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEEENS0_12PseudoHandleIT_EEPS7_:
  503|    799|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    799|  return PseudoHandle<T>::create(ptr);
  505|    799|}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEE6createEPS5_:
  155|    799|  static PseudoHandle<T> create(value_type value) {
  156|    799|    return PseudoHandle<T>(value);
  157|    799|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEEC2EPS5_:
   67|    799|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEE6createEPS4_:
  155|    153|  static PseudoHandle<T> create(value_type value) {
  156|    153|    return PseudoHandle<T>(value);
  157|    153|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2EPS4_:
   67|    153|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEENS0_12PseudoHandleIT_EEPS6_:
  503|    153|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    153|  return PseudoHandle<T>::create(ptr);
  505|    153|}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2EOS5_:
   74|   841k|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|   841k|    hnd.valid_ = false;
   76|   841k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEaSEOS5_:
   77|    138|  PseudoHandle &operator=(PseudoHandle &&hnd) {
   78|    138|    value_ = std::move(hnd.value_);
   79|    138|    valid_ = hnd.valid_;
   80|    138|    hnd.valid_ = false;
   81|    138|    return *this;
   82|    138|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentEE3getEv:
  126|    799|  value_type get() const {
  127|    799|    assert(valid_ && "Pseudo handle has been invalidated");
  128|    799|    return value_;
  129|    799|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2ENS0_6HandleIS4_EE:
   91|   840k|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEptEv:
  131|  2.52M|  arrow_type operator->() const {
  132|  2.52M|    assert(valid_ && "Pseudo handle has been invalidated");
  133|  2.52M|    return traits_type::arrow(value_);
  134|  2.52M|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEaSENS0_6HandleIS4_EE:
  101|    799|  PseudoHandle &operator=(Handle<T> handle) {
  102|    799|    value_ = *handle;
  103|    799|#ifndef NDEBUG
  104|    799|    valid_ = true;
  105|    799|#endif
  106|    799|    return *this;
  107|    799|  }
_ZN6hermes2vm18createPseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEENS0_12PseudoHandleIT_EEPS7_:
  503|  2.23k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  2.23k|  return PseudoHandle<T>::create(ptr);
  505|  2.23k|}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEE6createEPS5_:
  155|  2.23k|  static PseudoHandle<T> create(value_type value) {
  156|  2.23k|    return PseudoHandle<T>(value);
  157|  2.23k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEC2EPS5_:
   67|  2.23k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE6createEPS4_:
  155|   663k|  static PseudoHandle<T> create(value_type value) {
  156|   663k|    return PseudoHandle<T>(value);
  157|   663k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2EPS4_:
   67|   663k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEENS0_12PseudoHandleIT_EEPS6_:
  503|   663k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|   663k|  return PseudoHandle<T>::create(ptr);
  505|   663k|}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2EOS5_:
   74|   936k|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|   936k|    hnd.valid_ = false;
   76|   936k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEaSEOS5_:
   77|     14|  PseudoHandle &operator=(PseudoHandle &&hnd) {
   78|     14|    value_ = std::move(hnd.value_);
   79|     14|    valid_ = hnd.valid_;
   80|     14|    hnd.valid_ = false;
   81|     14|    return *this;
   82|     14|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEE3getEv:
  126|  2.23k|  value_type get() const {
  127|  2.23k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|  2.23k|    return value_;
  129|  2.23k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ENS0_6HandleIS4_EE:
   91|   273k|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEdeEv:
  372|   274k|  value_type operator*() const {
  373|   274k|    return get();
  374|   274k|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEptEv:
  131|   823k|  arrow_type operator->() const {
  132|   823k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|   823k|    return traits_type::arrow(value_);
  134|   823k|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEaSEPS4_:
  466|     13|  MutableHandle &operator=(value_type value) {
  467|     13|    set(value);
  468|     13|    return *this;
  469|     13|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3setEPS4_:
  475|     13|  void set(value_type value) {
  476|     13|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|     13|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEaSENS0_6HandleIS4_EE:
  101|  1.33k|  PseudoHandle &operator=(Handle<T> handle) {
  102|  1.33k|    value_ = *handle;
  103|  1.33k|#ifndef NDEBUG
  104|  1.33k|    valid_ = true;
  105|  1.33k|#endif
  106|  1.33k|    return *this;
  107|  1.33k|  }
_ZN6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEC2ERKS4_:
  337|     33|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_23BufferedStringPrimitiveIDsEEE6vmcastERKNS0_10HandleBaseE:
  403|     29|  static Handle<T> vmcast(const HandleBase &other) {
  404|     29|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|     29|    return Handle<T>(other, true);
  406|     29|  }
_ZN6hermes2vm15HermesValueCastINS0_23BufferedStringPrimitiveIDsEELb1EE11assertValidENS0_11HermesValueE:
  275|     29|  static void assertValid(HermesValue x) {
  276|     29|#ifndef NDEBUG
  277|     29|    (void)vmcast<T>(x);
  278|     29|#endif
  279|     29|  }
_ZN6hermes2vm6HandleINS0_23BufferedStringPrimitiveIDsEEEC2ERKNS0_10HandleBaseEb:
  307|     29|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEdeEv:
  372|     31|  value_type operator*() const {
  373|     31|    return get();
  374|     31|  }
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEE3getEv:
  358|     31|  value_type get() const {
  359|     31|    return HermesValueTraits<T>::decode(getHermesValue());
  360|     31|  }
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEptEv:
  368|     31|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|     31|    return HermesValueTraits<T>::arrow(*handleRef());
  370|     31|  }
_ZNK6hermes2vm6HandleINS0_23BufferedStringPrimitiveIDsEEE3getEv:
  358|     29|  value_type get() const {
  359|     29|    return HermesValueTraits<T>::decode(getHermesValue());
  360|     29|  }
_ZN6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEC2ERNS0_15HandleRootOwnerEPS3_:
  317|     31|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_17NativeConstructorEvEERKNS1_IT_EE:
  335|  21.7k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm13MutableHandleINS0_8JSObjectEEaSEONS0_12PseudoHandleIS2_EE:
  460|     87|  MutableHandle &operator=(PseudoHandle<T> &&other) {
  461|     87|    set(other.get());
  462|     87|    other.invalidate();
  463|     87|    return *this;
  464|     87|  }
_ZN6hermes2vm12PseudoHandleINS0_17NativeConstructorEEC2EPS2_:
   67|  6.72k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm12PseudoHandleINS0_17NativeConstructorEE3getEv:
  126|  6.72k|  value_type get() const {
  127|  6.72k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|  6.72k|    return value_;
  129|  6.72k|  }
_ZN6hermes2vm6HandleINS0_17NativeConstructorEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  6.72k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm12PseudoHandleINS0_17NativeConstructorEE10invalidateEv:
  120|  6.72k|  void invalidate() {
  121|  6.72k|#ifndef NDEBUG
  122|  6.72k|    valid_ = false;
  123|  6.72k|#endif
  124|  6.72k|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2INS0_17NativeConstructorEvEERKNS1_IT_EE:
  335|  6.72k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_17NativeConstructorEvEERKNS1_IT_EE:
  335|  7.04k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_14NativeFunctionEvEERKNS1_IT_EE:
  335|  60.9k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_14NativeFunctionEE6vmcastERKNS0_10HandleBaseE:
  403|    320|  static Handle<T> vmcast(const HandleBase &other) {
  404|    320|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|    320|    return Handle<T>(other, true);
  406|    320|  }
_ZN6hermes2vm15HermesValueCastINS0_14NativeFunctionELb1EE11assertValidENS0_11HermesValueE:
  275|    320|  static void assertValid(HermesValue x) {
  276|    320|#ifndef NDEBUG
  277|    320|    (void)vmcast<T>(x);
  278|    320|#endif
  279|    320|  }
_ZN6hermes2vm6HandleINS0_14NativeFunctionEEC2ERKNS0_10HandleBaseEb:
  307|    320|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm13MutableHandleINS0_14NativeFunctionEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|  14.0k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm13MutableHandleINS0_14NativeFunctionEEaSEPS2_:
  466|  7.20k|  MutableHandle &operator=(value_type value) {
  467|  7.20k|    set(value);
  468|  7.20k|    return *this;
  469|  7.20k|  }
_ZN6hermes2vm13MutableHandleINS0_14NativeFunctionEE3setEPS2_:
  475|  7.20k|  void set(value_type value) {
  476|  7.20k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  7.20k|  }
_ZN6hermes2vm6HandleINS0_10JSFunctionEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|     82|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_10JSFunctionEvEERKNS1_IT_EE:
  335|     82|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_12SingleObjectILNS0_8CellKindE60EEEEC2ERKS5_:
  337|    320|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_12SingleObjectILNS0_8CellKindE60EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|    160|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_12SingleObjectILNS0_8CellKindE60EEEvEERKNS1_IT_EE:
  335|  7.20k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_12SingleObjectILNS0_8CellKindE59EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|    160|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_12SingleObjectILNS0_8CellKindE59EEEvEERKNS1_IT_EE:
  335|    640|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEaSEPS4_:
  466|  9.60k|  MutableHandle &operator=(value_type value) {
  467|  9.60k|    set(value);
  468|  9.60k|    return *this;
  469|  9.60k|  }
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3setEPS4_:
  475|  9.60k|  void set(value_type value) {
  476|  9.60k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  9.60k|  }
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERKS5_:
  337|    160|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_8JSStringEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    160|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    160|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    160|    return Handle<T>(valueAddr, true);
  392|    160|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSStringELb1EE11assertValidENS0_11HermesValueE:
  275|    160|  static void assertValid(HermesValue x) {
  276|    160|#ifndef NDEBUG
  277|    160|    (void)vmcast<T>(x);
  278|    160|#endif
  279|    160|  }
_ZN6hermes2vm6HandleINS0_8JSNumberEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    160|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    160|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    160|    return Handle<T>(valueAddr, true);
  392|    160|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSNumberELb1EE11assertValidENS0_11HermesValueE:
  275|    160|  static void assertValid(HermesValue x) {
  276|    160|#ifndef NDEBUG
  277|    160|    (void)vmcast<T>(x);
  278|    160|#endif
  279|    160|  }
_ZN6hermes2vm6HandleINS0_8JSNumberEEC2EPKNS0_17PinnedHermesValueEb:
  305|    160|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8JSNumberEvEERKNS1_IT_EE:
  335|  1.12k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_9JSBooleanEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    160|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    160|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    160|    return Handle<T>(valueAddr, true);
  392|    160|  }
_ZN6hermes2vm15HermesValueCastINS0_9JSBooleanELb1EE11assertValidENS0_11HermesValueE:
  275|    160|  static void assertValid(HermesValue x) {
  276|    160|#ifndef NDEBUG
  277|    160|    (void)vmcast<T>(x);
  278|    160|#endif
  279|    160|  }
_ZN6hermes2vm6HandleINS0_9JSBooleanEEC2EPKNS0_17PinnedHermesValueEb:
  305|    160|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_9JSBooleanEvEERKNS1_IT_EE:
  335|    480|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_8JSRegExpEEC2EOS3_:
  338|      1|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_8JSRegExpEEC2ERKNS0_10HandleBaseEb:
  307|      1|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_8JSRegExpEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|      1|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|      1|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|      1|    return Handle<T>(valueAddr, true);
  399|      1|  }
_ZNK6hermes2vm6HandleINS0_8JSRegExpEEcvbEv:
  364|     18|  explicit operator bool() const {
  365|     18|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 18, False: 0]
  |  Branch (365:40): [True: 17, False: 1]
  ------------------
  366|     18|  }
_ZN6hermes2vm12PseudoHandleINS0_15DictPropertyMapEE6createEPS2_:
  155|   209k|  static PseudoHandle<T> create(value_type value) {
  156|   209k|    return PseudoHandle<T>(value);
  157|   209k|  }
_ZN6hermes2vm12PseudoHandleINS0_15DictPropertyMapEEC2EPS2_:
   67|   209k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_15DictPropertyMapEEENS0_12PseudoHandleIT_EEPS4_:
  503|   209k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|   209k|  return PseudoHandle<T>::create(ptr);
  505|   209k|}
_ZN6hermes2vm12PseudoHandleINS0_15DictPropertyMapEEC2EOS3_:
   74|   209k|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|   209k|    hnd.valid_ = false;
   76|   209k|  }
_ZN6hermes2vm13MutableHandleINS0_15DictPropertyMapEEaSEPS2_:
  466|  16.7k|  MutableHandle &operator=(value_type value) {
  467|  16.7k|    set(value);
  468|  16.7k|    return *this;
  469|  16.7k|  }
_ZN6hermes2vm13MutableHandleINS0_15DictPropertyMapEE3setEPS2_:
  475|  16.7k|  void set(value_type value) {
  476|  16.7k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  16.7k|  }
_ZN6hermes2vm12PseudoHandleINS0_14OrderedHashMapEE6createEPS2_:
  155|    160|  static PseudoHandle<T> create(value_type value) {
  156|    160|    return PseudoHandle<T>(value);
  157|    160|  }
_ZN6hermes2vm12PseudoHandleINS0_14OrderedHashMapEEC2EPS2_:
   67|    160|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_14OrderedHashMapEEENS0_12PseudoHandleIT_EEPS4_:
  503|    160|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    160|  return PseudoHandle<T>::create(ptr);
  505|    160|}
_ZN6hermes2vm12PseudoHandleINS0_14OrderedHashMapEEC2EOS3_:
   74|    160|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|    160|    hnd.valid_ = false;
   76|    160|  }

_ZN6hermes2vm15HandleRootOwner17getUndefinedValueEv:
   61|    238|inline Handle<HermesValue> HandleRootOwner::getUndefinedValue() {
   62|    238|  return Handle<HermesValue>(&undefinedValue_);
   63|    238|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  1.60M|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  1.60M|  return Handle<T>(*this, vmcast<T>(value));
   30|  1.60M|}
_ZN6hermes2vm15HandleRootOwner20newPinnedHermesValueENS0_11HermesValueE:
  101|  43.1M|    HermesValue value) {
  102|  43.1M|  assert(topGCScope_ && "no active GCScope");
  103|  43.1M|  return newPinnedHermesValue(topGCScope_, value);
  104|  43.1M|}
_ZN6hermes2vm15HandleRootOwner20newPinnedHermesValueEPNS0_7GCScopeENS0_11HermesValueE:
   95|  43.1M|    HermesValue value) {
   96|  43.1M|  assert(inScope && "Target GCScope can't be null");
   97|  43.1M|  return inScope->newPinnedHermesValue(value);
   98|  43.1M|}
_ZN6hermes2vm15HandleRootOwner13getTopGCScopeEv:
   89|  48.1M|inline GCScope *HandleRootOwner::getTopGCScope() {
   90|  48.1M|  return topGCScope_;
   91|  48.1M|}
_ZN6hermes2vm15HandleRootOwner10makeHandleENS0_11HermesValueE:
   17|  3.89M|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|  3.89M|  return Handle<HermesValue>(*this, value);
   22|  3.89M|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EEPS5_:
   24|   864k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|   864k|  return Handle<T>(*this, p);
   26|   864k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8JSObjectEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|  1.25k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  1.25k|  Handle<T> res{*this, pseudo.get()};
   37|  1.25k|  pseudo.invalidate();
   38|  1.25k|  return res;
   39|  1.25k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_11EnvironmentEEENS0_6HandleIT_EEv:
   57|    361|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|    361|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|    361|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_8JSObjectEEENS0_6HandleIT_EEv:
   57|  71.0k|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|  71.0k|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|  71.0k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EEv:
   57|  58.1k|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|  58.1k|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|  58.1k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleENS0_8SymbolIDE:
   31|  3.36M|inline Handle<SymbolID> HandleRootOwner::makeHandle(SymbolID value) {
   32|  3.36M|  return Handle<SymbolID>(*this, value);
   33|  3.36M|}
_ZN6hermes2vm15HandleRootOwner12getZeroValueEv:
   77|    168|inline Handle<HermesValue> HandleRootOwner::getZeroValue() {
   78|    168|  return Handle<HermesValue>(&zeroValue_);
   79|    168|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|  5.63M|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  5.63M|  Handle<T> res{*this, pseudo.get()};
   37|  5.63M|  pseudo.invalidate();
   38|  5.63M|  return res;
   39|  5.63M|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HermesValueEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|  4.17M|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  4.17M|  Handle<T> res{*this, pseudo.get()};
   37|  4.17M|  pseudo.invalidate();
   38|  4.17M|  return res;
   39|  4.17M|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_6DomainEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|    356|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|    356|  Handle<T> res{*this, pseudo.get()};
   37|    356|  pseudo.invalidate();
   38|    356|  return res;
   39|    356|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_6DomainEEENS0_6HandleIT_EEPS5_:
   24|  6.33k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|  6.33k|  return Handle<T>(*this, p);
   26|  6.33k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_15BigIntPrimitiveEEENS0_6HandleIT_EEPS5_:
   24|      1|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|      1|  return Handle<T>(*this, p);
   26|      1|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8JSObjectEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  3.05M|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  3.05M|  return Handle<T>(*this, vmcast<T>(value));
   30|  3.05M|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEENS0_13MutableHandleIT_EEPS7_:
   52|    160|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|    160|  return MutableHandle<T>(*this, p);
   54|    160|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_13BoundFunctionEEENS0_6HandleIT_EEPS5_:
   24|    160|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|    160|  return Handle<T>(*this, p);
   26|    160|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_14NativeFunctionEEENS0_6HandleIT_EEPS5_:
   24|  70.7k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|  70.7k|  return Handle<T>(*this, p);
   26|  70.7k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EEPS5_:
   24|   359k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|   359k|  return Handle<T>(*this, p);
   26|   359k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_11HiddenClassEEENS0_6HandleIT_EEv:
   57|    396|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|    396|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|    396|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  94.0k|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  94.0k|  return Handle<T>(*this, vmcast<T>(value));
   30|  94.0k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|   192k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|   192k|  Handle<T> res{*this, pseudo.get()};
   37|   192k|  pseudo.invalidate();
   38|   192k|  return res;
   39|   192k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_7JSErrorEEENS0_6HandleIT_EEPS5_:
   24|     47|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|     47|  return Handle<T>(*this, p);
   26|     47|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_16PropertyAccessorEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  7.04k|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  7.04k|  return Handle<T>(*this, vmcast<T>(value));
   30|  7.04k|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_8JSObjectEEENS0_13MutableHandleIT_EEPS5_:
   52|     67|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|     67|  return MutableHandle<T>(*this, p);
   54|     67|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEENS0_6HandleIT_EEONS0_12PseudoHandleIS7_EE:
   35|  1.33k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  1.33k|  Handle<T> res{*this, pseudo.get()};
   37|  1.33k|  pseudo.invalidate();
   38|  1.33k|  return res;
   39|  1.33k|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEENS0_13MutableHandleIT_EEPS7_:
   52|   273k|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|   273k|  return MutableHandle<T>(*this, p);
   54|   273k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_7JSArrayEEENS0_6HandleIT_EEPS5_:
   24|  1.05M|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|  1.05M|  return Handle<T>(*this, p);
   26|  1.05M|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_8CallableEEENS0_6HandleIT_EEv:
   57|     52|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|     52|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|     52|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEENS0_13MutableHandleIT_EEPS7_:
   52|     52|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|     52|  return MutableHandle<T>(*this, p);
   54|     52|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8CallableEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|    320|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|    320|  return Handle<T>(*this, vmcast<T>(value));
   30|    320|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8JSStringEEENS0_6HandleIT_EEPS5_:
   24|    175|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|    175|  return Handle<T>(*this, p);
   26|    175|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_7JSErrorEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|     53|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|     53|  Handle<T> res{*this, pseudo.get()};
   37|     53|  pseudo.invalidate();
   38|     53|  return res;
   39|     53|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEENS0_6HandleIT_EEONS0_12PseudoHandleIS7_EE:
   35|    799|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|    799|  Handle<T> res{*this, pseudo.get()};
   37|    799|  pseudo.invalidate();
   38|    799|  return res;
   39|    799|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_23ExternalStringPrimitiveIDsEEEENS0_6HandleIT_EEPS6_:
   24|     29|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|     29|  return Handle<T>(*this, p);
   26|     29|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_23ExternalStringPrimitiveIDsEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|      2|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|      2|  return Handle<T>(*this, vmcast<T>(value));
   30|      2|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_17NativeConstructorEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|  6.72k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  6.72k|  Handle<T> res{*this, pseudo.get()};
   37|  6.72k|  pseudo.invalidate();
   38|  6.72k|  return res;
   39|  6.72k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_14NativeFunctionEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|    320|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|    320|  return Handle<T>(*this, vmcast<T>(value));
   30|    320|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_10JSFunctionEEENS0_6HandleIT_EEPS5_:
   24|     82|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|     82|  return Handle<T>(*this, p);
   26|     82|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_12SingleObjectILNS0_8CellKindE60EEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|    160|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|    160|  return Handle<T>(*this, vmcast<T>(value));
   30|    160|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_12SingleObjectILNS0_8CellKindE59EEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|    160|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|    160|  return Handle<T>(*this, vmcast<T>(value));
   30|    160|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  9.76k|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  9.76k|  return Handle<T>(*this, vmcast<T>(value));
   30|  9.76k|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_15StringPrimitiveEEENS0_13MutableHandleIT_EEPS5_:
   52|      2|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|      2|  return MutableHandle<T>(*this, p);
   54|      2|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_8JSRegExpEEENS0_6HandleIT_EEv:
   57|      1|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|      1|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|      1|}

_ZN6hermes2vm7GCScopeC2ERNS0_15HandleRootOwnerEPKcj:
  295|  3.99M|      : runtime_(runtime),
  296|       |#ifndef NDEBUG
  297|  3.99M|        handlesLimit_(handlesLimit),
  298|       |#endif
  299|       |#ifdef HERMESVM_DEBUG_TRACK_GCSCOPE_HANDLES
  300|       |        name_(name),
  301|       |#endif
  302|  3.99M|        prevScope_(runtime.topGCScope_),
  303|  3.99M|        chunks_({(PinnedHermesValue *)inlineStorage_}) {
  304|  3.99M|    runtime.topGCScope_ = this;
  305|  3.99M|  }
_ZN6hermes2vm16GCScopeDebugBaseD2Ev:
  179|  3.99M|  ~GCScopeDebugBase() {
  180|  3.99M|    assert(numActiveHandles_ == 0 && "Destroying GCScope with active handles");
  181|  3.99M|  }
_ZN6hermes2vm7GCScope20newPinnedHermesValueENS0_11HermesValueE:
  439|  43.1M|  PinnedHermesValue *newPinnedHermesValue(HermesValue value) {
  440|  43.1M|#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && !defined(NDEBUG)
  441|       |    // Ignore assert below when fuzzing a debug build.
  442|  43.1M|    (void)handlesLimit_; // ignore unused variable warning
  443|       |#else
  444|       |    assert(
  445|       |        getHandleCountDbg() < handlesLimit_ &&
  446|       |        "Too many handles allocated in GCScope");
  447|       |#endif
  448|  43.1M|    assert(runtime_.noHandleLevel_ == 0 && "No handles allowed right now.");
  449|       |
  450|  43.1M|    setHandleCountDbg(getHandleCountDbg() + 1);
  451|       |#ifdef HERMESVM_DEBUG_TRACK_GCSCOPE_HANDLES
  452|       |    if (numAllocatedHandles_ > maxAllocatedHandles_)
  453|       |      maxAllocatedHandles_ = numAllocatedHandles_;
  454|       |#endif
  455|       |
  456|       |    /// Check the fast path: is there space in the current chunk?
  457|  43.1M|    if (LLVM_LIKELY(next_ < curChunkEnd_)) {
  ------------------
  |  |  188|  43.1M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 42.8M, False: 357k]
  |  |  ------------------
  ------------------
  458|       |      /// Initialize the new handle with the specified value and return.
  459|  42.8M|      return new (next_++) PinnedHermesValue(value);
  460|  42.8M|    }
  461|       |
  462|       |    /// Slow path: allocate a new chunk.
  463|   357k|    return _newChunkAndPHV(value);
  464|  43.1M|  }
_ZN6hermes2vm7GCScope17setHandleCountDbgEj:
  332|  62.0M|  LLVM_ATTRIBUTE_ALWAYS_INLINE void setHandleCountDbg(unsigned count) {
  333|  62.0M|    numAllocatedHandles_ = count;
  334|  62.0M|  }
_ZNK6hermes2vm7GCScope17getHandleCountDbgEv:
  328|  72.1M|  LLVM_ATTRIBUTE_ALWAYS_INLINE size_t getHandleCountDbg() const {
  329|  72.1M|    return numAllocatedHandles_;
  330|  72.1M|  }
_ZN6hermes2vm7GCScope6MarkerC2EPNS0_17PinnedHermesValueEj:
  355|  4.96M|        : next(next), curChunkIndex(curChunkIndex) {}
_ZNK6hermes2vm7GCScope12createMarkerEv:
  366|  4.96M|  Marker createMarker() const {
  367|  4.96M|    return Marker(next_, curChunkIndex_);
  368|  4.96M|  }
_ZN6hermes2vm7GCScope13flushToMarkerENS1_6MarkerE:
  372|  12.0M|  void flushToMarker(Marker marker) {
  373|  12.0M|    assert(
  374|  12.0M|        marker.curChunkIndex <= curChunkIndex_ &&
  375|  12.0M|        "trying to reset to a higher chunk");
  376|  12.0M|    assert(
  377|  12.0M|        (marker.curChunkIndex < curChunkIndex_ || marker.next <= next_) &&
  378|  12.0M|        "trying to reset to a higher next pointer");
  379|  12.0M|    PinnedHermesValue *const chunkStart = chunks_[marker.curChunkIndex];
  380|  12.0M|    PinnedHermesValue *const chunkEnd = chunkStart + CHUNK_SIZE;
  381|       |    // Write empty values into the soon-to-be invalid chunk slots to catch bugs.
  382|  12.0M|    invalidateFreedHandleValues(marker.curChunkIndex, marker.next);
  383|  12.0M|    curChunkIndex_ = marker.curChunkIndex;
  384|  12.0M|    curChunkEnd_ = chunkEnd;
  385|       |    // Ensure that the marker is associated with this GCScope by validating the
  386|       |    // saved 'next' pointer - it must point within the chunk. Note that it can
  387|       |    // be equal to curChunkEnd_ if the chunk had just been exhausted before the
  388|       |    // marker was saved.
  389|  12.0M|    assert(
  390|  12.0M|        marker.next >= chunkStart && marker.next <= curChunkEnd_ &&
  391|  12.0M|        "savedNext is not within the current chunk");
  392|  12.0M|    next_ = marker.next;
  393|       |
  394|  12.0M|    setHandleCountDbg(
  395|  12.0M|        curChunkIndex_ * CHUNK_SIZE + (next_ - chunks_[curChunkIndex_]));
  396|  12.0M|  }
_ZN6hermes2vm7GCScope17flushToSmallCountEj:
  400|  6.76M|  void flushToSmallCount(unsigned numHandlesToPreserve) {
  401|  6.76M|    assert(
  402|  6.76M|        numHandlesToPreserve <= CHUNK_SIZE && "numHandles exceeds CHUNK_SIZE");
  403|  6.76M|    assert(
  404|  6.76M|        numHandlesToPreserve <= getHandleCountDbg() &&
  405|  6.76M|        "numHandles exceeds the actual number of handles");
  406|       |
  407|  6.76M|    auto *chunk = (PinnedHermesValue *)inlineStorage_;
  408|       |    // Write empty values into the soon-to-be invalid chunk slots to catch bugs.
  409|  6.76M|    invalidateFreedHandleValues(0, chunk + numHandlesToPreserve);
  410|  6.76M|    next_ = chunk + numHandlesToPreserve;
  411|  6.76M|    curChunkEnd_ = chunk + CHUNK_SIZE;
  412|  6.76M|    curChunkIndex_ = 0;
  413|       |
  414|  6.76M|    setHandleCountDbg(numHandlesToPreserve);
  415|  6.76M|  }
_ZN6hermes2vm7GCScope15clearAllHandlesEv:
  419|  5.60k|  void clearAllHandles() {
  420|  5.60k|    flushToSmallCount(0);
  421|  5.60k|  }
_ZN6hermes2vm17GCScopeMarkerRAIIC2ERNS0_15HandleRootOwnerE:
  491|  4.96M|      : gcScope_(runtime.getTopGCScope()), marker_(gcScope_->createMarker()) {}
_ZN6hermes2vm17GCScopeMarkerRAII5flushEv:
  500|  10.4M|  void flush() {
  501|  10.4M|    gcScope_->flushToMarker(marker_);
  502|  10.4M|  }
_ZN6hermes2vm17GCScopeMarkerRAIID2Ev:
  504|  4.96M|  ~GCScopeMarkerRAII() {
  505|  4.96M|    flush();
  506|  4.96M|  }
_ZN6hermes2vm15HandleRootOwnerD2Ev:
   60|    160|  virtual ~HandleRootOwner() = default;

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

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

_ZN6hermes2vm11HermesValue7setInGCES1_RNS0_7HadesGCE:
   20|   622k|void HermesValue::setInGC(HermesValue hv, GC &gc) {
   21|   622k|  setNoBarrier(hv);
   22|   622k|  assert(gc.calledByGC());
   23|   622k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE3setINSt3__117integral_constantIbLb1EEEEEvS2_RNS0_7HadesGCE:
   52|  7.63M|inline void GCHermesValueBase<HVType>::set(HVType hv, GC &gc) {
   53|  7.63M|  if (hv.isPointer()) {
  ------------------
  |  Branch (53:7): [True: 3.19M, False: 4.44M]
  ------------------
   54|  3.19M|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  3.19M|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
   55|  3.19M|        gc.validPointer(hv.getPointer(gc.getPointerBase())) &&
   56|  3.19M|        "Setting an invalid pointer into a GCHermesValue");
   57|  3.19M|    assert(
   58|  3.19M|        NeedsBarriers::value ||
   59|  3.19M|        !gc.needsWriteBarrier(
   60|  3.19M|            this, static_cast<GCCell *>(hv.getPointer(gc.getPointerBase()))));
   61|  3.19M|  }
   62|  7.63M|  if (NeedsBarriers::value)
  ------------------
  |  Branch (62:7): [Folded - Ignored]
  ------------------
   63|  7.63M|    gc.writeBarrier(this, hv);
   64|  7.63M|  HVType::setNoBarrier(hv);
   65|  7.63M|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE3setINSt3__117integral_constantIbLb1EEEEEvS2_RNS0_7HadesGCE:
   52|  6.44k|inline void GCHermesValueBase<HVType>::set(HVType hv, GC &gc) {
   53|  6.44k|  if (hv.isPointer()) {
  ------------------
  |  Branch (53:7): [True: 6.27k, False: 169]
  ------------------
   54|  6.27k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  6.27k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
   55|  6.27k|        gc.validPointer(hv.getPointer(gc.getPointerBase())) &&
   56|  6.27k|        "Setting an invalid pointer into a GCHermesValue");
   57|  6.27k|    assert(
   58|  6.27k|        NeedsBarriers::value ||
   59|  6.27k|        !gc.needsWriteBarrier(
   60|  6.27k|            this, static_cast<GCCell *>(hv.getPointer(gc.getPointerBase()))));
   61|  6.27k|  }
   62|  6.44k|  if (NeedsBarriers::value)
  ------------------
  |  Branch (62:7): [Folded - Ignored]
  ------------------
   63|  6.44k|    gc.writeBarrier(this, hv);
   64|  6.44k|  HVType::setNoBarrier(hv);
   65|  6.44k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE18uninitialized_fillIPS3_EEvT_S6_S2_RNS0_7HadesGCE:
  106|   842k|    GC &gc) {
  107|   842k|  if (fill.isPointer()) {
  ------------------
  |  Branch (107:7): [True: 0, False: 842k]
  ------------------
  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|   842k|  } else {
  113|  1.68M|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (113:28): [True: 847k, False: 842k]
  ------------------
  114|       |      // Use a constructor that doesn't handle pointer values.
  115|   847k|      new (&*cur) GCHermesValueBase<HVType>(fill, gc, nullptr);
  116|   847k|    }
  117|   842k|  }
  118|   842k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE18uninitialized_fillIPS3_EEvT_S6_S2_RNS0_7HadesGCE:
  106|  4.55M|    GC &gc) {
  107|  4.55M|  if (fill.isPointer()) {
  ------------------
  |  Branch (107:7): [True: 0, False: 4.55M]
  ------------------
  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|  4.55M|  } else {
  113|  12.5M|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (113:28): [True: 7.97M, False: 4.55M]
  ------------------
  114|       |      // Use a constructor that doesn't handle pointer values.
  115|  7.97M|      new (&*cur) GCHermesValueBase<HVType>(fill, gc, nullptr);
  116|  7.97M|    }
  117|  4.55M|  }
  118|  4.55M|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCE:
   34|   840k|GCHermesValueBase<HVType>::GCHermesValueBase(HVType hv, GC &gc) : HVType{hv} {
   35|   840k|  assert(!hv.isPointer() || hv.getPointer());
   36|   840k|  if (NeedsBarriers::value)
  ------------------
  |  Branch (36:7): [Folded - Ignored]
  ------------------
   37|   840k|    gc.constructorWriteBarrier(this, hv);
   38|   840k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCE:
   34|     52|GCHermesValueBase<HVType>::GCHermesValueBase(HVType hv, GC &gc) : HVType{hv} {
   35|     52|  assert(!hv.isPointer() || hv.getPointer());
   36|     52|  if (NeedsBarriers::value)
  ------------------
  |  Branch (36:7): [Folded - Ignored]
  ------------------
   37|     52|    gc.constructorWriteBarrier(this, hv);
   38|     52|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCEDn:
   43|  7.97M|    : HVType{hv} {
   44|  7.97M|  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|  7.97M|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE9setNonPtrES2_RNS0_7HadesGCE:
   68|    320|void GCHermesValueBase<HVType>::setNonPtr(HVType hv, GC &gc) {
   69|    320|  assert(!hv.isPointer());
   70|    320|  gc.snapshotWriteBarrier(this);
   71|    320|  HVType::setNoBarrier(hv);
   72|    320|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCEDn:
   43|   847k|    : HVType{hv} {
   44|   847k|  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|   847k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE28rangeUnreachableWriteBarrierEPS3_S4_RNS0_7HadesGCE:
  223|     15|    GC &gc) {
  224|     15|  gc.snapshotWriteBarrierRange(first, last - first);
  225|     15|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE18uninitialized_copyEPS3_S4_S4_RNS0_7HadesGCE:
  188|    138|    GC &gc) {
  189|    138|#ifndef NDEBUG
  190|    138|  uintptr_t fromFirst = reinterpret_cast<uintptr_t>(first),
  191|    138|            fromLast = reinterpret_cast<uintptr_t>(last);
  192|    138|  uintptr_t toFirst = reinterpret_cast<uintptr_t>(result),
  193|    138|            toLast = toFirst + fromFirst - fromLast;
  194|    138|  assert(
  195|    138|      (toLast < fromFirst || fromLast < toFirst) &&
  196|    138|      "Uninitialized range cannot overlap with an initialized one.");
  197|    138|#endif
  198|       |
  199|    138|  gc.constructorWriteBarrierRange(result, last - first);
  200|       |  // memcpy is fine for an uninitialized copy.
  201|    138|  std::memcpy(
  202|    138|      reinterpret_cast<void *>(result), first, (last - first) * sizeof(HVType));
  203|    138|  return result + (last - first);
  204|    138|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE18uninitialized_copyEPS3_S4_S4_RNS0_7HadesGCE:
  188|  9.61k|    GC &gc) {
  189|  9.61k|#ifndef NDEBUG
  190|  9.61k|  uintptr_t fromFirst = reinterpret_cast<uintptr_t>(first),
  191|  9.61k|            fromLast = reinterpret_cast<uintptr_t>(last);
  192|  9.61k|  uintptr_t toFirst = reinterpret_cast<uintptr_t>(result),
  193|  9.61k|            toLast = toFirst + fromFirst - fromLast;
  194|  9.61k|  assert(
  195|  9.61k|      (toLast < fromFirst || fromLast < toFirst) &&
  196|  9.61k|      "Uninitialized range cannot overlap with an initialized one.");
  197|  9.61k|#endif
  198|       |
  199|  9.61k|  gc.constructorWriteBarrierRange(result, last - first);
  200|       |  // memcpy is fine for an uninitialized copy.
  201|  9.61k|  std::memcpy(
  202|  9.61k|      reinterpret_cast<void *>(result), first, (last - first) * sizeof(HVType));
  203|  9.61k|  return result + (last - first);
  204|  9.61k|}
_ZN6hermes2vm17PinnedHermesValueaSINS0_11HermesValueEEERS1_ONS0_12PseudoHandleIT_EE:
   26|    160|inline PinnedHermesValue &PinnedHermesValue::operator=(PseudoHandle<T> &&hv) {
   27|    160|  setNoBarrier(hv.getHermesValue());
   28|    160|  hv.invalidate();
   29|    160|  return *this;
   30|    160|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE4fillIPS3_EEvT_S6_S2_RNS0_7HadesGCE:
   87|     57|    GC &gc) {
   88|     57|  if (fill.isPointer()) {
  ------------------
  |  Branch (88:7): [True: 0, False: 57]
  ------------------
   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|     57|  } else {
   93|     57|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (93:28): [True: 0, False: 57]
  ------------------
   94|      0|      cur->setNonPtr(fill, gc);
   95|      0|    }
   96|     57|  }
   97|     57|}

_ZN6hermes2vm11HermesValue26encodeUntrustedNumberValueEd:
  329|  1.29M|  inline static HermesValue encodeUntrustedNumberValue(double num) {
  330|  1.29M|    if (LLVM_UNLIKELY(std::isnan(num))) {
  ------------------
  |  |  189|  1.29M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.25M, False: 45.4k]
  |  |  ------------------
  ------------------
  331|  1.25M|      return encodeNaNValue();
  332|  1.25M|    }
  333|  45.4k|    return HermesValue(llvh::DoubleToBits(num));
  334|  1.29M|  }
_ZN6hermes2vm11HermesValue14encodeNaNValueEv:
  366|  1.25M|  static HermesValue encodeNaNValue() {
  367|  1.25M|    return HermesValue(
  368|  1.25M|        llvh::DoubleToBits(std::numeric_limits<double>::quiet_NaN()));
  369|  1.25M|  }
_ZN6hermes2vm11HermesValueC2Em:
  556|  24.9M|  constexpr explicit HermesValue(uint64_t val) : raw_(val) {}
_ZNK6hermes2vm11HermesValue9getObjectEv:
  479|   179M|  inline void *getObject() const {
  480|   179M|    assert(isObject());
  481|   179M|    return getPointer();
  482|   179M|  }
_ZNK6hermes2vm11HermesValue10getPointerEv:
  437|   278M|  inline void *getPointer() const {
  438|   278M|    assert(isPointer());
  439|       |    // Mask out the tag.
  440|   278M|    return reinterpret_cast<void *>(raw_ & kDataMask);
  441|   278M|  }
_ZNK6hermes2vm11HermesValue9isPointerEv:
  419|   381M|  inline bool isPointer() const {
  420|   381M|    return raw_ >= ((uint64_t)Tag::FirstPointer << kNumDataBits);
  421|   381M|  }
_ZNK6hermes2vm11HermesValue9getBigIntEv:
  474|   781k|  inline BigIntPrimitive *getBigInt() const {
  475|   781k|    assert(isBigInt());
  476|   781k|    return static_cast<BigIntPrimitive *>(getPointer());
  477|   781k|  }
_ZNK6hermes2vm11HermesValue8isBigIntEv:
  413|  1.97M|  inline bool isBigInt() const {
  414|  1.97M|    return getTag() == Tag::BigInt;
  415|  1.97M|  }
_ZNK6hermes2vm11HermesValue6getTagEv:
  223|   318M|  inline Tag getTag() const {
  224|   318M|    return (Tag)((int64_t)raw_ >> kNumDataBits);
  225|   318M|  }
_ZNK6hermes2vm11HermesValue9getStringEv:
  469|  42.8M|  inline StringPrimitive *getString() const {
  470|  42.8M|    assert(isString());
  471|  42.8M|    return static_cast<StringPrimitive *>(getPointer());
  472|  42.8M|  }
_ZNK6hermes2vm11HermesValue9getSymbolEv:
  459|  4.49M|  inline SymbolID getSymbol() const {
  460|  4.49M|    assert(isSymbol());
  461|  4.49M|    return SymbolID::unsafeCreate((uint32_t)raw_);
  462|  4.49M|  }
_ZNK6hermes2vm11HermesValue8isSymbolEv:
  401|  37.8M|  inline bool isSymbol() const {
  402|  37.8M|    return getETag() == ETag::Symbol;
  403|  37.8M|  }
_ZNK6hermes2vm11HermesValue7getETagEv:
  226|   493M|  inline ETag getETag() const {
  227|   493M|    return (ETag)((int64_t)raw_ >> (kNumDataBits - 1));
  228|   493M|  }
_ZN6hermes2vm11HermesValue15encodeNullValueEv:
  308|  1.28k|  inline static constexpr HermesValue encodeNullValue() {
  309|  1.28k|    return HermesValue(0, ETag::Null);
  310|  1.28k|  }
_ZN6hermes2vm11HermesValueC2EmNS1_4ETagE:
  560|  48.7M|      : raw_(val | ((uint64_t)etag << (kNumDataBits - 1))) {}
_ZN6hermes2vm11HermesValue15encodeBoolValueEb:
  304|   392k|  constexpr inline static HermesValue encodeBoolValue(bool val) {
  305|   392k|    return HermesValue((uint64_t)(val), ETag::Bool);
  306|   392k|  }
_ZN6hermes2vm11HermesValue17encodeObjectValueEPv:
  267|  4.61M|  inline static HermesValue encodeObjectValue(void *val) {
  268|  4.61M|    assert(val && "Null pointers require special handling.");
  269|  4.61M|    return encodeObjectValueUnsafe(val);
  270|  4.61M|  }
_ZN6hermes2vm11HermesValue23encodeObjectValueUnsafeEPv:
  244|  28.3M|  inline static HermesValue encodeObjectValueUnsafe(void *val) {
  245|  28.3M|    validatePointer(val);
  246|  28.3M|    HermesValue RV(reinterpret_cast<uintptr_t>(val), Tag::Object);
  247|  28.3M|    assert(RV.isObject());
  248|  28.3M|    return RV;
  249|  28.3M|  }
_ZN6hermes2vm11HermesValue15validatePointerEPKv:
  199|  52.1M|  static void validatePointer(const void *ptr) {
  200|  52.1M|#if LLVM_PTR_SIZE == 8
  201|  52.1M|    assert(
  202|  52.1M|        (reinterpret_cast<uintptr_t>(ptr) & ~kDataMask) == 0 &&
  203|  52.1M|        "Pointer top bits are set");
  204|  52.1M|#endif
  205|  52.1M|  }
_ZN6hermes2vm11HermesValueC2EmNS1_3TagE:
  558|  56.1M|      : raw_(val | ((uint64_t)tag << kNumDataBits)) {}
_ZNK6hermes2vm11HermesValue11isUndefinedEv:
  387|  26.1M|  inline bool isUndefined() const {
  388|  26.1M|    return getETag() == ETag::Undefined;
  389|  26.1M|  }
_ZNK6hermes2vm11HermesValue7isEmptyEv:
  390|  4.91M|  inline bool isEmpty() const {
  391|  4.91M|    return getETag() == ETag::Empty;
  392|  4.91M|  }
_ZNK6hermes2vm11HermesValue6isNullEv:
  384|  1.08M|  inline bool isNull() const {
  385|  1.08M|    return getETag() == ETag::Null;
  386|  1.08M|  }
_ZNK6hermes2vm11HermesValue6isBoolEv:
  404|   392k|  inline bool isBool() const {
  405|   392k|    return getETag() == ETag::Bool;
  406|   392k|  }
_ZNK6hermes2vm11HermesValue7getBoolEv:
  464|  1.81k|  inline bool getBool() const {
  465|  1.81k|    assert(isBool());
  466|  1.81k|    return (bool)(raw_ & 0x1);
  467|  1.81k|  }
_ZNK6hermes2vm11HermesValue8isDoubleEv:
  416|  84.4M|  inline bool isDouble() const {
  417|  84.4M|    return raw_ < ((uint64_t)Tag::First << kNumDataBits);
  418|  84.4M|  }
_ZNK6hermes2vm11HermesValue9getDoubleEv:
  443|  20.3M|  inline double getDouble() const {
  444|  20.3M|    assert(isDouble());
  445|  20.3M|    return llvh::BitsToDouble(raw_);
  446|  20.3M|  }
_ZN6hermes2vm17PinnedHermesValueC2ENS0_11HermesValueE:
  594|  48.3M|  constexpr PinnedHermesValue(HermesValue v) : HermesValue(v) {}
_ZNK6hermes2vm11HermesValue9isInvalidEv:
  394|   405M|  inline bool isInvalid() const {
  395|   405M|    return getETag() == ETag::Invalid;
  396|   405M|  }
_ZN6hermes2vm11HermesValue23encodeStringValueUnsafeEPKNS0_15StringPrimitiveE:
  252|  23.3M|      const StringPrimitive *val) {
  253|  23.3M|    validatePointer(val);
  254|  23.3M|    HermesValue RV(reinterpret_cast<uintptr_t>(val), Tag::Str);
  255|  23.3M|    assert(RV.isString());
  256|  23.3M|    return RV;
  257|  23.3M|  }
_ZNK6hermes2vm11HermesValue8isStringEv:
  410|  68.2M|  inline bool isString() const {
  411|  68.2M|    return getTag() == Tag::Str;
  412|  68.2M|  }
_ZNK6hermes2vm11HermesValue8isNumberEv:
  422|  19.0M|  inline bool isNumber() const {
  423|  19.0M|    return isDouble();
  424|  19.0M|  }
_ZNK6hermes2vm11HermesValue9getNumberEv:
  484|  18.8M|  inline double getNumber() const {
  485|  18.8M|    return getDouble();
  486|  18.8M|  }
_ZN6hermes2vm11HermesValue20encodeUndefinedValueEv:
  312|  13.9M|  inline static constexpr HermesValue encodeUndefinedValue() {
  313|  13.9M|    return HermesValue(0, ETag::Undefined);
  314|  13.9M|  }
_ZN6hermes2vm11HermesValue19encodeNativePointerEPKv:
  290|  13.8M|  inline static HermesValue encodeNativePointer(const void *p) {
  291|  13.8M|    HermesValue RV(reinterpret_cast<uintptr_t>(p));
  292|  13.8M|    assert(
  293|  13.8M|        RV.isDouble() && RV.getNativePointer<void>() == p &&
  294|  13.8M|        "Native pointer cannot be represented as a double");
  295|  13.8M|    return RV;
  296|  13.8M|  }
_ZNK6hermes2vm11HermesValue16getNativePointerIvEEPT_v:
  454|  13.8M|  inline T *getNativePointer() const {
  455|  13.8M|    assert(isDouble() && "Native pointers must look like doubles.");
  456|  13.8M|    return reinterpret_cast<T *>(raw_);
  457|  13.8M|  }
_ZN6hermes2vm11HermesValue18encodeNativeUInt32Ej:
  282|  3.45M|  inline static HermesValue encodeNativeUInt32(uint32_t val) {
  283|  3.45M|    HermesValue RV(val, Tag::NativeValue);
  284|  3.45M|    assert(
  285|  3.45M|        RV.isNativeValue() && RV.getNativeUInt32() == val &&
  286|  3.45M|        "native value doesn't fit");
  287|  3.45M|    return RV;
  288|  3.45M|  }
_ZNK6hermes2vm11HermesValue13isNativeValueEv:
  398|  17.6M|  inline bool isNativeValue() const {
  399|  17.6M|    return getTag() == Tag::NativeValue;
  400|  17.6M|  }
_ZNK6hermes2vm11HermesValue15getNativeUInt32Ev:
  448|  9.57M|  inline uint32_t getNativeUInt32() const {
  449|  9.57M|    assert(isNativeValue());
  450|  9.57M|    return (uint32_t)raw_;
  451|  9.57M|  }
_ZN6hermes2vm11HermesValue18encodeInvalidValueEv:
  321|  25.4M|  inline static constexpr HermesValue encodeInvalidValue() {
  322|  25.4M|    return HermesValue(0, ETag::Invalid);
  323|  25.4M|  }
_ZN6hermes2vm17PinnedHermesValueaSERKNS0_11HermesValueE:
  600|   371M|  PinnedHermesValue &operator=(const HermesValue &hv) {
  601|   371M|    setNoBarrier(hv);
  602|   371M|    return *this;
  603|   371M|  }
_ZN6hermes2vm11HermesValue12setNoBarrierES1_:
  551|   378M|  void setNoBarrier(HermesValue hv) {
  552|   378M|    raw_ = hv.raw_;
  553|   378M|  }
_ZNK6hermes2vm11HermesValue8isObjectEv:
  407|   230M|  inline bool isObject() const {
  408|   230M|    return getTag() == Tag::Object;
  409|   230M|  }
_ZNK6hermes2vm11HermesValue6getRawEv:
  433|  3.29M|  inline RawType getRaw() const {
  434|  3.29M|    return raw_;
  435|  3.29M|  }
_ZN6hermes2vm11HermesValue16encodeEmptyValueEv:
  316|  1.11M|  inline static constexpr HermesValue encodeEmptyValue() {
  317|  1.11M|    return HermesValue(0, ETag::Empty);
  318|  1.11M|  }
_ZN6hermes2vm11HermesValue17encodeBigIntValueEPKNS0_15BigIntPrimitiveE:
  277|   390k|  inline static HermesValue encodeBigIntValue(const BigIntPrimitive *val) {
  278|   390k|    assert(val && "Null pointers require special handling.");
  279|   390k|    return encodeBigIntValueUnsafe(val);
  280|   390k|  }
_ZN6hermes2vm11HermesValue23encodeBigIntValueUnsafeEPKNS0_15BigIntPrimitiveE:
  260|   390k|      const BigIntPrimitive *val) {
  261|   390k|    validatePointer(val);
  262|   390k|    HermesValue RV(reinterpret_cast<uintptr_t>(val), Tag::BigInt);
  263|   390k|    assert(RV.isBigInt());
  264|   390k|    return RV;
  265|   390k|  }
_ZN6hermes2vm11HermesValue17encodeSymbolValueENS0_8SymbolIDE:
  298|  7.79M|  inline static HermesValue encodeSymbolValue(SymbolID val) {
  299|  7.79M|    HermesValue RV(val.unsafeGetRaw(), ETag::Symbol);
  300|  7.79M|    assert(RV.isSymbol());
  301|  7.79M|    return RV;
  302|  7.79M|  }
_ZNK6hermes2vm11HermesValue9getObjectERNS0_11PointerBaseE:
  531|  8.99M|  GCCell *getObject(PointerBase &) const {
  532|  8.99M|    return static_cast<GCCell *>(getObject());
  533|  8.99M|  }
_ZN6hermes2vm11HermesValue26encodeUntrustedNumberValueImEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  351|  1.76k|      encodeUntrustedNumberValue(T num) {
  352|  1.76k|    return encodeTrustedNumberValue((double)num);
  353|  1.76k|  }
_ZN6hermes2vm11HermesValue24encodeTrustedNumberValueEd:
  339|  9.50M|  inline static HermesValue encodeTrustedNumberValue(double num) {
  340|  9.50M|    HermesValue RV(llvh::DoubleToBits(num));
  341|  9.50M|    assert(RV.isDouble() && "value not representable as double");
  342|  9.50M|    return RV;
  343|  9.50M|  }
_ZN6hermes2vm11HermesValue7fromRawEm:
  216|   394k|  constexpr inline static HermesValue fromRaw(RawType raw) {
  217|   394k|    return HermesValue(raw);
  218|   394k|  }
_ZN6hermes2vm11HermesValue12combineETagsENS1_4ETagES2_:
  231|  1.28k|  inline static constexpr unsigned combineETags(ETag aTag, ETag bTag) {
  232|  1.28k|    using UTagType = std::make_unsigned<TagType>::type;
  233|  1.28k|    auto a = static_cast<UTagType>(aTag), b = static_cast<UTagType>(bTag);
  234|  1.28k|    return ((a & kETagMask) << kETagWidth) | (b & kETagMask);
  235|  1.28k|  }
_ZN6hermes2vm11HermesValue17encodeStringValueEPKNS0_15StringPrimitiveE:
  272|  8.30M|  inline static HermesValue encodeStringValue(const StringPrimitive *val) {
  273|  8.30M|    assert(val && "Null pointers require special handling.");
  274|  8.30M|    return encodeStringValueUnsafe(val);
  275|  8.30M|  }
_ZNK6hermes2vm11HermesValue13updatePointerEPv:
  372|   622k|  inline HermesValue updatePointer(void *val) const {
  373|   622k|    assert(isPointer());
  374|   622k|    HermesValue V(reinterpret_cast<uintptr_t>(val), getTag());
  375|   622k|    assert(V.isPointer());
  376|   622k|    return V;
  377|   622k|  }
_ZNK6hermes2vm11HermesValue5isNaNEv:
  425|  1.04k|  inline bool isNaN() const {
  426|       |    // Mask out the sign bit since it does not affect whether the value is a
  427|       |    // NaN. All the other bits must be equal to the NaN bit pattern, since we
  428|       |    // only use the quiet NaN to represent NaN.
  429|  1.04k|    uint64_t kMask = llvh::maskLeadingZeros<uint64_t>(1);
  430|  1.04k|    return (this->raw_ & kMask) == (encodeNaNValue().raw_ & kMask);
  431|  1.04k|  }
_ZNK6hermes2vm11HermesValue10getPointerERNS0_11PointerBaseE:
  528|  6.27k|  GCCell *getPointer(PointerBase &) const {
  529|  6.27k|    return static_cast<GCCell *>(getPointer());
  530|  6.27k|  }
_ZN6hermes2vm11HermesValue17encodeHermesValueES1_RNS0_7RuntimeE:
  535|   840k|  static HermesValue encodeHermesValue(HermesValue hv, Runtime &) {
  536|   840k|    return hv;
  537|   840k|  }
_ZN6hermes2vm11HermesValue17encodeObjectValueEPNS0_6GCCellERNS0_7RuntimeE:
  538|    799|  static HermesValue encodeObjectValue(GCCell *obj, Runtime &) {
  539|    799|    return encodeObjectValue(obj);
  540|    799|  }
_ZN6hermes2vm17PinnedHermesValueC2Ev:
  593|  56.9k|      : HermesValue(HermesValue::encodeUndefinedValue()) {}
_ZN6hermes2vm17PinnedHermesValueaSERKS1_:
  596|  6.85M|  PinnedHermesValue &operator=(const PinnedHermesValue &phv) {
  597|  6.85M|    setNoBarrier(phv);
  598|  6.85M|    return *this;
  599|  6.85M|  }
_ZNK6hermes2vm11HermesValue16getNativePointerIKNS_4inst4InstEEEPT_v:
  454|  4.23M|  inline T *getNativePointer() const {
  455|  4.23M|    assert(isDouble() && "Native pointers must look like doubles.");
  456|  4.23M|    return reinterpret_cast<T *>(raw_);
  457|  4.23M|  }
_ZNK6hermes2vm11HermesValue16getNativePointerINS0_17PinnedHermesValueEEEPT_v:
  454|  3.45M|  inline T *getNativePointer() const {
  455|  3.45M|    assert(isDouble() && "Native pointers must look like doubles.");
  456|  3.45M|    return reinterpret_cast<T *>(raw_);
  457|  3.45M|  }
_ZN6hermes2vm11HermesValue24encodeTrustedNumberValueIiEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  361|  3.61M|      encodeTrustedNumberValue(T num) {
  362|  3.61M|    assert((double)num == num && "value not representable as double");
  363|  3.61M|    return encodeTrustedNumberValue((double)num);
  364|  3.61M|  }
_ZN6hermes2vm11HermesValue24encodeTrustedNumberValueIjEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  361|      1|      encodeTrustedNumberValue(T num) {
  362|      1|    assert((double)num == num && "value not representable as double");
  363|      1|    return encodeTrustedNumberValue((double)num);
  364|      1|  }
_ZN6hermes2vm11HermesValue26encodeUntrustedNumberValueIjEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  351|  3.20M|      encodeUntrustedNumberValue(T num) {
  352|  3.20M|    return encodeTrustedNumberValue((double)num);
  353|  3.20M|  }
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EEC2Ev:
  615|  2.28M|  GCHermesValueBase() : HVType(HVType::encodeUndefinedValue()) {}
_ZNK6hermes2vm11HermesValue16getNativePointerINS0_9CodeBlockEEEPT_v:
  454|   393k|  inline T *getNativePointer() const {
  455|   393k|    assert(isDouble() && "Native pointers must look like doubles.");
  456|   393k|    return reinterpret_cast<T *>(raw_);
  457|   393k|  }
_ZN6hermes2vm11HermesValue26encodeUntrustedNumberValueIiEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  351|   411k|      encodeUntrustedNumberValue(T num) {
  352|   411k|    return encodeTrustedNumberValue((double)num);
  353|   411k|  }
_ZN6hermes2vm11HermesValue24encodeTrustedNumberValueIhEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  361|   749k|      encodeTrustedNumberValue(T num) {
  362|   749k|    assert((double)num == num && "value not representable as double");
  363|   749k|    return encodeTrustedNumberValue((double)num);
  364|   749k|  }
_ZNK6hermes2vm11HermesValue11getNumberAsIjEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES5_E4typeEv:
  490|  1.12M|  getNumberAs() const {
  491|  1.12M|    double num = getDouble();
  492|  1.12M|    assert(
  493|  1.12M|        num >= std::numeric_limits<T>::lowest() &&
  494|       |        // The cast is to ignore the following warning:
  495|       |        // implicit conversion from 'int64_t' to 'double' changes value.
  496|  1.12M|        num <= (double)std::numeric_limits<T>::max() && (T)num == num &&
  497|  1.12M|        "value not representable as type");
  498|  1.12M|    return num;
  499|  1.12M|  }
_ZNK6hermes2vm11HermesValue11getNumberAsIiEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES5_E4typeEv:
  490|      2|  getNumberAs() const {
  491|      2|    double num = getDouble();
  492|      2|    assert(
  493|      2|        num >= std::numeric_limits<T>::lowest() &&
  494|       |        // The cast is to ignore the following warning:
  495|       |        // implicit conversion from 'int64_t' to 'double' changes value.
  496|      2|        num <= (double)std::numeric_limits<T>::max() && (T)num == num &&
  497|      2|        "value not representable as type");
  498|      2|    return num;
  499|      2|  }
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEEC2Ev:
  615|   818k|  GCHermesValueBase() : HVType(HVType::encodeUndefinedValue()) {}

_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE6encodeEPS2_:
  225|  15.0M|  static HermesValue encode(T *value) {
  226|  15.0M|    return HermesValue::encodeStringValueUnsafe(value);
  227|  15.0M|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE6decodeENS0_11HermesValueE:
  228|  38.5M|  static T *decode(HermesValue value) {
  229|  38.5M|    return (T *)value.getString();
  230|  38.5M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE6encodeES2_:
  151|  19.1M|  static value_type encode(HermesValue value) {
  152|  19.1M|    return value;
  153|  19.1M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8CallableELb1EE5arrowERKNS0_11HermesValueE:
  267|  4.54M|  static arrow_type arrow(const HermesValue &value) {
  268|  4.54M|    auto *res = decode(value);
  269|  4.54M|    assert(res && "dereferencing null handle");
  270|  4.54M|    return res;
  271|  4.54M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8CallableELb1EE6decodeENS0_11HermesValueE:
  264|  7.23M|  static T *decode(HermesValue value) {
  265|  7.23M|    return static_cast<T *>(value.getObject());
  266|  7.23M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE5arrowERKNS0_11HermesValueE:
  267|  97.9M|  static arrow_type arrow(const HermesValue &value) {
  268|  97.9M|    auto *res = decode(value);
  269|  97.9M|    assert(res && "dereferencing null handle");
  270|  97.9M|    return res;
  271|  97.9M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE6decodeENS0_11HermesValueE:
  264|   130M|  static T *decode(HermesValue value) {
  265|   130M|    return static_cast<T *>(value.getObject());
  266|   130M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE6encodeEPS2_:
  261|  19.4M|  static HermesValue encode(T *value) {
  262|  19.4M|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  19.4M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8SymbolIDELb0EE6decodeENS0_11HermesValueE:
  185|  4.49M|  static value_type decode(HermesValue value) {
  186|  4.49M|    return value.getSymbol();
  187|  4.49M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8SymbolIDELb0EE12defaultValueEv:
  179|  3.64M|  static value_type defaultValue() {
  180|  3.64M|    return SymbolID{};
  181|  3.64M|  };
_ZN6hermes2vm17HermesValueTraitsINS0_8SymbolIDELb0EE6encodeES2_:
  182|  7.39M|  static HermesValue encode(SymbolID value) {
  183|  7.39M|    return HermesValue::encodeSymbolValue(value);
  184|  7.39M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb1EE5arrowERKS3_:
  267|  4.20M|  static arrow_type arrow(const HermesValue &value) {
  268|  4.20M|    auto *res = decode(value);
  269|  4.20M|    assert(res && "dereferencing null handle");
  270|  4.20M|    return res;
  271|  4.20M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb1EE6decodeES3_:
  264|  5.04M|  static T *decode(HermesValue value) {
  265|  5.04M|    return static_cast<T *>(value.getObject());
  266|  5.04M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSArrayELb1EE6decodeENS0_11HermesValueE:
  264|  8.22M|  static T *decode(HermesValue value) {
  265|  8.22M|    return static_cast<T *>(value.getObject());
  266|  8.22M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE12defaultValueEv:
  147|  1.66M|  static constexpr value_type defaultValue() {
  148|  1.66M|    return HermesValue::encodeUndefinedValue();
  149|  1.66M|  };
_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE6decodeES2_:
  155|  33.8M|  static HermesValue decode(value_type value) {
  156|  33.8M|    return value;
  157|  33.8M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE5arrowERKS2_:
  158|  64.4M|  static const HermesValue *arrow(const HermesValue &value) {
  159|  64.4M|    return &value;
  160|  64.4M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15BigIntPrimitiveELb1EE6encodeEPS2_:
  199|      1|  static HermesValue encode(value_type value) {
  200|      1|    return HermesValue::encodeBigIntValueUnsafe(value);
  201|      1|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15BigIntPrimitiveELb1EE6decodeENS0_11HermesValueE:
  202|   781k|  static value_type decode(HermesValue value) {
  203|   781k|    return (value_type)value.getBigInt();
  204|   781k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15BigIntPrimitiveELb1EE5arrowERKNS0_11HermesValueE:
  205|      3|  static arrow_type arrow(const HermesValue &value) {
  206|      3|    auto *res = decode(value);
  207|      3|    assert(res && "dereferencing null handle");
  208|      3|    return res;
  209|      3|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15BigIntPrimitiveELb1EE5arrowEPS2_:
  210|   781k|  static arrow_type arrow(value_type ptr) {
  211|   781k|    assert(ptr && "dereferencing null handle");
  212|   781k|    return ptr;
  213|   781k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE6decodeENS0_11HermesValueE:
  264|  14.2M|  static T *decode(HermesValue value) {
  265|  14.2M|    return static_cast<T *>(value.getObject());
  266|  14.2M|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE5arrowERKNS0_11HermesValueE:
  231|  27.9M|  static arrow_type arrow(const HermesValue &value) {
  232|  27.9M|    auto *res = decode(value);
  233|  27.9M|    assert(res && "dereferencing null handle");
  234|  27.9M|    return res;
  235|  27.9M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE5arrowEPS2_:
  272|   271k|  static arrow_type arrow(value_type ptr) {
  273|   271k|    assert(ptr && "dereferencing null handle");
  274|   271k|    return ptr;
  275|   271k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_6DomainELb1EE5arrowERKNS0_11HermesValueE:
  267|    597|  static arrow_type arrow(const HermesValue &value) {
  268|    597|    auto *res = decode(value);
  269|    597|    assert(res && "dereferencing null handle");
  270|    597|    return res;
  271|    597|  }
_ZN6hermes2vm17HermesValueTraitsINS0_6DomainELb1EE6decodeENS0_11HermesValueE:
  264|  7.39k|  static T *decode(HermesValue value) {
  265|  7.39k|    return static_cast<T *>(value.getObject());
  266|  7.39k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11EnvironmentELb1EE6decodeENS0_11HermesValueE:
  264|  7.03k|  static T *decode(HermesValue value) {
  265|  7.03k|    return static_cast<T *>(value.getObject());
  266|  7.03k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_11HermesValueEEELb1EE6decodeES3_:
  264|    320|  static T *decode(HermesValue value) {
  265|    320|    return static_cast<T *>(value.getObject());
  266|    320|  }
_ZN6hermes2vm17HermesValueTraitsINS0_6DomainELb1EE6encodeEPS2_:
  261|  6.84k|  static HermesValue encode(T *value) {
  262|  6.84k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  6.84k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE5arrowERKNS0_11HermesValueE:
  267|    454|  static arrow_type arrow(const HermesValue &value) {
  268|    454|    auto *res = decode(value);
  269|    454|    assert(res && "dereferencing null handle");
  270|    454|    return res;
  271|    454|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE6decodeENS0_11HermesValueE:
  264|    990|  static T *decode(HermesValue value) {
  265|    990|    return static_cast<T *>(value.getObject());
  266|    990|  }
_ZN6hermes2vm17HermesValueTraitsINS0_9ArrayImplELb1EE5arrowERKNS0_11HermesValueE:
  267|   582k|  static arrow_type arrow(const HermesValue &value) {
  268|   582k|    auto *res = decode(value);
  269|   582k|    assert(res && "dereferencing null handle");
  270|   582k|    return res;
  271|   582k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_9ArrayImplELb1EE6decodeENS0_11HermesValueE:
  264|   582k|  static T *decode(HermesValue value) {
  265|   582k|    return static_cast<T *>(value.getObject());
  266|   582k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_11HermesValueEEELb1EE6encodeEPS4_:
  261|    160|  static HermesValue encode(T *value) {
  262|    160|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    160|  }
_ZN6hermes2vm17HermesValueTraitsINS0_13BoundFunctionELb1EE6encodeEPS2_:
  261|    160|  static HermesValue encode(T *value) {
  262|    160|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    160|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8CallableELb1EE6encodeEPS2_:
  261|    390|  static HermesValue encode(T *value) {
  262|    390|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    390|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14NativeFunctionELb1EE6encodeEPS2_:
  261|  92.3k|  static HermesValue encode(T *value) {
  262|  92.3k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  92.3k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE5arrowEPS2_:
  272|  6.19k|  static arrow_type arrow(value_type ptr) {
  273|  6.19k|    assert(ptr && "dereferencing null handle");
  274|  6.19k|    return ptr;
  275|  6.19k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14NativeFunctionELb1EE6decodeENS0_11HermesValueE:
  264|  9.92k|  static T *decode(HermesValue value) {
  265|  9.92k|    return static_cast<T *>(value.getObject());
  266|  9.92k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE6encodeEPS2_:
  261|  1.79M|  static HermesValue encode(T *value) {
  262|  1.79M|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  1.79M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE5arrowERKNS0_11HermesValueE:
  267|  10.9M|  static arrow_type arrow(const HermesValue &value) {
  268|  10.9M|    auto *res = decode(value);
  269|  10.9M|    assert(res && "dereferencing null handle");
  270|  10.9M|    return res;
  271|  10.9M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE5arrowEPS2_:
  272|  27.4M|  static arrow_type arrow(value_type ptr) {
  273|  27.4M|    assert(ptr && "dereferencing null handle");
  274|  27.4M|    return ptr;
  275|  27.4M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15DictPropertyMapELb1EE6encodeEPS2_:
  261|  1.00M|  static HermesValue encode(T *value) {
  262|  1.00M|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  1.00M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15DictPropertyMapELb1EE5arrowERKNS0_11HermesValueE:
  267|    840|  static arrow_type arrow(const HermesValue &value) {
  268|    840|    auto *res = decode(value);
  269|    840|    assert(res && "dereferencing null handle");
  270|    840|    return res;
  271|    840|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15DictPropertyMapELb1EE6decodeENS0_11HermesValueE:
  264|  1.90M|  static T *decode(HermesValue value) {
  265|  1.90M|    return static_cast<T *>(value.getObject());
  266|  1.90M|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE5arrowEPS2_:
  236|  2.67M|  static arrow_type arrow(value_type ptr) {
  237|  2.67M|    assert(ptr && "dereferencing null handle");
  238|  2.67M|    return ptr;
  239|  2.67M|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE12defaultValueEv:
  222|  4.17M|  static constexpr value_type defaultValue() {
  223|  4.17M|    return value_type{};
  224|  4.17M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE12defaultValueEv:
  258|  3.64M|  static constexpr value_type defaultValue() {
  259|  3.64M|    return value_type{};
  260|  3.64M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE6encodeEPS2_:
  261|  6.28k|  static HermesValue encode(T *value) {
  262|  6.28k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  6.28k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSRegExpELb1EE6encodeEPS2_:
  261|      8|  static HermesValue encode(T *value) {
  262|      8|    return HermesValue::encodeObjectValueUnsafe(value);
  263|      8|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSErrorELb1EE6encodeEPS2_:
  261|    100|  static HermesValue encode(T *value) {
  262|    100|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    100|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16PropertyAccessorELb1EE6encodeEPS2_:
  261|  7.04k|  static HermesValue encode(T *value) {
  262|  7.04k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  7.04k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSArrayELb1EE5arrowERKNS0_11HermesValueE:
  267|  2.24M|  static arrow_type arrow(const HermesValue &value) {
  268|  2.24M|    auto *res = decode(value);
  269|  2.24M|    assert(res && "dereferencing null handle");
  270|  2.24M|    return res;
  271|  2.24M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE6encodeEPS4_:
  261|   274k|  static HermesValue encode(T *value) {
  262|   274k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|   274k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE6decodeENS0_11HermesValueE:
  264|  1.92M|  static T *decode(HermesValue value) {
  265|  1.92M|    return static_cast<T *>(value.getObject());
  266|  1.92M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE5arrowERKNS0_11HermesValueE:
  267|  1.37M|  static arrow_type arrow(const HermesValue &value) {
  268|  1.37M|    auto *res = decode(value);
  269|  1.37M|    assert(res && "dereferencing null handle");
  270|  1.37M|    return res;
  271|  1.37M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSArrayELb1EE6encodeEPS2_:
  261|  1.05M|  static HermesValue encode(T *value) {
  262|  1.05M|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  1.05M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb1EE6encodeEPS4_:
  261|  29.0k|  static HermesValue encode(T *value) {
  262|  29.0k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  29.0k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSErrorELb1EE5arrowERKNS0_11HermesValueE:
  267|    697|  static arrow_type arrow(const HermesValue &value) {
  268|    697|    auto *res = decode(value);
  269|    697|    assert(res && "dereferencing null handle");
  270|    697|    return res;
  271|    697|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSErrorELb1EE6decodeENS0_11HermesValueE:
  264|    697|  static T *decode(HermesValue value) {
  265|    697|    return static_cast<T *>(value.getObject());
  266|    697|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb1EE5arrowERKNS0_11HermesValueE:
  267|  38.6k|  static arrow_type arrow(const HermesValue &value) {
  268|  38.6k|    auto *res = decode(value);
  269|  38.6k|    assert(res && "dereferencing null handle");
  270|  38.6k|    return res;
  271|  38.6k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb1EE6decodeENS0_11HermesValueE:
  264|  77.5k|  static T *decode(HermesValue value) {
  265|  77.5k|    return static_cast<T *>(value.getObject());
  266|  77.5k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb1EE12defaultValueEv:
  258|     15|  static constexpr value_type defaultValue() {
  259|     15|    return value_type{};
  260|     15|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb1EE6encodeEPS4_:
  261|    967|  static HermesValue encode(T *value) {
  262|    967|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    967|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14OrderedHashMapELb1EE6encodeEPS2_:
  261|    160|  static HermesValue encode(T *value) {
  262|    160|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    160|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSRegExpELb1EE5arrowERKNS0_11HermesValueE:
  267|     16|  static arrow_type arrow(const HermesValue &value) {
  268|     16|    auto *res = decode(value);
  269|     16|    assert(res && "dereferencing null handle");
  270|     16|    return res;
  271|     16|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSRegExpELb1EE6decodeENS0_11HermesValueE:
  264|     32|  static T *decode(HermesValue value) {
  265|     32|    return static_cast<T *>(value.getObject());
  266|     32|  }
_ZN6hermes2vm17HermesValueTraitsINS0_9JSBooleanELb1EE6encodeEPS2_:
  261|    160|  static HermesValue encode(T *value) {
  262|    160|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    160|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSNumberELb1EE6encodeEPS2_:
  261|    161|  static HermesValue encode(T *value) {
  262|    161|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    161|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSStringELb1EE6encodeEPS2_:
  261|    175|  static HermesValue encode(T *value) {
  262|    175|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    175|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_11HermesValueEEELb1EE5arrowEPS4_:
  272|  2.52M|  static arrow_type arrow(value_type ptr) {
  273|  2.52M|    assert(ptr && "dereferencing null handle");
  274|  2.52M|    return ptr;
  275|  2.52M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE5arrowEPS4_:
  272|   823k|  static arrow_type arrow(value_type ptr) {
  273|   823k|    assert(ptr && "dereferencing null handle");
  274|   823k|    return ptr;
  275|   823k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIDsEELb1EE6decodeENS0_11HermesValueE:
  264|     62|  static T *decode(HermesValue value) {
  265|     62|    return static_cast<T *>(value.getObject());
  266|     62|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIDsEELb1EE5arrowERKNS0_11HermesValueE:
  267|     31|  static arrow_type arrow(const HermesValue &value) {
  268|     31|    auto *res = decode(value);
  269|     31|    assert(res && "dereferencing null handle");
  270|     31|    return res;
  271|     31|  }
_ZN6hermes2vm16StringTraitsImplINS0_23BufferedStringPrimitiveIDsEEE6decodeENS0_11HermesValueE:
  228|     29|  static T *decode(HermesValue value) {
  229|     29|    return (T *)value.getString();
  230|     29|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIDsEELb1EE6encodeEPS3_:
  261|     31|  static HermesValue encode(T *value) {
  262|     31|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     31|  }
_ZN6hermes2vm17HermesValueTraitsINS0_17NativeConstructorELb1EE6encodeEPS2_:
  261|  6.72k|  static HermesValue encode(T *value) {
  262|  6.72k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  6.72k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14NativeFunctionELb1EE12defaultValueEv:
  258|  14.0k|  static constexpr value_type defaultValue() {
  259|  14.0k|    return value_type{};
  260|  14.0k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_12SingleObjectILNS0_8CellKindE60EEELb1EE6encodeEPS4_:
  261|    160|  static HermesValue encode(T *value) {
  262|    160|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    160|  }
_ZN6hermes2vm17HermesValueTraitsINS0_12SingleObjectILNS0_8CellKindE59EEELb1EE6encodeEPS4_:
  261|    160|  static HermesValue encode(T *value) {
  262|    160|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    160|  }

_ZN6hermes2vm11HiddenClass7classofEPKNS0_6GCCellE:
  272|  27.1M|  static bool classof(const GCCell *cell) {
  273|  27.1M|    return cell->getKind() == CellKind::HiddenClassKind;
  274|  27.1M|  }
_ZN6hermes2vm10ClassFlagsC2Ev:
   64|    160|  ClassFlags() {
   65|    160|    ::memset(this, 0, sizeof(*this));
   66|    160|  }
_ZN6hermes2vm6detail10TransitionC2ENS0_8SymbolIDE:
  136|   741k|      : symbolID(symbolID), propertyFlags() {}
_ZN6hermes2vm6detail10TransitionC2ENS0_8SymbolIDENS0_13PropertyFlagsE:
  138|   549k|      : symbolID(symbolID), propertyFlags(flags) {}
_ZNK6hermes2vm6detail10TransitioneqERKS2_:
  140|  1.88M|  bool operator==(const Transition &a) const {
  141|  1.88M|    return symbolID == a.symbolID && propertyFlags == a.propertyFlags;
  ------------------
  |  Branch (141:12): [True: 505k, False: 1.38M]
  |  Branch (141:38): [True: 505k, False: 0]
  ------------------
  142|  1.88M|  }
_ZN6hermes2vm6detail13TransitionMapD2Ev:
  149|  94.2k|  ~TransitionMap() {
  150|  94.2k|    if (isLarge())
  ------------------
  |  Branch (150:9): [True: 2.09k, False: 92.1k]
  ------------------
  151|  2.09k|      delete large();
  152|  92.1k|    else if (!isClean())
  ------------------
  |  Branch (152:14): [True: 82.9k, False: 9.20k]
  ------------------
  153|  82.9k|      smallValue().releaseSlot();
  154|  94.2k|  }
_ZN6hermes2vm6detail13TransitionMap11containsKeyERKNS1_10TransitionERNS0_7HadesGCE:
  157|  3.84k|  bool containsKey(const Transition &key, GC &gc) {
  158|  3.84k|    return (smallKey_ == key && smallValue().isValid()) ||
  ------------------
  |  Branch (158:13): [True: 2.40k, False: 1.44k]
  |  Branch (158:33): [True: 2.40k, False: 0]
  ------------------
  159|  3.84k|        (isLarge() && large()->containsKey(key));
  ------------------
  |  Branch (159:10): [True: 1.44k, False: 0]
  |  Branch (159:23): [True: 800, False: 642]
  ------------------
  160|  3.84k|  }
_ZN6hermes2vm6detail13TransitionMap6lookupERNS0_7RuntimeERKNS1_10TransitionE:
  164|   451k|  HiddenClass *lookup(Runtime &runtime, const Transition &key) {
  165|   451k|    if (smallKey_ == key) {
  ------------------
  |  Branch (165:9): [True: 85.0k, False: 366k]
  ------------------
  166|  85.0k|      return smallValue().get(runtime);
  167|   366k|    } else if (isLarge()) {
  ------------------
  |  Branch (167:16): [True: 278k, False: 87.3k]
  ------------------
  168|   278k|      return large()->lookup(runtime, key);
  169|   278k|    } else {
  170|  87.3k|      return nullptr;
  171|  87.3k|    }
  172|   451k|  }
_ZN6hermes2vm6detail13TransitionMap9insertNewERNS0_7RuntimeERKNS1_10TransitionENS0_6HandleINS0_11HiddenClassEEE:
  179|  93.8k|      Handle<HiddenClass> value) {
  180|  93.8k|    assert(
  181|  93.8k|        key.symbolID != SymbolID::empty() &&
  182|  93.8k|        "Should never insert an empty key");
  183|  93.8k|    if (smallKey_ == key && smallValue().isValid()) {
  ------------------
  |  Branch (183:9): [True: 0, False: 93.8k]
  |  Branch (183:29): [True: 0, False: 0]
  ------------------
  184|      0|      return false;
  185|      0|    }
  186|  93.8k|    if (isClean()) {
  ------------------
  |  Branch (186:9): [True: 85.0k, False: 8.80k]
  ------------------
  187|  85.0k|      smallKey_ = key;
  188|  85.0k|      smallValue() = WeakRef<HiddenClass>(runtime, value);
  189|  85.0k|      return true;
  190|  85.0k|    }
  191|  8.80k|    if (!isLarge())
  ------------------
  |  Branch (191:9): [True: 2.09k, False: 6.71k]
  ------------------
  192|  2.09k|      uncleanMakeLarge(runtime);
  193|  8.80k|    return large()->insertNew(runtime, key, value);
  194|  93.8k|  }
_ZNK6hermes2vm6detail13TransitionMap7isCleanEv:
  222|   188k|  bool isClean() const {
  223|   188k|    return smallKey_.symbolID == SymbolID::empty();
  224|   188k|  }
_ZNK6hermes2vm6detail13TransitionMap7isLargeEv:
  227|  1.12M|  bool isLarge() const {
  228|  1.12M|    return smallKey_.symbolID == SymbolID::deleted();
  229|  1.12M|  }
_ZN6hermes2vm6detail13TransitionMap10smallValueEv:
  235|   259k|  WeakRef<HiddenClass> &smallValue() {
  236|   259k|    assert(!isLarge());
  237|   259k|    return u.smallValue_;
  238|   259k|  }
_ZNK6hermes2vm6detail13TransitionMap5largeEv:
  243|   293k|  WeakValueMap<Transition, HiddenClass> *large() const {
  244|   293k|    assert(isLarge());
  245|   293k|    return u.large_;
  246|   293k|  }
_ZN6hermes2vm6detail13TransitionMap1UC2Ev:
  250|  94.2k|    U() : smallValue_((WeakRefSlot *)nullptr) {}
_ZN6hermes2vm11HiddenClass11getCellKindEv:
  269|   188k|  static constexpr CellKind getCellKind() {
  270|   188k|    return CellKind::HiddenClassKind;
  271|   188k|  }
_ZNK6hermes2vm11HiddenClass16getNumPropertiesEv:
  289|  1.05M|  unsigned getNumProperties() const {
  290|  1.05M|    return numProperties_;
  291|  1.05M|  }
_ZNK6hermes2vm11HiddenClass12isDictionaryEv:
  295|  2.95M|  bool isDictionary() const {
  296|  2.95M|    return flags_.dictionaryMode;
  297|  2.95M|  }
_ZNK6hermes2vm11HiddenClass19isDictionaryNoCacheEv:
  303|  3.84k|  bool isDictionaryNoCache() const {
  304|  3.84k|    assert(
  305|  3.84k|        (!flags_.dictionaryNoCacheMode || flags_.dictionaryMode) &&
  306|  3.84k|        "dictionaryNoCacheMode should only be set if dictionaryMode is set.");
  307|  3.84k|    return flags_.dictionaryNoCacheMode;
  308|  3.84k|  }
_ZNK6hermes2vm11HiddenClass25getHasIndexLikePropertiesEv:
  310|  3.95M|  bool getHasIndexLikeProperties() const {
  311|  3.95M|    return flags_.hasIndexLikeProperties;
  312|  3.95M|  }
_ZN6hermes2vm11HiddenClassC2ERNS0_7RuntimeENS0_10ClassFlagsENS0_6HandleIS1_EENS0_8SymbolIDENS0_13PropertyFlagsEj:
  489|  94.2k|      : symbolID_(symbolID),
  490|  94.2k|        propertyFlags_(propertyFlags),
  491|  94.2k|        flags_(flags),
  492|  94.2k|        numProperties_(numProperties),
  493|  94.2k|        parent_(runtime, *parent, runtime.getHeap()) {
  494|  94.2k|    assert(propertyFlags.isValid() && "propertyFlags must be valid");
  495|  94.2k|  }
_ZN6hermes2vm11HiddenClass19tryFindPropertyFastEPKS1_RNS0_11PointerBaseENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
  635|  1.12M|    NamedPropertyDescriptor &desc) {
  636|  1.12M|  if (LLVM_LIKELY(self->propertyMap_)) {
  ------------------
  |  |  188|  1.12M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.11M, False: 4.17k]
  |  |  ------------------
  ------------------
  637|  1.11M|    auto found =
  638|  1.11M|        DictPropertyMap::find(self->propertyMap_.getNonNull(base), name);
  639|  1.11M|    if (LLVM_LIKELY(found)) {
  ------------------
  |  |  188|  1.11M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.11M, False: 2.30k]
  |  |  ------------------
  ------------------
  640|  1.11M|      desc = DictPropertyMap::getDescriptorPair(
  641|  1.11M|                 self->propertyMap_.getNonNull(base), *found)
  642|  1.11M|                 ->second;
  643|  1.11M|    }
  644|  1.11M|    return found.hasValue();
  645|  1.11M|  } else if (self->numProperties_ == 0) {
  ------------------
  |  Branch (645:14): [True: 1.12k, False: 3.05k]
  ------------------
  646|  1.12k|    return false;
  647|  1.12k|  }
  648|  3.05k|  return llvh::None;
  649|  1.12M|}
_ZN6hermes2vm11HiddenClass12computeFlagsENS0_10ClassFlagsENS0_13PropertyFlagsEb:
  653|   795k|    bool addedIndexLike) {
  654|   795k|  flags.hasIndexLikeProperties |= addedIndexLike;
  655|       |  // Carry over the the existing mayHaveAccessor flag. Once an accessor property
  656|       |  // has been set, all subsequent classes must have this property marked.
  657|   795k|  flags.mayHaveAccessor |= pf.accessor;
  658|   795k|  return flags;
  659|   795k|}
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE11getEmptyKeyEv:
  671|   330k|  static inline HiddenClass::Transition getEmptyKey() {
  672|   330k|    return HiddenClass::Transition(SymbolID::empty());
  673|   330k|  }
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE15getTombstoneKeyEv:
  675|   316k|  static inline HiddenClass::Transition getTombstoneKey() {
  676|   316k|    return HiddenClass::Transition(SymbolID::deleted());
  677|   316k|  }
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE12getHashValueES4_:
  679|   294k|  static inline unsigned getHashValue(HiddenClass::Transition transition) {
  680|   294k|    return transition.symbolID.unsafeGetRaw() ^ transition.propertyFlags._flags;
  681|   294k|  }
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE7isEqualERKS4_S7_:
  685|  1.34M|      const HiddenClass::Transition &b) {
  686|  1.34M|    return a == b;
  687|  1.34M|  }
JSObject.cpp:_ZN6hermes2vm11HiddenClass15forEachPropertyIZNS0_8JSObject18getOwnPropertyKeysENS0_6HandleIS3_EERNS0_7RuntimeENS0_12OwnKeysFlagsEE3$_0EEvNS4_IS1_EES7_RKT_:
  611|     45|    const CallbackFunction &callback) {
  612|     45|  if (LLVM_UNLIKELY(!selfHandle->propertyMap_))
  ------------------
  |  |  189|     45|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 15, False: 30]
  |  |  ------------------
  ------------------
  613|     15|    initializeMissingPropertyMap(selfHandle, runtime);
  614|       |
  615|     45|  return DictPropertyMap::forEachProperty(
  616|     45|      runtime.makeHandle(selfHandle->propertyMap_), runtime, callback);
  617|     45|}

_ZN6hermes2vm10HostObject8getProxyEv:
  123|   390k|  HostObjectProxy *getProxy() {
  124|   390k|    return static_cast<HostObjectProxy *>(this->getDecoration());
  125|   390k|  }
_ZN6hermes2vm10HostObject7classofEPKNS0_6GCCellE:
  102|   390k|  static bool classof(const GCCell *cell) {
  103|   390k|    return cell->getKind() == CellKind::HostObjectKind;
  104|   390k|  }
_ZN6hermes2vm10HostObject11getCellKindEv:
   99|    320|  static constexpr CellKind getCellKind() {
  100|    320|    return CellKind::HostObjectKind;
  101|    320|  }
_ZN6hermes2vm10HostObject3getENS0_8SymbolIDE:
  111|   390k|  CallResult<HermesValue> get(SymbolID name) {
  112|   390k|    return getProxy()->get(name);
  113|   390k|  }
_ZN6hermes2vm10HostObjectC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENS9_14default_deleteISB_EEEE:
  136|    160|      : DecoratedObject(runtime, parent, clazz, std::move(proxy)) {}

_ZN6hermes2vm15IdentifierTable15getSymbolHandleERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
   89|    160|  CallResult<Handle<SymbolID>> getSymbolHandle(Runtime &runtime, UTF16Ref str) {
   90|    160|    return getSymbolHandle(runtime, str, hermes::hashString(str));
   91|    160|  }
_ZN6hermes2vm15IdentifierTable7reserveEj:
  148|    676|  void reserve(uint32_t count) {
  149|    676|    lookupVector_.reserve(count);
  150|    676|    hashTable_.reserve(count);
  151|    676|    markedSymbols_.reserve(count);
  152|    676|  }
_ZN6hermes2vm15IdentifierTable11LookupEntryC2EN4llvh8ArrayRefIcEEjb:
  273|   103k|        : asciiPtr_(str.data()),
  274|   103k|          isUTF16_(false),
  275|   103k|          isNotUniqued_(isNotUniqued),
  276|   103k|          num_(str.size()),
  277|   103k|          hash_(hash) {}
_ZN6hermes2vm15IdentifierTable11LookupEntryC2EN4llvh8ArrayRefIDsEEj:
  285|    328|        : utf16Ptr_(str.data()),
  286|    328|          isUTF16_(true),
  287|    328|          isNotUniqued_(false),
  288|    328|          num_(str.size()),
  289|    328|          hash_(hash) {}
_ZN6hermes2vm15IdentifierTable11LookupEntryC2Ev:
  304|   461k|    LookupEntry() : strPrim_(nullptr), num_(FREE_LIST_END) {}
_ZNK6hermes2vm15IdentifierTable11LookupEntry11isLazyASCIIEv:
  306|  6.01M|    bool isLazyASCII() const {
  307|  6.01M|      return asciiPtr_ && !isUTF16_;
  ------------------
  |  Branch (307:14): [True: 6.01M, False: 0]
  |  Branch (307:27): [True: 6.01M, False: 139]
  ------------------
  308|  6.01M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry11isLazyUTF16Ev:
  309|    143|    bool isLazyUTF16() const {
  310|    143|      return utf16Ptr_ && isUTF16_;
  ------------------
  |  Branch (310:14): [True: 143, False: 0]
  |  Branch (310:27): [True: 143, False: 0]
  ------------------
  311|    143|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry12isStringPrimEv:
  312|  22.2M|    bool isStringPrim() const {
  313|  22.2M|      return strPrim_ && num_ >= NON_LAZY_STRING_PRIM_TAG;
  ------------------
  |  Branch (313:14): [True: 22.2M, False: 0]
  |  Branch (313:26): [True: 19.0M, False: 3.18M]
  ------------------
  314|  22.2M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry10isFreeSlotEv:
  321|  3.48M|    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|  3.48M|      return !strPrim_;
  325|  3.48M|    }
_ZN6hermes2vm15IdentifierTable11LookupEntry11materializeEPNS0_15StringPrimitiveE:
  331|  57.6k|    void materialize(StringPrimitive *str) {
  332|  57.6k|      assert(str && "Invalid string primitive pointer");
  333|  57.6k|      strPrim_ = str;
  334|  57.6k|      num_ = LAZY_STRING_PRIM_TAG;
  335|  57.6k|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry15getLazyASCIIRefEv:
  344|  2.98M|    ASCIIRef getLazyASCIIRef() const {
  345|  2.98M|      assert(isLazyASCII() && "Not an ASCII lazy identifier");
  346|  2.98M|      return ASCIIRef(asciiPtr_, num_);
  347|  2.98M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry15getLazyUTF16RefEv:
  348|     72|    UTF16Ref getLazyUTF16Ref() const {
  349|     72|      assert(isLazyUTF16() && "Not a UTF16 lazy identifier");
  350|     72|      return UTF16Ref(utf16Ptr_, num_);
  351|     72|    }
_ZN6hermes2vm15IdentifierTable11LookupEntry16getStringPrimRefEv:
  352|  4.84M|    StringPrimitive *&getStringPrimRef() {
  353|  4.84M|      assert(isStringPrim() && "Not a valid string primitive");
  354|  4.84M|      return strPrim_;
  355|  4.84M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry13getStringPrimEv:
  356|  5.00M|    const StringPrimitive *getStringPrim() const {
  357|  5.00M|      assert(isStringPrim() && "Not a valid string primitive");
  358|  5.00M|      return strPrim_;
  359|  5.00M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry7getHashEv:
  365|  3.24M|    uint32_t getHash() const {
  366|  3.24M|      return hash_;
  367|  3.24M|    }
_ZN6hermes2vm15IdentifierTable19getLookupTableEntryENS0_8SymbolIDE:
  408|  3.72M|  LookupEntry &getLookupTableEntry(SymbolID id) {
  409|  3.72M|    return getLookupTableEntry(id.unsafeGetIndex());
  410|  3.72M|  }
_ZNK6hermes2vm15IdentifierTable19getLookupTableEntryENS0_8SymbolIDE:
  412|  8.43M|  const LookupEntry &getLookupTableEntry(SymbolID id) const {
  413|  8.43M|    return getLookupTableEntry(id.unsafeGetIndex());
  414|  8.43M|  }
_ZN6hermes2vm15IdentifierTable19getLookupTableEntryEj:
  416|  6.96M|  LookupEntry &getLookupTableEntry(uint32_t id) {
  417|  6.96M|    assert(id < lookupVector_.size() && "Identifier ID out of bound");
  418|  6.96M|    return lookupVector_[id];
  419|  6.96M|  }
_ZNK6hermes2vm15IdentifierTable19getLookupTableEntryEj:
  421|  8.43M|  const LookupEntry &getLookupTableEntry(uint32_t id) const {
  422|  8.43M|    assert(id < lookupVector_.size() && "Identifier ID out of bound");
  423|  8.43M|    return lookupVector_[id];
  424|  8.43M|  }
_ZN6hermes2vm15IdentifierTable21getOrCreateIdentifierIcEENS0_10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleINS0_15StringPrimitiveEEE:
  447|  1.83M|      Handle<StringPrimitive> primHandle) {
  448|  1.83M|    return getOrCreateIdentifier(
  449|  1.83M|        runtime, str, primHandle, hermes::hashString(str));
  450|  1.83M|  }
_ZN6hermes2vm15IdentifierTable18ConservativeVectorINS1_11LookupEntryEE12emplace_backEv:
  385|   461k|    void emplace_back() {
  386|   461k|      auto cap = capacity();
  387|   461k|      if (size() == cap) {
  ------------------
  |  Branch (387:11): [True: 471, False: 461k]
  ------------------
  388|    471|        reserve(cap + cap / 4);
  389|    471|      }
  390|   461k|      Base::emplace_back();
  391|   461k|    }

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

_ZN6hermes2vm16InterpreterStateC2Ev:
   29|    160|  InterpreterState() {}
_ZN6hermes2vm16InterpreterStateC2EPNS0_9CodeBlockEj:
   32|    356|      : codeBlock(codeBlock), offset(offset) {}

_ZN6hermes2vm7JSArray9getLengthEPKS1_RNS0_11PointerBaseE:
  295|  3.29M|  static uint32_t getLength(const JSArray *self, PointerBase &pb) {
  296|  3.29M|    return getDirectSlotValue<lengthPropIndex()>(self).getNumber(pb);
  297|  3.29M|  }
_ZN6hermes2vm7JSArray7classofEPKNS0_6GCCellE:
  291|  5.51M|  static bool classof(const GCCell *cell) {
  292|  5.51M|    return cell->getKind() == CellKind::JSArrayKind;
  293|  5.51M|  }
_ZN6hermes2vm9ArrayImpl12setElementAtENS0_6HandleIS1_EERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
   54|  1.58M|      Handle<> value) {
   55|  1.58M|    auto result = _setOwnIndexedImpl(selfHandle, runtime, index, value);
   56|  1.58M|    (void)result;
   57|  1.58M|    assert(
   58|  1.58M|        result != ExecutionStatus::EXCEPTION && *result &&
   59|  1.58M|        "JSArrayImpl::setElementAt() failing");
   60|  1.58M|  }
_ZN6hermes2vm9ArrayImpl7classofEPKNS0_6GCCellE:
   24|  8.80M|  static bool classof(const GCCell *cell) {
   25|  8.80M|    return kindInRange(
   26|  8.80M|        cell->getKind(),
   27|  8.80M|        CellKind::ArrayImplKind_first,
   28|  8.80M|        CellKind::ArrayImplKind_last);
   29|  8.80M|  }
_ZN6hermes2vm9ArrayImpl26unsafeSetExistingElementAtEPS1_RNS0_7RuntimeEjNS0_13HermesValue32E:
   70|   411k|      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|   411k|    assert(!self->flags_.noExtend && "this array cannot be extended");
   74|       |
   75|   411k|    assert(
   76|   411k|        index >= self->beginIndex_ && index < self->endIndex_ &&
   77|   411k|        "array index out of range");
   78|   411k|    self->getIndexedStorage(runtime)->set(
   79|   411k|        runtime, index - self->beginIndex_, value);
   80|   411k|  }
_ZNK6hermes2vm9ArrayImpl11getEndIndexEv:
   98|     45|  size_type getEndIndex() const {
   99|     45|    return endIndex_;
  100|     45|  }
_ZNK6hermes2vm9ArrayImpl2atERNS0_7RuntimeEj:
  104|  1.85M|  const SmallHermesValue at(Runtime &runtime, size_type index) const {
  105|  1.85M|    return index >= beginIndex_ && index < endIndex_
  ------------------
  |  Branch (105:12): [True: 1.85M, False: 0]
  |  Branch (105:36): [True: 1.58M, False: 271k]
  ------------------
  106|  1.85M|        ? getIndexedStorage(runtime)->at(runtime, index - beginIndex_)
  107|  1.85M|        : SmallHermesValue::encodeEmptyValue();
  108|  1.85M|  }
_ZNK6hermes2vm9ArrayImpl17getIndexedStorageERNS0_11PointerBaseE:
  117|  7.63M|  StorageType *getIndexedStorage(PointerBase &base) const {
  118|  7.63M|    return indexedStorage_.get(base);
  119|  7.63M|  }
_ZN6hermes2vm9ArrayImpl17setIndexedStorageERNS0_11PointerBaseEPNS0_18SegmentedArrayBaseINS0_13HermesValue32EEERNS0_7HadesGCE:
  123|   936k|  void setIndexedStorage(PointerBase &base, StorageType *p, GC &gc) {
  124|   936k|    indexedStorage_.set(base, p, gc);
  125|   936k|  }
_ZN6hermes2vm9Arguments7classofEPKNS0_6GCCellE:
  242|   355k|  static bool classof(const GCCell *cell) {
  243|   355k|    return cell->getKind() == CellKind::ArgumentsKind;
  244|   355k|  }
_ZN6hermes2vm7JSArray20jsArrayPropertyCountEv:
  267|  1.05M|  static constexpr SlotIndex jsArrayPropertyCount() {
  268|  1.05M|    return numOverlapSlots<JSArray>() + NAMED_PROPERTY_SLOTS;
  269|  1.05M|  }
_ZN6hermes2vm7JSArray15lengthPropIndexEv:
  271|    320|  static constexpr inline SlotIndex lengthPropIndex() {
  272|    320|    return jsArrayPropertyCount() - 1;
  273|    320|  }
_ZN6hermes2vm7JSArray11getCellKindEv:
  288|  2.10M|  static constexpr CellKind getCellKind() {
  289|  2.10M|    return CellKind::JSArrayKind;
  290|  2.10M|  }
_ZN6hermes2vm7JSArray17setLengthPropertyENS0_6HandleIS1_EERNS0_7RuntimeEjNS0_11PropOpFlagsE:
  353|      1|      PropOpFlags opFlags = PropOpFlags{}) {
  354|       |    // TODO: optimize this now that we know the index of the property slot.
  355|      1|    return putNamed_RJS(
  356|      1|        selfHandle,
  357|      1|        runtime,
  358|      1|        Predefined::getSymbolID(Predefined::length),
  359|      1|        runtime.makeHandle(HermesValue::encodeTrustedNumberValue(newValue)));
  360|      1|  }
_ZN6hermes2vm7JSArray9putLengthEPS1_RNS0_7RuntimeENS0_13HermesValue32E:
  373|  2.54M|  putLength(JSArray *self, Runtime &runtime, SmallHermesValue newLength) {
  374|  2.54M|    setDirectSlotValue<lengthPropIndex()>(self, newLength, runtime.getHeap());
  375|  2.54M|  }
_ZN6hermes2vm7JSArrayC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEET_:
  368|  1.05M|      : ArrayImpl(runtime, *parent, *clazz, needsBarrier) {}
_ZN6hermes2vm9ArrayImplC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeEPNS0_8JSObjectEPNS0_11HiddenClassET_:
  145|  1.05M|      : JSObject(runtime, parent, clazz, needsBarriers) {
  146|  1.05M|    flags_.indexedStorage = true;
  147|  1.05M|    flags_.fastIndexProperties = true;
  148|  1.05M|  }

_ZN6hermes2vm6JSDate7classofEPKNS0_6GCCellE:
   27|   355k|  static bool classof(const GCCell *cell) {
   28|   355k|    return cell->getKind() == CellKind::JSDateKind;
   29|   355k|  }

_ZN6hermes2vm14StackTraceInfoC2EPNS0_9CodeBlockEj:
   33|    109|      : codeBlock(codeBlock), bytecodeOffset(bytecodeOffset) {}
_ZN6hermes2vm7JSError11getCellKindEv:
   48|    106|  static constexpr CellKind getCellKind() {
   49|    106|    return CellKind::JSErrorKind;
   50|    106|  }
_ZN6hermes2vm7JSError7classofEPKNS0_6GCCellE:
   51|   355k|  static bool classof(const GCCell *cell) {
   52|   355k|    return cell->getKind() == CellKind::JSErrorKind;
   53|   355k|  }
_ZNK6hermes2vm7JSError13getStackTraceEv:
  103|     52|  const StackTrace *getStackTrace() const {
  104|     52|    return stacktrace_.get();
  105|     52|  }
_ZNK6hermes2vm7JSError9catchableEv:
  107|     52|  bool catchable() const {
  108|     52|    return catchable_;
  109|     52|  }
_ZN6hermes2vm7JSErrorC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEb:
  147|     53|      : JSObject(runtime, *parent, *clazz), catchable_{catchable} {}

_ZN6hermes2vm20LocalTimeOffsetCacheC2Ev:
   90|    160|  LocalTimeOffsetCache() {
   91|    160|    reset();
   92|    160|  }
_ZN6hermes2vm20LocalTimeOffsetCache5resetEv:
   95|    160|  void reset() {
   96|    160|    ::tzset();
   97|    160|    ltza_ = localTZA();
   98|    160|    caches_.fill(DSTCacheEntry{});
   99|    160|    candidate_ = caches_.data();
  100|    160|    epoch_ = 0;
  101|    160|    needsToReset_ = false;
  102|    160|  }

_ZNK6hermes2vm8JSObject13isProxyObjectEv:
  446|  3.06M|  bool isProxyObject() const {
  447|  3.06M|    return flags_.proxyObject;
  448|  3.06M|  }
_ZNK6hermes2vm8JSObject12isHostObjectEv:
  441|   821k|  bool isHostObject() const {
  442|   821k|    return flags_.hostObject;
  443|   821k|  }
_ZN6hermes2vm8JSObject21getOwnNamedDescriptorENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1857|  5.12M|    NamedPropertyDescriptor &desc) {
 1858|  5.12M|  return findProperty(selfHandle, runtime, name, desc).hasValue();
 1859|  5.12M|}
_ZN6hermes2vm8JSObject12findPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1985|  5.92M|    NamedPropertyDescriptor &desc) {
 1986|  5.92M|  return findProperty(
 1987|  5.92M|      selfHandle, runtime, name, PropertyFlags::invalid(), desc);
 1988|  5.92M|}
_ZN6hermes2vm8JSObject12findPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsERNS0_23NamedPropertyDescriptorE:
 1995|  13.7M|    NamedPropertyDescriptor &desc) {
 1996|  13.7M|  auto ret = HiddenClass::findProperty(
 1997|  13.7M|      createPseudoHandle(selfHandle->clazz_.getNonNull(runtime)),
 1998|  13.7M|      runtime,
 1999|  13.7M|      name,
 2000|  13.7M|      expectedFlags,
 2001|  13.7M|      desc);
 2002|  13.7M|  assert(
 2003|  13.7M|      !(selfHandle->flags_.proxyObject && ret) &&
 2004|  13.7M|      "Proxy objects should never have own properties");
 2005|  13.7M|  return ret;
 2006|  13.7M|}
_ZN6hermes2vm8JSObject17defineOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 1102|  92.9k|      PropOpFlags opFlags = PropOpFlags()) {
 1103|  92.9k|#ifdef HERMES_SLOW_DEBUG
 1104|       |    // In slow debug, check if the symbol looks like an array index. If that's
 1105|       |    // the case, it should be using defineOwnComputed instead.
 1106|  92.9k|    auto nameView = runtime.getIdentifierTable().getStringView(runtime, name);
 1107|  92.9k|    assert(
 1108|  92.9k|        !toArrayIndex(nameView) &&
 1109|  92.9k|        "Array index property should use defineOwnComputed instead");
 1110|  92.9k|#endif
 1111|  92.9k|    return defineOwnPropertyInternal(
 1112|  92.9k|        selfHandle, runtime, name, dpFlags, valueOrAccessor, opFlags);
 1113|  92.9k|  }
_ZN6hermes2vm19DefinePropertyFlags26getDefaultNewPropertyFlagsEv:
   72|   839k|  static DefinePropertyFlags getDefaultNewPropertyFlags() {
   73|   839k|    DefinePropertyFlags dpf{};
   74|   839k|    dpf.setEnumerable = 1;
   75|   839k|    dpf.enumerable = 1;
   76|   839k|    dpf.setWritable = 1;
   77|   839k|    dpf.writable = 1;
   78|   839k|    dpf.setConfigurable = 1;
   79|   839k|    dpf.configurable = 1;
   80|   839k|    dpf.setValue = 1;
   81|   839k|    return dpf;
   82|   839k|  }
_ZN6hermes2vm19DefinePropertyFlagsC2Ev:
   50|   913k|  DefinePropertyFlags() {
   51|   913k|    _flags = 0;
   52|   913k|  }
_ZN6hermes2vm8JSObject23getNamedSlotValueUnsafeEPS1_RNS0_11PointerBaseENS0_23NamedPropertyDescriptorE:
  615|  4.18M|      NamedPropertyDescriptor desc) {
  616|  4.18M|    assert(
  617|  4.18M|        !self->flags_.proxyObject && !desc.flags.proxyObject &&
  618|  4.18M|        "getNamedSlotValueUnsafe called on a Proxy");
  619|  4.18M|    assert(
  620|  4.18M|        !desc.flags.hostObject &&
  621|  4.18M|        "getNamedSlotValueUnsafe called on a HostObject");
  622|  4.18M|    return getNamedSlotValueUnsafe(self, runtime, desc.slot);
  623|  4.18M|  }
_ZN6hermes2vm8JSObject23getNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE0EEES4_PS1_RNS0_11PointerBaseEj:
 1691|  4.18M|    SlotIndex index) {
 1692|  4.18M|  assert(!self->flags_.proxyObject && "getNamedSlotValue called on a Proxy");
 1693|       |
 1694|  4.18M|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|  4.18M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.05M, False: 1.13M]
  |  |  ------------------
  ------------------
 1695|  3.05M|    return self->directProps()[index];
 1696|       |
 1697|  1.13M|  return self->propStorage_.getNonNull(runtime)->at<inl>(
 1698|  1.13M|      index - DIRECT_PROPERTY_SLOTS);
 1699|  4.18M|}
_ZN6hermes2vm8JSObject11directPropsEv:
 1530|  8.82M|GCSmallHermesValue *JSObject::directProps() {
 1531|  8.82M|  return static_cast<JSObjectAndDirectProps *>(this)->directProps_;
 1532|  8.82M|}
_ZN6hermes2vm8JSObject15getComputed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEE:
 1938|  2.52M|    Handle<> nameValHandle) {
 1939|  2.52M|  return getComputedWithReceiver_RJS(
 1940|  2.52M|      selfHandle, runtime, nameValHandle, selfHandle);
 1941|  2.52M|}
_ZN6hermes2vm8JSObject15putComputed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEES7_NS0_11PropOpFlagsE:
 1958|   272k|    PropOpFlags opFlags) {
 1959|   272k|  return putComputedWithReceiver_RJS(
 1960|   272k|      selfHandle, runtime, nameValHandle, valueHandle, selfHandle, opFlags);
 1961|   272k|}
_ZN6hermes2vm8JSObject18getDirectSlotValueILj3EEENS0_13HermesValue32EPKS1_:
 1675|  3.29M|inline SmallHermesValue JSObject::getDirectSlotValue(const JSObject *self) {
 1676|  3.29M|  static_assert(index < DIRECT_PROPERTY_SLOTS, "Must be a direct property");
 1677|  3.29M|  return self->directProps()[index];
 1678|  3.29M|}
_ZNK6hermes2vm8JSObject11directPropsEv:
 1534|  3.29M|const GCSmallHermesValue *JSObject::directProps() const {
 1535|  3.29M|  return static_cast<const JSObjectAndDirectProps *>(this)->directProps_;
 1536|  3.29M|}
_ZN6hermes2vm8JSObject12getNamed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_11PropOpFlagsEPNS0_18PropertyCacheEntryE:
 1930|  3.80M|    PropertyCacheEntry *cacheEntry) {
 1931|  3.80M|  return getNamedWithReceiver_RJS(
 1932|  3.80M|      selfHandle, runtime, name, selfHandle, opFlags, cacheEntry);
 1933|  3.80M|}
_ZN6hermes2vm8JSObject7classofEPKNS0_6GCCellE:
  382|  21.4M|  static bool classof(const GCCell *cell) {
  383|  21.4M|    return kindInRange(
  384|  21.4M|        cell->getKind(), CellKind::ObjectKind_first, CellKind::ObjectKind_last);
  385|  21.4M|  }
_ZNK6hermes2vm19DefinePropertyFlags7isEmptyEv:
   55|  1.27k|  bool isEmpty() const {
   56|  1.27k|    return _flags == 0;
   57|  1.27k|  }
_ZNK6hermes2vm19DefinePropertyFlags10isAccessorEv:
   65|  4.05M|  bool isAccessor() const {
   66|  4.05M|    return setGetter || setSetter;
  ------------------
  |  Branch (66:12): [True: 21.6k, False: 4.02M]
  |  Branch (66:25): [True: 0, False: 4.02M]
  ------------------
   67|  4.05M|  }
_ZN6hermes2vm19DefinePropertyFlags24getNewNonEnumerableFlagsEv:
   87|  66.0k|  static DefinePropertyFlags getNewNonEnumerableFlags() {
   88|  66.0k|    DefinePropertyFlags dpf{};
   89|  66.0k|    dpf.setEnumerable = 1;
   90|  66.0k|    dpf.enumerable = 0;
   91|  66.0k|    dpf.setWritable = 1;
   92|  66.0k|    dpf.writable = 1;
   93|  66.0k|    dpf.setConfigurable = 1;
   94|  66.0k|    dpf.configurable = 1;
   95|  66.0k|    dpf.setValue = 1;
   96|  66.0k|    return dpf;
   97|  66.0k|  }
_ZN6hermes2vm11ObjectFlagsC2Ev:
  141|  1.50M|  ObjectFlags() {
  142|  1.50M|    ::memset(this, 0, sizeof(*this));
  143|  1.50M|  }
_ZN6hermes2vm8JSObjectC2ERNS0_7RuntimeEPS1_PNS0_11HiddenClassE:
  354|  84.6k|      : JSObject(runtime, parent, clazz, GCPointerBase::NoBarriers()) {
  355|       |    // Direct property slots are initialized by initDirectPropStorage.
  356|  84.6k|  }
_ZN6hermes2vm8JSObject11getCellKindEv:
  379|   729k|  static constexpr CellKind getCellKind() {
  380|   729k|    return CellKind::JSObjectKind;
  381|   729k|  }
_ZNK6hermes2vm8JSObject12isExtensibleEv:
  431|  2.60M|  bool isExtensible() const {
  432|  2.60M|    return !flags_.noExtend;
  433|  2.60M|  }
_ZNK6hermes2vm8JSObject6isLazyEv:
  436|  2.42M|  bool isLazy() const {
  437|  2.42M|    return flags_.lazyObject;
  438|  2.42M|  }
_ZNK6hermes2vm8JSObject9getParentERNS0_7RuntimeE:
  457|  4.68M|  JSObject *getParent(Runtime &runtime) const {
  458|  4.68M|    return parent_.get(runtime);
  459|  4.68M|  }
_ZNK6hermes2vm8JSObject8getClassERNS0_11PointerBaseE:
  462|  1.27M|  HiddenClass *getClass(PointerBase &base) const {
  463|  1.27M|    return clazz_.getNonNull(base);
  464|  1.27M|  }
_ZNK6hermes2vm8JSObject13getClassGCPtrEv:
  467|  2.08M|  const GCPointer<HiddenClass> &getClassGCPtr() const {
  468|  2.08M|    return clazz_;
  469|  2.08M|  }
_ZN6hermes2vm8JSObject19getOwnPropertyNamesENS0_6HandleIS1_EERNS0_7RuntimeEb:
  567|     45|      bool onlyEnumerable) {
  568|     45|    return getOwnPropertyKeys(
  569|     45|        selfHandle,
  570|     45|        runtime,
  571|     45|        OwnKeysFlags().plusIncludeNonSymbols().setIncludeNonEnumerable(
  572|     45|            !onlyEnumerable));
  573|     45|  }
_ZN6hermes2vm8JSObject23setNamedSlotValueUnsafeEPS1_RNS0_7RuntimeENS0_23NamedPropertyDescriptorENS0_13HermesValue32E:
  664|    402|      SmallHermesValue value) {
  665|    402|    assert(!desc.flags.proxyObject && "setNamedSlotValue called on a Proxy");
  666|    402|    assert(
  667|    402|        !desc.flags.hostObject && "setNamedSlotValue called on a HostObject");
  668|    402|    setNamedSlotValueUnsafe(self, runtime, desc.slot, value);
  669|    402|  }
_ZN6hermes2vm8JSObject13getOwnIndexedENS0_12PseudoHandleIS1_EERNS0_7RuntimeEj:
 1050|   271k|  getOwnIndexed(PseudoHandle<JSObject> self, Runtime &runtime, uint32_t index) {
 1051|   271k|    const auto *vtable = self->getVT();
 1052|   271k|    return vtable->getOwnIndexed(std::move(self), runtime, index);
 1053|   271k|  }
_ZN6hermes2vm8JSObject13setOwnIndexedENS0_6HandleIS1_EERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
 1060|  1.09M|      Handle<> value) {
 1061|  1.09M|    return selfHandle->getVT()->setOwnIndexed(
 1062|  1.09M|        selfHandle, runtime, index, value);
 1063|  1.09M|  }
_ZNK6hermes2vm8JSObject5getVTEv:
 1351|  5.94M|  const ObjectVTable *getVT() const {
 1352|  5.94M|    return static_cast<const ObjectVTable *>(GCCell::getVT());
 1353|  5.94M|  }
_ZN6hermes2vm8JSObject17directPropsOffsetEv:
 1538|  3.00M|constexpr size_t JSObject::directPropsOffset() {
 1539|  3.00M|  return llvh::alignTo<alignof(GCSmallHermesValue)>(sizeof(JSObject));
 1540|  3.00M|}
_ZN6hermes2vm8JSObject16cellSizeJSObjectEv:
 1542|  1.42M|constexpr size_t JSObject::cellSizeJSObject() {
 1543|  1.42M|  static_assert(
 1544|  1.42M|      sizeof(JSObjectAndDirectProps) ==
 1545|  1.42M|          directPropsOffset() +
 1546|  1.42M|              sizeof(GCSmallHermesValue) * DIRECT_PROPERTY_SLOTS,
 1547|  1.42M|      "unexpected padding");
 1548|  1.42M|  static_assert(
 1549|  1.42M|      heapAlignSize(sizeof(JSObjectAndDirectProps)) ==
 1550|  1.42M|          sizeof(JSObjectAndDirectProps),
 1551|  1.42M|      "Wasted direct slot due to alignment");
 1552|  1.42M|  return sizeof(JSObjectAndDirectProps);
 1553|  1.42M|}
_ZN6hermes2vm8JSObject19allocatePropStorageENS0_6HandleIS1_EERNS0_7RuntimeEj:
 1629|  70.5k|    PropStorage::size_type size) {
 1630|  70.5k|  if (LLVM_LIKELY(size <= DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|  70.5k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 70.5k, False: 0]
  |  |  ------------------
  ------------------
 1631|  70.5k|    return ExecutionStatus::RETURNED;
 1632|       |
 1633|      0|  auto res = PropStorage::create(
 1634|      0|      runtime, size - DIRECT_PROPERTY_SLOTS, size - DIRECT_PROPERTY_SLOTS);
 1635|      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]
  |  |  ------------------
  ------------------
 1636|      0|    return ExecutionStatus::EXCEPTION;
 1637|       |
 1638|      0|  selfHandle->propStorage_.setNonNull(
 1639|      0|      runtime, vmcast<PropStorage>(*res), runtime.getHeap());
 1640|      0|  return ExecutionStatus::RETURNED;
 1641|      0|}
_ZN6hermes2vm8JSObject17getNamedSlotValueENS0_6HandleIS1_EERNS0_7RuntimeENS0_23NamedPropertyDescriptorE:
 1718|  1.20k|    NamedPropertyDescriptor desc) {
 1719|  1.20k|  if (LLVM_UNLIKELY(desc.flags.proxyObject) ||
  ------------------
  |  |  189|  2.40k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.20k]
  |  |  ------------------
  ------------------
 1720|  1.20k|      LLVM_UNLIKELY(desc.flags.hostObject)) {
  ------------------
  |  |  189|  1.20k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.20k]
  |  |  ------------------
  ------------------
 1721|      0|    SymbolID name = SymbolID::unsafeCreate(desc.slot);
 1722|      0|    assert(name.isValid() && "invalid SymbolID in descriptor");
 1723|      0|    return getNamed_RJS(self, runtime, name);
 1724|      0|  }
 1725|  1.20k|  return createPseudoHandle(
 1726|  1.20k|      getNamedSlotValueUnsafe(self.get(), runtime, desc).unboxToHV(runtime));
 1727|  1.20k|}
_ZN6hermes2vm8JSObject26getComputedSlotValueUnsafeENS0_12PseudoHandleIS1_EERNS0_7RuntimeENS0_26ComputedPropertyDescriptorE:
 1795|   729k|    ComputedPropertyDescriptor desc) {
 1796|   729k|  if (LLVM_LIKELY(desc.flags.indexed)) {
  ------------------
  |  |  188|   729k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 729k]
  |  |  ------------------
  ------------------
 1797|      0|    assert(
 1798|      0|        self->flags_.indexedStorage &&
 1799|      0|        "indexed flag set but no indexed storage");
 1800|      0|    return getOwnIndexed(std::move(self), runtime, desc.slot);
 1801|      0|  }
 1802|       |  // Call is valid because this function cannot be called with a Proxy.
 1803|   729k|  return getNamedSlotValueUnsafe(
 1804|   729k|             self.get(), runtime, desc.castToNamedPropertyDescriptorRef())
 1805|   729k|      .unboxToHV(runtime);
 1806|   729k|}
_ZN6hermes2vm8JSObject28tryGetOwnNamedDescriptorFastEPS1_RNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1865|  1.12M|    NamedPropertyDescriptor &desc) {
 1866|  1.12M|  return HiddenClass::tryFindPropertyFast(
 1867|  1.12M|      self->clazz_.getNonNull(runtime), runtime, name, desc);
 1868|  1.12M|}
_ZN6hermes2vm8JSObject28getNamedDescriptorPredefinedENS0_6HandleIS1_EERNS0_7RuntimeENS0_10Predefined3StrERNS0_23NamedPropertyDescriptorE:
 1894|    114|    NamedPropertyDescriptor &desc) {
 1895|    114|  return getNamedDescriptorUnsafe(
 1896|    114|      selfHandle,
 1897|    114|      runtime,
 1898|    114|      Predefined::getSymbolID(name),
 1899|    114|      PropertyFlags::invalid(),
 1900|    114|      desc);
 1901|    114|}
_ZN6hermes2vm8JSObject24getNamedDescriptorUnsafeENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1920|  3.80M|    NamedPropertyDescriptor &desc) {
 1921|  3.80M|  return getNamedDescriptorUnsafe(
 1922|  3.80M|      selfHandle, runtime, name, PropertyFlags::invalid(), desc);
 1923|  3.80M|}
_ZN6hermes2vm8JSObject12putNamed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 1948|   549k|    PropOpFlags opFlags) {
 1949|   549k|  return putNamedWithReceiver_RJS(
 1950|   549k|      selfHandle, runtime, name, valueHandle, selfHandle, opFlags);
 1951|   549k|}
_ZN6hermes2vm8JSObject18getOwnIndexedRangeEPS1_RNS0_7RuntimeE:
 1965|     45|    Runtime &runtime) {
 1966|     45|  return self->getVT()->getOwnIndexedRange(self, runtime);
 1967|     45|};
_ZN6hermes2vm8JSObject14haveOwnIndexedEPS1_RNS0_7RuntimeEj:
 1970|   271k|JSObject::haveOwnIndexed(JSObject *self, Runtime &runtime, uint32_t index) {
 1971|   271k|  return self->getVT()->haveOwnIndexed(self, runtime, index);
 1972|   271k|}
_ZN6hermes2vm8JSObject26getOwnIndexedPropertyFlagsEPS1_RNS0_7RuntimeEj:
 1977|  4.29M|    uint32_t index) {
 1978|  4.29M|  return self->getVT()->getOwnIndexedPropertyFlags(self, runtime, index);
 1979|  4.29M|}
_ZNK6hermes2vm8JSObject16shouldCacheForInERNS0_7RuntimeE:
 2008|     45|inline bool JSObject::shouldCacheForIn(Runtime &runtime) const {
 2009|     45|  return !clazz_.getNonNull(runtime)->isDictionary() &&
  ------------------
  |  Branch (2009:10): [True: 45, False: 0]
  ------------------
 2010|     45|      !flags_.indexedStorage && !flags_.hostObject && !flags_.proxyObject;
  ------------------
  |  Branch (2010:7): [True: 0, False: 45]
  |  Branch (2010:33): [True: 0, False: 0]
  |  Branch (2010:55): [True: 0, False: 0]
  ------------------
 2011|     45|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_14NativeFunctionEEEjv:
 1515|   141k|  static constexpr unsigned numOverlapSlots() {
 1516|   141k|    static_assert(
 1517|   141k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|   141k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|   141k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|   141k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|   141k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17NativeConstructorEEEjv:
 1515|  13.4k|  static constexpr unsigned numOverlapSlots() {
 1516|  13.4k|    static_assert(
 1517|  13.4k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|  13.4k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|  13.4k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|  13.4k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|  13.4k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15DecoratedObjectEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_7JSArrayEEEjv:
 1515|  2.10M|  static constexpr unsigned numOverlapSlots() {
 1516|  2.10M|    static_assert(
 1517|  2.10M|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|  2.10M|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|  2.10M|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|  2.10M|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|  2.10M|  }
_ZN6hermes2vm8JSObject23getNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE1EEES4_PS1_RNS0_11PointerBaseEj:
 1691|   961k|    SlotIndex index) {
 1692|   961k|  assert(!self->flags_.proxyObject && "getNamedSlotValue called on a Proxy");
 1693|       |
 1694|   961k|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|   961k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 160, False: 960k]
  |  |  ------------------
  ------------------
 1695|    160|    return self->directProps()[index];
 1696|       |
 1697|   960k|  return self->propStorage_.getNonNull(runtime)->at<inl>(
 1698|   960k|      index - DIRECT_PROPERTY_SLOTS);
 1699|   961k|}
_ZN6hermes2vm8JSObject23setNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE1EEEvPS1_RNS0_7RuntimeEjS4_:
 1754|  1.60k|    SmallHermesValue value) {
 1755|       |  // NOTE: even though it is tempting to implement this in terms of assignment
 1756|       |  // to namedSlotRef(), it is a slight performance regression, which is not
 1757|       |  // entirely unexpected.
 1758|  1.60k|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|  1.60k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.60k, False: 0]
  |  |  ------------------
  ------------------
 1759|  1.60k|    return self->directProps()[index].set(value, runtime.getHeap());
 1760|       |
 1761|      0|  self->propStorage_.getNonNull(runtime)->set<inl>(
 1762|      0|      index - DIRECT_PROPERTY_SLOTS, value, runtime.getHeap());
 1763|      0|}
_ZN6hermes2vm8JSObject23setNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE0EEEvPS1_RNS0_7RuntimeEjS4_:
 1754|   841k|    SmallHermesValue value) {
 1755|       |  // NOTE: even though it is tempting to implement this in terms of assignment
 1756|       |  // to namedSlotRef(), it is a slight performance regression, which is not
 1757|       |  // entirely unexpected.
 1758|   841k|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|   841k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 640, False: 840k]
  |  |  ------------------
  ------------------
 1759|    640|    return self->directProps()[index].set(value, runtime.getHeap());
 1760|       |
 1761|   840k|  self->propStorage_.getNonNull(runtime)->set<inl>(
 1762|   840k|      index - DIRECT_PROPERTY_SLOTS, value, runtime.getHeap());
 1763|   840k|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_17NativeConstructorEEEjv:
 1501|  6.72k|  static constexpr uint32_t cellSizeImpl() {
 1502|  6.72k|    static_assert(
 1503|  6.72k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|  6.72k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|  6.72k|  }
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_17NativeConstructorEEEPT_RNS0_7RuntimeES5_:
 1661|  6.72k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|  6.72k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|  6.72k|  static_assert(
 1664|  6.72k|      count <= DIRECT_PROPERTY_SLOTS,
 1665|  6.72k|      "smallPropStorage size must fit in direct properties");
 1666|  6.72k|  GCSmallHermesValue::uninitialized_fill(
 1667|  6.72k|      self->directProps() + numOverlapSlots<T>(),
 1668|  6.72k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|  6.72k|      SmallHermesValue::encodeUndefinedValue(),
 1670|  6.72k|      runtime.getHeap());
 1671|  6.72k|  return self;
 1672|  6.72k|}
_ZN6hermes2vm8JSObject18setDirectSlotValueILj3EEEvPS1_NS0_13HermesValue32ERNS0_7HadesGCE:
 1682|  2.54M|JSObject::setDirectSlotValue(JSObject *self, SmallHermesValue value, GC &gc) {
 1683|  2.54M|  static_assert(index < DIRECT_PROPERTY_SLOTS, "Must be a direct property");
 1684|  2.54M|  self->directProps()[index].set(value, gc);
 1685|  2.54M|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8CallableEEEjv:
 1515|      9|  static constexpr unsigned numOverlapSlots() {
 1516|      9|    static_assert(
 1517|      9|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      9|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      9|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      9|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      9|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13BoundFunctionEEEjv:
 1515|    321|  static constexpr unsigned numOverlapSlots() {
 1516|    321|    static_assert(
 1517|    321|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    321|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    321|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    321|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    321|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10JSFunctionEEEjv:
 1515|  12.4k|  static constexpr unsigned numOverlapSlots() {
 1516|  12.4k|    static_assert(
 1517|  12.4k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|  12.4k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|  12.4k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|  12.4k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|  12.4k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15JSAsyncFunctionEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_19JSGeneratorFunctionEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_22GeneratorInnerFunctionEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObjectC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeEPS1_PNS0_11HiddenClassET_:
  332|  1.13M|      : parent_(runtime, parent, runtime.getHeap(), needsBarriers),
  333|  1.13M|        clazz_(runtime, clazz, runtime.getHeap(), needsBarriers),
  334|  1.13M|        propStorage_(nullptr) {
  335|       |    // Direct property slots are initialized by initDirectPropStorage.
  336|  1.13M|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_13BoundFunctionEEEjv:
 1501|    160|  static constexpr uint32_t cellSizeImpl() {
 1502|    160|    static_assert(
 1503|    160|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|    160|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|    160|  }
Callable.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_13BoundFunctionEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1576|    160|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1577|       |  // Check that the object looks well-formed.
 1578|    160|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1579|    160|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1580|    160|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_13BoundFunctionEEEPT_RNS0_7RuntimeES5_:
 1661|    160|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|    160|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|    160|  static_assert(
 1664|    160|      count <= DIRECT_PROPERTY_SLOTS,
 1665|    160|      "smallPropStorage size must fit in direct properties");
 1666|    160|  GCSmallHermesValue::uninitialized_fill(
 1667|    160|      self->directProps() + numOverlapSlots<T>(),
 1668|    160|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|    160|      SmallHermesValue::encodeUndefinedValue(),
 1670|    160|      runtime.getHeap());
 1671|    160|  return self;
 1672|    160|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_14NativeFunctionEEEjv:
 1501|  70.5k|  static constexpr uint32_t cellSizeImpl() {
 1502|  70.5k|    static_assert(
 1503|  70.5k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|  70.5k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|  70.5k|  }
Callable.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_14NativeFunctionEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1576|  70.5k|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1577|       |  // Check that the object looks well-formed.
 1578|  70.5k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1579|  70.5k|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1580|  70.5k|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_14NativeFunctionEEEPT_RNS0_7RuntimeES5_:
 1661|  70.5k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|  70.5k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|  70.5k|  static_assert(
 1664|  70.5k|      count <= DIRECT_PROPERTY_SLOTS,
 1665|  70.5k|      "smallPropStorage size must fit in direct properties");
 1666|  70.5k|  GCSmallHermesValue::uninitialized_fill(
 1667|  70.5k|      self->directProps() + numOverlapSlots<T>(),
 1668|  70.5k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|  70.5k|      SmallHermesValue::encodeUndefinedValue(),
 1670|  70.5k|      runtime.getHeap());
 1671|  70.5k|  return self;
 1672|  70.5k|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_10JSFunctionEEEjv:
 1501|  6.19k|  static constexpr uint32_t cellSizeImpl() {
 1502|  6.19k|    static_assert(
 1503|  6.19k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|  6.19k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|  6.19k|  }
Callable.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_10JSFunctionEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1586|  6.19k|    JSObjectType *obj) {
 1587|  6.19k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1588|  6.19k|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1589|  6.19k|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_10JSFunctionEEEPT_RNS0_7RuntimeES5_:
 1661|  6.19k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|  6.19k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|  6.19k|  static_assert(
 1664|  6.19k|      count <= DIRECT_PROPERTY_SLOTS,
 1665|  6.19k|      "smallPropStorage size must fit in direct properties");
 1666|  6.19k|  GCSmallHermesValue::uninitialized_fill(
 1667|  6.19k|      self->directProps() + numOverlapSlots<T>(),
 1668|  6.19k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|  6.19k|      SmallHermesValue::encodeUndefinedValue(),
 1670|  6.19k|      runtime.getHeap());
 1671|  6.19k|  return self;
 1672|  6.19k|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_14RequireContextEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsIS1_EEjv:
 1515|   729k|  static constexpr unsigned numOverlapSlots() {
 1516|   729k|    static_assert(
 1517|   729k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|   729k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|   729k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|   729k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|   729k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9ArrayImplEEEjv:
 1515|      2|  static constexpr unsigned numOverlapSlots() {
 1516|      2|    static_assert(
 1517|      2|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      2|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      2|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      2|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      2|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9ArgumentsEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15JSArrayIteratorEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_7JSArrayEEEjv:
 1501|  1.05M|  static constexpr uint32_t cellSizeImpl() {
 1502|  1.05M|    static_assert(
 1503|  1.05M|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|  1.05M|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|  1.05M|  }
JSArray.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_7JSArrayEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1576|  1.05M|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1577|       |  // Check that the object looks well-formed.
 1578|  1.05M|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1579|  1.05M|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1580|  1.05M|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_7JSArrayEEEPT_RNS0_7RuntimeES5_:
 1661|  1.05M|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|  1.05M|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|  1.05M|  static_assert(
 1664|  1.05M|      count <= DIRECT_PROPERTY_SLOTS,
 1665|  1.05M|      "smallPropStorage size must fit in direct properties");
 1666|  1.05M|  GCSmallHermesValue::uninitialized_fill(
 1667|  1.05M|      self->directProps() + numOverlapSlots<T>(),
 1668|  1.05M|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|  1.05M|      SmallHermesValue::encodeUndefinedValue(),
 1670|  1.05M|      runtime.getHeap());
 1671|  1.05M|  return self;
 1672|  1.05M|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13JSArrayBufferEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10JSDataViewEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_6JSDateEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_7JSErrorEEEjv:
 1515|    107|  static constexpr unsigned numOverlapSlots() {
 1516|    107|    static_assert(
 1517|    107|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    107|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    107|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    107|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    107|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_7JSErrorEEEjv:
 1501|     53|  static constexpr uint32_t cellSizeImpl() {
 1502|     53|    static_assert(
 1503|     53|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|     53|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|     53|  }
JSError.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_7JSErrorEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1586|     53|    JSObjectType *obj) {
 1587|     53|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1588|     53|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1589|     53|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_7JSErrorEEEPT_RNS0_7RuntimeES5_:
 1661|     53|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|     53|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|     53|  static_assert(
 1664|     53|      count <= DIRECT_PROPERTY_SLOTS,
 1665|     53|      "smallPropStorage size must fit in direct properties");
 1666|     53|  GCSmallHermesValue::uninitialized_fill(
 1667|     53|      self->directProps() + numOverlapSlots<T>(),
 1668|     53|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|     53|      SmallHermesValue::encodeUndefinedValue(),
 1670|     53|      runtime.getHeap());
 1671|     53|  return self;
 1672|     53|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_11JSGeneratorEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObjectC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeENS0_6HandleIS1_EENS7_INS0_11HiddenClassEEET_:
  344|   364k|      : parent_(runtime, *parent, runtime.getHeap(), needsBarriers),
  345|   364k|        clazz_(runtime, *clazz, runtime.getHeap(), needsBarriers),
  346|   364k|        propStorage_(nullptr) {
  347|       |    // Direct property slots are initialized by initDirectPropStorage.
  348|   364k|  }
_ZN6hermes2vm8JSObject12cellSizeImplIS1_EEjv:
 1501|   364k|  static constexpr uint32_t cellSizeImpl() {
 1502|   364k|    static_assert(
 1503|   364k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|   364k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|   364k|  }
JSObject.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_8JSObjectEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1586|   364k|    JSObjectType *obj) {
 1587|   364k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1588|   364k|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1589|   364k|}
_ZN6hermes2vm8JSObject21initDirectPropStorageIS1_EEPT_RNS0_7RuntimeES4_:
 1661|   364k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|   364k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|   364k|  static_assert(
 1664|   364k|      count <= DIRECT_PROPERTY_SLOTS,
 1665|   364k|      "smallPropStorage size must fit in direct properties");
 1666|   364k|  GCSmallHermesValue::uninitialized_fill(
 1667|   364k|      self->directProps() + numOverlapSlots<T>(),
 1668|   364k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|   364k|      SmallHermesValue::encodeUndefinedValue(),
 1670|   364k|      runtime.getHeap());
 1671|   364k|  return self;
 1672|   364k|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_7JSProxyEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSRegExpEEEjv:
 1515|     17|  static constexpr unsigned numOverlapSlots() {
 1516|     17|    static_assert(
 1517|     17|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|     17|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|     17|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|     17|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|     17|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_8JSRegExpEEEjv:
 1501|      8|  static constexpr uint32_t cellSizeImpl() {
 1502|      8|    static_assert(
 1503|      8|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|      8|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|      8|  }
JSRegExp.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_8JSRegExpEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1586|      8|    JSObjectType *obj) {
 1587|      8|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1588|      8|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1589|      8|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_8JSRegExpEEEPT_RNS0_7RuntimeES5_:
 1661|      8|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|      8|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|      8|  static_assert(
 1664|      8|      count <= DIRECT_PROPERTY_SLOTS,
 1665|      8|      "smallPropStorage size must fit in direct properties");
 1666|      8|  GCSmallHermesValue::uninitialized_fill(
 1667|      8|      self->directProps() + numOverlapSlots<T>(),
 1668|      8|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|      8|      SmallHermesValue::encodeUndefinedValue(),
 1670|      8|      runtime.getHeap());
 1671|      8|  return self;
 1672|      8|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSMapImplILNS0_8CellKindE47EEEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSMapImplILNS0_8CellKindE48EEEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17JSMapIteratorImplILNS0_8CellKindE50EEEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17JSMapIteratorImplILNS0_8CellKindE49EEEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_16JSTypedArrayBaseEEEjv:
 1515|     11|  static constexpr unsigned numOverlapSlots() {
 1516|     11|    static_assert(
 1517|     11|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|     11|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|     11|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|     11|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|     11|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13JSWeakMapImplILNS0_8CellKindE51EEEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13JSWeakMapImplILNS0_8CellKindE52EEEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17JSWeakMapImplBaseEEEjv:
 1515|      2|  static constexpr unsigned numOverlapSlots() {
 1516|      2|    static_assert(
 1517|      2|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      2|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      2|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      2|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      2|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSWeakRefEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_25FinalizableNativeFunctionEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10HostObjectEEEjv:
 1515|    321|  static constexpr unsigned numOverlapSlots() {
 1516|    321|    static_assert(
 1517|    321|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    321|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    321|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    321|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    321|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_10HostObjectEEEjv:
 1501|    160|  static constexpr uint32_t cellSizeImpl() {
 1502|    160|    static_assert(
 1503|    160|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|    160|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|    160|  }
HostModel.cpp:_ZN6hermes2vm12JSObjectInitL17initToHermesValueINS0_10HostObjectEEENS0_11HermesValueERNS0_7RuntimeEPT_:
 1593|    160|static HermesValue initToHermesValue(Runtime &runtime, JSObjectType *obj) {
 1594|    160|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1595|    160|  return HermesValue::encodeObjectValue(
 1596|    160|      JSObjectType::initDirectPropStorage(runtime, obj));
 1597|    160|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_10HostObjectEEEPT_RNS0_7RuntimeES5_:
 1661|    160|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|    160|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|    160|  static_assert(
 1664|    160|      count <= DIRECT_PROPERTY_SLOTS,
 1665|    160|      "smallPropStorage size must fit in direct properties");
 1666|    160|  GCSmallHermesValue::uninitialized_fill(
 1667|    160|      self->directProps() + numOverlapSlots<T>(),
 1668|    160|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|    160|      SmallHermesValue::encodeUndefinedValue(),
 1670|    160|      runtime.getHeap());
 1671|    160|  return self;
 1672|    160|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSStringEEEjv:
 1515|    351|  static constexpr unsigned numOverlapSlots() {
 1516|    351|    static_assert(
 1517|    351|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    351|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    351|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    351|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    351|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_16JSStringIteratorEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSBigIntEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSNumberEEEjv:
 1515|    323|  static constexpr unsigned numOverlapSlots() {
 1516|    323|    static_assert(
 1517|    323|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    323|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    323|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    323|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    323|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSBooleanEEEjv:
 1515|    321|  static constexpr unsigned numOverlapSlots() {
 1516|    321|    static_assert(
 1517|    321|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    321|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    321|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    321|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    321|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSSymbolEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_8JSStringEEEjv:
 1501|    175|  static constexpr uint32_t cellSizeImpl() {
 1502|    175|    static_assert(
 1503|    175|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|    175|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|    175|  }
PrimitiveBox.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_8JSStringEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1576|    175|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1577|       |  // Check that the object looks well-formed.
 1578|    175|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1579|    175|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1580|    175|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_8JSStringEEEPT_RNS0_7RuntimeES5_:
 1661|    175|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|    175|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|    175|  static_assert(
 1664|    175|      count <= DIRECT_PROPERTY_SLOTS,
 1665|    175|      "smallPropStorage size must fit in direct properties");
 1666|    175|  GCSmallHermesValue::uninitialized_fill(
 1667|    175|      self->directProps() + numOverlapSlots<T>(),
 1668|    175|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|    175|      SmallHermesValue::encodeUndefinedValue(),
 1670|    175|      runtime.getHeap());
 1671|    175|  return self;
 1672|    175|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_8JSNumberEEEjv:
 1501|    161|  static constexpr uint32_t cellSizeImpl() {
 1502|    161|    static_assert(
 1503|    161|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|    161|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|    161|  }
PrimitiveBox.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_8JSNumberEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1586|    161|    JSObjectType *obj) {
 1587|    161|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1588|    161|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1589|    161|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_8JSNumberEEEPT_RNS0_7RuntimeES5_:
 1661|    161|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|    161|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|    161|  static_assert(
 1664|    161|      count <= DIRECT_PROPERTY_SLOTS,
 1665|    161|      "smallPropStorage size must fit in direct properties");
 1666|    161|  GCSmallHermesValue::uninitialized_fill(
 1667|    161|      self->directProps() + numOverlapSlots<T>(),
 1668|    161|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|    161|      SmallHermesValue::encodeUndefinedValue(),
 1670|    161|      runtime.getHeap());
 1671|    161|  return self;
 1672|    161|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_9JSBooleanEEEjv:
 1501|    160|  static constexpr uint32_t cellSizeImpl() {
 1502|    160|    static_assert(
 1503|    160|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|    160|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|    160|  }
PrimitiveBox.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_9JSBooleanEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1586|    160|    JSObjectType *obj) {
 1587|    160|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1588|    160|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1589|    160|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_9JSBooleanEEEPT_RNS0_7RuntimeES5_:
 1661|    160|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|    160|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|    160|  static_assert(
 1664|    160|      count <= DIRECT_PROPERTY_SLOTS,
 1665|    160|      "smallPropStorage size must fit in direct properties");
 1666|    160|  GCSmallHermesValue::uninitialized_fill(
 1667|    160|      self->directProps() + numOverlapSlots<T>(),
 1668|    160|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|    160|      SmallHermesValue::encodeUndefinedValue(),
 1670|    160|      runtime.getHeap());
 1671|    160|  return self;
 1672|    160|}
AsyncFunction.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_17NativeConstructorEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1586|  6.72k|    JSObjectType *obj) {
 1587|  6.72k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1588|  6.72k|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1589|  6.72k|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_12SingleObjectILNS0_8CellKindE60EEEEEjv:
 1501|    160|  static constexpr uint32_t cellSizeImpl() {
 1502|    160|    static_assert(
 1503|    160|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|    160|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|    160|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_12SingleObjectILNS0_8CellKindE60EEEEEjv:
 1515|    321|  static constexpr unsigned numOverlapSlots() {
 1516|    321|    static_assert(
 1517|    321|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    321|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    321|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    321|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    321|  }
Math.cpp:_ZN6hermes2vm12JSObjectInitL17initToHermesValueINS0_12SingleObjectILNS0_8CellKindE60EEEEENS0_11HermesValueERNS0_7RuntimeEPT_:
 1593|    160|static HermesValue initToHermesValue(Runtime &runtime, JSObjectType *obj) {
 1594|    160|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1595|    160|  return HermesValue::encodeObjectValue(
 1596|    160|      JSObjectType::initDirectPropStorage(runtime, obj));
 1597|    160|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_12SingleObjectILNS0_8CellKindE60EEEEEPT_RNS0_7RuntimeES7_:
 1661|    160|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|    160|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|    160|  static_assert(
 1664|    160|      count <= DIRECT_PROPERTY_SLOTS,
 1665|    160|      "smallPropStorage size must fit in direct properties");
 1666|    160|  GCSmallHermesValue::uninitialized_fill(
 1667|    160|      self->directProps() + numOverlapSlots<T>(),
 1668|    160|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|    160|      SmallHermesValue::encodeUndefinedValue(),
 1670|    160|      runtime.getHeap());
 1671|    160|  return self;
 1672|    160|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_12SingleObjectILNS0_8CellKindE59EEEEEjv:
 1501|    160|  static constexpr uint32_t cellSizeImpl() {
 1502|    160|    static_assert(
 1503|    160|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1504|    160|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1504:12): [Folded - Ignored]
  ------------------
 1505|    160|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_12SingleObjectILNS0_8CellKindE59EEEEEjv:
 1515|    321|  static constexpr unsigned numOverlapSlots() {
 1516|    321|    static_assert(
 1517|    321|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|    321|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|    321|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|    321|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|    321|  }
JSON.cpp:_ZN6hermes2vm12JSObjectInitL17initToHermesValueINS0_12SingleObjectILNS0_8CellKindE59EEEEENS0_11HermesValueERNS0_7RuntimeEPT_:
 1593|    160|static HermesValue initToHermesValue(Runtime &runtime, JSObjectType *obj) {
 1594|    160|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1595|    160|  return HermesValue::encodeObjectValue(
 1596|    160|      JSObjectType::initDirectPropStorage(runtime, obj));
 1597|    160|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_12SingleObjectILNS0_8CellKindE59EEEEEPT_RNS0_7RuntimeES7_:
 1661|    160|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1662|    160|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1663|    160|  static_assert(
 1664|    160|      count <= DIRECT_PROPERTY_SLOTS,
 1665|    160|      "smallPropStorage size must fit in direct properties");
 1666|    160|  GCSmallHermesValue::uninitialized_fill(
 1667|    160|      self->directProps() + numOverlapSlots<T>(),
 1668|    160|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1669|    160|      SmallHermesValue::encodeUndefinedValue(),
 1670|    160|      runtime.getHeap());
 1671|    160|  return self;
 1672|    160|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10JSCallSiteEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15JSCallableProxyEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_22JSRegExpStringIteratorEEEjv:
 1515|      1|  static constexpr unsigned numOverlapSlots() {
 1516|      1|    static_assert(
 1517|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1518|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1519|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1520|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1521|      1|  }

_ZN6hermes2vm8JSRegExp11getCellKindEv:
   28|     16|  static constexpr CellKind getCellKind() {
   29|     16|    return CellKind::JSRegExpKind;
   30|     16|  }
_ZN6hermes2vm8JSRegExp7classofEPKNS0_6GCCellE:
   31|   355k|  static bool classof(const GCCell *cell) {
   32|   355k|    return cell->getKind() == CellKind::JSRegExpKind;
   33|   355k|  }
_ZN6hermes2vm8JSRegExp6createERNS0_7RuntimeE:
   42|      8|  static PseudoHandle<JSRegExp> create(Runtime &runtime) {
   43|      8|    return create(runtime, Handle<JSObject>::vmcast(&runtime.regExpPrototype));
   44|      8|  }
_ZN6hermes2vm8JSRegExp14getSyntaxFlagsEPS1_:
   97|     14|  static regex::SyntaxFlags getSyntaxFlags(JSRegExp *self) {
   98|     14|    return self->syntaxFlags_;
   99|     14|  }
_ZN6hermes2vm8JSRegExpC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
  130|      8|      : JSObject(runtime, *parent, *clazz),
  131|      8|        pattern_(
  132|      8|            runtime,
  133|      8|            runtime.getPredefinedString(Predefined::emptyString),
  134|      8|            runtime.getHeap()) {}

_ZN6hermes2vm14MarkBitArrayNC4sizeEv:
  111|    226|/* static */ constexpr size_t MarkBitArrayNC::size() {
  112|    226|  return kNumBits;
  113|    226|}
_ZNK6hermes2vm14MarkBitArrayNC14addressToIndexEPKv:
  115|   763k|size_t MarkBitArrayNC::addressToIndex(const void *p) const {
  116|   763k|  assert(
  117|   763k|      base() <= p && p < AlignedStorage::end(base()) &&
  118|   763k|      "precondition: argument must be within the covered range");
  119|   763k|  auto cp = reinterpret_cast<const char *>(p);
  120|   763k|  return (cp - base()) >> LogHeapAlign;
  121|   763k|}
_ZNK6hermes2vm14MarkBitArrayNC2atEm:
  133|   178k|bool MarkBitArrayNC::at(size_t ind) const {
  134|   178k|  assert(ind < kNumBits && "precondition: ind must be within the index range");
  135|   178k|  return bitArray_.at(ind);
  136|   178k|}
_ZN6hermes2vm14MarkBitArrayNC4markEm:
  138|   585k|void MarkBitArrayNC::mark(size_t ind) {
  139|   585k|  assert(ind < kNumBits && "precondition: ind must be within the index range");
  140|   585k|  bitArray_.set(ind, true);
  141|   585k|}
_ZN6hermes2vm14MarkBitArrayNC7markAllEv:
  147|    320|void MarkBitArrayNC::markAll() {
  148|    320|  bitArray_.set();
  149|    320|}
_ZN6hermes2vm14MarkBitArrayNC23findNextUnmarkedBitFromEm:
  155|    226|size_t MarkBitArrayNC::findNextUnmarkedBitFrom(size_t ind) {
  156|    226|  return bitArray_.findNextZeroBitFrom(ind);
  157|    226|}
_ZNK6hermes2vm14MarkBitArrayNC4baseEv:
  167|  2.29M|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|  2.29M|  return const_cast<char *>(reinterpret_cast<const char *>(this));
  174|  2.29M|}
_ZN6hermes2vm14MarkBitArrayNCC2Ev:
   25|    320|  MarkBitArrayNC() = default;

_ZN6hermes2vm8Metadata9ArrayDataC2ENS2_9ArrayTypeEhhh:
   56|      8|        : type(type),
   57|      8|          startOffset(startOffset),
   58|      8|          lengthOffset(lengthOffset),
   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|     51|      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;

_ZNK6hermes2vm10NativeArgs5beginEv:
  222|  4.94M|  ConstArgIterator begin() const {
  223|  4.94M|    return firstArg_;
  224|  4.94M|  }
_ZNK6hermes2vm10NativeArgs3endEv:
  225|     17|  ConstArgIterator end() const {
  226|     17|    return begin() + argCount_;
  227|     17|  }
_ZNK6hermes2vm10NativeArgs10getThisArgEv:
   78|  2.66M|  const PinnedHermesValue &getThisArg() const {
   79|  2.66M|    return begin()[-1];
   80|  2.66M|  }
_ZN6hermes2vm10NativeArgsC2ENSt3__116reverse_iteratorIPKNS0_17PinnedHermesValueEEEjS6_:
   43|  3.44M|      : firstArg_(firstArg), argCount_(argCount), newTarget_(newTarget) {}
_ZNK6hermes2vm10NativeArgs12getNewTargetEv:
   52|     87|  const PinnedHermesValue &getNewTarget() const {
   53|     87|    return *newTarget_;
   54|     87|  }
_ZNK6hermes2vm10NativeArgs14isFunctionCallEv:
   64|      1|  bool isFunctionCall() const {
   65|      1|    return newTarget_->isUndefined();
   66|      1|  }
_ZNK6hermes2vm10NativeArgs17isConstructorCallEv:
   68|      1|  bool isConstructorCall() const {
   69|      1|    return !isFunctionCall();
   70|      1|  }
_ZNK6hermes2vm10NativeArgs11getArgCountEv:
   73|   391k|  unsigned getArgCount() const {
   74|   391k|    return argCount_;
   75|   391k|  }
_ZNK6hermes2vm10NativeArgs13getThisHandleEv:
   83|  2.66M|  Handle<> getThisHandle() const {
   84|  2.66M|    return Handle<>(&getThisArg());
   85|  2.66M|  }
_ZNK6hermes2vm10NativeArgs6getArgEj:
  103|  2.65M|  HermesValue getArg(unsigned index) const {
  104|  2.65M|    return index < argCount_ ? static_cast<HermesValue>(begin()[index])
  ------------------
  |  Branch (104:12): [True: 1.87M, False: 781k]
  ------------------
  105|  2.65M|                             : HermesValue::encodeUndefinedValue();
  106|  2.65M|  }
_ZNK6hermes2vm10NativeArgs12getArgHandleEj:
  111|   404k|  Handle<> getArgHandle(unsigned index) const {
  112|   404k|    return index < argCount_ ? Handle<>(&begin()[index])
  ------------------
  |  Branch (112:12): [True: 404k, False: 2]
  ------------------
  113|   404k|                             : HandleRootOwner::getUndefinedValue();
  114|   404k|  }
_ZN6hermes2vm10NativeArgs15handle_iteratorC2ENSt3__116reverse_iteratorIPKNS0_17PinnedHermesValueEEE:
  144|     34|    explicit handle_iterator(ConstArgIterator arg) : arg_(arg) {}
_ZNK6hermes2vm10NativeArgs15handle_iteratorneERKS2_:
  156|   325k|    bool operator!=(const handle_iterator &o) const {
  157|   325k|      return arg_ != o.arg_;
  158|   325k|    }
_ZNK6hermes2vm10NativeArgs15handle_iteratordeEv:
  163|   325k|    Handle<> operator*() const {
  164|   325k|      return Handle<>(&*arg_);
  165|   325k|    }
_ZN6hermes2vm10NativeArgs15handle_iteratorppEv:
  173|   325k|    handle_iterator &operator++() {
  174|   325k|      ++arg_;
  175|   325k|      return *this;
  176|   325k|    }
_ZNK6hermes2vm10NativeArgs7handlesEv:
  218|     17|  llvh::iterator_range<handle_iterator> handles() const {
  219|     17|    return llvh::make_range(handle_iterator(begin()), handle_iterator(end()));
  220|     17|  };
_ZNK6hermes2vm10NativeArgs11dyncastThisINS0_8JSObjectEEENS0_6HandleIT_EEv:
   90|     58|  Handle<T> dyncastThis() const {
   91|     58|    return vmisa<T>(getThisArg()) ? Handle<T>::vmcast(&getThisArg())
  ------------------
  |  Branch (91:12): [True: 58, False: 0]
  ------------------
   92|     58|                                  : HandleRootOwner::makeNullHandle<T>();
   93|     58|  }
_ZNK6hermes2vm10NativeArgs11dyncastThisINS0_8CallableEEENS0_6HandleIT_EEv:
   90|     85|  Handle<T> dyncastThis() const {
   91|     85|    return vmisa<T>(getThisArg()) ? Handle<T>::vmcast(&getThisArg())
  ------------------
  |  Branch (91:12): [True: 85, False: 0]
  ------------------
   92|     85|                                  : HandleRootOwner::makeNullHandle<T>();
   93|     85|  }
_ZNK6hermes2vm10NativeArgs11dyncastThisINS0_8JSRegExpEEENS0_6HandleIT_EEv:
   90|     16|  Handle<T> dyncastThis() const {
   91|     16|    return vmisa<T>(getThisArg()) ? Handle<T>::vmcast(&getThisArg())
  ------------------
  |  Branch (91:12): [True: 16, False: 0]
  ------------------
   92|     16|                                  : HandleRootOwner::makeNullHandle<T>();
   93|     16|  }

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

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

_ZNK6hermes2vm11PointerBase21basedToPointerNonNullENS0_12BasedPointerE:
  161|   103M|inline void *PointerBase::basedToPointerNonNull(BasedPointer ptr) const {
  162|   103M|  assert(ptr && "Null pointer given to basedToPointerNonNull");
  163|   103M|  uintptr_t addr = reinterpret_cast<uintptr_t>(this) + ptr.getRawValue();
  164|   103M|  return reinterpret_cast<void *>(addr);
  165|   103M|}
_ZNK6hermes2vm12BasedPointercvbEv:
  148|   179M|inline BasedPointer::operator bool() const {
  149|   179M|  return raw_ != 0;
  150|   179M|}
_ZNK6hermes2vm12BasedPointer11getRawValueEv:
  144|   108M|inline BasedPointer::StorageType BasedPointer::getRawValue() const {
  145|   108M|  return raw_;
  146|   108M|}
_ZN6hermes2vm12BasedPointerC2Ej:
  137|  47.3M|inline BasedPointer::BasedPointer(StorageType raw) : raw_(raw) {}
_ZNK6hermes2vm11PointerBase14basedToPointerENS0_12BasedPointerE:
  173|  51.6M|inline void *PointerBase::basedToPointer(BasedPointer ptr) const {
  174|  51.6M|  return ptr ? basedToPointerNonNull(ptr) : nullptr;
  ------------------
  |  Branch (174:10): [True: 45.1M, False: 6.43M]
  ------------------
  175|  51.6M|}
_ZNK6hermes2vm11PointerBase14pointerToBasedEPKv:
  184|  10.2M|inline BasedPointer PointerBase::pointerToBased(const void *ptr) const {
  185|  10.2M|  return ptr ? pointerToBasedNonNull(ptr) : BasedPointer{nullptr};
  ------------------
  |  Branch (185:10): [True: 8.15M, False: 2.12M]
  ------------------
  186|  10.2M|}
_ZNK6hermes2vm11PointerBase21pointerToBasedNonNullEPKv:
  177|  13.9M|inline BasedPointer PointerBase::pointerToBasedNonNull(const void *ptr) const {
  178|  13.9M|  assert(ptr && "Null pointer given to pointerToBasedNonNull");
  179|  13.9M|  uintptr_t offset = (uintptr_t)ptr - (uintptr_t)this;
  180|  13.9M|  assert(llvh::isUInt<32>(offset) && "Pointer out of range");
  181|  13.9M|  return BasedPointer{static_cast<uint32_t>(offset)};
  182|  13.9M|}
_ZN6hermes2vm12BasedPointerC2EDn:
  136|  2.12M|inline BasedPointer::BasedPointer(std::nullptr_t) : raw_(0) {}
_ZNK6hermes2vm12BasedPointereqES1_:
  152|  4.31M|inline bool BasedPointer::operator==(BasedPointer other) const {
  153|  4.31M|  return raw_ == other.raw_;
  154|  4.31M|}
_ZN6hermes2vm11PointerBase10setSegmentEjPv:
  188|    320|inline void PointerBase::setSegment(unsigned idx, void *segStart) {
  189|    320|  assert(segStart == AlignedStorage::start(segStart) && "Precondition");
  190|    320|  SegmentInfo::setSegmentIndexFromStart(segStart, idx);
  191|    320|}
_ZN6hermes2vm11PointerBaseC2Ev:
  167|    160|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|    160|  assert(llvh::alignmentAdjustment(this, AlignedStorage::size()) == 0);
  171|    160|}

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

_ZN6hermes2vm8JSString11getCellKindEv:
   29|    350|  static constexpr CellKind getCellKind() {
   30|    350|    return CellKind::JSStringKind;
   31|    350|  }
_ZN6hermes2vm8JSString7classofEPKNS0_6GCCellE:
   32|  2.03M|  static bool classof(const GCCell *cell) {
   33|  2.03M|    return cell->getKind() == CellKind::JSStringKind;
   34|  2.03M|  }
_ZN6hermes2vm8JSString18getPrimitiveStringEPKS1_RNS0_7RuntimeE:
   59|  1.68M|      Runtime &runtime) {
   60|  1.68M|    return self->primitiveValue_.get(runtime);
   61|  1.68M|  }
_ZN6hermes2vm8JSStringC2ERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEENS4_INS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
   68|    175|      : JSObject(runtime, *parent, *clazz),
   69|    175|        primitiveValue_(runtime, *value, runtime.getHeap()) {
   70|    175|    flags_.indexedStorage = true;
   71|    175|    flags_.fastIndexProperties = true;
   72|    175|  }
_ZN6hermes2vm8JSNumber11getCellKindEv:
  235|    322|  static constexpr CellKind getCellKind() {
  236|    322|    return CellKind::JSNumberKind;
  237|    322|  }
_ZN6hermes2vm8JSNumber7classofEPKNS0_6GCCellE:
  238|   355k|  static bool classof(const GCCell *cell) {
  239|   355k|    return cell->getKind() == CellKind::JSNumberKind;
  240|   355k|  }
_ZN6hermes2vm8JSNumberC2ERNS0_7RuntimeEdNS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
  256|    161|      : JSObject(runtime, *parent, *clazz), primitiveValue_(value) {}
_ZN6hermes2vm9JSBoolean11getCellKindEv:
  275|    320|  static constexpr CellKind getCellKind() {
  276|    320|    return CellKind::JSBooleanKind;
  277|    320|  }
_ZN6hermes2vm9JSBoolean7classofEPKNS0_6GCCellE:
  278|   355k|  static bool classof(const GCCell *cell) {
  279|   355k|    return cell->getKind() == CellKind::JSBooleanKind;
  280|   355k|  }
_ZN6hermes2vm9JSBooleanC2ERNS0_7RuntimeEbNS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
  296|    160|      : JSObject(runtime, *parent, *clazz), primitiveValue_(value) {}

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

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

_ZN6hermes2vm23NamedPropertyDescriptorC2Ev:
  168|  7.22M|  NamedPropertyDescriptor() = default;
_ZN6hermes2vm18PropertyDescriptorC2Ev:
  159|  10.8M|  PropertyDescriptor() : _altFlags(0), slot(INVALID_SLOT_INDEX) {}
_ZN6hermes2vm13PropertyFlags7invalidEv:
  111|  13.1M|  static PropertyFlags invalid() {
  112|  13.1M|    PropertyFlags pf{};
  113|  13.1M|    pf.invalidFlags = 1;
  114|  13.1M|    return pf;
  115|  13.1M|  }
_ZN6hermes2vm13PropertyFlagsC2Ev:
   69|  19.8M|  PropertyFlags() {
   70|  19.8M|    _flags = 0;
   71|  19.8M|  }
_ZN6hermes2vm13PropertyFlags28defaultNewNamedPropertyFlagsEv:
   92|   728k|  static PropertyFlags defaultNewNamedPropertyFlags() {
   93|   728k|    PropertyFlags pf{};
   94|   728k|    pf.enumerable = 1;
   95|   728k|    pf.writable = 1;
   96|   728k|    pf.configurable = 1;
   97|   728k|    return pf;
   98|   728k|  }
_ZN6hermes2vm13PropertyFlags5clearEv:
   73|  92.2k|  void clear() {
   74|  92.2k|    _flags = 0;
   75|  92.2k|  }
_ZNK6hermes2vm13PropertyFlagseqES1_:
   77|   505k|  bool operator==(PropertyFlags f) const {
   78|   505k|    return _flags == f._flags;
   79|   505k|  }
_ZNK6hermes2vm13PropertyFlagsneES1_:
   80|  1.27k|  bool operator!=(PropertyFlags f) const {
   81|  1.27k|    return _flags != f._flags;
   82|  1.27k|  }
_ZNK6hermes2vm13PropertyFlags7isValidEv:
   86|  1.44M|  bool isValid() const {
   87|  1.44M|    return !invalidFlags;
   88|  1.44M|  }
_ZN6hermes2vm18PropertyDescriptor15PropertyFlags32C2ENS0_13PropertyFlagsE:
  138|  1.71M|    PropertyFlags32(PropertyFlags flags) : PropertyFlags(flags), _padding(0) {}
_ZN6hermes2vm18PropertyDescriptorC2ENS0_13PropertyFlagsEj:
  157|   796k|      : flags(flags), slot(slot) {}
_ZN6hermes2vm23NamedPropertyDescriptorC2ENS0_13PropertyFlagsEj:
  166|   796k|      : PropertyDescriptor(flags, slot) {}
_ZN6hermes2vm26ComputedPropertyDescriptor32castToNamedPropertyDescriptorRefEv:
  183|  4.90M|  NamedPropertyDescriptor &castToNamedPropertyDescriptorRef() {
  184|  4.90M|    return *static_cast<NamedPropertyDescriptor *>(
  185|  4.90M|        static_cast<PropertyDescriptor *>(this));
  186|  4.90M|  }
_ZN6hermes2vm26ComputedPropertyDescriptorC2Ev:
  177|  3.64M|  ComputedPropertyDescriptor() = default;

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

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

_ZN6hermes2vm7Runtime7getHeapEv:
  388|  51.0M|  GC &getHeap() {
  389|  51.0M|    return *heapStorage_.get();
  390|  51.0M|  }
_ZN6hermes2vm7Runtime11runBytecodeEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefENS0_6HandleINS0_11EnvironmentEEE:
  279|    274|      Handle<Environment> environment) {
  280|    274|    getHeap().runtimeWillExecute();
  281|    274|    return runBytecode(
  282|    274|        std::move(bytecode),
  283|    274|        runtimeModuleFlags,
  284|    274|        sourceURL,
  285|    274|        environment,
  286|    274|        Handle<>(&global_));
  287|    274|  }
_ZNK6hermes2vm7Runtime17hasMicrotaskQueueEv:
  895|    480|  bool hasMicrotaskQueue() const {
  896|    480|    return hasMicrotaskQueue_;
  897|    480|  }
_ZN6hermes2vm7Runtime18getIdentifierTableEv:
  429|  3.49M|  IdentifierTable &getIdentifierTable() {
  430|  3.49M|    return identifierTable_;
  431|  3.49M|  }
_ZN6hermes2vm7Runtime25getStringPrimFromSymbolIDENS0_8SymbolIDE:
 2024|  3.66M|inline StringPrimitive *Runtime::getStringPrimFromSymbolID(SymbolID id) {
 2025|  3.66M|  return identifierTable_.getStringPrim(*this, id);
 2026|  3.66M|}
_ZN6hermes2vm12NoAllocScopeC2ERNS0_7RuntimeE:
 1905|  20.2M|  explicit NoAllocScope(Runtime &runtime) : NoAllocScope(runtime.getHeap()) {}
_ZN6hermes2vm12NoAllocScopeC2ERNS0_7HadesGCE:
 1906|  20.2M|  explicit NoAllocScope(GC &gc) : BaseNoScope(&gc.noAllocLevel_) {}
_ZN6hermes2vm11BaseNoScopeC2EPj:
 1845|  20.2M|  explicit BaseNoScope(uint32_t *level) : level_(level) {
 1846|  20.2M|    assert(level_ && "constructing BaseNoScope with moved/release object");
 1847|  20.2M|    ++*level_;
 1848|  20.2M|  }
_ZN6hermes2vm11BaseNoScopeD2Ev:
 1856|  20.2M|  ~BaseNoScope() {
 1857|  20.2M|    if (level_)
  ------------------
  |  Branch (1857:9): [True: 20.2M, False: 42]
  ------------------
 1858|  20.2M|      release();
 1859|  20.2M|  }
_ZN6hermes2vm11BaseNoScope7releaseEv:
 1879|  20.2M|  void release() {
 1880|  20.2M|    assert(level_ && "already released");
 1881|  20.2M|    assert(*level_ > 0 && "unbalanced no alloc");
 1882|  20.2M|    --*level_;
 1883|  20.2M|    level_ = nullptr;
 1884|  20.2M|  }
_ZNK6hermes2vm7Runtime14hasArrayBufferEv:
  891|    160|  bool hasArrayBuffer() const {
  892|    160|    return hasArrayBuffer_;
  893|    160|  }
_ZN6hermes2vm21ScopedNativeCallFrameC2ERNS0_7RuntimeEjNS0_11HermesValueES4_S4_:
 1731|  2.66M|      : runtime_(runtime), savedSP_(runtime.getStackPointer()) {
 1732|       |#ifndef HERMES_CHECK_NATIVE_STACK
 1733|       |    runtime.overflowGuard_.callDepth++;
 1734|       |#endif
 1735|  2.66M|    uint32_t registersNeeded =
 1736|  2.66M|        StackFrameLayout::callerOutgoingRegisters(argCount);
 1737|  2.66M|    overflowed_ = !runtimeCanAllocateFrame(runtime, registersNeeded);
 1738|  2.66M|    if (LLVM_UNLIKELY(overflowed_)) {
  ------------------
  |  |  189|  2.66M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.66M]
  |  |  ------------------
  ------------------
 1739|      0|      return;
 1740|      0|    }
 1741|       |
 1742|       |    // We have enough space. Increment the call frame depth and construct the
 1743|       |    // frame. The ScopedNativeCallFrame will restore both.
 1744|  2.66M|    auto *stack = runtime.allocUninitializedStack(registersNeeded);
 1745|  2.66M|    frame_ = StackFramePtr::initFrame(
 1746|  2.66M|        stack,
 1747|  2.66M|        runtime.currentFrame_,
 1748|  2.66M|        nullptr,
 1749|  2.66M|        nullptr,
 1750|  2.66M|        argCount,
 1751|  2.66M|        callee,
 1752|  2.66M|        newTarget);
 1753|  2.66M|    frame_.getThisArgRef() = thisArg;
 1754|  2.66M|#if HERMES_SLOW_DEBUG
 1755|       |    // Poison the initial arguments to ensure the caller sets all of them before
 1756|       |    // a GC.
 1757|  2.66M|    assert(!overflowed_ && "Overflow should return early");
 1758|  2.66M|    overflowHasBeenChecked_ = true;
 1759|  2.66M|    fillArguments(argCount, HermesValue::encodeInvalidValue());
 1760|       |    // We still want the user to check for overflow.
 1761|  2.66M|    overflowHasBeenChecked_ = false;
 1762|  2.66M|#endif
 1763|  2.66M|  }
_ZN6hermes2vm7Runtime15getStackPointerEv:
  465|  2.66M|  PinnedHermesValue *getStackPointer() {
  466|  2.66M|    return stackPointer_;
  467|  2.66M|  }
_ZN6hermes2vm21ScopedNativeCallFrame23runtimeCanAllocateFrameERNS0_7RuntimeEj:
 1709|  2.66M|      uint32_t registersNeeded) {
 1710|  2.66M|    return runtime.checkAvailableStack(registersNeeded) &&
  ------------------
  |  Branch (1710:12): [True: 2.66M, False: 0]
  ------------------
 1711|  2.66M|        !runtime.isStackOverflowing();
  ------------------
  |  Branch (1711:9): [True: 2.66M, False: 0]
  ------------------
 1712|  2.66M|  }
_ZN6hermes2vm7Runtime19checkAvailableStackEj:
 2057|  6.11M|inline bool Runtime::checkAvailableStack(uint32_t count) {
 2058|       |  // Note: use 64-bit arithmetic to avoid overflow. We could also do it with
 2059|       |  // a couple of comparisons, but that is likely to be slower.
 2060|  6.11M|  return availableStackSize() >= (uint64_t)count + STACK_RESERVE;
 2061|  6.11M|}
_ZNK6hermes2vm7Runtime18availableStackSizeEv:
 2053|  12.2M|inline uint32_t Runtime::availableStackSize() const {
 2054|  12.2M|  return (uint32_t)(registerStackEnd_ - stackPointer_);
 2055|  12.2M|}
_ZN6hermes2vm7Runtime18isStackOverflowingEv:
 2135|  6.11M|inline bool Runtime::isStackOverflowing() {
 2136|  6.11M|  return overflowGuard_.isOverflowing();
 2137|  6.11M|}
_ZN6hermes2vm7Runtime23allocUninitializedStackEj:
 2063|  6.11M|inline PinnedHermesValue *Runtime::allocUninitializedStack(uint32_t count) {
 2064|  6.11M|  assert(availableStackSize() >= count && "register stack overflow");
 2065|  6.11M|  return stackPointer_ += count;
 2066|  6.11M|}
_ZN6hermes2vm21ScopedNativeCallFrame13fillArgumentsEjNS0_11HermesValueE:
 1799|  2.66M|  void fillArguments(uint32_t argCount, HermesValue fillValue) {
 1800|  2.66M|    assert(overflowHasBeenChecked_ && "ScopedNativeCallFrame could overflow");
 1801|  2.66M|    assert(argCount == frame_.getArgCount() && "Arg count mismatch.");
 1802|  2.66M|    std::uninitialized_fill_n(frame_.argsBegin(), argCount, fillValue);
 1803|  2.66M|  }
_ZNK6hermes2vm21ScopedNativeCallFrame10overflowedEv:
 1806|  2.66M|  bool overflowed() const {
 1807|  2.66M|#ifndef NDEBUG
 1808|  2.66M|    overflowHasBeenChecked_ = !overflowed_;
 1809|  2.66M|#endif
 1810|  2.66M|    return overflowed_;
 1811|  2.66M|  }
_ZN6hermes2vm7Runtime19potentiallyMoveHeapEv:
 2153|  5.56M|inline void Runtime::potentiallyMoveHeap() {}
_ZN6hermes2vm21ScopedNativeCallFrameD2Ev:
 1785|  2.66M|  ~ScopedNativeCallFrame() {
 1786|       |    // Note that we unconditionally increment the native call frame depth and
 1787|       |    // save the SP to avoid branching in the dtor.
 1788|       |#ifndef HERMES_CHECK_NATIVE_STACK
 1789|       |    runtime_.overflowGuard_.callDepth--;
 1790|       |#endif
 1791|  2.66M|    runtime_.popToSavedStackPointer(savedSP_);
 1792|  2.66M|#ifndef NDEBUG
 1793|       |    // Clear the frame to detect use-after-free.
 1794|  2.66M|    frame_ = StackFramePtr{};
 1795|  2.66M|#endif
 1796|  2.66M|  }
_ZN6hermes2vm7Runtime22popToSavedStackPointerEPNS0_17PinnedHermesValueE:
 2042|  2.66M|inline void Runtime::popToSavedStackPointer(PinnedHermesValue *stackPointer) {
 2043|  2.66M|  assert(
 2044|  2.66M|      stackPointer <= stackPointer_ &&
 2045|  2.66M|      "attempting to pop the stack to a higher level");
 2046|  2.66M|  stackPointer_ = stackPointer;
 2047|  2.66M|}
_ZNK6hermes2vm7Runtime14getThrownValueEv:
  561|     53|  HermesValue getThrownValue() const {
  562|     53|    return thrownValue_;
  563|     53|  }
_ZN6hermes2vm7Runtime16clearThrownValueEv:
 2144|    456|inline void Runtime::clearThrownValue() {
 2145|    456|  thrownValue_ = HermesValue::encodeEmptyValue();
 2146|    456|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_15BigIntPrimitiveELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
 1962|   390k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|   390k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|   390k|  (void)getCurrentIP();
 1969|   390k|#endif
 1970|   390k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|   390k|      size, std::forward<Args>(args)...);
 1972|   390k|}
_ZNK6hermes2vm7Runtime12getCurrentIPEv:
 1448|  33.5M|  inline const inst::Inst *getCurrentIP() const {
 1449|       |#ifdef NDEBUG
 1450|       |    return currentIP_;
 1451|       |#else
 1452|  33.5M|    assert(
 1453|  33.5M|        currentIP_.hasValue() &&
 1454|  33.5M|        "Current IP unknown - this probably means a CAPTURE_IP_* is missing in the interpreter.");
 1455|  33.5M|    return *currentIP_;
 1456|  33.5M|#endif
 1457|  33.5M|  }
_ZN6hermes2vm7Runtime14setThrownValueENS0_11HermesValueE:
 2139|    100|inline ExecutionStatus Runtime::setThrownValue(HermesValue value) {
 2140|    100|  thrownValue_ = value;
 2141|    100|  return ExecutionStatus::EXCEPTION;
 2142|    100|}
_ZN6hermes2vm7Runtime22addCustomRootsFunctionENSt3__18functionIFvPNS0_7HadesGCERNS0_12RootAcceptorEEEE:
 1924|    160|    std::function<void(GC *, RootAcceptor &)> markRootsFn) {
 1925|    160|  customMarkRootFuncs_.emplace_back(std::move(markRootsFn));
 1926|    160|}
_ZN6hermes2vm7Runtime26addCustomWeakRootsFunctionENSt3__18functionIFvPNS0_7HadesGCERNS0_16WeakRootAcceptorEEEE:
 1929|    160|    std::function<void(GC *, WeakRootAcceptor &)> markRootsFn) {
 1930|    160|  customMarkWeakRootFuncs_.emplace_back(std::move(markRootsFn));
 1931|    160|}
_ZN6hermes2vm7Runtime25addCustomSnapshotFunctionENSt3__18functionIFvRNS0_12HeapSnapshotEEEES7_:
 1935|    160|    std::function<void(HeapSnapshot &)> edges) {
 1936|    160|  customSnapshotNodeFuncs_.emplace_back(std::move(nodes));
 1937|    160|  customSnapshotEdgeFuncs_.emplace_back(std::move(edges));
 1938|    160|}
_ZN6hermes2vm7Runtime15getCurrentFrameEv:
  504|  4.67k|  StackFramePtr getCurrentFrame() {
  505|  4.67k|    return currentFrame_;
  506|  4.67k|  }
_ZN6hermes2vm7Runtime22raiseTypeErrorForValueENS0_6HandleINS0_11HermesValueEEEN4llvh9StringRefE:
  671|      1|  raiseTypeErrorForValue(Handle<> value, llvh::StringRef msg) {
  672|      1|    return raiseTypeErrorForValue("", value, msg);
  673|      1|  }
_ZN6hermes2vm7Runtime23getCodeCoverageProfilerEv:
  843|  2.75k|  CodeCoverageProfiler &getCodeCoverageProfiler() {
  844|  2.75k|    return *codeCoverageProfiler_;
  845|  2.75k|  }
_ZN6hermes2vm7Runtime11getDebuggerEv:
  862|  3.27k|  Debugger &getDebugger() {
  863|  3.27k|    return debugger_;
  864|  3.27k|  }
_ZNK6hermes2vm7Runtime13hasES6PromiseEv:
  871|    320|  bool hasES6Promise() const {
  872|    320|    return hasES6Promise_;
  873|    320|  }
_ZNK6hermes2vm7Runtime11hasES6ProxyEv:
  875|    320|  bool hasES6Proxy() const {
  876|    320|    return hasES6Proxy_;
  877|    320|  }
_ZNK6hermes2vm7Runtime11hasES6ClassEv:
  879|    247|  bool hasES6Class() const {
  880|    247|#ifndef HERMES_FACEBOOK_BUILD
  881|    247|    return hasES6Class_;
  882|       |#else
  883|       |    return false;
  884|       |#endif
  885|    247|  }
_ZNK6hermes2vm7Runtime20getVMExperimentFlagsEv:
  903|  2.37k|  experiments::VMExperimentFlags getVMExperimentFlags() const {
  904|  2.37k|    return vmExperimentFlags_;
  905|  2.37k|  }
_ZN6hermes2vm7Runtime16addRuntimeModuleEPNS0_13RuntimeModuleE:
 1129|    597|  void addRuntimeModule(RuntimeModule *rm) {
 1130|    597|    runtimeModuleList_.push_back(*rm);
 1131|    597|  }
_ZN6hermes2vm7Runtime37testAndClearDebuggerAsyncBreakRequestEv:
 1350|   396k|  uint8_t testAndClearDebuggerAsyncBreakRequest() {
 1351|   396k|    return testAndClearAsyncBreakRequest(
 1352|   396k|        (uint8_t)AsyncBreakReasonBits::DebuggerExplicit |
 1353|   396k|        (uint8_t)AsyncBreakReasonBits::DebuggerImplicit);
 1354|   396k|  }
_ZNK6hermes2vm7Runtime13hasAsyncBreakEv:
 1370|   840k|  bool hasAsyncBreak() const {
 1371|   840k|    return asyncBreakRequestFlag_.load(std::memory_order_relaxed) != 0
 1372|       |#ifdef __EMSCRIPTEN__
 1373|       |        || test_wasm_host_timeout()
 1374|       |#endif
 1375|   840k|        ;
 1376|   840k|  }
_ZN6hermes2vm7Runtime29testAndClearAsyncBreakRequestEh:
 1380|   396k|  uint8_t testAndClearAsyncBreakRequest(uint8_t reasonBits) {
 1381|       |    /// Note that while the triggerTimeoutAsyncBreak() function may be called
 1382|       |    /// from any thread, this one may only be called from within the Interpreter
 1383|       |    /// loop.
 1384|   396k|    uint8_t flag = asyncBreakRequestFlag_.load(std::memory_order_relaxed);
 1385|   396k|    if (LLVM_LIKELY((flag & (uint8_t)reasonBits) == 0)) {
  ------------------
  |  |  188|   396k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 396k, False: 0]
  |  |  ------------------
  ------------------
 1386|       |      // Fast path.
 1387|   396k|      return false;
 1388|   396k|    }
 1389|       |    // Clear the flag using CAS.
 1390|      0|    uint8_t oldFlag = asyncBreakRequestFlag_.fetch_and(
 1391|      0|        ~(uint8_t)reasonBits, std::memory_order_relaxed);
 1392|      0|    assert(oldFlag != 0 && "Why is oldFlag zero?");
 1393|      0|    return oldFlag;
 1394|      0|  }
_ZN6hermes2vm7Runtime12setCurrentIPEPKNS_4inst4InstE:
 1440|  12.3M|  inline void setCurrentIP(const inst::Inst *ip) {
 1441|  12.3M|    currentIP_ = ip;
 1442|  12.3M|  }
_ZNK6hermes2vm7Runtime16getCurrentIPSlowEv:
 1460|  8.69M|  inline const inst::Inst *getCurrentIPSlow() const override {
 1461|  8.69M|    return getCurrentIP();
 1462|  8.69M|  }
_ZN6hermes2vm7Runtime19invalidateCurrentIPEv:
 1467|  12.3M|  void invalidateCurrentIP() {
 1468|  12.3M|    currentIP_.reset();
 1469|  12.3M|  }
_ZN6hermes2vm7Runtime24saveCallerIPInStackFrameEv:
 1475|  3.45M|  void saveCallerIPInStackFrame() {
 1476|  3.45M|#ifndef NDEBUG
 1477|  3.45M|    assert(
 1478|  3.45M|        (!currentFrame_.getSavedIP() ||
 1479|  3.45M|         (currentIP_.hasValue() && currentFrame_.getSavedIP() == currentIP_)) &&
 1480|  3.45M|        "The ip should either be null or already have the expected value");
 1481|  3.45M|#endif
 1482|  3.45M|    currentFrame_.getSavedIPRef() =
 1483|  3.45M|        HermesValue::encodeNativePointer(getCurrentIP());
 1484|  3.45M|  }
_ZN6hermes2vm7Runtime13pushCallStackEPKNS0_9CodeBlockEPKNS_4inst4InstE:
 1517|  2.75k|  inline void pushCallStack(const CodeBlock *codeBlock, const inst::Inst *ip) {
 1518|  2.75k|    if (stackTracesTree_) {
  ------------------
  |  Branch (1518:9): [True: 0, False: 2.75k]
  ------------------
 1519|      0|      pushCallStackImpl(codeBlock, ip);
 1520|      0|    }
 1521|  2.75k|  }
_ZN6hermes2vm7Runtime12popCallStackEv:
 1524|  2.75k|  inline void popCallStack() {
 1525|  2.75k|    if (stackTracesTree_) {
  ------------------
  |  Branch (1525:9): [True: 0, False: 2.75k]
  ------------------
 1526|      0|      popCallStackImpl();
 1527|      0|    }
 1528|  2.75k|  }
_ZN6hermes2vm24ScopedNativeDepthTrackerC2ERNS0_7RuntimeE:
 1599|  3.44M|  explicit ScopedNativeDepthTracker(Runtime &runtime) : runtime_(runtime) {
 1600|  3.44M|    (void)runtime_;
 1601|       |#ifndef HERMES_CHECK_NATIVE_STACK
 1602|       |    ++runtime.overflowGuard_.callDepth;
 1603|       |#endif
 1604|  3.44M|    overflowed_ = runtime.isStackOverflowing();
 1605|  3.44M|  }
_ZN6hermes2vm24ScopedNativeDepthTrackerD2Ev:
 1606|  3.44M|  ~ScopedNativeDepthTracker() {
 1607|       |#ifndef HERMES_CHECK_NATIVE_STACK
 1608|       |    --runtime_.overflowGuard_.callDepth;
 1609|       |#endif
 1610|  3.44M|  }
_ZNK6hermes2vm24ScopedNativeDepthTracker10overflowedEv:
 1613|  3.44M|  bool overflowed() const {
 1614|  3.44M|    return overflowed_;
 1615|  3.44M|  }
_ZN6hermes2vm24ScopedNativeDepthReducerC2ERNS0_7RuntimeE:
 1642|     52|      : runtime_(runtime),
 1643|     52|        nativeStackGapOld(runtime.overflowGuard_.nativeStackGap) {
 1644|       |    // Temporarily reduce the gap to use that headroom for gathering the error.
 1645|       |    // If overflow is detected, the recomputation of the stack bounds will
 1646|       |    // result in no gap for the duration of the ScopedNativeDepthReducer's
 1647|       |    // lifetime.
 1648|     52|    runtime_.overflowGuard_.nativeStackGap = kReducedNativeStackGap;
 1649|     52|  }
_ZN6hermes2vm24ScopedNativeDepthReducerD2Ev:
 1650|     52|  ~ScopedNativeDepthReducer() {
 1651|     52|    assert(
 1652|     52|        runtime_.overflowGuard_.nativeStackGap == kReducedNativeStackGap &&
 1653|     52|        "ScopedNativeDepthReducer gap was overridden");
 1654|     52|    runtime_.overflowGuard_.nativeStackGap = nativeStackGapOld;
 1655|       |    // Force the bounds to be recomputed the next time.
 1656|     52|    runtime_.overflowGuard_.clearStackBounds();
 1657|     52|  }
_ZN6hermes2vm10NoRJSScopeC2ERNS0_7RuntimeE:
 1914|     45|  explicit NoRJSScope(Runtime &runtime) : BaseNoScope(&runtime.noRJSLevel_) {}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureENS0_15ExecutionStatusE:
 1984|  70.5k|inline void Runtime::ignoreAllocationFailure(ExecutionStatus status) {
 1985|  70.5k|  if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  70.5k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 70.5k]
  |  |  ------------------
  ------------------
 1986|      0|    hermes_fatal("Unhandled out of memory exception");
 1987|  70.5k|}
_ZN6hermes2vm7Runtime19getPredefinedStringENS0_10Predefined3StrE:
 2005|  2.82M|    Predefined::Str predefined) {
 2006|  2.82M|  return getStringPrimFromSymbolID(Predefined::getSymbolID(predefined));
 2007|  2.82M|}
_ZN6hermes2vm7Runtime25getPredefinedStringHandleENS0_10Predefined3StrE:
 2015|   786k|    Predefined::Str predefined) {
 2016|   786k|  return makeHandle(getPredefinedString(predefined));
 2017|   786k|}
_ZN6hermes2vm7Runtime18checkAndAllocStackEjNS0_11HermesValueE:
 2068|  3.45M|inline bool Runtime::checkAndAllocStack(uint32_t count, HermesValue initValue) {
 2069|  3.45M|  if (!checkAvailableStack(count))
  ------------------
  |  Branch (2069:7): [True: 0, False: 3.45M]
  ------------------
 2070|      0|    return false;
 2071|  3.45M|  allocStack(count, initValue);
 2072|  3.45M|  return true;
 2073|  3.45M|}
_ZN6hermes2vm7Runtime27setCurrentFrameToTopOfStackEv:
 2090|  3.45M|inline StackFramePtr Runtime::setCurrentFrameToTopOfStack() {
 2091|  3.45M|  return currentFrame_ = StackFramePtr(stackPointer_);
 2092|  3.45M|}
_ZN6hermes2vm7Runtime28restoreStackAndPreviousFrameENS0_14StackFramePtrTILb0EEE:
 2095|  3.45M|    StackFramePtr currentFrame) {
 2096|  3.45M|  assert(
 2097|  3.45M|      currentFrame_ == currentFrame &&
 2098|  3.45M|      "currentFrame parameter must match currentFrame_");
 2099|  3.45M|  stackPointer_ = currentFrame.ptr();
 2100|  3.45M|  return currentFrame_ = currentFrame.getPreviousFrame();
 2101|  3.45M|}
_ZN6hermes2vm7Runtime14getStackFramesEv:
 2107|   391k|inline llvh::iterator_range<StackFrameIterator> Runtime::getStackFrames() {
 2108|   391k|  return {
 2109|   391k|      StackFrameIterator{currentFrame_},
 2110|   391k|      StackFrameIterator{registerStackStart_}};
 2111|   391k|};
_ZN6hermes2vm7Runtime24getOverflowGuardForRegexEv:
 2120|     86|inline StackOverflowGuard Runtime::getOverflowGuardForRegex() {
 2121|     86|  StackOverflowGuard copy = overflowGuard_;
 2122|       |#ifndef HERMES_CHECK_NATIVE_STACK
 2123|       |  // We should take into account the approximate difference in sizes between the
 2124|       |  // stack size of the interpreter vs the regex executor. The max call depth in
 2125|       |  // use here was calculated using call stack sizes of the interpreter. Since
 2126|       |  // the executor has a smaller stack size, it should be allowed to recurse more
 2127|       |  // than the interpreter could have. So we multiply the max allowed depth by
 2128|       |  // some number larger than 1.
 2129|       |  constexpr uint32_t kRegexMaxDepthMult = 5;
 2130|       |  copy.maxCallDepth *= kRegexMaxDepthMult;
 2131|       |#endif
 2132|     86|  return copy;
 2133|     86|}
_ZN6hermes2vm7Runtime15getCrashManagerEv:
 2148|  1.43k|inline CrashManager &Runtime::getCrashManager() {
 2149|  1.43k|  return *crashMgr_;
 2150|  1.43k|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_11HermesValueEEET_NS0_10CallResultIS4_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEE:
 1975|   223k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1976|   223k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   223k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 223k]
  |  |  ------------------
  ------------------
 1977|      0|    hermes_fatal("Unhandled out of memory exception");
 1978|       |  // Use std::move here to account for specializations of CallResult,
 1979|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1980|       |  // which wrap a class with a deleted copy constructor.
 1981|   223k|  return std::move(res.getValue());
 1982|   223k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_11BoxedDoubleELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_DpOT2_:
 1945|   818k|T *Runtime::makeAFixed(Args &&...args) {
 1946|   818k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|   818k|  (void)getCurrentIP();
 1952|   818k|#endif
 1953|   818k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|   818k|      std::forward<Args>(args)...);
 1955|   818k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_16ArrayStorageBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
 1962|  90.6k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|  90.6k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|  90.6k|  (void)getCurrentIP();
 1969|  90.6k|#endif
 1970|  90.6k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|  90.6k|      size, std::forward<Args>(args)...);
 1972|  90.6k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_11EnvironmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleIS3_EERjEEEPT_jDpOT2_:
 1962|    836|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|    836|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|    836|  (void)getCurrentIP();
 1969|    836|#endif
 1970|    836|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|    836|      size, std::forward<Args>(args)...);
 1972|    836|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_17NativeConstructorELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESD_S6_NS0_10NativeArgsEERPFNSF_INS0_12PseudoHandleIS8_EELSI_6EEES6_S9_SD_ERNS0_8CellKindEEEEPT_DpOT2_:
 1945|  6.72k|T *Runtime::makeAFixed(Args &&...args) {
 1946|  6.72k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|  6.72k|  (void)getCurrentIP();
 1952|  6.72k|#endif
 1953|  6.72k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|  6.72k|      std::forward<Args>(args)...);
 1955|  6.72k|}
_ZN6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3setERNS0_7RuntimeEPS2_:
 1574|  6.19k|  void set(Runtime &runtime, T *ptr) {
 1575|  6.19k|    set(runtime.getHeap(), ptr);
 1576|  6.19k|  }
_ZN6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3setERNS0_7HadesGCEPS2_:
 1577|  6.19k|  void set(GC &gc, T *ptr) {
 1578|  6.19k|    bits_ = reinterpret_cast<uintptr_t>(ptr) ^ gc.pointerEncryptionKey_[K];
 1579|  6.19k|  }
_ZNK6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3getERNS0_7RuntimeE:
 1580|  3.07k|  T *get(Runtime &runtime) const {
 1581|  3.07k|    return get(runtime.getHeap());
 1582|  3.07k|  }
_ZNK6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3getERNS0_7HadesGCE:
 1583|  3.07k|  T *get(GC &gc) const {
 1584|  3.07k|    return reinterpret_cast<T *>(bits_ ^ gc.pointerEncryptionKey_[K]);
 1585|  3.07k|  }
_ZN6hermes2vm7Runtime13makeAVariableINS0_16ArrayStorageBaseINS0_11HermesValueEEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
 1962|    160|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|    160|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|    160|  (void)getCurrentIP();
 1969|    160|#endif
 1970|    160|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|    160|      size, std::forward<Args>(args)...);
 1972|    160|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_13BoundFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_NS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERNS7_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_DpOT2_:
 1945|    160|T *Runtime::makeAFixed(Args &&...args) {
 1946|    160|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    160|  (void)getCurrentIP();
 1952|    160|#endif
 1953|    160|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    160|      std::forward<Args>(args)...);
 1955|    160|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_14NativeFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESD_S6_NS0_10NativeArgsEEEEEPT_DpOT2_:
 1945|  70.5k|T *Runtime::makeAFixed(Args &&...args) {
 1946|  70.5k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|  70.5k|  (void)getCurrentIP();
 1952|  70.5k|#endif
 1953|  70.5k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|  70.5k|      std::forward<Args>(args)...);
 1955|  70.5k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_10JSFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_6DomainEEERNS7_INS0_8JSObjectEEENS7_INS0_11HiddenClassEEERNS7_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_DpOT2_:
 1945|  6.19k|T *Runtime::makeAFixed(Args &&...args) {
 1946|  6.19k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|  6.19k|  (void)getCurrentIP();
 1952|  6.19k|#endif
 1953|  6.19k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|  6.19k|      std::forward<Args>(args)...);
 1955|  6.19k|}
_ZN6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EEC2ERNS0_7RuntimeEPS2_:
 1571|  6.19k|  XorPtr(Runtime &runtime, T *ptr) {
 1572|  6.19k|    set(runtime, ptr);
 1573|  6.19k|  }
_ZN6hermes2vm7Runtime10makeAFixedINS0_6DomainELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
 1945|    516|T *Runtime::makeAFixed(Args &&...args) {
 1946|    516|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    516|  (void)getCurrentIP();
 1952|    516|#endif
 1953|    516|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    516|      std::forward<Args>(args)...);
 1955|    516|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_11HiddenClassELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRS1_RNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_DpOT2_:
 1945|  94.2k|T *Runtime::makeAFixed(Args &&...args) {
 1946|  94.2k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|  94.2k|  (void)getCurrentIP();
 1952|  94.2k|#endif
 1953|  94.2k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|  94.2k|      std::forward<Args>(args)...);
 1955|  94.2k|}
_ZN6hermes2vm7Runtime10makeHandleINS0_15DictPropertyMapEEENS0_6HandleIT_EERKNS0_9GCPointerIS5_EE:
 1995|     45|inline Handle<T> Runtime::makeHandle(const GCPointer<T> &p) {
 1996|     45|  return Handle<T>(*this, p.get(*this));
 1997|     45|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT2_:
 1962|   415k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|   415k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|   415k|  (void)getCurrentIP();
 1969|   415k|#endif
 1970|   415k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|   415k|      size, std::forward<Args>(args)...);
 1972|   415k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT2_:
 1962|    216|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|    216|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|    216|  (void)getCurrentIP();
 1969|    216|#endif
 1970|    216|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|    216|      size, std::forward<Args>(args)...);
 1972|    216|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_12PseudoHandleINS0_15StringPrimitiveEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1975|  57.6k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1976|  57.6k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  57.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 57.6k]
  |  |  ------------------
  ------------------
 1977|      0|    hermes_fatal("Unhandled out of memory exception");
 1978|       |  // Use std::move here to account for specializations of CallResult,
 1979|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1980|       |  // which wrap a class with a deleted copy constructor.
 1981|  57.6k|  return std::move(res.getValue());
 1982|  57.6k|}
_ZN6hermes2vm7Runtime10makeHandleINS0_8CallableEEENS0_6HandleIT_EERKNS0_9GCPointerIS5_EE:
 1995|     70|inline Handle<T> Runtime::makeHandle(const GCPointer<T> &p) {
 1996|     70|  return Handle<T>(*this, p.get(*this));
 1997|     70|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_7JSArrayELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEERNS7_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
 1945|  1.05M|T *Runtime::makeAFixed(Args &&...args) {
 1946|  1.05M|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|  1.05M|  (void)getCurrentIP();
 1952|  1.05M|#endif
 1953|  1.05M|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|  1.05M|      std::forward<Args>(args)...);
 1955|  1.05M|}
_ZN6hermes2vm7Runtime10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EERKNS0_9GCPointerIS5_EE:
 1995|  1.15M|inline Handle<T> Runtime::makeHandle(const GCPointer<T> &p) {
 1996|  1.15M|  return Handle<T>(*this, p.get(*this));
 1997|  1.15M|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_7JSErrorELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERbEEEPT_DpOT2_:
 1945|     53|T *Runtime::makeAFixed(Args &&...args) {
 1946|     53|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|     53|  (void)getCurrentIP();
 1952|     53|#endif
 1953|     53|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|     53|      std::forward<Args>(args)...);
 1955|     53|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSObjectELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleIS3_EENS7_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
 1945|   364k|T *Runtime::makeAFixed(Args &&...args) {
 1946|   364k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|   364k|  (void)getCurrentIP();
 1952|   364k|#endif
 1953|   364k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|   364k|      std::forward<Args>(args)...);
 1955|   364k|}
_ZN6hermes2vm7Runtime17makeMutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEENS0_13MutableHandleIT_EERKNS0_9GCPointerIS7_EE:
 2000|  9.60k|inline MutableHandle<T> Runtime::makeMutableHandle(const GCPointer<T> &p) {
 2001|  9.60k|  return MutableHandle<T>(*this, p.get(*this));
 2002|  9.60k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSRegExpELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1945|      8|T *Runtime::makeAFixed(Args &&...args) {
 1946|      8|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|      8|  (void)getCurrentIP();
 1952|      8|#endif
 1953|      8|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|      8|      std::forward<Args>(args)...);
 1955|      8|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_10HostObjectELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSD_14default_deleteISF_EEEEEEEPT_DpOT2_:
 1945|    160|T *Runtime::makeAFixed(Args &&...args) {
 1946|    160|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    160|  (void)getCurrentIP();
 1952|    160|#endif
 1953|    160|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    160|      std::forward<Args>(args)...);
 1955|    160|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSStringELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_15StringPrimitiveEEERNS7_INS0_8JSObjectEEERNS7_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1945|    175|T *Runtime::makeAFixed(Args &&...args) {
 1946|    175|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    175|  (void)getCurrentIP();
 1952|    175|#endif
 1953|    175|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    175|      std::forward<Args>(args)...);
 1955|    175|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSNumberELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RdRNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1945|    161|T *Runtime::makeAFixed(Args &&...args) {
 1946|    161|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    161|  (void)getCurrentIP();
 1952|    161|#endif
 1953|    161|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    161|      std::forward<Args>(args)...);
 1955|    161|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_9JSBooleanELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RbRNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1945|    160|T *Runtime::makeAFixed(Args &&...args) {
 1946|    160|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    160|  (void)getCurrentIP();
 1952|    160|#endif
 1953|    160|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    160|      std::forward<Args>(args)...);
 1955|    160|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_16PropertyAccessorELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8CallableEEESA_EEEPT_DpOT2_:
 1945|  7.36k|T *Runtime::makeAFixed(Args &&...args) {
 1946|  7.36k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|  7.36k|  (void)getCurrentIP();
 1952|  7.36k|#endif
 1953|  7.36k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|  7.36k|      std::forward<Args>(args)...);
 1955|  7.36k|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureIbEET_NS0_10CallResultIS3_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEE:
 1975|  5.28k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1976|  5.28k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  5.28k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.28k]
  |  |  ------------------
  ------------------
 1977|      0|    hermes_fatal("Unhandled out of memory exception");
 1978|       |  // Use std::move here to account for specializations of CallResult,
 1979|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1980|       |  // which wrap a class with a deleted copy constructor.
 1981|  5.28k|  return std::move(res.getValue());
 1982|  5.28k|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_6HandleINS0_8SymbolIDEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1975|  7.44k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1976|  7.44k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  7.44k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7.44k]
  |  |  ------------------
  ------------------
 1977|      0|    hermes_fatal("Unhandled out of memory exception");
 1978|       |  // Use std::move here to account for specializations of CallResult,
 1979|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1980|       |  // which wrap a class with a deleted copy constructor.
 1981|  7.44k|  return std::move(res.getValue());
 1982|  7.44k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_18SegmentedArrayBaseINS0_11HermesValueEE7SegmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
 1945|    799|T *Runtime::makeAFixed(Args &&...args) {
 1946|    799|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    799|  (void)getCurrentIP();
 1952|    799|#endif
 1953|    799|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    799|      std::forward<Args>(args)...);
 1955|    799|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_18SegmentedArrayBaseINS0_11HermesValueEEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
 1962|    153|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|    153|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|    153|  (void)getCurrentIP();
 1969|    153|#endif
 1970|    153|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|    153|      size, std::forward<Args>(args)...);
 1972|    153|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
 1945|  2.23k|T *Runtime::makeAFixed(Args &&...args) {
 1946|  2.23k|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|  2.23k|  (void)getCurrentIP();
 1952|  2.23k|#endif
 1953|  2.23k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|  2.23k|      std::forward<Args>(args)...);
 1955|  2.23k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
 1962|   663k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|   663k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|   663k|  (void)getCurrentIP();
 1969|   663k|#endif
 1970|   663k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|   663k|      size, std::forward<Args>(args)...);
 1972|   663k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
 1962|      3|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|      3|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|      3|  (void)getCurrentIP();
 1969|      3|#endif
 1970|      3|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|      3|      size, std::forward<Args>(args)...);
 1972|      3|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
 1962|  20.4k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|  20.4k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|  20.4k|  (void)getCurrentIP();
 1969|  20.4k|#endif
 1970|  20.4k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|  20.4k|      size, std::forward<Args>(args)...);
 1972|  20.4k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
 1962|   390k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|   390k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|   390k|  (void)getCurrentIP();
 1969|   390k|#endif
 1970|   390k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|   390k|      size, std::forward<Args>(args)...);
 1972|   390k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
 1962|  2.10M|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|  2.10M|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|  2.10M|  (void)getCurrentIP();
 1969|  2.10M|#endif
 1970|  2.10M|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|  2.10M|      size, std::forward<Args>(args)...);
 1972|  2.10M|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
 1962|  20.4k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|  20.4k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|  20.4k|  (void)getCurrentIP();
 1969|  20.4k|#endif
 1970|  20.4k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|  20.4k|      size, std::forward<Args>(args)...);
 1972|  20.4k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
 1962|  1.95M|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|  1.95M|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|  1.95M|  (void)getCurrentIP();
 1969|  1.95M|#endif
 1970|  1.95M|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|  1.95M|      size, std::forward<Args>(args)...);
 1972|  1.95M|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
 1962|     11|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|     11|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|     11|  (void)getCurrentIP();
 1969|     11|#endif
 1970|     11|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|     11|      size, std::forward<Args>(args)...);
 1972|     11|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23ExternalStringPrimitiveIcEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT2_:
 1962|     28|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|     28|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|     28|  (void)getCurrentIP();
 1969|     28|#endif
 1970|     28|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|     28|      size, std::forward<Args>(args)...);
 1972|     28|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
 1962|    252|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|    252|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|    252|  (void)getCurrentIP();
 1969|    252|#endif
 1970|    252|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|    252|      size, std::forward<Args>(args)...);
 1972|    252|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23BufferedStringPrimitiveIDsEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT2_:
 1962|     31|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|     31|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|     31|  (void)getCurrentIP();
 1969|     31|#endif
 1970|     31|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|     31|      size, std::forward<Args>(args)...);
 1972|     31|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_12PseudoHandleINS0_11HermesValueEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1975|    800|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1976|    800|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    800|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 800]
  |  |  ------------------
  ------------------
 1977|      0|    hermes_fatal("Unhandled out of memory exception");
 1978|       |  // Use std::move here to account for specializations of CallResult,
 1979|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1980|       |  // which wrap a class with a deleted copy constructor.
 1981|    800|  return std::move(res.getValue());
 1982|    800|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_6HandleINS0_8JSStringEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1975|    160|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1976|    160|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
 1977|      0|    hermes_fatal("Unhandled out of memory exception");
 1978|       |  // Use std::move here to account for specializations of CallResult,
 1979|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1980|       |  // which wrap a class with a deleted copy constructor.
 1981|    160|  return std::move(res.getValue());
 1982|    160|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_6HandleINS0_7JSArrayEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1975|    160|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1976|    160|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
 1977|      0|    hermes_fatal("Unhandled out of memory exception");
 1978|       |  // Use std::move here to account for specializations of CallResult,
 1979|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1980|       |  // which wrap a class with a deleted copy constructor.
 1981|    160|  return std::move(res.getValue());
 1982|    160|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_12SingleObjectILNS0_8CellKindE60EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1945|    160|T *Runtime::makeAFixed(Args &&...args) {
 1946|    160|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    160|  (void)getCurrentIP();
 1952|    160|#endif
 1953|    160|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    160|      std::forward<Args>(args)...);
 1955|    160|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_12SingleObjectILNS0_8CellKindE59EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1945|    160|T *Runtime::makeAFixed(Args &&...args) {
 1946|    160|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    160|  (void)getCurrentIP();
 1952|    160|#endif
 1953|    160|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    160|      std::forward<Args>(args)...);
 1955|    160|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_15DictPropertyMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT2_:
 1962|   209k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1963|   209k|#ifndef NDEBUG
 1964|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1965|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1966|       |  // allows us to leverage our whole test-suite to find missing cases of
 1967|       |  // CAPTURE_IP* macros in the interpreter loop.
 1968|   209k|  (void)getCurrentIP();
 1969|   209k|#endif
 1970|   209k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1971|   209k|      size, std::forward<Args>(args)...);
 1972|   209k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_14OrderedHashMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_DpOT2_:
 1945|    160|T *Runtime::makeAFixed(Args &&...args) {
 1946|    160|#ifndef NDEBUG
 1947|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1948|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1949|       |  // allows us to leverage our whole test-suite to find missing cases of
 1950|       |  // CAPTURE_IP* macros in the interpreter loop.
 1951|    160|  (void)getCurrentIP();
 1952|    160|#endif
 1953|    160|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1954|    160|      std::forward<Args>(args)...);
 1955|    160|}

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

_ZN6hermes2vm18RuntimeModuleFlagsC2Ev:
   58|    643|  RuntimeModuleFlags() : flags(0) {}
_ZNK6hermes2vm13RuntimeModule20getOnlyLazyCodeBlockEv:
  186|     81|  CodeBlock *getOnlyLazyCodeBlock() const {
  187|     81|    assert(functionMap_.size() == 1 && functionMap_[0] && "Not a lazy module?");
  188|     81|    return functionMap_[0];
  189|     81|  }
_ZN6hermes2vm13RuntimeModule17getLazyRootModuleEv:
  206|    437|  RuntimeModule *getLazyRootModule() {
  207|       |#if defined(HERMESVM_LEAN)
  208|       |    return this;
  209|       |#else
  210|    437|    return lazyRoot_;
  211|    437|#endif
  212|    437|  }
_ZN6hermes2vm13RuntimeModule20getSymbolIDMustExistEj:
  237|  1.30M|  SymbolID getSymbolIDMustExist(StringID stringID) {
  238|  1.30M|    assert(
  239|  1.30M|        stringIDMap_[stringID].isValid() &&
  240|  1.30M|        "Symbol must exist for this string ID");
  241|  1.30M|    return stringIDMap_[stringID];
  242|  1.30M|  }
_ZN6hermes2vm13RuntimeModule34getSymbolIDFromStringIDMayAllocateEj:
  247|   764k|  SymbolID getSymbolIDFromStringIDMayAllocate(StringID stringID) {
  248|   764k|    SymbolID id = stringIDMap_[stringID];
  249|   764k|    if (LLVM_UNLIKELY(!id.isValid())) {
  ------------------
  |  |  189|   764k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.83k, False: 762k]
  |  |  ------------------
  ------------------
  250|       |      // Materialize this lazily created symbol.
  251|  1.83k|      auto entry = bcProvider_->getStringTableEntry(stringID);
  252|  1.83k|      id = createSymbolFromStringIDMayAllocate(stringID, entry, llvh::None);
  253|  1.83k|    }
  254|   764k|    assert(id.isValid() && "Failed to create symbol for stringID");
  255|   764k|    return id;
  256|   764k|  }
_ZN6hermes2vm13RuntimeModule23getCodeBlockMayAllocateEj:
  279|  6.51k|  inline CodeBlock *getCodeBlockMayAllocate(unsigned index) {
  280|  6.51k|    if (LLVM_LIKELY(functionMap_[index])) {
  ------------------
  |  |  188|  6.51k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 6.51k]
  |  |  ------------------
  ------------------
  281|      0|      return functionMap_[index];
  282|      0|    }
  283|  6.51k|    return getCodeBlockSlowPath(index);
  284|  6.51k|  }
_ZNK6hermes2vm13RuntimeModule13isInitializedEv:
  287|  6.59k|  bool isInitialized() const {
  288|  6.59k|    return !bcProvider_->isLazy();
  289|  6.59k|  }
_ZNK6hermes2vm13RuntimeModule11getBytecodeEv:
  291|    712|  const hbc::BCProvider *getBytecode() const {
  292|    712|    return bcProvider_.get();
  293|    712|  }
_ZN6hermes2vm13RuntimeModule11getBytecodeEv:
  295|  1.09k|  hbc::BCProvider *getBytecode() {
  296|  1.09k|    return bcProvider_.get();
  297|  1.09k|  }
_ZNK6hermes2vm13RuntimeModule13hasCJSModulesEv:
  305|    356|  bool hasCJSModules() const {
  306|    356|    return !getBytecode()->getCJSModuleTable().empty();
  307|    356|  }
_ZNK6hermes2vm13RuntimeModule19hasCJSModulesStaticEv:
  311|    356|  bool hasCJSModulesStatic() const {
  312|    356|    return !getBytecode()->getCJSModuleTableStatic().empty();
  313|    356|  }
_ZN6hermes2vm13RuntimeModule13markDomainRefERNS0_16WeakRootAcceptorE:
  363|  1.32k|  void markDomainRef(WeakRootAcceptor &acceptor) {
  364|  1.32k|    acceptor.acceptWeak(domain_);
  365|  1.32k|  }
_ZNK6hermes2vm13RuntimeModule18isOwningDomainDeadEv:
  368|  1.32k|  bool isOwningDomainDead() const {
  369|  1.32k|    return !domain_;
  370|  1.32k|  }
_ZN6hermes2vm13RuntimeModule24findCachedTemplateObjectEj:
  403|   390k|  JSObject *findCachedTemplateObject(uint32_t templateObjID) {
  404|   390k|    return templateMap_.lookup(templateObjID);
  405|   390k|  }
_ZN6hermes2vm13RuntimeModule19cacheTemplateObjectEjNS0_6HandleINS0_8JSObjectEEE:
  414|     38|      Handle<JSObject> templateObj) {
  415|     38|    assert(
  416|     38|        templateMap_.count(templateObjID) == 0 &&
  417|     38|        "The template object already exists.");
  418|     38|    templateMap_[templateObjID] = templateObj.get();
  419|     38|  }

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

_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE2atILNS3_6InlineE0EEES2_RNS0_11PointerBaseEj:
  283|   840k|  HVType at(PointerBase &base, size_type index) const {
  284|   840k|    assert(index < size(base) && "Invalid index.");
  285|   840k|    if (inl == Inline::Yes || index < kValueToSegmentThreshold) {
  ------------------
  |  Branch (285:9): [Folded - Ignored]
  |  Branch (285:31): [True: 24.6k, False: 815k]
  ------------------
  286|  24.6k|      return inlineStorage()[index];
  287|   815k|    } else {
  288|   815k|      return segmentAt(base, toSegment(index))->at(toInterior(index));
  289|   815k|    }
  290|   840k|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE4sizeERNS0_11PointerBaseE:
  304|  6.72M|  size_type size(PointerBase &base) const {
  305|  6.72M|    const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  306|  6.72M|    if (LLVM_LIKELY(numSlotsUsed <= kValueToSegmentThreshold)) {
  ------------------
  |  |  188|  6.72M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 175k, False: 6.54M]
  |  |  ------------------
  ------------------
  307|   175k|      return numSlotsUsed;
  308|  6.54M|    } else {
  309|  6.54M|      const SegmentNumber numSegments = numSlotsUsed - kValueToSegmentThreshold;
  310|  6.54M|      const size_type numBeforeLastSegment =
  311|  6.54M|          kValueToSegmentThreshold + (numSegments - 1) * Segment::kMaxLength;
  312|  6.54M|      const uint32_t numInLastSegment =
  313|  6.54M|          segmentAt(base, numSegments - 1)->length();
  314|  6.54M|      return numBeforeLastSegment + numInLastSegment;
  315|  6.54M|    }
  316|  6.72M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7Segment6lengthEv:
   93|  8.99M|    uint32_t length() const {
   94|  8.99M|      return length_.load(std::memory_order_relaxed);
   95|  8.99M|    }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE13inlineStorageEv:
  515|  24.6k|  const GCHVType *inlineStorage() const {
  516|  24.6k|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>();
  517|  24.6k|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE9segmentAtERNS0_11PointerBaseEj:
  487|  8.99M|  const Segment *segmentAt(PointerBase &base, SegmentNumber segment) const {
  488|  8.99M|    assert(
  489|  8.99M|        segment < numUsedSegments() &&
  490|  8.99M|        "Trying to get a segment that does not exist");
  491|  8.99M|    return vmcast<Segment>(
  492|  8.99M|        segmentAtPossiblyUnallocated(segment)->getObject(base));
  493|  8.99M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE15numUsedSegmentsEv:
  542|  8.99M|  SegmentNumber numUsedSegments() const {
  543|  8.99M|    const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  544|  8.99M|    return numSlotsUsed <= kValueToSegmentThreshold
  ------------------
  |  Branch (544:12): [True: 0, False: 8.99M]
  ------------------
  545|  8.99M|        ? 0
  546|  8.99M|        : numSlotsUsed - kValueToSegmentThreshold;
  547|  8.99M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7Segment7classofEPKNS0_6GCCellE:
   74|  8.99M|    static bool classof(const GCCell *cell) {
   75|  8.99M|      return cell->getKind() == getCellKind();
   76|  8.99M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7Segment11getCellKindEv:
   65|  8.99M|    static constexpr CellKind getCellKind() {
   66|  8.99M|      static_assert(
   67|  8.99M|          std::is_same<HVType, HermesValue>::value ||
   68|  8.99M|              std::is_same<HVType, SmallHermesValue>::value,
   69|  8.99M|          "Illegal HVType.");
   70|  8.99M|      return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (70:14): [Folded - Ignored]
  ------------------
   71|  8.99M|          ? CellKind::SegmentKind
   72|  8.99M|          : CellKind::SegmentSmallKind;
   73|  8.99M|    }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE28segmentAtPossiblyUnallocatedEj:
  502|  8.99M|  const GCHVType *segmentAtPossiblyUnallocated(SegmentNumber segment) const {
  503|  8.99M|    assert(
  504|  8.99M|        segment < numSegments() &&
  505|  8.99M|        "Trying to get a segment that does not exist");
  506|  8.99M|    return segments() + segment;
  507|  8.99M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE11numSegmentsEv:
  534|  8.99M|  SegmentNumber numSegments() const {
  535|  8.99M|    const auto slotCap = slotCapacity();
  536|  8.99M|    return slotCap <= kValueToSegmentThreshold
  ------------------
  |  Branch (536:12): [True: 0, False: 8.99M]
  ------------------
  537|  8.99M|        ? 0
  538|  8.99M|        : slotCap - kValueToSegmentThreshold;
  539|  8.99M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE12slotCapacityEv:
  154|  9.88M|  size_type slotCapacity() const {
  155|  9.88M|    return slotCapacityForAllocationSize(getAllocatedSize());
  156|  9.88M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE29slotCapacityForAllocationSizeEj:
  147|  9.88M|  static constexpr size_type slotCapacityForAllocationSize(uint32_t allocSize) {
  148|  9.88M|    return (allocSize - allocationSizeForSlots(0)) / sizeof(HVType);
  149|  9.88M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE22allocationSizeForSlotsEj:
  472|  9.88M|  static constexpr uint32_t allocationSizeForSlots(SegmentNumber numSlots) {
  473|  9.88M|    return SegmentedArrayBase::template totalSizeToAlloc<GCHVType>(numSlots);
  474|  9.88M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE8segmentsEv:
  526|  8.99M|  const GCHVType *segments() const {
  527|  8.99M|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>() +
  528|  8.99M|        kValueToSegmentThreshold;
  529|  8.99M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE9toSegmentEj:
  447|  2.44M|  static SegmentNumber toSegment(TotalIndex index) {
  448|  2.44M|    assert(
  449|  2.44M|        index >= kValueToSegmentThreshold &&
  450|  2.44M|        "Cannot get the segment of an element in the inline storage");
  451|  2.44M|    return (index - kValueToSegmentThreshold) / Segment::kMaxLength;
  452|  2.44M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7Segment2atEj:
   86|   815k|    const GCHVType &at(uint32_t index) const {
   87|   815k|      assert(
   88|   815k|          index < length() &&
   89|   815k|          "Cannot get an index outside of the length of a segment");
   90|   815k|      return data_[index];
   91|   815k|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE10toInteriorEj:
  457|  2.44M|  static InteriorIndex toInterior(TotalIndex index) {
  458|  2.44M|    assert(
  459|  2.44M|        index >= kValueToSegmentThreshold &&
  460|  2.44M|        "Cannot get the interior index of an element in the inline storage");
  461|  2.44M|    return (index - kValueToSegmentThreshold) % Segment::kMaxLength;
  462|  2.44M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE19numSlotsForCapacityEj:
  431|    967|  static constexpr SegmentNumber numSlotsForCapacity(size_type capacity) {
  432|    967|    if (capacity <= kValueToSegmentThreshold)
  ------------------
  |  Branch (432:9): [True: 135, False: 832]
  ------------------
  433|    135|      return capacity;
  434|       |    // Enough segments to hold the capacity excluding inline storage.
  435|    832|    const size_t numSegments = llvh::alignTo<Segment::kMaxLength>(
  436|    832|                                   capacity - kValueToSegmentThreshold) /
  437|    832|        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|    832|    return kValueToSegmentThreshold + numSegments;
  441|    967|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE25allocationSizeForCapacityEj:
  328|    153|  static constexpr uint32_t allocationSizeForCapacity(size_type capacity) {
  329|    153|    return allocationSizeForSlots(numSlotsForCapacity(capacity));
  330|    153|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE29maxNumSegmentsWithoutOverflowEv:
  629|    153|SegmentedArrayBase<HVType>::maxNumSegmentsWithoutOverflow() {
  630|    153|  return (
  631|    153|      (std::numeric_limits<uint32_t>::max() - kValueToSegmentThreshold) /
  632|    153|      Segment::kMaxLength);
  633|    153|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE14maxNumSegmentsEv:
  619|    153|SegmentedArrayBase<HVType>::maxNumSegments() {
  620|    153|  const SegmentedArrayBase::SegmentNumber maxAllocSlots =
  621|    153|      slotCapacityForAllocationSize(GC::maxAllocationSize());
  622|    153|  const SegmentedArrayBase::SegmentNumber maxAllocSegments =
  623|    153|      maxAllocSlots - kValueToSegmentThreshold;
  624|    153|  return std::min(maxAllocSegments, maxNumSegmentsWithoutOverflow());
  625|    153|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE11maxElementsEv:
  613|    153|SegmentedArrayBase<HVType>::maxElements() {
  614|    153|  return maxNumSegments() * Segment::kMaxLength + kValueToSegmentThreshold;
  615|    153|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE22allocationSizeForSlotsEj:
  472|  19.9M|  static constexpr uint32_t allocationSizeForSlots(SegmentNumber numSlots) {
  473|  19.9M|    return SegmentedArrayBase::template totalSizeToAlloc<GCHVType>(numSlots);
  474|  19.9M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE19numSlotsForCapacityEj:
  431|   664k|  static constexpr SegmentNumber numSlotsForCapacity(size_type capacity) {
  432|   664k|    if (capacity <= kValueToSegmentThreshold)
  ------------------
  |  Branch (432:9): [True: 662k, False: 1.42k]
  ------------------
  433|   662k|      return capacity;
  434|       |    // Enough segments to hold the capacity excluding inline storage.
  435|  1.42k|    const size_t numSegments = llvh::alignTo<Segment::kMaxLength>(
  436|  1.42k|                                   capacity - kValueToSegmentThreshold) /
  437|  1.42k|        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|  1.42k|    return kValueToSegmentThreshold + numSegments;
  441|   664k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE25allocationSizeForCapacityEj:
  328|   663k|  static constexpr uint32_t allocationSizeForCapacity(size_type capacity) {
  329|   663k|    return allocationSizeForSlots(numSlotsForCapacity(capacity));
  330|   663k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE29slotCapacityForAllocationSizeEj:
  147|  19.2M|  static constexpr size_type slotCapacityForAllocationSize(uint32_t allocSize) {
  148|  19.2M|    return (allocSize - allocationSizeForSlots(0)) / sizeof(HVType);
  149|  19.2M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE29maxNumSegmentsWithoutOverflowEv:
  629|  1.71M|SegmentedArrayBase<HVType>::maxNumSegmentsWithoutOverflow() {
  630|  1.71M|  return (
  631|  1.71M|      (std::numeric_limits<uint32_t>::max() - kValueToSegmentThreshold) /
  632|  1.71M|      Segment::kMaxLength);
  633|  1.71M|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE14maxNumSegmentsEv:
  619|  1.71M|SegmentedArrayBase<HVType>::maxNumSegments() {
  620|  1.71M|  const SegmentedArrayBase::SegmentNumber maxAllocSlots =
  621|  1.71M|      slotCapacityForAllocationSize(GC::maxAllocationSize());
  622|  1.71M|  const SegmentedArrayBase::SegmentNumber maxAllocSegments =
  623|  1.71M|      maxAllocSlots - kValueToSegmentThreshold;
  624|  1.71M|  return std::min(maxAllocSegments, maxNumSegmentsWithoutOverflow());
  625|  1.71M|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE11maxElementsEv:
  613|  1.71M|SegmentedArrayBase<HVType>::maxElements() {
  614|  1.71M|  return maxNumSegments() * Segment::kMaxLength + kValueToSegmentThreshold;
  615|  1.71M|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE11getCellKindEv:
  370|  1.68M|  static constexpr CellKind getCellKind() {
  371|  1.68M|    static_assert(
  372|  1.68M|        std::is_same<HVType, HermesValue>::value ||
  373|  1.68M|            std::is_same<HVType, SmallHermesValue>::value,
  374|  1.68M|        "Illegal HVType.");
  375|  1.68M|    return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (375:12): [Folded - Ignored]
  ------------------
  376|  1.68M|        ? CellKind::SegmentedArrayKind
  377|  1.68M|        : CellKind::SegmentedArraySmallKind;
  378|  1.68M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7classofEPKNS0_6GCCellE:
  379|  1.68M|  static bool classof(const GCCell *cell) {
  380|  1.68M|    return cell->getKind() == getCellKind();
  381|  1.68M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE3setILNS3_6InlineE0EEEvRNS0_7RuntimeEjS2_:
  294|  3.09M|  void set(Runtime &runtime, TotalIndex index, HVType val) {
  295|  3.09M|    atRef<inl>(runtime, index).set(val, runtime.getHeap());
  296|  3.09M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE5atRefILNS3_6InlineE0EEERNS0_17GCHermesValueBaseIS2_EERNS0_11PointerBaseEj:
  269|  3.09M|  GCHVType &atRef(PointerBase &base, TotalIndex index) {
  270|  3.09M|    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|  3.09M|    } else {
  277|  3.09M|      return *(begin(base) + index);
  278|  3.09M|    }
  279|  3.09M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE4sizeERNS0_11PointerBaseE:
  304|  16.4M|  size_type size(PointerBase &base) const {
  305|  16.4M|    const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  306|  16.4M|    if (LLVM_LIKELY(numSlotsUsed <= kValueToSegmentThreshold)) {
  ------------------
  |  |  188|  16.4M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5.03M, False: 11.4M]
  |  |  ------------------
  ------------------
  307|  5.03M|      return numSlotsUsed;
  308|  11.4M|    } else {
  309|  11.4M|      const SegmentNumber numSegments = numSlotsUsed - kValueToSegmentThreshold;
  310|  11.4M|      const size_type numBeforeLastSegment =
  311|  11.4M|          kValueToSegmentThreshold + (numSegments - 1) * Segment::kMaxLength;
  312|  11.4M|      const uint32_t numInLastSegment =
  313|  11.4M|          segmentAt(base, numSegments - 1)->length();
  314|  11.4M|      return numBeforeLastSegment + numInLastSegment;
  315|  11.4M|    }
  316|  16.4M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9segmentAtERNS0_11PointerBaseEj:
  487|  16.7M|  const Segment *segmentAt(PointerBase &base, SegmentNumber segment) const {
  488|  16.7M|    assert(
  489|  16.7M|        segment < numUsedSegments() &&
  490|  16.7M|        "Trying to get a segment that does not exist");
  491|  16.7M|    return vmcast<Segment>(
  492|  16.7M|        segmentAtPossiblyUnallocated(segment)->getObject(base));
  493|  16.7M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE15numUsedSegmentsEv:
  542|  16.7M|  SegmentNumber numUsedSegments() const {
  543|  16.7M|    const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  544|  16.7M|    return numSlotsUsed <= kValueToSegmentThreshold
  ------------------
  |  Branch (544:12): [True: 0, False: 16.7M]
  ------------------
  545|  16.7M|        ? 0
  546|  16.7M|        : numSlotsUsed - kValueToSegmentThreshold;
  547|  16.7M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE28segmentAtPossiblyUnallocatedEj:
  502|  16.7M|  const GCHVType *segmentAtPossiblyUnallocated(SegmentNumber segment) const {
  503|  16.7M|    assert(
  504|  16.7M|        segment < numSegments() &&
  505|  16.7M|        "Trying to get a segment that does not exist");
  506|  16.7M|    return segments() + segment;
  507|  16.7M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE11numSegmentsEv:
  534|  16.7M|  SegmentNumber numSegments() const {
  535|  16.7M|    const auto slotCap = slotCapacity();
  536|  16.7M|    return slotCap <= kValueToSegmentThreshold
  ------------------
  |  Branch (536:12): [True: 0, False: 16.7M]
  ------------------
  537|  16.7M|        ? 0
  538|  16.7M|        : slotCap - kValueToSegmentThreshold;
  539|  16.7M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE12slotCapacityEv:
  154|  19.2M|  size_type slotCapacity() const {
  155|  19.2M|    return slotCapacityForAllocationSize(getAllocatedSize());
  156|  19.2M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8segmentsEv:
  526|  16.7M|  const GCHVType *segments() const {
  527|  16.7M|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>() +
  528|  16.7M|        kValueToSegmentThreshold;
  529|  16.7M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment11getCellKindEv:
   65|  16.7M|    static constexpr CellKind getCellKind() {
   66|  16.7M|      static_assert(
   67|  16.7M|          std::is_same<HVType, HermesValue>::value ||
   68|  16.7M|              std::is_same<HVType, SmallHermesValue>::value,
   69|  16.7M|          "Illegal HVType.");
   70|  16.7M|      return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (70:14): [Folded - Ignored]
  ------------------
   71|  16.7M|          ? CellKind::SegmentKind
   72|  16.7M|          : CellKind::SegmentSmallKind;
   73|  16.7M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment7classofEPKNS0_6GCCellE:
   74|  16.7M|    static bool classof(const GCCell *cell) {
   75|  16.7M|      return cell->getKind() == getCellKind();
   76|  16.7M|    }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment6lengthEv:
   93|  16.7M|    uint32_t length() const {
   94|  16.7M|      return length_.load(std::memory_order_relaxed);
   95|  16.7M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE13inlineStorageEv:
  510|  2.35M|  GCHVType *inlineStorage() {
  511|  2.35M|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>();
  512|  2.35M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE5beginERNS0_11PointerBaseE:
  405|  3.09M|  iterator begin(PointerBase &base) {
  406|  3.09M|    return iterator(this, 0, base);
  407|  3.09M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8iteratorplEj:
  209|  3.09M|    iterator operator+(TotalIndex index) const {
  210|  3.09M|      assert(
  211|  3.09M|          index_ <= std::numeric_limits<TotalIndex>::max() - index &&
  212|  3.09M|          "Overflow in addition");
  213|  3.09M|      return iterator(owner_, index_ + index, base_);
  214|  3.09M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8iteratordeEv:
  232|  3.09M|    reference operator*() {
  233|  3.09M|      assert(
  234|  3.09M|          index_ < owner_->size(base_) &&
  235|  3.09M|          "Trying to read from an index outside the size");
  236|       |      // Almost all arrays fit entirely in the inline storage.
  237|  3.09M|      if (LLVM_LIKELY(index_ < kValueToSegmentThreshold)) {
  ------------------
  |  |  188|  3.09M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 823k, False: 2.27M]
  |  |  ------------------
  ------------------
  238|   823k|        return owner_->inlineStorage()[index_];
  239|  2.27M|      } else {
  240|  2.27M|        return owner_->segmentAt(base_, toSegment(index_))
  241|  2.27M|            ->at(toInterior(index_));
  242|  2.27M|      }
  243|  3.09M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9toSegmentEj:
  447|  5.27M|  static SegmentNumber toSegment(TotalIndex index) {
  448|  5.27M|    assert(
  449|  5.27M|        index >= kValueToSegmentThreshold &&
  450|  5.27M|        "Cannot get the segment of an element in the inline storage");
  451|  5.27M|    return (index - kValueToSegmentThreshold) / Segment::kMaxLength;
  452|  5.27M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9segmentAtERNS0_11PointerBaseEj:
  481|  3.60M|  Segment *segmentAt(PointerBase &base, SegmentNumber segment) {
  482|  3.60M|    return const_cast<Segment *>(
  483|  3.60M|        static_cast<const SegmentedArrayBase *>(this)->segmentAt(
  484|  3.60M|            base, segment));
  485|  3.60M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE10toInteriorEj:
  457|  5.26M|  static InteriorIndex toInterior(TotalIndex index) {
  458|  5.26M|    assert(
  459|  5.26M|        index >= kValueToSegmentThreshold &&
  460|  5.26M|        "Cannot get the interior index of an element in the inline storage");
  461|  5.26M|    return (index - kValueToSegmentThreshold) % Segment::kMaxLength;
  462|  5.26M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment2atEj:
   78|  2.27M|    GCHVType &at(uint32_t index) {
   79|  2.27M|      assert(
   80|  2.27M|          index < length() &&
   81|  2.27M|          "Cannot get an index outside of the length of a segment");
   82|  2.27M|      return data_[index];
   83|  2.27M|    }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE2atILNS3_6InlineE0EEES2_RNS0_11PointerBaseEj:
  283|  2.16M|  HVType at(PointerBase &base, size_type index) const {
  284|  2.16M|    assert(index < size(base) && "Invalid index.");
  285|  2.16M|    if (inl == Inline::Yes || index < kValueToSegmentThreshold) {
  ------------------
  |  Branch (285:9): [Folded - Ignored]
  |  Branch (285:31): [True: 502k, False: 1.66M]
  ------------------
  286|   502k|      return inlineStorage()[index];
  287|  1.66M|    } else {
  288|  1.66M|      return segmentAt(base, toSegment(index))->at(toInterior(index));
  289|  1.66M|    }
  290|  2.16M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE13inlineStorageEv:
  515|   502k|  const GCHVType *inlineStorage() const {
  516|   502k|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>();
  517|   502k|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment2atEj:
   86|  1.66M|    const GCHVType &at(uint32_t index) const {
   87|  1.66M|      assert(
   88|  1.66M|          index < length() &&
   89|  1.66M|          "Cannot get an index outside of the length of a segment");
   90|  1.66M|      return data_[index];
   91|  1.66M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE11getCellKindEv:
  370|  16.5M|  static constexpr CellKind getCellKind() {
  371|  16.5M|    static_assert(
  372|  16.5M|        std::is_same<HVType, HermesValue>::value ||
  373|  16.5M|            std::is_same<HVType, SmallHermesValue>::value,
  374|  16.5M|        "Illegal HVType.");
  375|  16.5M|    return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (375:12): [Folded - Ignored]
  ------------------
  376|  16.5M|        ? CellKind::SegmentedArrayKind
  377|  16.5M|        : CellKind::SegmentedArraySmallKind;
  378|  16.5M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7classofEPKNS0_6GCCellE:
  379|  15.2M|  static bool classof(const GCCell *cell) {
  380|  15.2M|    return cell->getKind() == getCellKind();
  381|  15.2M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8iteratorC2EPS3_jRNS0_11PointerBaseE:
  181|  6.18M|        : owner_(owner), index_(index), base_(base) {
  182|  6.18M|      assert(
  183|  6.18M|          index_ <= owner_->size(base_) &&
  184|  6.18M|          "Cannot make an iterator that points outside of the storage");
  185|  6.18M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE5clearERNS0_7RuntimeE:
  366|     15|  void clear(Runtime &runtime) {
  367|     15|    shrinkRight(runtime, size(runtime));
  368|     15|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7Segment2atEj:
   78|   815k|    GCHVType &at(uint32_t index) {
   79|   815k|      assert(
   80|   815k|          index < length() &&
   81|   815k|          "Cannot get an index outside of the length of a segment");
   82|   815k|      return data_[index];
   83|   815k|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE8iteratorC2EPS3_jRNS0_11PointerBaseE:
  181|  1.68M|        : owner_(owner), index_(index), base_(base) {
  182|  1.68M|      assert(
  183|  1.68M|          index_ <= owner_->size(base_) &&
  184|  1.68M|          "Cannot make an iterator that points outside of the storage");
  185|  1.68M|    }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE8iteratorplEj:
  209|   840k|    iterator operator+(TotalIndex index) const {
  210|   840k|      assert(
  211|   840k|          index_ <= std::numeric_limits<TotalIndex>::max() - index &&
  212|   840k|          "Overflow in addition");
  213|   840k|      return iterator(owner_, index_ + index, base_);
  214|   840k|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE8iteratordeEv:
  232|   840k|    reference operator*() {
  233|   840k|      assert(
  234|   840k|          index_ < owner_->size(base_) &&
  235|   840k|          "Trying to read from an index outside the size");
  236|       |      // Almost all arrays fit entirely in the inline storage.
  237|   840k|      if (LLVM_LIKELY(index_ < kValueToSegmentThreshold)) {
  ------------------
  |  |  188|   840k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 25.0k, False: 815k]
  |  |  ------------------
  ------------------
  238|  25.0k|        return owner_->inlineStorage()[index_];
  239|   815k|      } else {
  240|   815k|        return owner_->segmentAt(base_, toSegment(index_))
  241|   815k|            ->at(toInterior(index_));
  242|   815k|      }
  243|   840k|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE5beginERNS0_11PointerBaseE:
  405|   840k|  iterator begin(PointerBase &base) {
  406|   840k|    return iterator(this, 0, base);
  407|   840k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE20calculateNewCapacityEjj:
  421|    138|      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|    138|    return std::max(currentSize * 2, newSize);
  427|    138|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE9segmentAtERNS0_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_11HermesValueEE28segmentAtPossiblyUnallocatedEj:
  497|  2.39k|  GCHVType *segmentAtPossiblyUnallocated(SegmentNumber segment) {
  498|  2.39k|    return const_cast<GCHVType *>(static_cast<const SegmentedArrayBase *>(this)
  499|  2.39k|                                      ->segmentAtPossiblyUnallocated(segment));
  500|  2.39k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE13inlineStorageEv:
  510|  77.0k|  GCHVType *inlineStorage() {
  511|  77.0k|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>();
  512|  77.0k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE20calculateNewCapacityEjj:
  421|     13|      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|     13|    return std::max(currentSize * 2, newSize);
  427|     13|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE28segmentAtPossiblyUnallocatedEj:
  497|  5.80k|  GCHVType *segmentAtPossiblyUnallocated(SegmentNumber segment) {
  498|  5.80k|    return const_cast<GCHVType *>(static_cast<const SegmentedArrayBase *>(this)
  499|  5.80k|                                      ->segmentAtPossiblyUnallocated(segment));
  500|  5.80k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE5atRefILNS3_6InlineE0EEERNS0_17GCHermesValueBaseIS2_EERNS0_11PointerBaseEj:
  269|   840k|  GCHVType &atRef(PointerBase &base, TotalIndex index) {
  270|   840k|    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|   840k|    } else {
  277|   840k|      return *(begin(base) + index);
  278|   840k|    }
  279|   840k|  }

_ZN6hermes2vm23SerializedLiteralParserC2EN4llvh8ArrayRefIhEEjPNS0_13RuntimeModuleE:
   44|     14|      : SerializedLiteralParserBase(buff, totalLen),
   45|     14|        runtimeModule_(runtimeModule) {}

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

_ZN6hermes2vm19RootSectionAcceptor16beginRootSectionENS1_7SectionE:
   52|  5.31k|  virtual void beginRootSection(Section section) {}
_ZN6hermes2vm19RootSectionAcceptor14endRootSectionEv:
   53|  5.31k|  virtual void endRootSection() {}
_ZN6hermes2vm28RootAndSlotAcceptorWithNames6acceptERPNS0_6GCCellE:
   79|   633k|  void accept(GCCell *&ptr) final {
   80|   633k|    accept(ptr, nullptr);
   81|   633k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames6acceptERNS0_17PinnedHermesValueE:
   84|  2.08M|  void accept(PinnedHermesValue &hv) final {
   85|  2.08M|    accept(hv, nullptr);
   86|  2.08M|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames14acceptNullableERNS0_17PinnedHermesValueE:
   87|  3.11k|  void acceptNullable(PinnedHermesValue &hv) final {
   88|  3.11k|    acceptNullable(hv, nullptr);
   89|  3.11k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames6acceptERKNS0_12RootSymbolIDE:
   93|  24.4k|  void accept(const RootSymbolID &sym) final {
   94|  24.4k|    accept(sym, nullptr);
   95|  24.4k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames15provideSnapshotERKNSt3__18functionIFvRNS0_12HeapSnapshotEEEE:
  126|  1.13k|      const std::function<void(HeapSnapshot &)> &func) {}
_ZN6hermes2vm19RootSectionAcceptorD2Ev:
   42|  1.01k|  virtual ~RootSectionAcceptor() = default;
_ZN6hermes2vm12SlotAcceptorD2Ev:
   34|    904|  virtual ~SlotAcceptor() = default;
_ZN6hermes2vm12RootAcceptor9acceptPtrINS0_15StringPrimitiveEEEvRPT_:
   68|   615k|  void acceptPtr(T *&ptr) {
   69|   615k|    accept(reinterpret_cast<GCCell *&>(ptr));
   70|   615k|  }
_ZN6hermes2vm12RootAcceptor9acceptPtrINS0_8JSObjectEEEvRPT_:
   68|    285|  void acceptPtr(T *&ptr) {
   69|    285|    accept(reinterpret_cast<GCCell *&>(ptr));
   70|    285|  }
_ZN6hermes2vm12RootAcceptor9acceptPtrINS0_8CallableEEEvRPT_:
   68|  17.9k|  void acceptPtr(T *&ptr) {
   69|  17.9k|    accept(reinterpret_cast<GCCell *&>(ptr));
   70|  17.9k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames9acceptPtrINS0_8JSObjectEEEvRPT_PKc:
  100|    678|  void acceptPtr(T *&ptr, const char *name) {
  101|    678|    accept(reinterpret_cast<GCCell *&>(ptr), name);
  102|    678|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEEC2ERS4_:
  144|    113|  explicit DroppingAcceptor(Acceptor &acceptor) : acceptor(acceptor) {}
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEE6acceptERPNS0_6GCCellEPKc:
  148|  6.31k|  void accept(GCCell *&ptr, const char *) override {
  149|  6.31k|    acceptor.accept(ptr);
  150|  6.31k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEE6acceptERNS0_17PinnedHermesValueEPKc:
  156|   687k|  void accept(PinnedHermesValue &hv, const char *) override {
  157|   687k|    acceptor.accept(hv);
  158|   687k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEE14acceptNullableERNS0_17PinnedHermesValueEPKc:
  159|  1.03k|  void acceptNullable(PinnedHermesValue &hv, const char *) override {
  160|  1.03k|    acceptor.acceptNullable(hv);
  161|  1.03k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEEC2ERS2_:
  144|    226|  explicit DroppingAcceptor(Acceptor &acceptor) : acceptor(acceptor) {}
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE6acceptERPNS0_6GCCellEPKc:
  148|   628k|  void accept(GCCell *&ptr, const char *) override {
  149|   628k|    acceptor.accept(ptr);
  150|   628k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE6acceptERNS0_17PinnedHermesValueEPKc:
  156|  1.43M|  void accept(PinnedHermesValue &hv, const char *) override {
  157|  1.43M|    acceptor.accept(hv);
  158|  1.43M|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE14acceptNullableERNS0_17PinnedHermesValueEPKc:
  159|  2.07k|  void acceptNullable(PinnedHermesValue &hv, const char *) override {
  160|  2.07k|    acceptor.acceptNullable(hv);
  161|  2.07k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE6acceptERKNS0_12RootSymbolIDEPKc:
  171|  24.4k|  void accept(const RootSymbolID &sym, const char *) override {
  172|  24.4k|    acceptor.accept(sym);
  173|  24.4k|  }

_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEEC2ERS4_:
  109|  34.3k|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE16visitWithinRangeEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsEPKcSD_:
  130|    318|      const char *end) {
  131|    318|    auto *ptr = reinterpret_cast<char *>(cell);
  132|    318|    visitFieldsWithinRange(ptr, offsets, begin, end);
  133|    318|    if (offsets.array) {
  ------------------
  |  Branch (133:9): [True: 89, False: 229]
  ------------------
  134|     89|      visitArrayWithinRange(ptr, *offsets.array, begin, end);
  135|     89|    }
  136|    318|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE22visitFieldsWithinRangeEPcRKNS0_8Metadata11SlotOffsetsEPKcSC_:
  166|    318|      const char *end) {
  167|    318|    size_t i = 0;
  168|    318|#define SLOT_TYPE(type)                    \
  169|    318|  for (; i < offsets.end##type; ++i) {     \
  170|    318|    char *slot = base + offsets.fields[i]; \
  171|    318|    if (slot < begin)                      \
  172|    318|      continue;                            \
  173|    318|    if (slot >= end) {                     \
  174|    318|      i = offsets.end##type;               \
  175|    318|      break;                               \
  176|    318|    }                                      \
  177|    318|    visitSlot<type>(slot);                 \
  178|    318|  }
  179|    318|#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|    318|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  169|    602|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 414, False: 188]
  |  |  |  |  ------------------
  |  |  |  |  170|    414|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|    414|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 40, False: 374]
  |  |  |  |  ------------------
  |  |  |  |  172|    414|      continue;                            \
  |  |  |  |  173|    414|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 130, False: 244]
  |  |  |  |  ------------------
  |  |  |  |  174|    130|      i = offsets.end##type;               \
  |  |  |  |  175|    130|      break;                               \
  |  |  |  |  176|    130|    }                                      \
  |  |  |  |  177|    374|    visitSlot<type>(slot);                 \
  |  |  |  |  178|    244|  }
  |  |  ------------------
  |  |   11|    318|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  169|    318|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 0, False: 318]
  |  |  |  |  ------------------
  |  |  |  |  170|      0|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|      0|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  172|      0|      continue;                            \
  |  |  |  |  173|      0|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  174|      0|      i = offsets.end##type;               \
  |  |  |  |  175|      0|      break;                               \
  |  |  |  |  176|      0|    }                                      \
  |  |  |  |  177|      0|    visitSlot<type>(slot);                 \
  |  |  |  |  178|      0|  }
  |  |  ------------------
  |  |   12|    318|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  169|    329|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 18, False: 311]
  |  |  |  |  ------------------
  |  |  |  |  170|     18|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|     18|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 0, False: 18]
  |  |  |  |  ------------------
  |  |  |  |  172|     18|      continue;                            \
  |  |  |  |  173|     18|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 7, False: 11]
  |  |  |  |  ------------------
  |  |  |  |  174|      7|      i = offsets.end##type;               \
  |  |  |  |  175|      7|      break;                               \
  |  |  |  |  176|      7|    }                                      \
  |  |  |  |  177|     18|    visitSlot<type>(slot);                 \
  |  |  |  |  178|     11|  }
  |  |  ------------------
  |  |   13|    318|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  169|    400|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 82, False: 318]
  |  |  |  |  ------------------
  |  |  |  |  170|     82|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|     82|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 27, False: 55]
  |  |  |  |  ------------------
  |  |  |  |  172|     82|      continue;                            \
  |  |  |  |  173|     82|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 0, False: 55]
  |  |  |  |  ------------------
  |  |  |  |  174|      0|      i = offsets.end##type;               \
  |  |  |  |  175|      0|      break;                               \
  |  |  |  |  176|      0|    }                                      \
  |  |  |  |  177|     55|    visitSlot<type>(slot);                 \
  |  |  |  |  178|     55|  }
  |  |  ------------------
  ------------------
  180|    318|#undef SLOT_TYPE
  181|    318|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_13GCPointerBaseEEEvPc:
  142|   116k|  void visitSlot(char *const slot) {
  143|   116k|    assert(
  144|   116k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   116k|        "Should be aligned to the same alignment as T");
  146|   116k|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   116k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPc:
  142|      1|  void visitSlot(char *const slot) {
  143|      1|    assert(
  144|      1|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|      1|        "Should be aligned to the same alignment as T");
  146|      1|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|      1|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPc:
  142|  8.94k|  void visitSlot(char *const slot) {
  143|  8.94k|    assert(
  144|  8.94k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  8.94k|        "Should be aligned to the same alignment as T");
  146|  8.94k|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  8.94k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_10GCSymbolIDEEEvPc:
  142|  16.9k|  void visitSlot(char *const slot) {
  143|  16.9k|    assert(
  144|  16.9k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  16.9k|        "Should be aligned to the same alignment as T");
  146|  16.9k|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  16.9k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE21visitArrayWithinRangeEPcRKNS0_8Metadata9ArrayDataEPKcSC_:
  211|     89|      const char *end) {
  212|     89|    using ArrayType = Metadata::ArrayData::ArrayType;
  213|     89|    char *start = base + array.startOffset;
  214|     89|    const auto length =
  215|     89|        *reinterpret_cast<std::uint32_t *>(base + array.lengthOffset);
  216|     89|    const auto stride = array.stride;
  217|     89|    switch (array.type) {
  ------------------
  |  Branch (217:13): [True: 0, False: 89]
  ------------------
  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: 89]
  |  |  |  |  ------------------
  |  |  |  |  220|      0|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|      0|    break;
  |  |  ------------------
  |  |   11|      3|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  219|      3|  case ArrayType::type:                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (219:3): [True: 3, False: 86]
  |  |  |  |  ------------------
  |  |  |  |  220|      3|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|      3|    break;
  |  |  ------------------
  |  |   12|      4|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  219|      4|  case ArrayType::type:                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (219:3): [True: 4, False: 85]
  |  |  |  |  ------------------
  |  |  |  |  220|      4|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|      4|    break;
  |  |  ------------------
  |  |   13|     82|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  219|     82|  case ArrayType::type:                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (219:3): [True: 82, False: 7]
  |  |  |  |  ------------------
  |  |  |  |  220|     82|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|     82|    break;
  |  |  ------------------
  ------------------
  223|     89|#undef SLOT_TYPE
  224|     89|    }
  225|     89|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE27visitArrayObjectWithinRangeINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPcmmPKcSC_:
  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|     51|    while (start < end) {
  ------------------
  |  Branch (199:12): [True: 48, False: 3]
  ------------------
  200|       |      // Selects which type to cast to based on the type of array given.
  201|     48|      acceptor_.accept(*reinterpret_cast<ElementType *>(start));
  202|     48|      start += stride;
  203|     48|    }
  204|      3|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE27visitArrayObjectWithinRangeINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPcmmPKcSC_:
  191|      4|      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|      4|    const char *const endOfObject = start + length * stride;
  195|      4|    char *const alignedStartOfCard =
  196|      4|        const_cast<char *>(begin - (begin - start) % stride);
  197|      4|    start = std::max(start, alignedStartOfCard);
  198|      4|    end = std::min(endOfObject, end);
  199|    208|    while (start < end) {
  ------------------
  |  Branch (199:12): [True: 204, False: 4]
  ------------------
  200|       |      // Selects which type to cast to based on the type of array given.
  201|    204|      acceptor_.accept(*reinterpret_cast<ElementType *>(start));
  202|    204|      start += stride;
  203|    204|    }
  204|      4|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE27visitArrayObjectWithinRangeINS0_10GCSymbolIDEEEvPcmmPKcSA_:
  191|     82|      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|     82|    const char *const endOfObject = start + length * stride;
  195|     82|    char *const alignedStartOfCard =
  196|     82|        const_cast<char *>(begin - (begin - start) % stride);
  197|     82|    start = std::max(start, alignedStartOfCard);
  198|     82|    end = std::min(endOfObject, end);
  199|    301|    while (start < end) {
  ------------------
  |  Branch (199:12): [True: 219, False: 82]
  ------------------
  200|       |      // Selects which type to cast to based on the type of array given.
  201|    219|      acceptor_.accept(*reinterpret_cast<ElementType *>(start));
  202|    219|      start += stride;
  203|    219|    }
  204|     82|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|  63.5k|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|  63.5k|    auto *ptr = reinterpret_cast<char *>(cell);
  118|  63.5k|    visitFields(ptr, offsets);
  119|  63.5k|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 16.3k, False: 47.1k]
  ------------------
  120|  16.3k|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|  16.3k|    }
  122|  63.5k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|  63.5k|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|  63.5k|    size_t i = 0;
  153|  63.5k|#define SLOT_TYPE(type)              \
  154|  63.5k|  for (; i < offsets.end##type; ++i) \
  155|  63.5k|    visitSlot<type>(base + offsets.fields[i]);
  156|  63.5k|#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|  63.5k|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|   180k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 116k, False: 63.5k]
  |  |  |  |  ------------------
  |  |  |  |  155|   116k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|  63.5k|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|  63.5k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 1, False: 63.5k]
  |  |  |  |  ------------------
  |  |  |  |  155|  63.5k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|  63.5k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|  72.4k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 8.93k, False: 63.5k]
  |  |  |  |  ------------------
  |  |  |  |  155|  63.5k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|  63.5k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|  80.4k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 16.8k, False: 63.5k]
  |  |  |  |  ------------------
  |  |  |  |  155|  63.5k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|  63.5k|#undef SLOT_TYPE
  158|  63.5k|  }
_ZN6hermes2vm11BaseVisitor10visitArrayINS0_7HadesGC12EvacAcceptorILb0EEELb0EEEvRT_PcRKNS0_8Metadata9ArrayDataE:
   26|  16.3k|  visitArray(Acceptor &acceptor, char *base, const Metadata::ArrayData &array) {
   27|  16.3k|    using ArrayType = Metadata::ArrayData::ArrayType;
   28|  16.3k|    char *start = base + array.startOffset;
   29|       |    // Load the length, making sure all dependent writes have completed with
   30|       |    // memory_order_acquire.
   31|  16.3k|    const auto length = reinterpret_cast<AtomicIfConcurrentGC<std::uint32_t> *>(
   32|  16.3k|                            base + array.lengthOffset)
   33|  16.3k|                            ->load(std::memory_order_acquire);
   34|  16.3k|    const auto stride = array.stride;
   35|  16.3k|    switch (array.type) {
  ------------------
  |  Branch (35:13): [True: 0, False: 16.3k]
  ------------------
   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: 16.3k]
  |  |  |  |  ------------------
  |  |  |  |   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|      0|        acceptor, start, length, stride);        \
  |  |  |  |   40|      0|    break;
  |  |  ------------------
  |  |   11|    976|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   37|    976|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 976, False: 15.4k]
  |  |  |  |  ------------------
  |  |  |  |   38|    976|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|    976|        acceptor, start, length, stride);        \
  |  |  |  |   40|    976|    break;
  |  |  ------------------
  |  |   12|  13.8k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   37|  13.8k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 13.8k, False: 2.52k]
  |  |  |  |  ------------------
  |  |  |  |   38|  13.8k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  13.8k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  13.8k|    break;
  |  |  ------------------
  |  |   13|  1.55k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   37|  1.55k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 1.55k, False: 14.8k]
  |  |  |  |  ------------------
  |  |  |  |   38|  1.55k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  1.55k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  1.55k|    break;
  |  |  ------------------
  ------------------
   42|  16.3k|#undef SLOT_TYPE
   43|  16.3k|    }
   44|  16.3k|  }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EEEvRT_Pcjm:
   83|    976|      std::size_t stride) {
   84|   843k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 842k, False: 976]
  ------------------
   85|   842k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   842k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   842k|      start += stride;
   88|   842k|    }
   89|    976|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EE4implERS5_RS8_j:
   65|   842k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   842k|      acceptor.accept(elem);
   67|   842k|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EEEvRT_Pcjm:
   83|  13.8k|      std::size_t stride) {
   84|   550k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 536k, False: 13.8k]
  ------------------
   85|   536k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   536k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   536k|      start += stride;
   88|   536k|    }
   89|  13.8k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EE4implERS5_RS8_j:
   65|   536k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   536k|      acceptor.accept(elem);
   67|   536k|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12EvacAcceptorILb0EEENS0_10GCSymbolIDELb0EEEvRT_Pcjm:
   83|  1.55k|      std::size_t stride) {
   84|   480k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 478k, False: 1.55k]
  ------------------
   85|   478k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   478k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   478k|      start += stride;
   88|   478k|    }
   89|  1.55k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12EvacAcceptorILb0EEENS0_10GCSymbolIDELb0EE4implERS5_RS6_j:
   65|   478k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   478k|      acceptor.accept(elem);
   67|   478k|    }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEEC2ERS2_:
  109|  7.95M|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|  7.95M|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|  7.95M|    auto *ptr = reinterpret_cast<char *>(cell);
  118|  7.95M|    visitFields(ptr, offsets);
  119|  7.95M|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 952k, False: 6.99M]
  ------------------
  120|   952k|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|   952k|    }
  122|  7.95M|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|  7.95M|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|  7.95M|    size_t i = 0;
  153|  7.95M|#define SLOT_TYPE(type)              \
  154|  7.95M|  for (; i < offsets.end##type; ++i) \
  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  156|  7.95M|#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|  7.95M|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|  13.9M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 5.97M, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|  7.95M|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|  7.95M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 22, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|  7.95M|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|  11.7M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 3.78M, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|  7.95M|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|  8.08M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 133k, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|  7.95M|#undef SLOT_TYPE
  158|  7.95M|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_13GCPointerBaseEEEvPc:
  142|  5.97M|  void visitSlot(char *const slot) {
  143|  5.97M|    assert(
  144|  5.97M|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  5.97M|        "Should be aligned to the same alignment as T");
  146|  5.97M|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  5.97M|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPc:
  142|     22|  void visitSlot(char *const slot) {
  143|     22|    assert(
  144|     22|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|     22|        "Should be aligned to the same alignment as T");
  146|     22|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|     22|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPc:
  142|  3.78M|  void visitSlot(char *const slot) {
  143|  3.78M|    assert(
  144|  3.78M|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  3.78M|        "Should be aligned to the same alignment as T");
  146|  3.78M|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  3.78M|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_10GCSymbolIDEEEvPc:
  142|   133k|  void visitSlot(char *const slot) {
  143|   133k|    assert(
  144|   133k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   133k|        "Should be aligned to the same alignment as T");
  146|   133k|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   133k|  }
_ZN6hermes2vm11BaseVisitor10visitArrayINS0_27CheckHeapWellFormedAcceptorELb0EEEvRT_PcRKNS0_8Metadata9ArrayDataE:
   26|   952k|  visitArray(Acceptor &acceptor, char *base, const Metadata::ArrayData &array) {
   27|   952k|    using ArrayType = Metadata::ArrayData::ArrayType;
   28|   952k|    char *start = base + array.startOffset;
   29|       |    // Load the length, making sure all dependent writes have completed with
   30|       |    // memory_order_acquire.
   31|   952k|    const auto length = reinterpret_cast<AtomicIfConcurrentGC<std::uint32_t> *>(
   32|   952k|                            base + array.lengthOffset)
   33|   952k|                            ->load(std::memory_order_acquire);
   34|   952k|    const auto stride = array.stride;
   35|   952k|    switch (array.type) {
  ------------------
  |  Branch (35:13): [True: 0, False: 952k]
  ------------------
   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: 952k]
  |  |  |  |  ------------------
  |  |  |  |   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|      0|        acceptor, start, length, stride);        \
  |  |  |  |   40|      0|    break;
  |  |  ------------------
  |  |   11|  21.0k|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   37|  21.0k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 21.0k, False: 931k]
  |  |  |  |  ------------------
  |  |  |  |   38|  21.0k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  21.0k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  21.0k|    break;
  |  |  ------------------
  |  |   12|   742k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   37|   742k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 742k, False: 209k]
  |  |  |  |  ------------------
  |  |  |  |   38|   742k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|   742k|        acceptor, start, length, stride);        \
  |  |  |  |   40|   742k|    break;
  |  |  ------------------
  |  |   13|   188k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   37|   188k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 188k, False: 763k]
  |  |  |  |  ------------------
  |  |  |  |   38|   188k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|   188k|        acceptor, start, length, stride);        \
  |  |  |  |   40|   188k|    break;
  |  |  ------------------
  ------------------
   42|   952k|#undef SLOT_TYPE
   43|   952k|    }
   44|   952k|  }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EEEvRT_Pcjm:
   83|  21.0k|      std::size_t stride) {
   84|  20.5M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 20.5M, False: 21.0k]
  ------------------
   85|  20.5M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  20.5M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  20.5M|      start += stride;
   88|  20.5M|    }
   89|  21.0k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EE4implERS3_RS6_j:
   65|  20.5M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  20.5M|      acceptor.accept(elem);
   67|  20.5M|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EEEvRT_Pcjm:
   83|   742k|      std::size_t stride) {
   84|  4.36M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 3.61M, False: 742k]
  ------------------
   85|  3.61M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  3.61M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  3.61M|      start += stride;
   88|  3.61M|    }
   89|   742k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EE4implERS3_RS6_j:
   65|  3.61M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  3.61M|      acceptor.accept(elem);
   67|  3.61M|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_27CheckHeapWellFormedAcceptorENS0_10GCSymbolIDELb0EEEvRT_Pcjm:
   83|   188k|      std::size_t stride) {
   84|  2.37M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 2.18M, False: 188k]
  ------------------
   85|  2.18M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  2.18M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  2.18M|      start += stride;
   88|  2.18M|    }
   89|   188k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_27CheckHeapWellFormedAcceptorENS0_10GCSymbolIDELb0EE4implERS3_RS4_j:
   65|  2.18M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  2.18M|      acceptor.accept(elem);
   67|  2.18M|    }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEC2ERS3_:
  109|  7.95M|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|  7.95M|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|  7.95M|    auto *ptr = reinterpret_cast<char *>(cell);
  118|  7.95M|    visitFields(ptr, offsets);
  119|  7.95M|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 952k, False: 6.99M]
  ------------------
  120|   952k|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|   952k|    }
  122|  7.95M|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|  7.95M|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|  7.95M|    size_t i = 0;
  153|  7.95M|#define SLOT_TYPE(type)              \
  154|  7.95M|  for (; i < offsets.end##type; ++i) \
  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  156|  7.95M|#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|  7.95M|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|  13.9M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 5.97M, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|  7.95M|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|  7.95M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 22, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|  7.95M|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|  11.7M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 3.78M, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|  7.95M|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|  8.08M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 133k, False: 7.95M]
  |  |  |  |  ------------------
  |  |  |  |  155|  7.95M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|  7.95M|#undef SLOT_TYPE
  158|  7.95M|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_13GCPointerBaseEEEvPc:
  142|  5.97M|  void visitSlot(char *const slot) {
  143|  5.97M|    assert(
  144|  5.97M|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  5.97M|        "Should be aligned to the same alignment as T");
  146|  5.97M|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  5.97M|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPc:
  142|     22|  void visitSlot(char *const slot) {
  143|     22|    assert(
  144|     22|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|     22|        "Should be aligned to the same alignment as T");
  146|     22|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|     22|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPc:
  142|  3.78M|  void visitSlot(char *const slot) {
  143|  3.78M|    assert(
  144|  3.78M|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  3.78M|        "Should be aligned to the same alignment as T");
  146|  3.78M|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  3.78M|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_10GCSymbolIDEEEvPc:
  142|   133k|  void visitSlot(char *const slot) {
  143|   133k|    assert(
  144|   133k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   133k|        "Should be aligned to the same alignment as T");
  146|   133k|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   133k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor10visitArrayIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorLb0EEEvRT_PcRKNS0_8Metadata9ArrayDataE:
   26|   952k|  visitArray(Acceptor &acceptor, char *base, const Metadata::ArrayData &array) {
   27|   952k|    using ArrayType = Metadata::ArrayData::ArrayType;
   28|   952k|    char *start = base + array.startOffset;
   29|       |    // Load the length, making sure all dependent writes have completed with
   30|       |    // memory_order_acquire.
   31|   952k|    const auto length = reinterpret_cast<AtomicIfConcurrentGC<std::uint32_t> *>(
   32|   952k|                            base + array.lengthOffset)
   33|   952k|                            ->load(std::memory_order_acquire);
   34|   952k|    const auto stride = array.stride;
   35|   952k|    switch (array.type) {
  ------------------
  |  Branch (35:13): [True: 0, False: 952k]
  ------------------
   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: 952k]
  |  |  |  |  ------------------
  |  |  |  |   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|      0|        acceptor, start, length, stride);        \
  |  |  |  |   40|      0|    break;
  |  |  ------------------
  |  |   11|  21.0k|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   37|  21.0k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 21.0k, False: 931k]
  |  |  |  |  ------------------
  |  |  |  |   38|  21.0k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  21.0k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  21.0k|    break;
  |  |  ------------------
  |  |   12|   742k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   37|   742k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 742k, False: 209k]
  |  |  |  |  ------------------
  |  |  |  |   38|   742k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|   742k|        acceptor, start, length, stride);        \
  |  |  |  |   40|   742k|    break;
  |  |  ------------------
  |  |   13|   188k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   37|   188k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 188k, False: 763k]
  |  |  |  |  ------------------
  |  |  |  |   38|   188k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|   188k|        acceptor, start, length, stride);        \
  |  |  |  |   40|   188k|    break;
  |  |  ------------------
  ------------------
   42|   952k|#undef SLOT_TYPE
   43|   952k|    }
   44|   952k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor16visitArrayObjectIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EEEvRT_Pcjm:
   83|  21.0k|      std::size_t stride) {
   84|  20.5M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 20.5M, False: 21.0k]
  ------------------
   85|  20.5M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  20.5M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  20.5M|      start += stride;
   88|  20.5M|    }
   89|  21.0k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EE4implERS4_RS7_j:
   65|  20.5M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  20.5M|      acceptor.accept(elem);
   67|  20.5M|    }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor16visitArrayObjectIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EEEvRT_Pcjm:
   83|   742k|      std::size_t stride) {
   84|  4.36M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 3.61M, False: 742k]
  ------------------
   85|  3.61M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  3.61M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  3.61M|      start += stride;
   88|  3.61M|    }
   89|   742k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EE4implERS4_RS7_j:
   65|  3.61M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  3.61M|      acceptor.accept(elem);
   67|  3.61M|    }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor16visitArrayObjectIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_10GCSymbolIDELb0EEEvRT_Pcjm:
   83|   188k|      std::size_t stride) {
   84|  2.37M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 2.18M, False: 188k]
  ------------------
   85|  2.18M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  2.18M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  2.18M|      start += stride;
   88|  2.18M|    }
   89|   188k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_10GCSymbolIDELb0EE4implERS4_RS5_j:
   65|  2.18M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  2.18M|      acceptor.accept(elem);
   67|  2.18M|    }

_ZNK6hermes2vm13HermesValue329getNumberERNS0_11PointerBaseE:
   90|  3.29M|double HermesValue32::getNumber(PointerBase &pb) const {
   91|  3.29M|  assert(isNumber());
   92|  3.29M|  if (LLVM_LIKELY(getTag() == Tag::SmallInt))
  ------------------
  |  |  188|  3.29M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.29M, False: 0]
  |  |  ------------------
  ------------------
   93|  3.29M|    return getSmallInt();
   94|      0|  return vmcast<BoxedDouble>(getPointer(pb))->get();
   95|  3.29M|}
_ZN6hermes2vm13HermesValue327setInGCES1_RNS0_7HadesGCE:
   35|   527k|void HermesValue32::setInGC(HermesValue32 hv, GC &gc) {
   36|   527k|  setNoBarrier(hv);
   37|   527k|  assert(gc.calledByGC());
   38|   527k|}
_ZNK6hermes2vm13HermesValue329unboxToHVERNS0_11PointerBaseE:
   40|  6.26M|HermesValue HermesValue32::unboxToHV(PointerBase &pb) const {
   41|  6.26M|  switch (getETag()) {
   42|  2.03M|    case ETag::Object1:
  ------------------
  |  Branch (42:5): [True: 2.03M, False: 4.22M]
  ------------------
   43|  3.63M|    case ETag::Object2:
  ------------------
  |  Branch (43:5): [True: 1.60M, False: 4.65M]
  ------------------
   44|  3.63M|      return HermesValue::encodeObjectValue(getObject(pb));
   45|      0|    case ETag::BigInt1:
  ------------------
  |  Branch (45:5): [True: 0, False: 6.26M]
  ------------------
   46|      0|    case ETag::BigInt2:
  ------------------
  |  Branch (46:5): [True: 0, False: 6.26M]
  ------------------
   47|      0|      return HermesValue::encodeBigIntValue(getBigInt(pb));
   48|   689k|    case ETag::String1:
  ------------------
  |  Branch (48:5): [True: 689k, False: 5.57M]
  ------------------
   49|   730k|    case ETag::String2:
  ------------------
  |  Branch (49:5): [True: 40.7k, False: 6.22M]
  ------------------
   50|   730k|      return HermesValue::encodeStringValue(getString(pb));
   51|      0|    case ETag::BoxedDouble1:
  ------------------
  |  Branch (51:5): [True: 0, False: 6.26M]
  ------------------
   52|      0|    case ETag::BoxedDouble2:
  ------------------
  |  Branch (52:5): [True: 0, False: 6.26M]
  ------------------
   53|      0|      return HermesValue::encodeUntrustedNumberValue(
   54|      0|          vmcast<BoxedDouble>(getPointer(pb))->get());
   55|   811k|    case ETag::SmallInt1:
  ------------------
  |  Branch (55:5): [True: 811k, False: 5.45M]
  ------------------
   56|  1.62M|    case ETag::SmallInt2:
  ------------------
  |  Branch (56:5): [True: 811k, False: 5.45M]
  ------------------
   57|  1.62M|      return HermesValue::encodeTrustedNumberValue(getSmallInt());
   58|      0|    case ETag::Symbol1:
  ------------------
  |  Branch (58:5): [True: 0, False: 6.26M]
  ------------------
   59|      0|    case ETag::Symbol2:
  ------------------
  |  Branch (59:5): [True: 0, False: 6.26M]
  ------------------
   60|      0|      return HermesValue::encodeSymbolValue(SymbolID::unsafeCreate(getValue()));
   61|      0|    case ETag::Bool:
  ------------------
  |  Branch (61:5): [True: 0, False: 6.26M]
  ------------------
   62|      0|      return HermesValue::encodeBoolValue(getETagValue());
   63|      3|    case ETag::Undefined:
  ------------------
  |  Branch (63:5): [True: 3, False: 6.26M]
  ------------------
   64|      3|      return HermesValue::encodeUndefinedValue();
   65|   271k|    case ETag::Empty:
  ------------------
  |  Branch (65:5): [True: 271k, False: 5.99M]
  ------------------
   66|   271k|      return HermesValue::encodeEmptyValue();
   67|      0|    case ETag::Null:
  ------------------
  |  Branch (67:5): [True: 0, False: 6.26M]
  ------------------
   68|      0|      return HermesValue::encodeNullValue();
   69|      0|    default:
  ------------------
  |  Branch (69:5): [True: 0, False: 6.26M]
  ------------------
   70|      0|      llvm_unreachable("No other tag");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   71|  6.26M|  }
   72|  6.26M|}
_ZNK6hermes2vm13HermesValue329getStringERNS0_11PointerBaseE:
   85|  1.47M|StringPrimitive *HermesValue32::getString(PointerBase &pb) const {
   86|  1.47M|  assert(isString());
   87|  1.47M|  return vmcast<StringPrimitive>(getPointer(pb));
   88|  1.47M|}
_ZN6hermes2vm13HermesValue3217encodeHermesValueENS0_11HermesValueERNS0_7RuntimeE:
   99|  5.63M|    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|  5.63M|  switch (hv.getETag()) {
  108|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (108:5): [True: 0, False: 5.63M]
  ------------------
  109|      0|      return encodeEmptyValue();
  110|    323|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (110:5): [True: 323, False: 5.63M]
  ------------------
  111|    323|      return encodeUndefinedValue();
  112|  4.64k|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (112:5): [True: 4.64k, False: 5.63M]
  ------------------
  113|  4.64k|      return encodeNullValue();
  114|    320|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (114:5): [True: 320, False: 5.63M]
  ------------------
  115|    320|      return encodeBoolValue(hv.getBool());
  116|  1.60k|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (116:5): [True: 1.60k, False: 5.63M]
  ------------------
  117|  1.60k|      return encodeSymbolValue(hv.getSymbol());
  118|  2.37M|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (118:5): [True: 2.37M, False: 3.26M]
  ------------------
  119|  2.37M|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (119:5): [True: 0, False: 5.63M]
  ------------------
  120|  2.37M|      return encodeStringValue(hv.getString(), runtime);
  121|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (121:5): [True: 0, False: 5.63M]
  ------------------
  122|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (122:5): [True: 0, False: 5.63M]
  ------------------
  123|      0|      return encodeBigIntValue(hv.getBigInt(), runtime);
  124|   274k|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (124:5): [True: 274k, False: 5.36M]
  ------------------
  125|   274k|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (125:5): [True: 0, False: 5.63M]
  ------------------
  126|   274k|      return encodeObjectValue(static_cast<GCCell *>(hv.getObject()), runtime);
  127|  2.98M|    default:
  ------------------
  |  Branch (127:5): [True: 2.98M, False: 2.65M]
  ------------------
  128|  2.98M|      assert(
  129|  2.98M|          hv.isNumber() && "Native values are forbidden in SmallHermesValue");
  130|  2.98M|      return encodeNumberValue(hv.getNumber(), runtime);
  131|  5.63M|  }
  132|  5.63M|}
_ZN6hermes2vm13HermesValue3217encodeNumberValueEdRNS0_7RuntimeE:
  136|  5.52M|    Runtime &runtime) {
  137|       |  // Always box values when Handle-SAN is on so we can catch any mistakes.
  138|  5.52M|#ifndef HERMESVM_SANITIZE_HANDLES
  139|  5.52M|  const SmiType i = doubleToSmi(d);
  140|  5.52M|  if (LLVM_LIKELY(llvh::DoubleToBits(d) == llvh::DoubleToBits(i)))
  ------------------
  |  |  188|  5.52M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.71M, False: 818k]
  |  |  ------------------
  ------------------
  141|  4.71M|    return fromTagAndValue(Tag::SmallInt, i);
  142|   818k|#endif
  143|   818k|  return encodePointerImpl(
  144|   818k|      BoxedDouble::create(d, runtime), Tag::BoxedDouble, runtime);
  145|  5.52M|}
_ZN6hermes2vm13HermesValue3217encodeObjectValueEPNS0_6GCCellERNS0_11PointerBaseE:
  149|   276k|    PointerBase &pb) {
  150|   276k|  assert(
  151|   276k|      (!ptr || !vmisa<StringPrimitive>(ptr) || !vmisa<BigIntPrimitive>(ptr)) &&
  152|   276k|      "Strings must use encodeStringValue; BigInts, encodeBigIntValue");
  153|   276k|  return encodePointerImpl(ptr, Tag::Object, pb);
  154|   276k|}

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

_ZN6hermes2vm12SmallXStringIDsLj32EEC2EN4llvh9StringRefE:
   37|    160|      : Super(strRef.bytes_begin(), strRef.bytes_end()) {}
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendINS0_10StringView14const_iteratorEEERS2_T_S7_:
   73|    160|  SmallXString &append(in_iter start, in_iter end) {
   74|    160|    Super::append(start, end);
   75|    160|    return *this;
   76|    160|  }
_ZN6hermes2vm12SmallXStringIDsLj32EEC2Ev:
   29|   716k|  SmallXString() {}
_ZNK6hermes2vm12SmallXStringIDsLj32EE8arrayRefEv:
   78|      2|  llvh::ArrayRef<T> arrayRef() const {
   79|      2|    return llvh::ArrayRef<T>(Super::begin(), Super::end());
   80|      2|  }
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendEPKDs:
   49|    150|  SmallXString &append(const T *strz) {
   50|    150|    Super::append(strz, strz + std::char_traits<T>::length(strz));
   51|    150|    return *this;
   52|    150|  }
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendEN4llvh9StringRefE:
   55|  86.3k|  SmallXString &append(llvh::StringRef strRef) {
   56|  86.3k|    Super::append(strRef.bytes_begin(), strRef.bytes_end());
   57|  86.3k|    return *this;
   58|  86.3k|  }
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendEDs:
   61|  5.17k|  SmallXString &append(T ch) {
   62|  5.17k|    Super::push_back(ch);
   63|  5.17k|    return *this;
   64|  5.17k|  }
_ZN6hermes2vm12SmallXStringIDsLj64EEC2Ev:
   29|    138|  SmallXString() {}
_ZN6hermes2vm12SmallXStringIDsLj64EE6appendEN4llvh9StringRefE:
   55|    170|  SmallXString &append(llvh::StringRef strRef) {
   56|    170|    Super::append(strRef.bytes_begin(), strRef.bytes_end());
   57|    170|    return *this;
   58|    170|  }
_ZN6hermes2vm12SmallXStringIDsLj64EE6appendEc:
   67|     81|  SmallXString &append(char ch) {
   68|     81|    Super::push_back((unsigned char)ch);
   69|     81|    return *this;
   70|     81|  }
_ZN6hermes2vm12SmallXStringIDsLj4EEC2Ev:
   29|     87|  SmallXString() {}

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

_ZN6hermes2vm14StackFramePtrTILb0EEC2Ev:
   50|  5.32M|  explicit StackFramePtrT() : frame_(nullptr) {}
_ZN6hermes2vm14StackFramePtrTILb0EE9initFrameEPNS0_17PinnedHermesValueES2_PKNS_4inst4InstEPKNS0_9CodeBlockEjNS0_11HermesValueESC_:
  205|  3.45M|      HermesValue newTarget) {
  206|  3.45M|    stackPointer[StackFrameLayout::PreviousFrame] =
  207|  3.45M|        HermesValue::encodeNativePointer(previousFrame.ptr());
  208|  3.45M|    stackPointer[StackFrameLayout::SavedIP] =
  209|  3.45M|        HermesValue::encodeNativePointer(savedIP);
  210|  3.45M|    stackPointer[StackFrameLayout::SavedCodeBlock] =
  211|  3.45M|        HermesValue::encodeNativePointer(savedCodeBlock);
  212|  3.45M|    stackPointer[StackFrameLayout::ArgCount] =
  213|  3.45M|        HermesValue::encodeNativeUInt32(argCount);
  214|  3.45M|    stackPointer[StackFrameLayout::NewTarget] = newTarget;
  215|  3.45M|    stackPointer[StackFrameLayout::CalleeClosureOrCB] = calleeClosureOrCB;
  216|       |
  217|  3.45M|    return StackFramePtrT<false>{stackPointer};
  218|  3.45M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE3ptrEv:
   91|  6.90M|  QualifiedHV *ptr() const {
   92|  6.90M|    return frame_;
   93|  6.90M|  }
_ZN6hermes2vm14StackFramePtrTILb0EEC2EPNS0_17PinnedHermesValueE:
   53|  11.5M|  explicit StackFramePtrT(QualifiedHV *frame) : frame_(frame) {}
_ZNK6hermes2vm14StackFramePtrTILb0EE13getThisArgRefEv:
   97|  9.17M|  QualifiedHV &get##name##Ref() const {       \
   98|  9.17M|    return frame_[StackFrameLayout::name];    \
   99|  9.17M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE11getArgCountEv:
  140|  6.12M|  uint32_t getArgCount() const {
  141|  6.12M|    return getArgCountRef().getNativeUInt32();
  142|  6.12M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE14getArgCountRefEv:
   97|  6.12M|  QualifiedHV &get##name##Ref() const {       \
   98|  6.12M|    return frame_[StackFrameLayout::name];    \
   99|  6.12M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE9argsBeginEv:
  172|  6.11M|  ArgIteratorT<isConst> argsBegin() const {
  173|  6.11M|    return ArgIteratorT<isConst>(&getThisArgRef());
  174|  6.11M|  }
_ZN6hermes2vm14StackFramePtrTILb0EEptEv:
   80|   395k|  StackFramePtrT *operator->() {
   81|   395k|    return this;
   82|   395k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE9getArgRefEi:
  179|  2.88k|  QualifiedHV &getArgRef(int32_t n) const {
  180|  2.88k|    assert(n >= -1 && n < (int64_t)getArgCount() && "invalid argument index");
  181|  2.88k|    return argsBegin()[n];
  182|  2.88k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE10getSavedIPEv:
  128|  4.23M|  const Inst *getSavedIP() const {
  129|  4.23M|    return getSavedIPRef().template getNativePointer<const Inst>();
  130|  4.23M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE13getSavedIPRefEv:
   97|  7.68M|  QualifiedHV &get##name##Ref() const {       \
   98|  7.68M|    return frame_[StackFrameLayout::name];    \
   99|  7.68M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EEeqES2_:
   69|  3.45M|  bool operator==(StackFramePtrT o) const {
   70|  3.45M|    return frame_ == o.frame_;
   71|  3.45M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE16getPreviousFrameEv:
  122|  3.45M|  StackFramePtrT<isConst> getPreviousFrame() const {
  123|  3.45M|    return StackFramePtrT<isConst>{getPreviousFramePointer()};
  124|  3.45M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE23getPreviousFramePointerEv:
  117|  3.45M|  QualifiedHV *getPreviousFramePointer() const {
  118|  3.45M|    return getPreviousFrameRef().template getNativePointer<PinnedHermesValue>();
  119|  3.45M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE19getPreviousFrameRefEv:
   97|  3.45M|  QualifiedHV &get##name##Ref() const {       \
   98|  3.45M|    return frame_[StackFrameLayout::name];    \
   99|  3.45M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE13getNativeArgsEv:
  243|  3.44M|  NativeArgs getNativeArgs() const {
  244|  3.44M|    return NativeArgs{argsBegin(), getArgCount(), &getNewTargetRef()};
  245|  3.44M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE15getNewTargetRefEv:
   97|  3.45M|  QualifiedHV &get##name##Ref() const {       \
   98|  3.45M|    return frame_[StackFrameLayout::name];    \
   99|  3.45M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE23getCalleeClosureOrCBRefEv:
   97|  3.19k|  QualifiedHV &get##name##Ref() const {       \
   98|  3.19k|    return frame_[StackFrameLayout::name];    \
   99|  3.19k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE17isConstructorCallEv:
  167|  2.75k|  bool isConstructorCall() const {
  168|  2.75k|    return !getNewTargetRef().isUndefined();
  169|  2.75k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE16getFirstLocalRefEv:
   97|  5.51k|  QualifiedHV &get##name##Ref() const {       \
   98|  5.51k|    return frame_[StackFrameLayout::name];    \
   99|  5.51k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE15getArgRefUnsafeEi:
  186|  3.68k|  QualifiedHV &getArgRefUnsafe(int32_t n) const {
  187|  3.68k|    return argsBegin()[n];
  188|  3.68k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE17getSavedCodeBlockEv:
  134|   393k|  QualifiedCB *getSavedCodeBlock() const {
  135|   393k|    return getSavedCodeBlockRef().template getNativePointer<CodeBlock>();
  136|   393k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE20getSavedCodeBlockRefEv:
   97|   393k|  QualifiedHV &get##name##Ref() const {       \
   98|   393k|    return frame_[StackFrameLayout::name];    \
   99|   393k|  }
_ZN6hermes2vm14StackFramePtrTILb0EE9initFrameEPNS0_17PinnedHermesValueES2_PKNS_4inst4InstEPKNS0_9CodeBlockEjPNS0_8CallableEb:
  229|   390k|      bool construct) {
  230|   390k|    return initFrame(
  231|   390k|        stackPointer,
  232|   390k|        previousFrame,
  233|   390k|        savedIP,
  234|   390k|        savedCodeBlock,
  235|   390k|        argCount,
  236|   390k|        HermesValue::encodeObjectValue(calleeClosure),
  237|   390k|        construct ? HermesValue::encodeObjectValue(calleeClosure)
  ------------------
  |  Branch (237:9): [True: 0, False: 390k]
  ------------------
  238|   390k|                  : HermesValue::encodeUndefinedValue());
  239|   390k|  }
_ZN6hermes2vm19StackFrameIteratorTILb0EEC2ENS0_14StackFramePtrTILb0EEE:
  294|   391k|  StackFrameIteratorT(StackFramePtrT<isConst> frame) : frame_(frame) {}
_ZN6hermes2vm19StackFrameIteratorTILb0EEC2EPNS0_17PinnedHermesValueE:
  292|   391k|  StackFrameIteratorT(QualifiedHV *frame) : frame_(frame) {}
_ZNK6hermes2vm19StackFrameIteratorTILb0EEneES2_:
  311|    435|  bool operator!=(StackFrameIteratorT o) const {
  312|    435|    return frame_ != o.frame_;
  313|    435|  }
_ZN6hermes2vm19StackFrameIteratorTILb0EEppEv:
  315|    196|  StackFrameIteratorT &operator++() {
  316|    196|    frame_ = frame_.getPreviousFrame();
  317|    196|    return *this;
  318|    196|  }
_ZNK6hermes2vm19StackFrameIteratorTILb0EEdeEv:
  328|    166|  StackFramePtrT<isConst> operator*() const {
  329|    166|    return frame_;
  330|    166|  }
_ZNK6hermes2vm19StackFrameIteratorTILb0EEptEv:
  325|   391k|  StackFramePtrT<isConst> operator->() const {
  326|   391k|    return frame_;
  327|   391k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EEneES2_:
   73|    492|  bool operator!=(StackFramePtrT o) const {
   74|    492|    return frame_ != o.frame_;
   75|    492|  }

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

_ZN6hermes2vm13StringBuilder19createStringBuilderERNS0_7RuntimeENS_10SafeUInt32Eb:
   45|   781k|      bool isASCII = false) {
   46|   781k|    if (length.isOverflowed()) {
  ------------------
  |  Branch (46:9): [True: 0, False: 781k]
  ------------------
   47|      0|      return runtime.raiseRangeError("String length exceeds limit");
   48|      0|    }
   49|   781k|    auto crtRes = StringPrimitive::create(runtime, *length, isASCII);
   50|   781k|    if (LLVM_UNLIKELY(crtRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   781k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 781k]
  |  |  ------------------
  ------------------
   51|      0|      return ExecutionStatus::EXCEPTION;
   52|      0|    }
   53|   781k|    return StringBuilder(runtime, crtRes->getString());
   54|   781k|  }
_ZN6hermes2vm13StringBuilder14appendUTF16RefEN4llvh8ArrayRefIDsEE:
   69|   391k|  void appendUTF16Ref(UTF16Ref str) {
   70|   391k|    assert(
   71|   391k|        index_ + str.size() <= strPrim_->getStringLength() &&
   72|   391k|        "StringBuilder append out of bound");
   73|   391k|    if (LLVM_UNLIKELY((*strPrim_)->isASCII())) {
  ------------------
  |  |  189|   391k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 391k]
  |  |  ------------------
  ------------------
   74|       |      // If we are appending a UTF16 string to an ASCII, we have to recreate
   75|       |      // the string. This can cause performance issues if misused.
   76|       |      // The allocation can fail in theory, but in practice, since we are
   77|       |      // dropping one string and replace it with another, this should be safe.
   78|      0|      auto strRes = runtime_->ignoreAllocationFailure(StringPrimitive::create(
   79|      0|          *runtime_, strPrim_->getStringLength(), /*asciiNotUTF16*/ false));
   80|      0|      auto currentPartialString =
   81|      0|          ASCIIRef(strPrim_->castToASCIIPointer(), index_);
   82|      0|      strPrim_ = strRes.getString();
   83|      0|      index_ = 0;
   84|      0|      appendASCIIRef(currentPartialString);
   85|      0|    }
   86|   391k|    std::copy(
   87|   391k|        str.data(),
   88|   391k|        str.data() + str.size(),
   89|   391k|        strPrim_->castToUTF16PointerForWrite() + index_);
   90|   391k|    index_ += str.size();
   91|   391k|  }
_ZN6hermes2vm13StringBuilder14appendASCIIRefEN4llvh8ArrayRefIcEE:
   93|  1.48M|  void appendASCIIRef(ASCIIRef ascii) {
   94|  1.48M|    assert(
   95|  1.48M|        index_ + ascii.size() <= strPrim_->getStringLength() &&
   96|  1.48M|        "StringBuilder append out of bound");
   97|  1.48M|    if (LLVM_LIKELY(strPrim_->isASCII())) {
  ------------------
  |  |  188|  1.48M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 781k, False: 704k]
  |  |  ------------------
  ------------------
   98|   781k|      std::copy(
   99|   781k|          ascii.data(),
  100|   781k|          ascii.data() + ascii.size(),
  101|   781k|          strPrim_->castToASCIIPointerForWrite() + index_);
  102|   781k|    } else {
  103|   704k|      std::copy(
  104|   704k|          ascii.data(),
  105|   704k|          ascii.data() + ascii.size(),
  106|   704k|          strPrim_->castToUTF16PointerForWrite() + index_);
  107|   704k|    }
  108|  1.48M|    index_ += ascii.size();
  109|  1.48M|  }
_ZN6hermes2vm13StringBuilder16appendStringPrimENS0_6HandleINS0_15StringPrimitiveEEEj:
  130|  1.86M|  void appendStringPrim(Handle<StringPrimitive> other, uint32_t length) {
  131|  1.86M|    assert(
  132|  1.86M|        index_ + length <= strPrim_->getStringLength() &&
  133|  1.86M|        "StringBuilder append out of bound");
  134|  1.86M|    if (other->isASCII()) {
  ------------------
  |  Branch (134:9): [True: 1.47M, False: 391k]
  ------------------
  135|  1.47M|      appendASCIIRef({other->castToASCIIPointer(), length});
  136|  1.47M|    } else if (!strPrim_->isASCII()) {
  ------------------
  |  Branch (136:16): [True: 391k, False: 0]
  ------------------
  137|   391k|      appendUTF16Ref({other->castToUTF16Pointer(), length});
  138|   391k|    } else {
  139|       |      // strPrim_ is ASCII, while other is UTF16. We have to recreate string.
  140|      0|      auto strRes = runtime_->ignoreAllocationFailure(StringPrimitive::create(
  141|      0|          *runtime_, strPrim_->getStringLength(), /*asciiNotUTF16*/ false));
  142|      0|      auto currentPartialString =
  143|      0|          ASCIIRef(strPrim_->castToASCIIPointer(), index_);
  144|       |      // Set strPrim_ to the newly created string.
  145|      0|      strPrim_ = strRes.getString();
  146|      0|      index_ = 0;
  147|       |      // Append original string and other.
  148|      0|      appendASCIIRef(currentPartialString);
  149|      0|      appendUTF16Ref({other->castToUTF16Pointer(), length});
  150|      0|    }
  151|  1.86M|  }
_ZN6hermes2vm13StringBuilder16appendStringPrimENS0_6HandleINS0_15StringPrimitiveEEE:
  154|  1.86M|  void appendStringPrim(Handle<StringPrimitive> other) {
  155|  1.86M|    return appendStringPrim(other, other->getStringLength());
  156|  1.86M|  }
_ZNK6hermes2vm13StringBuilder18getStringPrimitiveEv:
  159|   781k|  Handle<StringPrimitive> getStringPrimitive() const {
  160|   781k|    assert(
  161|   781k|        index_ == strPrim_->getStringLength() &&
  162|   781k|        "String content is not fully filled yet.");
  163|   781k|    return Handle<StringPrimitive>::vmcast(strPrim_);
  164|   781k|  }
_ZN6hermes2vm13StringBuilderC2ERNS0_7RuntimeEPNS0_15StringPrimitiveE:
  168|   781k|      : strPrim_(runtime, strPrim), index_(0), runtime_(&runtime) {}

_ZN6hermes2vm15StringPrimitive6createERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  922|  2.10M|    ASCIIRef str) {
  923|  2.10M|  static_assert(
  924|  2.10M|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  925|  2.10M|      "External string threshold should be smaller than max string size.");
  926|  2.10M|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|  2.10M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.10M, False: 0]
  |  |  ------------------
  ------------------
  927|  2.10M|    return DynamicASCIIStringPrimitive::create(runtime, str);
  928|  2.10M|  } else {
  929|      0|    return ExternalStringPrimitive<char>::create(runtime, arrayToString(str));
  930|      0|  }
  931|  2.10M|}
_ZN6hermes2vm15StringPrimitive16isExternalLengthEj:
  107|  11.9M|  static bool isExternalLength(uint32_t length) {
  108|  11.9M|    return length >= EXTERNAL_STRING_THRESHOLD;
  109|  11.9M|  }
_ZN6hermes2vm15StringPrimitive7classofEPKNS0_6GCCellE:
  142|  13.4M|  static bool classof(const GCCell *cell) {
  143|  13.4M|    return kindInRange(
  144|  13.4M|        cell->getKind(),
  145|  13.4M|        CellKind::StringPrimitiveKind_first,
  146|  13.4M|        CellKind::StringPrimitiveKind_last);
  147|  13.4M|  }
_ZNK6hermes2vm15StringPrimitive18castToASCIIPointerEv:
 1013|  12.8M|inline const char *StringPrimitive::castToASCIIPointer() const {
 1014|  12.8M|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|  12.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 93, False: 12.8M]
  |  |  ------------------
  ------------------
 1015|     93|    return vmcast<ExternalASCIIStringPrimitive>(this)->getRawPointer();
 1016|  12.8M|  } else if (vmisa<DynamicUniquedASCIIStringPrimitive>(this)) {
  ------------------
  |  Branch (1016:14): [True: 9.64M, False: 3.19M]
  ------------------
 1017|  9.64M|    return vmcast<DynamicUniquedASCIIStringPrimitive>(this)->getRawPointer();
 1018|  9.64M|  } else if (vmisa<DynamicASCIIStringPrimitive>(this)) {
  ------------------
  |  Branch (1018:14): [True: 3.19M, False: 0]
  ------------------
 1019|  3.19M|    return vmcast<DynamicASCIIStringPrimitive>(this)->getRawPointer();
 1020|  3.19M|  } else {
 1021|      0|    return vmcast<BufferedASCIIStringPrimitive>(this)->getRawPointer();
 1022|      0|  }
 1023|  12.8M|}
_ZNK6hermes2vm15StringPrimitive10isExternalEv:
 1098|  17.6M|inline bool StringPrimitive::isExternal() const {
 1099|       |  // We require that external cell kinds be larger than dynamic cell kinds.
 1100|  17.6M|  static_assert(
 1101|  17.6M|      cellKindsContiguousAscending(
 1102|  17.6M|          CellKind::DynamicUTF16StringPrimitiveKind,
 1103|  17.6M|          CellKind::DynamicASCIIStringPrimitiveKind,
 1104|  17.6M|          CellKind::BufferedUTF16StringPrimitiveKind,
 1105|  17.6M|          CellKind::BufferedASCIIStringPrimitiveKind,
 1106|  17.6M|          CellKind::DynamicUniquedUTF16StringPrimitiveKind,
 1107|  17.6M|          CellKind::DynamicUniquedASCIIStringPrimitiveKind,
 1108|  17.6M|          CellKind::ExternalUTF16StringPrimitiveKind,
 1109|  17.6M|          CellKind::ExternalASCIIStringPrimitiveKind),
 1110|  17.6M|      "Cell kinds in unexpected order");
 1111|  17.6M|  return getKind() >= CellKind::ExternalUTF16StringPrimitiveKind;
 1112|  17.6M|}
_ZN6hermes2vm23ExternalStringPrimitiveIcE7classofEPKNS0_6GCCellE:
  566|    121|  static bool classof(const GCCell *cell) {
  567|    121|    return cell->getKind() == ExternalStringPrimitive::getCellKind();
  568|    121|  }
_ZN6hermes2vm23ExternalStringPrimitiveIcE11getCellKindEv:
  560|    177|  static constexpr CellKind getCellKind() {
  561|    177|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (561:12): [Folded - Ignored]
  ------------------
  562|    177|        ? CellKind::ExternalUTF16StringPrimitiveKind
  563|    177|        : CellKind::ExternalASCIIStringPrimitiveKind;
  564|    177|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIcE13getRawPointerEv:
  606|     93|  const T *getRawPointer() const {
  607|       |    // C++11 defines this to be valid even if the string is empty.
  608|     93|    return &contents_[0];
  609|     93|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE7classofEPKNS0_6GCCellE:
  472|  24.8M|  static bool classof(const GCCell *cell) {
  473|  24.8M|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|  24.8M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE11getCellKindEv:
  464|  25.6M|  static constexpr CellKind getCellKind() {
  465|  25.6M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|  25.6M|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|      0|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|  25.6M|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|  25.6M|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|  25.6M|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIcLb1EE13getRawPointerEv:
  515|  9.64M|  const T *getRawPointer() const {
  516|  9.64M|    return this->template getTrailingObjects<T>();
  517|  9.64M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE7classofEPKNS0_6GCCellE:
  472|  8.72M|  static bool classof(const GCCell *cell) {
  473|  8.72M|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|  8.72M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE11getCellKindEv:
  464|  16.8M|  static constexpr CellKind getCellKind() {
  465|  16.8M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|  16.8M|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|      0|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|  16.8M|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|  16.8M|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|  16.8M|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIcLb0EE13getRawPointerEv:
  515|  3.19M|  const T *getRawPointer() const {
  516|  3.19M|    return this->template getTrailingObjects<T>();
  517|  3.19M|  }
_ZNK6hermes2vm15StringPrimitive18castToUTF16PointerEv:
 1025|  1.38M|inline const char16_t *StringPrimitive::castToUTF16Pointer() const {
 1026|  1.38M|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|  1.38M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 213k, False: 1.17M]
  |  |  ------------------
  ------------------
 1027|   213k|    return vmcast<ExternalUTF16StringPrimitive>(this)->getRawPointer();
 1028|  1.17M|  } else if (vmisa<DynamicUniquedUTF16StringPrimitive>(this)) {
  ------------------
  |  Branch (1028:14): [True: 391k, False: 781k]
  ------------------
 1029|   391k|    return vmcast<DynamicUniquedUTF16StringPrimitive>(this)->getRawPointer();
 1030|   781k|  } else if (vmisa<DynamicUTF16StringPrimitive>(this)) {
  ------------------
  |  Branch (1030:14): [True: 781k, False: 0]
  ------------------
 1031|   781k|    return vmcast<DynamicUTF16StringPrimitive>(this)->getRawPointer();
 1032|   781k|  } else {
 1033|      0|    return vmcast<BufferedUTF16StringPrimitive>(this)->getRawPointer();
 1034|      0|  }
 1035|  1.38M|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE7classofEPKNS0_6GCCellE:
  566|   306k|  static bool classof(const GCCell *cell) {
  567|   306k|    return cell->getKind() == ExternalStringPrimitive::getCellKind();
  568|   306k|  }
_ZN6hermes2vm23ExternalStringPrimitiveIDsE11getCellKindEv:
  560|   306k|  static constexpr CellKind getCellKind() {
  561|   306k|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (561:12): [Folded - Ignored]
  ------------------
  562|   306k|        ? CellKind::ExternalUTF16StringPrimitiveKind
  563|   306k|        : CellKind::ExternalASCIIStringPrimitiveKind;
  564|   306k|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIDsE13getRawPointerEv:
  606|   213k|  const T *getRawPointer() const {
  607|       |    // C++11 defines this to be valid even if the string is empty.
  608|   213k|    return &contents_[0];
  609|   213k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE7classofEPKNS0_6GCCellE:
  472|  2.56M|  static bool classof(const GCCell *cell) {
  473|  2.56M|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|  2.56M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE11getCellKindEv:
  464|  2.56M|  static constexpr CellKind getCellKind() {
  465|  2.56M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|  2.56M|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|  2.56M|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|  2.56M|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|      0|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|  2.56M|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIDsLb1EE13getRawPointerEv:
  515|   391k|  const T *getRawPointer() const {
  516|   391k|    return this->template getTrailingObjects<T>();
  517|   391k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE7classofEPKNS0_6GCCellE:
  472|  2.56M|  static bool classof(const GCCell *cell) {
  473|  2.56M|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|  2.56M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE11getCellKindEv:
  464|  3.38M|  static constexpr CellKind getCellKind() {
  465|  3.38M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|  3.38M|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|  3.38M|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|  3.38M|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|      0|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|  3.38M|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIDsLb0EE13getRawPointerEv:
  515|   781k|  const T *getRawPointer() const {
  516|   781k|    return this->template getTrailingObjects<T>();
  517|   781k|  }
_ZN6hermes2vm23BufferedStringPrimitiveIDsE7classofEPKNS0_6GCCellE:
  684|     89|  static bool classof(const GCCell *cell) {
  685|     89|    return cell->getKind() == BufferedStringPrimitive::getCellKind();
  686|     89|  }
_ZN6hermes2vm23BufferedStringPrimitiveIDsE11getCellKindEv:
  678|    151|  static constexpr CellKind getCellKind() {
  679|    151|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (679:12): [Folded - Ignored]
  ------------------
  680|    151|        ? CellKind::BufferedUTF16StringPrimitiveKind
  681|    151|        : CellKind::BufferedASCIIStringPrimitiveKind;
  682|    151|  }
_ZNK6hermes2vm23BufferedStringPrimitiveIDsE15getConcatBufferEv:
  760|     58|  ExternalStringPrimitive<T> *getConcatBuffer() const {
  761|     58|    return vmcast<ExternalStringPrimitive<T>>(concatBufferHV_);
  762|     58|  }
_ZNK6hermes2vm15StringPrimitive7isASCIIEv:
 1073|  12.4M|inline bool StringPrimitive::isASCII() const {
 1074|       |  // Abstractly, we're doing the following test:
 1075|       |  // return getKind() == CellKind::DynamicASCIIStringPrimitiveKind ||
 1076|       |  //        getKind() == CellKind::DynamicUniquedASCIIStringPrimitiveKind ||
 1077|       |  //        getKind() == CellKind::ExternalASCIIStringPrimitiveKind;
 1078|       |  // We speed this up by making the assumption that the string primitive kinds
 1079|       |  // are defined consecutively, alternating between ASCII and UTF16.
 1080|       |  // We statically enforce this:
 1081|  12.4M|  static_assert(
 1082|  12.4M|      cellKindsContiguousAscending(
 1083|  12.4M|          CellKind::DynamicUTF16StringPrimitiveKind,
 1084|  12.4M|          CellKind::DynamicASCIIStringPrimitiveKind,
 1085|  12.4M|          CellKind::BufferedUTF16StringPrimitiveKind,
 1086|  12.4M|          CellKind::BufferedASCIIStringPrimitiveKind,
 1087|  12.4M|          CellKind::DynamicUniquedUTF16StringPrimitiveKind,
 1088|  12.4M|          CellKind::DynamicUniquedASCIIStringPrimitiveKind,
 1089|  12.4M|          CellKind::ExternalUTF16StringPrimitiveKind,
 1090|  12.4M|          CellKind::ExternalASCIIStringPrimitiveKind),
 1091|  12.4M|      "Cell kinds in unexpected order");
 1092|       |  // Given this assumption, the ASCII versions are either both odd or both
 1093|       |  // even.
 1094|  12.4M|  return (static_cast<uint32_t>(getKind()) & 1u) ==
 1095|  12.4M|      (static_cast<uint32_t>(CellKind::DynamicASCIIStringPrimitiveKind) & 1u);
 1096|  12.4M|}
_ZNK6hermes2vm15StringPrimitive12getStringRefIcEEN4llvh8ArrayRefIT_EEv:
  307|   358k|  llvh::ArrayRef<T> getStringRef() const {
  308|   358k|    return llvh::ArrayRef<T>{castToPointer<T>(), getStringLength()};
  309|   358k|  }
_ZNK6hermes2vm15StringPrimitive13castToPointerIcEEPKT_v:
 1005|   358k|inline const char *StringPrimitive::castToPointer<char>() const {
 1006|   358k|  return castToASCIIPointer();
 1007|   358k|}
_ZNK6hermes2vm15StringPrimitive15getStringLengthEv:
  225|  18.5M|  uint32_t getStringLength() const {
  226|  18.5M|    return lengthAndUniquedFlag_ & ~LENGTH_FLAG_UNIQUED;
  227|  18.5M|  }
_ZN6hermes2vm15StringPrimitiveC2Ej:
  102|  4.91M|  explicit StringPrimitive(uint32_t length) : lengthAndUniquedFlag_(length) {}
_ZNK6hermes2vm15StringPrimitive9isUniquedEv:
  230|  5.66M|  bool isUniqued() const {
  231|  5.66M|    return (lengthAndUniquedFlag_ & LENGTH_FLAG_UNIQUED) != 0;
  232|  5.66M|  }
_ZN6hermes2vm15StringPrimitive10ensureFlatERNS0_7RuntimeENS0_6HandleIS1_EE:
  270|  2.90M|      Handle<StringPrimitive> self) {
  271|       |    // In the future, ensureFlat may trigger GC as it might allocate for
  272|       |    // ropes. Move the heap here.
  273|  2.90M|    runtime.potentiallyMoveHeap();
  274|  2.90M|    return self;
  275|       |    // TODO: Deal with different subclasses (e.g. rope)
  276|  2.90M|  }
_ZNK6hermes2vm15StringPrimitive6isFlatEv:
  279|  2.18M|  bool isFlat() const {
  280|  2.18M|    return true;
  281|  2.18M|  }
_ZNK6hermes2vm15StringPrimitive14castToUTF16RefEjj:
  335|    375|  UTF16Ref castToUTF16Ref(uint32_t start, uint32_t length) const {
  336|    375|    return UTF16Ref(castToUTF16Pointer() + start, length);
  337|    375|  }
_ZNK6hermes2vm15StringPrimitive14castToASCIIRefEjj:
  340|  5.22M|  ASCIIRef castToASCIIRef(uint32_t start, uint32_t length) const {
  341|  5.22M|    return ASCIIRef(castToASCIIPointer() + start, length);
  342|  5.22M|  }
_ZNK6hermes2vm15StringPrimitive14castToUTF16RefEv:
  344|    289|  UTF16Ref castToUTF16Ref() const {
  345|    289|    return castToUTF16Ref(0, getStringLength());
  346|    289|  }
_ZNK6hermes2vm15StringPrimitive14castToASCIIRefEv:
  348|  5.22M|  ASCIIRef castToASCIIRef() const {
  349|  5.22M|    return castToASCIIRef(0, getStringLength());
  350|  5.22M|  }
_ZN6hermes2vm21SymbolStringPrimitive7classofEPKNS0_6GCCellE:
  398|  1.22M|  static bool classof(const GCCell *cell) {
  399|  1.22M|    static_assert(
  400|  1.22M|        cellKindsContiguousAscending(
  401|  1.22M|            CellKind::DynamicUniquedUTF16StringPrimitiveKind,
  402|  1.22M|            CellKind::DynamicUniquedASCIIStringPrimitiveKind,
  403|  1.22M|            CellKind::ExternalUTF16StringPrimitiveKind,
  404|  1.22M|            CellKind::ExternalASCIIStringPrimitiveKind),
  405|  1.22M|        "Unexpected CellKind ordering");
  406|  1.22M|    return kindInRange(
  407|  1.22M|        cell->getKind(),
  408|  1.22M|        CellKind::DynamicUniquedUTF16StringPrimitiveKind,
  409|  1.22M|        CellKind::ExternalASCIIStringPrimitiveKind);
  410|  1.22M|  }
_ZN6hermes2vm21SymbolStringPrimitive14updateUniqueIDENS0_8SymbolIDE:
  417|   416k|  void updateUniqueID(SymbolID id) {
  418|   416k|    assert(isUniqued() && "StringPrimitive is not uniqued");
  419|   416k|    weakUniqueID_ = id;
  420|   416k|  }
_ZNK6hermes2vm21SymbolStringPrimitive11getUniqueIDEv:
  423|   390k|  SymbolID getUniqueID() const {
  424|   390k|    assert(isUniqued() && "StringPrimitive is not uniqued");
  425|   390k|    return weakUniqueID_;
  426|   390k|  }
_ZN6hermes2vm25isBufferedStringPrimitiveEPKNS0_6GCCellE:
  777|   390k|inline bool isBufferedStringPrimitive(const GCCell *cell) {
  778|   390k|  return cell->getKind() == CellKind::BufferedUTF16StringPrimitiveKind ||
  ------------------
  |  Branch (778:10): [True: 0, False: 390k]
  ------------------
  779|   390k|      cell->getKind() == CellKind::BufferedASCIIStringPrimitiveKind;
  ------------------
  |  Branch (779:7): [True: 0, False: 390k]
  ------------------
  780|   390k|}
_ZN6hermes2vm15StringPrimitive6createERNS0_7RuntimeEjb:
  901|  1.95M|StringPrimitive::create(Runtime &runtime, uint32_t length, bool asciiNotUTF16) {
  902|  1.95M|  static_assert(
  903|  1.95M|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  904|  1.95M|      "External string threshold should be smaller than max string size.");
  905|  1.95M|  if (LLVM_LIKELY(!isExternalLength(length))) {
  ------------------
  |  |  188|  1.95M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.95M, False: 202]
  |  |  ------------------
  ------------------
  906|  1.95M|    if (asciiNotUTF16) {
  ------------------
  |  Branch (906:9): [True: 1.56M, False: 390k]
  ------------------
  907|  1.56M|      return DynamicASCIIStringPrimitive::create(runtime, length);
  908|  1.56M|    } else {
  909|   390k|      return DynamicUTF16StringPrimitive::create(runtime, length);
  910|   390k|    }
  911|  1.95M|  } else {
  912|    202|    if (asciiNotUTF16) {
  ------------------
  |  Branch (912:9): [True: 0, False: 202]
  ------------------
  913|      0|      return ExternalStringPrimitive<char>::create(runtime, length);
  914|    202|    } else {
  915|    202|      return ExternalStringPrimitive<char16_t>::create(runtime, length);
  916|    202|    }
  917|    202|  }
  918|  1.95M|}
_ZN6hermes2vm15StringPrimitive6createERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  935|   390k|    UTF16Ref str) {
  936|   390k|  static_assert(
  937|   390k|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  938|   390k|      "External string threshold should be smaller than max string size.");
  939|   390k|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|   390k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 390k, False: 48]
  |  |  ------------------
  ------------------
  940|   390k|    return createDynamic(runtime, str);
  941|   390k|  } else {
  942|     48|    return ExternalStringPrimitive<char16_t>::create(
  943|     48|        runtime, arrayToString(str));
  944|     48|  }
  945|   390k|}
_ZN6hermes2vm15StringPrimitive15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  964|  20.4k|    ASCIIRef str) {
  965|  20.4k|  static_assert(
  966|  20.4k|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  967|  20.4k|      "External string threshold should be smaller than max string size.");
  968|  20.4k|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|  20.4k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 20.4k, False: 0]
  |  |  ------------------
  ------------------
  969|  20.4k|    return DynamicASCIIStringPrimitive::createLongLived(runtime, str);
  970|  20.4k|  } else {
  971|      0|    return ExternalStringPrimitive<char>::createLongLived(
  972|      0|        runtime, arrayToString(str));
  973|      0|  }
  974|  20.4k|}
_ZN6hermes2vm15StringPrimitive15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  978|  20.4k|    UTF16Ref str) {
  979|  20.4k|  static_assert(
  980|  20.4k|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  981|  20.4k|      "External string threshold should be smaller than max string size.");
  982|  20.4k|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|  20.4k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 20.4k, False: 0]
  |  |  ------------------
  ------------------
  983|  20.4k|    return DynamicUTF16StringPrimitive::createLongLived(runtime, str);
  984|  20.4k|  } else {
  985|      0|    return ExternalStringPrimitive<char16_t>::createLongLived(
  986|      0|        runtime, arrayToString(str));
  987|      0|  }
  988|  20.4k|}
_ZNK6hermes2vm15StringPrimitive12canBeUniquedEv:
  990|   416k|inline bool StringPrimitive::canBeUniqued() const {
  991|   416k|  return vmisa<SymbolStringPrimitive>(this);
  992|   416k|}
_ZN6hermes2vm15StringPrimitive16convertToUniquedENS0_8SymbolIDE:
  994|   416k|inline void StringPrimitive::convertToUniqued(hermes::vm::SymbolID uniqueID) {
  995|   416k|  assert(canBeUniqued() && "StringPrimitive cannot be uniqued");
  996|   416k|  assert(!isUniqued() && "StringPrimitive is already uniqued");
  997|   416k|  assert(
  998|   416k|      uniqueID.isValid() && uniqueID.isUniqued() &&
  999|   416k|      "uniqueID SymbolID is not valid and uniqued");
 1000|   416k|  this->lengthAndUniquedFlag_ |= LENGTH_FLAG_UNIQUED;
 1001|   416k|  vmcast<SymbolStringPrimitive>(this)->updateUniqueID(uniqueID);
 1002|   416k|}
_ZN6hermes2vm15StringPrimitive26castToASCIIPointerForWriteEv:
 1037|  2.34M|inline char *StringPrimitive::castToASCIIPointerForWrite() {
 1038|  2.34M|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|  2.34M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.34M]
  |  |  ------------------
  ------------------
 1039|      0|    return vmcast<ExternalASCIIStringPrimitive>(this)->getRawPointerForWrite();
 1040|  2.34M|  } else if (vmisa<DynamicUniquedASCIIStringPrimitive>(this)) {
  ------------------
  |  Branch (1040:14): [True: 0, False: 2.34M]
  ------------------
 1041|      0|    return vmcast<DynamicUniquedASCIIStringPrimitive>(this)
 1042|      0|        ->getRawPointerForWrite();
 1043|  2.34M|  } else {
 1044|  2.34M|    return vmcast<DynamicASCIIStringPrimitive>(this)->getRawPointerForWrite();
 1045|  2.34M|  }
 1046|  2.34M|}
_ZN6hermes2vm15StringPrimitive26castToUTF16PointerForWriteEv:
 1048|  1.09M|inline char16_t *StringPrimitive::castToUTF16PointerForWrite() {
 1049|  1.09M|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|  1.09M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 92.1k, False: 1.00M]
  |  |  ------------------
  ------------------
 1050|  92.1k|    return vmcast<ExternalUTF16StringPrimitive>(this)->getRawPointerForWrite();
 1051|  1.00M|  } else if (vmisa<DynamicUniquedUTF16StringPrimitive>(this)) {
  ------------------
  |  Branch (1051:14): [True: 0, False: 1.00M]
  ------------------
 1052|      0|    return vmcast<DynamicUniquedUTF16StringPrimitive>(this)
 1053|      0|        ->getRawPointerForWrite();
 1054|  1.00M|  } else {
 1055|  1.00M|    return vmcast<DynamicUTF16StringPrimitive>(this)->getRawPointerForWrite();
 1056|  1.00M|  }
 1057|  1.09M|}
_ZNK6hermes2vm15StringPrimitive11getUniqueIDEv:
 1059|   390k|inline SymbolID StringPrimitive::getUniqueID() const {
 1060|   390k|  assert(this->isUniqued() && "StringPrimitive is not uniqued");
 1061|   390k|  return vmcast<SymbolStringPrimitive>(this)->getUniqueID();
 1062|   390k|}
_ZN6hermes2vm15StringPrimitive13arrayToStringIDsEENSt3__112basic_stringIT_NS3_11char_traitsIS5_EENS3_9allocatorIS5_EEEEN4llvh8ArrayRefIS5_EE:
   83|     48|  static std::basic_string<CharT> arrayToString(llvh::ArrayRef<CharT> arr) {
   84|     48|    return std::basic_string<CharT>{arr.begin(), arr.end()};
   85|     48|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE21getRawPointerForWriteEv:
  523|   415k|  T *getRawPointerForWrite() {
  524|   415k|    return this->template getTrailingObjects<T>();
  525|   415k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE21getRawPointerForWriteEv:
  523|  2.34M|  T *getRawPointerForWrite() {
  524|  2.34M|    return this->template getTrailingObjects<T>();
  525|  2.34M|  }
_ZN6hermes2vm23ExternalStringPrimitiveIDsE21getRawPointerForWriteEv:
  615|  92.1k|  T *getRawPointerForWrite() {
  616|       |    // C++11 defines this to be valid even if the string is empty.
  617|  92.1k|    return &contents_[0];
  618|  92.1k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE21getRawPointerForWriteEv:
  523|    216|  T *getRawPointerForWrite() {
  524|    216|    return this->template getTrailingObjects<T>();
  525|    216|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE21getRawPointerForWriteEv:
  523|  1.00M|  T *getRawPointerForWrite() {
  524|  1.00M|    return this->template getTrailingObjects<T>();
  525|  1.00M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EEC2Ej:
  483|   415k|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|   415k|    assert(!isExternalLength(length) && "length should not be external");
  485|   415k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE14allocationSizeEj:
  507|   415k|  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|   415k|    return std::max(
  511|   415k|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|   415k|        static_cast<size_t>(GC::minAllocationSize()));
  513|   415k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EEC2Ej:
  483|    216|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|    216|    assert(!isExternalLength(length) && "length should not be external");
  485|    216|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE14allocationSizeEj:
  507|    216|  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|    216|    return std::max(
  511|    216|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|    216|        static_cast<size_t>(GC::minAllocationSize()));
  513|    216|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EEC2Ej:
  483|  4.08M|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|  4.08M|    assert(!isExternalLength(length) && "length should not be external");
  485|  4.08M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE14allocationSizeEj:
  507|  4.08M|  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|  4.08M|    return std::max(
  511|  4.08M|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|  4.08M|        static_cast<size_t>(GC::minAllocationSize()));
  513|  4.08M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EEC2Ej:
  483|   411k|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|   411k|    assert(!isExternalLength(length) && "length should not be external");
  485|   411k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE14allocationSizeEj:
  507|   411k|  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|   411k|    return std::max(
  511|   411k|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|   411k|        static_cast<size_t>(GC::minAllocationSize()));
  513|   411k|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIDsE22calcExternalMemorySizeEv:
  573|    584|  size_t calcExternalMemorySize() const {
  574|    584|    return contents_.capacity() * sizeof(T);
  575|    584|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIcE22calcExternalMemorySizeEv:
  573|     56|  size_t calcExternalMemorySize() const {
  574|     56|    return contents_.capacity() * sizeof(T);
  575|     56|  }
_ZN6hermes2vm23BufferedStringPrimitiveIDsEC2ERNS0_7RuntimeEjNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEE:
  706|     31|      : StringPrimitive(length) {
  707|     31|    concatBufferHV_.set(
  708|     31|        HermesValue::encodeObjectValue(*concatBuffer), runtime.getHeap());
  709|     31|    assert(
  710|     31|        concatBuffer->contents_.size() >= length &&
  711|     31|        "length exceeds size of concatenation buffer");
  712|     31|  }
_ZN6hermes2vm23ExternalStringPrimitiveIDsED2Ev:
  585|    263|  ~ExternalStringPrimitive() = default;
_ZN6hermes2vm23ExternalStringPrimitiveIcED2Ev:
  585|     28|  ~ExternalStringPrimitive() = default;

_ZN6hermes2vm15stringRefEqualsIccEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|  4.32M|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|  4.32M|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 2.84M, False: 1.48M]
  ------------------
   42|  2.84M|    return false;
   43|  2.84M|  }
   44|  1.48M|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|  4.32M|}
_ZN6hermes2vm15stringRefEqualsIDscEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|     94|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|     94|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 94, False: 0]
  ------------------
   42|     94|    return false;
   43|     94|  }
   44|      0|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|     94|}
_ZN6hermes2vm15stringRefEqualsIcDsEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|      8|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|      8|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 8, False: 0]
  ------------------
   42|      8|    return false;
   43|      8|  }
   44|      0|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|      8|}
_ZN6hermes2vm15stringRefEqualsIDsDsEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|      2|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|      2|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 1, False: 1]
  ------------------
   42|      1|    return false;
   43|      1|  }
   44|      1|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|      2|}

_ZN6hermes2vm10StringViewC2ERKS1_:
  225|   448k|  StringView(const StringView &other) {
  226|   448k|    ::memcpy(this, &other, sizeof(*this));
  227|   448k|    if (isHandle_)
  ------------------
  |  Branch (227:9): [True: 422k, False: 26.0k]
  ------------------
  228|   422k|      new (strPrim_.buffer) Handle<StringPrimitive>(other.strPrim());
  229|   448k|  }
_ZNK6hermes2vm10StringView7strPrimEv:
  427|  6.84M|  const Handle<StringPrimitive> &strPrim() const {
  428|  6.84M|    assert(isHandle_ && "must be a handle");
  429|       |    // Need to go through a variable to placate gcc4.9.
  430|  6.84M|    const char *buffer = strPrim_.buffer;
  431|  6.84M|    return *reinterpret_cast<const Handle<StringPrimitive> *>(buffer);
  432|  6.84M|  }
_ZN6hermes2vm10StringViewD2Ev:
  242|  5.25M|  ~StringView() {
  243|  5.25M|    if (isHandle_)
  ------------------
  |  Branch (243:9): [True: 2.32M, False: 2.92M]
  ------------------
  244|  2.32M|      strPrim().~Handle<StringPrimitive>();
  245|  5.25M|  }
_ZN6hermes2vm10StringView7strPrimEv:
  421|  2.32M|  Handle<StringPrimitive> &strPrim() {
  422|  2.32M|    assert(isHandle_ && "must be a handle");
  423|       |    // Need to go through a variable to placate gcc4.9.
  424|  2.32M|    char *buffer = strPrim_.buffer;
  425|  2.32M|    return *reinterpret_cast<Handle<StringPrimitive> *>(buffer);
  426|  2.32M|  }
_ZNK6hermes2vm10StringView7isASCIIEv:
  290|  18.6M|  bool isASCII() const {
  291|  18.6M|    return isASCII_;
  292|  18.6M|  }
_ZNK6hermes2vm10StringView13castToCharPtrEv:
  342|  8.32M|  const char *castToCharPtr() const {
  343|  8.32M|    assert(isASCII() && "Cannot cast char16_t pointer to char pointer");
  344|  8.32M|    if (!isHandle_) {
  ------------------
  |  Branch (344:9): [True: 2.90M, False: 5.42M]
  ------------------
  345|  2.90M|      return static_cast<const char *>(nonManagedStringPtr_) + startIndex_;
  346|  2.90M|    }
  347|  5.42M|    assert(isHandle_ && "StringView does not contain a valid string");
  348|  5.42M|    return (*strPrim())->castToASCIIPointer() + startIndex_;
  349|  5.42M|  }
_ZNK6hermes2vm10StringView6lengthEv:
  280|  6.55M|  size_t length() const {
  281|  6.55M|    return length_;
  282|  6.55M|  }
_ZNK6hermes2vm10StringView15castToChar16PtrEv:
  352|   994k|  const char16_t *castToChar16Ptr() const {
  353|   994k|    assert(!isASCII() && "Cannot cast char pointer to char16 pointer");
  354|   994k|    if (!isHandle_) {
  ------------------
  |  Branch (354:9): [True: 1, False: 994k]
  ------------------
  355|      1|      return static_cast<const char16_t *>(nonManagedStringPtr_) + startIndex_;
  356|      1|    }
  357|   994k|    assert(isHandle_ && "StringView does not contain a valid string");
  358|   994k|    return (*strPrim())->castToUTF16Pointer() + startIndex_;
  359|   994k|  }
_ZNK6hermes2vm10StringViewcvNS0_11TwineChar16EEv:
  385|     46|  operator TwineChar16() const {
  386|     46|    return toTwine();
  387|     46|  }
_ZNK6hermes2vm10StringView7toTwineEv:
  378|     46|  TwineChar16 toTwine() const {
  379|     46|    if (isASCII()) {
  ------------------
  |  Branch (379:9): [True: 45, False: 1]
  ------------------
  380|     45|      return TwineChar16(llvh::StringRef(castToCharPtr(), length()));
  381|     45|    }
  382|      1|    return TwineChar16(UTF16Ref(castToChar16Ptr(), length()));
  383|     46|  }
_ZN6hermes2vm10StringView14const_iteratorC2EPKcPKDs:
   85|  3.26M|        : charPtr_(charPtr), char16Ptr_(char16Ptr) {
   86|  3.26M|      assert(
   87|  3.26M|          ((!charPtr_) ^ (!char16Ptr_)) &&
   88|  3.26M|          "Must provide one of char or char16 pointer");
   89|  3.26M|    }
_ZN6hermes2vm10StringView14const_iteratorC2EPKc:
   91|  1.77M|    explicit const_iterator(const char *ptr) : const_iterator(ptr, nullptr) {}
_ZN6hermes2vm10StringView14const_iteratorC2EPKDs:
   94|   781k|        : const_iterator(nullptr, ptr) {}
_ZN6hermes2vm10StringView14const_iteratorppEv:
  109|  10.9M|    const_iterator &operator++() {
  110|  10.9M|      if (charPtr_) {
  ------------------
  |  Branch (110:11): [True: 81, False: 10.9M]
  ------------------
  111|     81|        ++charPtr_;
  112|  10.9M|      } else {
  113|  10.9M|        ++char16Ptr_;
  114|  10.9M|      }
  115|  10.9M|      return *this;
  116|  10.9M|    }
_ZN6hermes2vm10StringView14const_iteratormmEv:
  117|      3|    const_iterator &operator--() {
  118|      3|      if (charPtr_) {
  ------------------
  |  Branch (118:11): [True: 3, False: 0]
  ------------------
  119|      3|        --charPtr_;
  120|      3|      } else {
  121|      0|        --char16Ptr_;
  122|      0|      }
  123|      3|      return *this;
  124|      3|    }
_ZNK6hermes2vm10StringView14const_iteratormiERKS2_:
  160|   710k|    difference_type operator-(const const_iterator &rhs) const {
  161|   710k|      if (charPtr_) {
  ------------------
  |  Branch (161:11): [True: 710k, False: 13]
  ------------------
  162|   710k|        return charPtr_ - rhs.charPtr_;
  163|   710k|      }
  164|     13|      return char16Ptr_ - rhs.char16Ptr_;
  165|   710k|    }
_ZNK6hermes2vm10StringView14const_iteratormiEl:
  167|   710k|    const_iterator operator-(difference_type rhs) const {
  168|   710k|      if (charPtr_) {
  ------------------
  |  Branch (168:11): [True: 710k, False: 9]
  ------------------
  169|   710k|        return const_iterator(charPtr_ - rhs, char16Ptr_);
  170|   710k|      }
  171|      9|      return const_iterator(charPtr_, char16Ptr_ - rhs);
  172|   710k|    }
_ZNK6hermes2vm10StringView14const_iteratorplEl:
  173|      9|    const_iterator operator+(difference_type rhs) const {
  174|      9|      if (charPtr_) {
  ------------------
  |  Branch (174:11): [True: 0, False: 9]
  ------------------
  175|      0|        return const_iterator(charPtr_ + rhs, char16Ptr_);
  176|      0|      }
  177|      9|      return const_iterator(charPtr_, char16Ptr_ + rhs);
  178|      9|    }
_ZNK6hermes2vm10StringView14const_iteratordeEv:
  182|  12.8M|    char16_t operator*() const {
  183|  12.8M|      return charPtr_ ? *charPtr_ : *char16Ptr_;
  ------------------
  |  Branch (183:14): [True: 1.87M, False: 10.9M]
  ------------------
  184|  12.8M|    }
_ZNK6hermes2vm10StringView14const_iteratoreqERKS2_:
  187|  12.7M|    bool operator==(const const_iterator &rhs) const {
  188|  12.7M|      if (charPtr_) {
  ------------------
  |  Branch (188:11): [True: 1.42M, False: 11.3M]
  ------------------
  189|  1.42M|        return charPtr_ == rhs.charPtr_;
  190|  1.42M|      }
  191|  11.3M|      return char16Ptr_ == rhs.char16Ptr_;
  192|  12.7M|    }
_ZNK6hermes2vm10StringView14const_iteratorneERKS2_:
  193|  11.9M|    bool operator!=(const const_iterator &rhs) const {
  194|  11.9M|      return !(*this == rhs);
  195|  11.9M|    }
_ZNK6hermes2vm10StringView5beginEv:
  254|  1.45M|  const_iterator begin() const {
  255|  1.45M|    if (isASCII()) {
  ------------------
  |  Branch (255:9): [True: 1.06M, False: 390k]
  ------------------
  256|  1.06M|      return const_iterator(castToCharPtr());
  257|  1.06M|    }
  258|   390k|    return const_iterator(castToChar16Ptr());
  259|  1.45M|  }
_ZNK6hermes2vm10StringView3endEv:
  262|  1.10M|  const_iterator end() const {
  263|  1.10M|    if (isASCII()) {
  ------------------
  |  Branch (263:9): [True: 710k, False: 390k]
  ------------------
  264|   710k|      return const_iterator(castToCharPtr() + length_);
  265|   710k|    }
  266|   390k|    return const_iterator(castToChar16Ptr() + length_);
  267|  1.10M|  }
_ZNK6hermes2vm10StringViewixEj:
  295|  1.27M|  char16_t operator[](uint32_t index) const {
  296|  1.27M|    assert(index < length_ && "Out of bound indexing");
  297|  1.27M|    if (isASCII()) {
  ------------------
  |  Branch (297:9): [True: 1.06M, False: 213k]
  ------------------
  298|  1.06M|      return castToCharPtr()[index];
  299|  1.06M|    }
  300|   213k|    return castToChar16Ptr()[index];
  301|  1.27M|  }
_ZNK6hermes2vm10StringView5sliceEjj:
  305|   355k|  StringView slice(uint32_t start, uint32_t length) const {
  306|   355k|    assert(start + length <= length_ && "Out of bound slicing");
  307|   355k|    auto newStringView = *this;
  308|   355k|    newStringView.startIndex_ += start;
  309|   355k|    newStringView.length_ = length;
  310|   355k|    return newStringView;
  311|   355k|  }
_ZNK6hermes2vm10StringView5sliceEj:
  315|      5|  StringView slice(uint32_t start) const {
  316|      5|    assert(start <= length_ && "Out of bound slicing");
  317|      5|    return slice(start, length_ - start);
  318|      5|  }
_ZNK6hermes2vm10StringView5sliceENS1_14const_iteratorES2_:
  321|   355k|  StringView slice(const_iterator first, const_iterator last) const {
  322|   355k|    return slice(first - begin(), last - first);
  323|   355k|  }
_ZNK6hermes2vm10StringView11getUTF16RefERN4llvh15SmallVectorImplIDsEE:
  330|   325k|  UTF16Ref getUTF16Ref(llvh::SmallVectorImpl<char16_t> &allocator) const {
  331|   325k|    assert(allocator.empty() && "Shouldn't use a non-empty allocator");
  332|   325k|    return getUTF16Ref(allocator, false);
  333|   325k|  }
_ZNK6hermes2vm10StringView6equalsERKS1_:
  362|  1.42M|  bool equals(const StringView &other) const {
  363|  1.42M|    if (other.isASCII()) {
  ------------------
  |  Branch (363:9): [True: 1.42M, False: 0]
  ------------------
  364|  1.42M|      return equals(ASCIIRef(other.castToCharPtr(), other.length()));
  365|  1.42M|    }
  366|      0|    return equals(UTF16Ref(other.castToChar16Ptr(), other.length()));
  367|  1.42M|  }
_ZN6hermes2vm10StringViewC2ENS0_6HandleINS0_15StringPrimitiveEEE:
  395|  1.90M|      : startIndex_(0),
  396|  1.90M|        isHandle_(true),
  397|  1.90M|        isASCII_(str->isASCII()),
  398|  1.90M|        length_(str->getStringLength()) {
  399|  1.90M|    new (strPrim_.buffer) Handle<StringPrimitive>(str);
  400|  1.90M|  }
_ZN6hermes2vm10StringViewC2EN4llvh8ArrayRefIcEE:
  404|  2.90M|      : nonManagedStringPtr_(asciiRef.data()),
  405|  2.90M|        startIndex_(0),
  406|  2.90M|        isHandle_(false),
  407|  2.90M|        isASCII_(true),
  408|  2.90M|        length_(asciiRef.size()) {}
_ZN6hermes2vm10StringViewC2EN4llvh8ArrayRefIDsEE:
  410|      1|      : nonManagedStringPtr_(utf16Ref.data()),
  411|      1|        startIndex_(0),
  412|      1|        isHandle_(false),
  413|      1|        isASCII_(false),
  414|      1|        length_(utf16Ref.size()) {}
_ZNK6hermes2vm10StringView6equalsIcEEbRKN4llvh8ArrayRefIT_EE:
  371|  2.84M|  bool equals(const llvh::ArrayRef<T> &other) const {
  372|  2.84M|    if (isASCII()) {
  ------------------
  |  Branch (372:9): [True: 2.84M, False: 8]
  ------------------
  373|  2.84M|      return stringRefEquals(ASCIIRef(castToCharPtr(), length()), other);
  374|  2.84M|    }
  375|      8|    return stringRefEquals(UTF16Ref(castToChar16Ptr(), length()), other);
  376|  2.84M|  }
_ZNK6hermes2vm10StringView6equalsIDsEEbRKN4llvh8ArrayRefIT_EE:
  371|     10|  bool equals(const llvh::ArrayRef<T> &other) const {
  372|     10|    if (isASCII()) {
  ------------------
  |  Branch (372:9): [True: 8, False: 2]
  ------------------
  373|      8|      return stringRefEquals(ASCIIRef(castToCharPtr(), length()), other);
  374|      8|    }
  375|      2|    return stringRefEquals(UTF16Ref(castToChar16Ptr(), length()), other);
  376|     10|  }

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

_ZN6hermes2vm8SymbolID12unsafeCreateEj:
  115|  18.0M|  static constexpr SymbolID unsafeCreate(RawType id) {
  116|  18.0M|    assert(id <= LAST_INVALID_ID && "ID outside valid range");
  117|  18.0M|    return SymbolID{id};
  118|  18.0M|  }
_ZN6hermes2vm8SymbolIDC2Ej:
  149|  21.6M|  explicit constexpr SymbolID(RawType id) : id_(id) {}
_ZNK6hermes2vm8SymbolIDeqES1_:
  103|  13.3M|  bool operator==(SymbolID sym) const {
  104|  13.3M|    return id_ == sym.id_;
  105|  13.3M|  }
_ZN6hermes2vm8SymbolID22unsafeCreateNotUniquedEj:
  141|  1.50M|  static constexpr SymbolID unsafeCreateNotUniqued(uint32_t index) {
  142|  1.50M|    assert(index <= LAST_INDEX && "Index outside valid range");
  143|  1.50M|    return SymbolID{index | NOT_UNIQUED_MASK};
  144|  1.50M|  }
_ZNK6hermes2vm8SymbolID12unsafeGetRawEv:
   81|  52.6M|  RawType unsafeGetRaw() const {
   82|  52.6M|    return id_;
   83|  52.6M|  }
_ZN6hermes2vm8SymbolIDC2Ev:
   65|  9.64M|  constexpr SymbolID() : id_(EMPTY_ID) {}
_ZNK6hermes2vm8SymbolID14unsafeGetIndexEv:
   74|  13.0M|  constexpr uint32_t unsafeGetIndex() const {
   75|  13.0M|    return id_ & (VALUE_MASK >> 1);
   76|  13.0M|  }
_ZNK6hermes2vm8SymbolID7isValidEv:
   85|  22.9M|  bool isValid() const {
   86|  22.9M|    return id_ < FIRST_INVALID_ID;
   87|  22.9M|  }
_ZNK6hermes2vm8SymbolID9isInvalidEv:
   88|  7.19M|  bool isInvalid() const {
   89|  7.19M|    return id_ >= FIRST_INVALID_ID;
   90|  7.19M|  }
_ZNK6hermes2vm8SymbolID12isNotUniquedEv:
   94|   474k|  constexpr bool isNotUniqued() const {
   95|   474k|    return id_ & NOT_UNIQUED_MASK;
   96|   474k|  }
_ZNK6hermes2vm8SymbolID9isUniquedEv:
   99|   474k|  constexpr bool isUniqued() const {
  100|   474k|    return !isNotUniqued();
  101|   474k|  }
_ZNK6hermes2vm8SymbolIDneES1_:
  106|  93.8k|  bool operator!=(SymbolID sym) const {
  107|  93.8k|    return id_ != sym.id_;
  108|  93.8k|  }
_ZN6hermes2vm8SymbolID5emptyEv:
  125|   707k|  static constexpr SymbolID empty() {
  126|   707k|    return SymbolID{EMPTY_ID};
  127|   707k|  }
_ZN6hermes2vm8SymbolID7deletedEv:
  130|  1.44M|  static constexpr SymbolID deleted() {
  131|  1.44M|    return SymbolID{DELETED_ID};
  132|  1.44M|  }
_ZN6hermes2vm10GCSymbolIDC2ENS0_8SymbolIDE:
  161|  1.31M|  explicit GCSymbolID(SymbolID id) : SymbolID(id) {}
_ZN6hermes2vm12RootSymbolIDC2Ev:
  177|    160|  constexpr RootSymbolID() : SymbolID() {}
_ZN6hermes2vm12RootSymbolIDC2ENS0_8SymbolIDE:
  179|  20.4k|  explicit RootSymbolID(SymbolID id) : SymbolID(id) {}

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

_ZN6hermes2vm11TwineChar16C2EPKc:
  121|     97|  TwineChar16(const char *str) : TwineChar16(llvh::StringRef(str)) {}
_ZN6hermes2vm11TwineChar16C2EN4llvh9StringRefE:
  125|    150|      : rightKind_(EmptyKind), leftSize_(str.size()), rightSize_(0) {
  126|    150|    if (str.size() == 0) {
  ------------------
  |  Branch (126:9): [True: 1, False: 149]
  ------------------
  127|      1|      leftKind_ = EmptyKind;
  128|    149|    } else {
  129|    149|      leftChild_.charStr = str.begin();
  130|    149|      leftKind_ = CharStrKind;
  131|    149|    }
  132|    150|    assert(isValid());
  133|    150|  }
_ZNK6hermes2vm11TwineChar167isValidEv:
  364|    852|  inline bool isValid() const {
  365|       |    // Right side never gets assigned null, only the left does.
  366|    852|    if (rightKind_ == NullKind) {
  ------------------
  |  Branch (366:9): [True: 0, False: 852]
  ------------------
  367|      0|      fprintf(stderr, "null right\n");
  368|      0|      return false;
  369|      0|    }
  370|       |
  371|       |    // Nullary strings must have an empty right side.
  372|    852|    if (isNullary() && rightKind_ != EmptyKind) {
  ------------------
  |  Branch (372:9): [True: 2, False: 850]
  |  Branch (372:24): [True: 0, False: 2]
  ------------------
  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|    852|    if (leftKind_ == EmptyKind && rightKind_ != EmptyKind) {
  ------------------
  |  Branch (378:9): [True: 2, False: 850]
  |  Branch (378:35): [True: 0, False: 2]
  ------------------
  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|    852|    if ((leftKind_ == TwineKind && !leftChild_.twine->isBinary()) ||
  ------------------
  |  Branch (384:10): [True: 161, False: 691]
  |  Branch (384:36): [True: 0, False: 161]
  ------------------
  385|    852|        (rightKind_ == TwineKind && !rightChild_.twine->isBinary())) {
  ------------------
  |  Branch (385:10): [True: 0, False: 852]
  |  Branch (385:37): [True: 0, False: 0]
  ------------------
  386|      0|      fprintf(stderr, "non-binary twine child\n");
  387|      0|      return false;
  388|      0|    }
  389|       |
  390|    852|    return true;
  391|    852|  }
_ZNK6hermes2vm11TwineChar169isNullaryEv:
  349|  1.04k|  inline bool isNullary() const {
  350|  1.04k|    return isNull() || isEmpty();
  ------------------
  |  Branch (350:12): [True: 0, False: 1.04k]
  |  Branch (350:24): [True: 2, False: 1.04k]
  ------------------
  351|  1.04k|  }
_ZNK6hermes2vm11TwineChar166isNullEv:
  339|  1.24k|  inline bool isNull() const {
  340|  1.24k|    return leftKind_ == NullKind;
  341|  1.24k|  }
_ZNK6hermes2vm11TwineChar167isEmptyEv:
  344|  1.24k|  inline bool isEmpty() const {
  345|  1.24k|    return leftKind_ == EmptyKind;
  346|  1.24k|  }
_ZNK6hermes2vm11TwineChar168isBinaryEv:
  359|    161|  inline bool isBinary() const {
  360|    161|    return leftKind_ != NullKind && rightKind_ != EmptyKind;
  ------------------
  |  Branch (360:12): [True: 161, False: 0]
  |  Branch (360:37): [True: 161, False: 0]
  ------------------
  361|    161|  }
_ZN6hermes2vmplERKNS0_11TwineChar16ES3_:
  436|     99|    const TwineChar16 &right) {
  437|     99|  return left.concat(right);
  438|     99|}
_ZNK6hermes2vm11TwineChar166concatERKS1_:
  394|     99|inline TwineChar16 TwineChar16::concat(const TwineChar16 &other) const {
  395|     99|  assert(isValid());
  396|     99|  assert(other.isValid());
  397|     99|  if (isNull() || other.isNull()) {
  ------------------
  |  Branch (397:7): [True: 0, False: 99]
  |  Branch (397:19): [True: 0, False: 99]
  ------------------
  398|      0|    return TwineChar16::createNull();
  399|      0|  }
  400|       |
  401|       |  // If one of the strings is empty, just return the other one.
  402|     99|  if (isEmpty()) {
  ------------------
  |  Branch (402:7): [True: 1, False: 98]
  ------------------
  403|      1|    return other;
  404|      1|  }
  405|     98|  if (other.isEmpty()) {
  ------------------
  |  Branch (405:7): [True: 0, False: 98]
  ------------------
  406|      0|    return *this;
  407|      0|  }
  408|       |
  409|       |  // Make a new twine, with two twine children.
  410|     98|  Node newLeft;
  411|     98|  newLeft.twine = this;
  412|     98|  NodeKind newLeftKind = TwineKind;
  413|     98|  size_t leftLen = size();
  414|       |
  415|     98|  Node newRight;
  416|     98|  newRight.twine = &other;
  417|     98|  NodeKind newRightKind = TwineKind;
  418|     98|  size_t rightLen = other.size();
  419|       |
  420|       |  // If either of the operands are unary, promote their left children.
  421|     98|  if (isUnary()) {
  ------------------
  |  Branch (421:7): [True: 47, False: 51]
  ------------------
  422|     47|    newLeft = leftChild_;
  423|     47|    newLeftKind = leftKind_;
  424|     47|  }
  425|     98|  if (other.isUnary()) {
  ------------------
  |  Branch (425:7): [True: 98, False: 0]
  ------------------
  426|     98|    newRight = other.leftChild_;
  427|     98|    newRightKind = other.leftKind_;
  428|     98|  }
  429|       |
  430|     98|  return TwineChar16(
  431|     98|      newLeft, newLeftKind, leftLen, newRight, newRightKind, rightLen);
  432|     98|}
_ZNK6hermes2vm11TwineChar164sizeEv:
  274|    300|  inline size_t size() const {
  275|    300|    assert(isValid());
  276|    300|    return leftSize_ + rightSize_;
  277|    300|  }
_ZNK6hermes2vm11TwineChar167isUnaryEv:
  354|    196|  inline bool isUnary() const {
  355|    196|    return !isNullary() && rightKind_ == EmptyKind;
  ------------------
  |  Branch (355:12): [True: 196, False: 0]
  |  Branch (355:28): [True: 145, False: 51]
  ------------------
  356|    196|  }
_ZN6hermes2vm11TwineChar16C2ENS1_4NodeENS1_8NodeKindEmS2_S3_m:
  326|     98|      : leftChild_(leftChild),
  327|     98|        leftKind_(leftKind),
  328|     98|        rightChild_(rightChild),
  329|     98|        rightKind_(rightKind),
  330|     98|        leftSize_(leftLen),
  331|     98|        rightSize_(rightLen) {
  332|     98|    assert(isValid());
  333|     98|  }
_ZN6hermes2vm11TwineChar16C2EN4llvh8ArrayRefIDsEE:
  151|      1|      : leftKind_(Char16StrKind),
  152|      1|        rightKind_(EmptyKind),
  153|      1|        leftSize_(str.size()),
  154|      1|        rightSize_(0) {
  155|      1|    leftChild_.char16Str = str.begin();
  156|      1|    assert(isValid());
  157|      1|  }

_ZNK6hermes2vm11PropOpFlags16plusThrowOnErrorEv:
   60|  5.08k|  Self plus##name() const {         \
   61|  5.08k|    auto r(*this);                  \
   62|  5.08k|    r.f##name##_ = true;            \
   63|  5.08k|    return r;                       \
   64|  5.08k|  }                                 \
_ZNK6hermes2vm11PropOpFlags13plusMustExistEv:
   60|     45|  Self plus##name() const {         \
   61|     45|    auto r(*this);                  \
   62|     45|    r.f##name##_ = true;            \
   63|     45|    return r;                       \
   64|     45|  }                                 \
_ZNK6hermes2vm11PropOpFlags12getMustExistEv:
   75|  2.25M|  bool get##name() const {          \
   76|  2.25M|    return f##name##_;              \
   77|  2.25M|  }
_ZNK6hermes2vm12OwnKeysFlags17getIncludeSymbolsEv:
   75|     45|  bool get##name() const {          \
   76|     45|    return f##name##_;              \
   77|     45|  }
_ZNK6hermes2vm12OwnKeysFlags21plusIncludeNonSymbolsEv:
   60|     45|  Self plus##name() const {         \
   61|     45|    auto r(*this);                  \
   62|     45|    r.f##name##_ = true;            \
   63|     45|    return r;                       \
   64|     45|  }                                 \
_ZNK6hermes2vm12OwnKeysFlags20getIncludeNonSymbolsEv:
   75|    135|  bool get##name() const {          \
   76|    135|    return f##name##_;              \
   77|    135|  }
_ZNK6hermes2vm12OwnKeysFlags23setIncludeNonEnumerableEb:
   70|     45|  Self set##name(bool v) const {    \
   71|     45|    auto r(*this);                  \
   72|     45|    r.f##name##_ = v;               \
   73|     45|    return r;                       \
   74|     45|  }                                 \
_ZNK6hermes2vm12OwnKeysFlags23getIncludeNonEnumerableEv:
   75|   841k|  bool get##name() const {          \
   76|   841k|    return f##name##_;              \
   77|   841k|  }

_ZNK6hermes2vm6VTable7isValidEv:
  210|  41.6M|  bool isValid() const {
  211|  41.6M|    return magic_ == kMagic && isSizeHeapAligned(size) &&
  ------------------
  |  Branch (211:12): [True: 41.6M, False: 0]
  |  Branch (211:32): [True: 41.6M, False: 0]
  ------------------
  212|  41.6M|        kindInRange(
  ------------------
  |  Branch (212:9): [True: 41.6M, False: 0]
  ------------------
  213|  41.6M|               kind, CellKind::AllCellsKind_first, CellKind::AllCellsKind_last);
  214|  41.6M|  }
_ZN6hermes2vm6VTable9getVTableENS0_8CellKindE:
  138|  17.3M|  static const VTable *getVTable(CellKind c) {
  139|  17.3M|    return vtableArray[static_cast<size_t>(c)];
  140|  17.3M|  }
_ZNK6hermes2vm6VTable16finalizeIfExistsEPNS0_6GCCellERNS0_7HadesGCE:
  175|   585k|  void finalizeIfExists(GCCell *cell, GC &gc) const {
  176|   585k|    assert(isValid());
  177|   585k|    if (finalize_) {
  ------------------
  |  Branch (177:9): [True: 94.4k, False: 491k]
  ------------------
  178|  94.4k|      finalize_(cell, gc);
  179|  94.4k|    }
  180|   585k|  }
_ZNK6hermes2vm6VTable8finalizeEPNS0_6GCCellERNS0_7HadesGCE:
  182|    843|  void finalize(GCCell *cell, GC &gc) const {
  183|    843|    assert(isValid());
  184|    843|    assert(
  185|    843|        finalize_ &&
  186|    843|        "Cannot unconditionally finalize if it doesn't have a finalize pointer");
  187|    843|    finalize_(cell, gc);
  188|    843|  }

_ZN6hermes2vm11WeakRefBaseC2EPNS0_11WeakRefSlotE:
   28|   190k|  WeakRefBase(WeakRefSlot *slot) : slot_(slot) {}
_ZNK6hermes2vm11WeakRefBase7isValidEv:
   32|   640k|  bool isValid() const {
   33|   640k|    return isSlotValid(slot_);
   34|   640k|  }
_ZN6hermes2vm11WeakRefBase11isSlotValidEPKNS0_11WeakRefSlotE:
   37|   640k|  static bool isSlotValid(const WeakRefSlot *slot) {
   38|   640k|    assert(slot && "slot must not be null");
   39|   640k|    return slot->hasValue();
   40|   640k|  }
_ZN6hermes2vm11WeakRefBase11releaseSlotEv:
   44|  95.9k|  void releaseSlot() {
   45|  95.9k|    slot_->free();
   46|  95.9k|  }
_ZNK6hermes2vm7WeakRefINS0_11HiddenClassEE3getERNS0_7RuntimeE:
   89|   359k|  T *get(Runtime &runtime) const {
   90|   359k|    if (!isValid()) {
  ------------------
  |  Branch (90:9): [True: 0, False: 359k]
  ------------------
   91|      0|      return nullptr;
   92|      0|    }
   93|   359k|    GCCell *value = slot_->get(runtime, runtime.getHeap());
   94|   359k|    return static_cast<T *>(value);
   95|   359k|  }
_ZN6hermes2vm7WeakRefINS0_11HiddenClassEEC2ERNS0_7RuntimeENS0_6HandleIS2_EE:
   59|  95.9k|      : WeakRef(runtime, runtime.getHeap(), *handle) {}
_ZN6hermes2vm7WeakRefINS0_11HiddenClassEEC2ERNS0_11PointerBaseERNS0_7HadesGCEPS2_:
   62|  95.9k|      : WeakRefBase(gc.allocWeakSlot(CompressedPointer::encode(ptr, base))) {}
_ZN6hermes2vm7WeakRefINS0_11HiddenClassEEC2EPNS0_11WeakRefSlotE:
   70|  94.2k|  explicit WeakRef(WeakRefSlot *slot) : WeakRefBase(slot) {}

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

_ZNK6hermes2vm11WeakRefSlot8hasValueEv:
   29|   999k|  bool hasValue() const {
   30|   999k|    assert(!isFree() && "Should never query a free WeakRef");
   31|   999k|    return value_.root != CompressedPointer(nullptr);
   32|   999k|  }
_ZN6hermes2vm11WeakRefSlot13markWeakRootsERNS0_16WeakRootAcceptorE:
   49|   199k|  void markWeakRoots(WeakRootAcceptor &acceptor) {
   50|   199k|    assert(!isFree() && "Cannot mark the weak root of a freed slot.");
   51|   199k|    acceptor.acceptWeak(value_.root);
   52|   199k|  }
_ZN6hermes2vm11WeakRefSlot4freeEv:
   71|  95.9k|  void free() {
   72|       |    /// There are three operations related to this atomic variable:
   73|       |    /// 1. Freeing the slot on background thread.
   74|       |    /// 2. Checking if the slot is free on the mutator.
   75|       |    /// 3. Freeing and reusing the slot on the mutator.
   76|       |    /// Since the only operation that background thread can do with the slot is
   77|       |    /// freeing it, we don't need a barrier to order the store.
   78|  95.9k|    free_.store(true, std::memory_order_relaxed);
   79|  95.9k|  }
_ZNK6hermes2vm11WeakRefSlot6isFreeEv:
   87|  3.79M|  bool isFree() const {
   88|  3.79M|    return free_.load(std::memory_order_relaxed);
   89|  3.79M|  }
_ZN6hermes2vm11WeakRefSlot11getNextFreeEv:
   91|   904k|  WeakRefSlot *getNextFree() {
   92|   904k|    assert(isFree() && "Can only get nextFree on a free slot");
   93|   904k|    return value_.nextFree;
   94|   904k|  }
_ZN6hermes2vm11WeakRefSlot11setNextFreeEPS1_:
   96|  97.4k|  void setNextFree(WeakRefSlot *nextFree) {
   97|  97.4k|    assert(isFree() && "can only set nextFree on a free slot");
   98|  97.4k|    value_.nextFree = nextFree;
   99|  97.4k|  }
_ZN6hermes2vm11WeakRefSlot7emplaceENS0_17CompressedPointerE:
  102|  95.9k|  void emplace(CompressedPointer ptr) {
  103|  95.9k|    assert(isFree() && "Slot must be free.");
  104|  95.9k|    value_.root = ptr;
  105|  95.9k|    free_.store(false, std::memory_order_relaxed);
  106|  95.9k|  }
_ZN6hermes2vm11WeakRefSlot15WeakRootOrIndexC2Ev:
  117|  95.6k|    WeakRootOrIndex() {}
_ZN6hermes2vm11WeakRefSlotC2Ev:
   83|  95.6k|  WeakRefSlot() = default;

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

_ZN6hermes2vm12WeakRootBaseC2EPNS0_6GCCellERNS0_11PointerBaseE:
   26|    597|      : CompressedPointer(CompressedPointer::encode(ptr, base)) {}
_ZN6hermes2vm12WeakRootBaseC2EDn:
   24|  6.67k|  explicit WeakRootBase(std::nullptr_t) : CompressedPointer(nullptr) {}
_ZNK6hermes2vm12WeakRootBase18getNoBarrierUnsafeERNS0_11PointerBaseE:
   39|   206k|  GCCell *getNoBarrierUnsafe(PointerBase &base) const {
   40|   206k|    return CompressedPointer::get(base);
   41|   206k|  }
_ZN6hermes2vm12WeakRootBaseaSENS0_17CompressedPointerE:
   50|   239k|  WeakRootBase &operator=(CompressedPointer ptr) {
   51|       |    // No need for a write barrier on weak roots currently.
   52|   239k|    setNoBarrier(ptr);
   53|   239k|    return *this;
   54|   239k|  }
_ZN6hermes2vm12WeakRootBaseaSEDn:
   56|    152|  WeakRootBase &operator=(std::nullptr_t) {
   57|       |    // No need for a write barrier on weak roots currently.
   58|    152|    setNoBarrier(CompressedPointer{nullptr});
   59|    152|    return *this;
   60|    152|  }
_ZN6hermes2vm8WeakRootINS0_6GCCellEEaSENS0_17CompressedPointerE:
   90|  95.9k|  WeakRoot &operator=(CompressedPointer ptr) {
   91|  95.9k|    WeakRootBase::operator=(ptr);
   92|  95.9k|    return *this;
   93|  95.9k|  }
_ZN6hermes2vm8WeakRootINS0_11HiddenClassEEC2EDn:
   69|  6.67k|  explicit WeakRoot(std::nullptr_t) : WeakRootBase(nullptr) {}
_ZN6hermes2vm8WeakRootINS0_11HiddenClassEEaSENS0_17CompressedPointerE:
   90|  3.88k|  WeakRoot &operator=(CompressedPointer ptr) {
   91|  3.88k|    WeakRootBase::operator=(ptr);
   92|  3.88k|    return *this;
   93|  3.88k|  }
_ZN6hermes2vm8WeakRootINS0_6DomainEEC2EPS2_RNS0_11PointerBaseE:
   70|    597|  explicit WeakRoot(T *ptr, PointerBase &base) : WeakRootBase(ptr, base) {}

_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE11containsKeyERKS3_:
   66|  1.44k|  bool containsKey(const KeyT &key) {
   67|  1.44k|    return internalFind(key) != map_.end();
   68|  1.44k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE12internalFindERKS3_:
  122|   280k|  InternalIterator internalFind(const KeyT &key) {
  123|   280k|    auto it = map_.find(key);
  124|       |    // Not found?
  125|   280k|    if (it == map_.end())
  ------------------
  |  Branch (125:9): [True: 7.35k, False: 273k]
  ------------------
  126|  7.35k|      return it;
  127|       |
  128|       |    // The value was garbage collected, so pretend that we didn't find it.
  129|   273k|    if (!it->second.isValid()) {
  ------------------
  |  Branch (129:9): [True: 0, False: 273k]
  ------------------
  130|      0|      return map_.end();
  131|      0|    }
  132|       |
  133|   273k|    return it;
  134|   273k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE6lookupERNS0_7RuntimeERKS3_:
   71|   278k|  ValueT *lookup(Runtime &runtime, const KeyT &key) {
   72|   278k|    auto it = internalFind(key);
   73|   278k|    if (it == map_.end())
  ------------------
  |  Branch (73:9): [True: 6.71k, False: 272k]
  ------------------
   74|  6.71k|      return nullptr;
   75|   272k|    return it->second.get(runtime);
   76|   278k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE9insertNewERNS0_7RuntimeERKS3_NS0_6HandleIS4_EE:
   91|  10.9k|  bool insertNew(Runtime &runtime, const KeyT &key, Handle<ValueT> value) {
   92|  10.9k|    auto [it, inserted] = map_.try_emplace(key, runtime, value);
   93|  10.9k|    if (!inserted) {
  ------------------
  |  Branch (93:9): [True: 0, False: 10.9k]
  ------------------
   94|       |      // The key already exists and the value is valid, this isn't a new entry.
   95|      0|      if (it->second.isValid()) {
  ------------------
  |  Branch (95:11): [True: 0, False: 0]
  ------------------
   96|      0|        return false;
   97|      0|      }
   98|       |      // Release the old slot before assigning it a new one.
   99|      0|      it->second.releaseSlot();
  100|      0|      it->second = WeakRef<ValueT>(runtime, value);
  101|      0|    }
  102|  10.9k|    pruneInvalid(runtime.getHeap());
  103|  10.9k|    return true;
  104|  10.9k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE12pruneInvalidERNS0_7HadesGCE:
  138|  10.9k|  void pruneInvalid(GC &gc) {
  139|  10.9k|    if (map_.size() <= pruneLimit_)
  ------------------
  |  Branch (139:9): [True: 10.2k, False: 695]
  ------------------
  140|  10.2k|      return;
  141|       |
  142|  6.14k|    for (auto it = map_.begin(), e = map_.end(); it != e; ++it) {
  ------------------
  |  Branch (142:50): [True: 5.45k, False: 695]
  ------------------
  143|  5.45k|      if (!it->second.isValid()) {
  ------------------
  |  Branch (143:11): [True: 0, False: 5.45k]
  ------------------
  144|      0|        it->second.releaseSlot();
  145|       |        // NOTE: DenseMap's erase() operation doesn't invalidate any
  146|       |        // iterators, (and has a void return type), so this is safe to do. If
  147|       |        // we were using a std::map<>, we would have to do
  148|       |        // "it = map_.erase(it)".
  149|      0|        map_.erase(it);
  150|      0|      }
  151|  5.45k|    }
  152|       |
  153|    695|    recalcPruneLimit();
  154|    695|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE16recalcPruneLimitEv:
  157|    695|  void recalcPruneLimit() {
  158|    695|    pruneLimit_ = std::max(map_.size() * 2 + 1, toRValue(kMinPruneLimit));
  159|    695|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEED2Ev:
   40|  2.09k|  ~WeakValueMap() {
   41|  2.09k|    for (auto &[k, v] : map_)
  ------------------
  |  Branch (41:23): [True: 10.9k, False: 2.09k]
  ------------------
   42|  10.9k|      v.releaseSlot();
   43|  2.09k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEEC2Ev:
   39|  2.09k|  WeakValueMap() : map_() {}

_ZNK6hermes2vm6detail19IdentifierHashTable10shouldGrowEv:
   56|   457k|  bool shouldGrow() const {
   57|   457k|    auto cap = capacity();
   58|   457k|    assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
   59|       |    // This is essentially cap * 0.75 < size.
   60|   457k|    return cap - (cap >> 2) < nonEmptyEntryCount_;
   61|   457k|  }
_ZN6hermes2vm6detail19IdentifierHashTableC2Ej:
   96|    160|      : table_(capacity) {}
_ZN6hermes2vm6detail19IdentifierHashTable18setIdentifierTableEPNS0_15IdentifierTableE:
   99|    160|  void setIdentifierTable(IdentifierTable *table) {
  100|    160|    identifierTable_ = table;
  101|    160|  }
_ZNK6hermes2vm6detail19IdentifierHashTable8capacityEv:
  109|  2.90M|  uint32_t capacity() const {
  110|  2.90M|    return table_.size();
  111|  2.90M|  }
_ZN6hermes2vm6detail19IdentifierHashTable7reserveEj:
  122|    676|  void reserve(uint32_t count) {
  123|    676|    auto cap = capacity();
  124|    676|    assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
  125|    676|    if ((cap >> 1) < count) {
  ------------------
  |  Branch (125:9): [True: 160, False: 516]
  ------------------
  126|       |      // Calculate new capacity needed to contain all identifiers.
  127|       |      // Always align it with power of 2.
  128|    160|      uint32_t newCapacity = llvh::NextPowerOf2(count * 2);
  129|    160|      growAndRehash(newCapacity);
  130|    160|    }
  131|    676|  }
_ZNK6hermes2vm6detail19IdentifierHashTable7isValidEj:
  167|  1.93M|  bool isValid(uint32_t index) const {
  168|  1.93M|    return table_.isValid(index);
  169|  1.93M|  }
_ZNK6hermes2vm6detail19IdentifierHashTable3getEj:
  172|  1.48M|  uint32_t get(uint32_t index) const {
  173|  1.48M|    return table_.get(index);
  174|  1.48M|  }

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

_ZN6hermes6ESTree9getParamsEPNS0_16FunctionLikeNodeE:
   18|   413k|NodeList &getParams(FunctionLikeNode *node) {
   19|   413k|  switch (node->getKind()) {
   20|    588|    default:
  ------------------
  |  Branch (20:5): [True: 588, False: 412k]
  ------------------
   21|    588|      assert(
   22|    588|          node->getKind() == NodeKind::Program && "invalid FunctionLikeNode");
   23|    588|      return cast<ProgramNode>(node)->dummyParamList;
   24|    166|    case NodeKind::FunctionExpression:
  ------------------
  |  Branch (24:5): [True: 166, False: 413k]
  ------------------
   25|    166|      return cast<FunctionExpressionNode>(node)->_params;
   26|   412k|    case NodeKind::ArrowFunctionExpression:
  ------------------
  |  Branch (26:5): [True: 412k, False: 754]
  ------------------
   27|   412k|      return cast<ArrowFunctionExpressionNode>(node)->_params;
   28|      0|    case NodeKind::FunctionDeclaration:
  ------------------
  |  Branch (28:5): [True: 0, False: 413k]
  ------------------
   29|      0|      return cast<FunctionDeclarationNode>(node)->_params;
   30|      0|#if HERMES_PARSE_FLOW
   31|      0|    case NodeKind::ComponentDeclaration:
  ------------------
  |  Branch (31:5): [True: 0, False: 413k]
  ------------------
   32|      0|      return cast<ComponentDeclarationNode>(node)->_params;
   33|      0|    case NodeKind::HookDeclaration:
  ------------------
  |  Branch (33:5): [True: 0, False: 413k]
  ------------------
   34|      0|      return cast<HookDeclarationNode>(node)->_params;
   35|   413k|#endif
   36|   413k|  }
   37|   413k|}
_ZN6hermes6ESTree17getBlockStatementEPNS0_16FunctionLikeNodeE:
   39|     82|BlockStatementNode *getBlockStatement(FunctionLikeNode *node) {
   40|     82|  switch (node->getKind()) {
   41|      0|    default:
  ------------------
  |  Branch (41:5): [True: 0, False: 82]
  ------------------
   42|      0|      assert(
   43|      0|          node->getKind() == NodeKind::Program && "invalid FunctionLikeNode");
   44|      0|      return nullptr;
   45|     82|    case NodeKind::FunctionExpression:
  ------------------
  |  Branch (45:5): [True: 82, False: 0]
  ------------------
   46|     82|      return cast<BlockStatementNode>(
   47|     82|          cast<FunctionExpressionNode>(node)->_body);
   48|      0|    case NodeKind::FunctionDeclaration:
  ------------------
  |  Branch (48:5): [True: 0, False: 82]
  ------------------
   49|      0|      return cast<BlockStatementNode>(
   50|      0|          cast<FunctionDeclarationNode>(node)->_body);
   51|      0|    case NodeKind::ArrowFunctionExpression:
  ------------------
  |  Branch (51:5): [True: 0, False: 82]
  ------------------
   52|      0|      return dyn_cast<BlockStatementNode>(
   53|      0|          cast<ArrowFunctionExpressionNode>(node)->_body);
   54|      0|#if HERMES_PARSE_FLOW
   55|      0|    case NodeKind::ComponentDeclaration:
  ------------------
  |  Branch (55:5): [True: 0, False: 82]
  ------------------
   56|      0|      return cast<BlockStatementNode>(
   57|      0|          cast<ComponentDeclarationNode>(node)->_body);
   58|      0|    case NodeKind::HookDeclaration:
  ------------------
  |  Branch (58:5): [True: 0, False: 82]
  ------------------
   59|      0|      return cast<BlockStatementNode>(cast<HookDeclarationNode>(node)->_body);
   60|     82|#endif
   61|     82|  }
   62|     82|}
_ZN6hermes6ESTree11getPropertyEPNS0_24MemberExpressionLikeNodeE:
   76|  86.9k|Node *getProperty(MemberExpressionLikeNode *node) {
   77|  86.9k|  switch (node->getKind()) {
   78|  35.1k|    case NodeKind::MemberExpression:
  ------------------
  |  Branch (78:5): [True: 35.1k, False: 51.8k]
  ------------------
   79|  35.1k|      return cast<MemberExpressionNode>(node)->_property;
   80|  51.8k|    case NodeKind::OptionalMemberExpression:
  ------------------
  |  Branch (80:5): [True: 51.8k, False: 35.1k]
  ------------------
   81|  51.8k|      return cast<OptionalMemberExpressionNode>(node)->_property;
   82|      0|    default:
  ------------------
  |  Branch (82:5): [True: 0, False: 86.9k]
  ------------------
   83|      0|      break;
   84|  86.9k|  }
   85|      0|  llvm_unreachable("invalid MemberExpressionLikeNode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   86|  86.9k|}
_ZN6hermes6ESTree11getComputedEPNS0_24MemberExpressionLikeNodeE:
   88|  43.5k|NodeBoolean getComputed(MemberExpressionLikeNode *node) {
   89|  43.5k|  switch (node->getKind()) {
   90|  17.5k|    case NodeKind::MemberExpression:
  ------------------
  |  Branch (90:5): [True: 17.5k, False: 25.9k]
  ------------------
   91|  17.5k|      return cast<MemberExpressionNode>(node)->_computed;
   92|  25.9k|    case NodeKind::OptionalMemberExpression:
  ------------------
  |  Branch (92:5): [True: 25.9k, False: 17.5k]
  ------------------
   93|  25.9k|      return cast<OptionalMemberExpressionNode>(node)->_computed;
   94|      0|    default:
  ------------------
  |  Branch (94:5): [True: 0, False: 43.5k]
  ------------------
   95|      0|      break;
   96|  43.5k|  }
   97|      0|  llvm_unreachable("invalid MemberExpressionLikeNode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   98|  43.5k|}
_ZN6hermes6ESTree9getCalleeEPNS0_22CallExpressionLikeNodeE:
  100|     19|Node *getCallee(CallExpressionLikeNode *node) {
  101|     19|  switch (node->getKind()) {
  102|      3|    case NodeKind::CallExpression:
  ------------------
  |  Branch (102:5): [True: 3, False: 16]
  ------------------
  103|      3|      return cast<CallExpressionNode>(node)->_callee;
  104|     16|    case NodeKind::OptionalCallExpression:
  ------------------
  |  Branch (104:5): [True: 16, False: 3]
  ------------------
  105|     16|      return cast<OptionalCallExpressionNode>(node)->_callee;
  106|      0|    default:
  ------------------
  |  Branch (106:5): [True: 0, False: 19]
  ------------------
  107|      0|      break;
  108|     19|  }
  109|      0|  llvm_unreachable("invalid CallExpressionLikeNode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  110|     19|}
_ZN6hermes6ESTree12getArgumentsEPNS0_22CallExpressionLikeNodeE:
  112|     38|NodeList &getArguments(CallExpressionLikeNode *node) {
  113|     38|  switch (node->getKind()) {
  114|      6|    case NodeKind::CallExpression:
  ------------------
  |  Branch (114:5): [True: 6, False: 32]
  ------------------
  115|      6|      return cast<CallExpressionNode>(node)->_arguments;
  116|     32|    case NodeKind::OptionalCallExpression:
  ------------------
  |  Branch (116:5): [True: 32, False: 6]
  ------------------
  117|     32|      return cast<OptionalCallExpressionNode>(node)->_arguments;
  118|      0|    default:
  ------------------
  |  Branch (118:5): [True: 0, False: 38]
  ------------------
  119|      0|      break;
  120|     38|  }
  121|      0|  llvm_unreachable("invalid CallExpressionLikeNode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  122|     38|}
_ZN6hermes6ESTree15hasSimpleParamsEPNS0_16FunctionLikeNodeE:
  124|   103k|bool hasSimpleParams(FunctionLikeNode *node) {
  125|   103k|  for (Node &param : getParams(node)) {
  ------------------
  |  Branch (125:20): [True: 103k, False: 103k]
  ------------------
  126|   103k|    if (isa<PatternNode>(param))
  ------------------
  |  Branch (126:9): [True: 0, False: 103k]
  ------------------
  127|      0|      return false;
  128|   103k|#if HERMES_PARSE_FLOW
  129|   103k|    if (isa<ComponentParameterNode>(param) &&
  ------------------
  |  Branch (129:9): [True: 0, False: 103k]
  ------------------
  130|   103k|        isa<PatternNode>(cast<ComponentParameterNode>(&param)->_local))
  ------------------
  |  Branch (130:9): [True: 0, False: 0]
  ------------------
  131|      0|      return false;
  132|   103k|#endif
  133|   103k|  }
  134|   103k|  return true;
  135|   103k|}
_ZN6hermes6ESTree19hasParamExpressionsEPNS0_16FunctionLikeNodeE:
  137|   103k|bool hasParamExpressions(FunctionLikeNode *node) {
  138|   103k|  for (Node &param : getParams(node)) {
  ------------------
  |  Branch (138:20): [True: 103k, False: 103k]
  ------------------
  139|   103k|    if (isa<AssignmentPatternNode>(param))
  ------------------
  |  Branch (139:9): [True: 0, False: 103k]
  ------------------
  140|      0|      return true;
  141|   103k|#if HERMES_PARSE_FLOW
  142|   103k|    if (isa<ComponentParameterNode>(param) &&
  ------------------
  |  Branch (142:9): [True: 0, False: 103k]
  ------------------
  143|   103k|        isa<AssignmentPatternNode>(
  ------------------
  |  Branch (143:9): [True: 0, False: 0]
  ------------------
  144|      0|            cast<ComponentParameterNode>(&param)->_local))
  145|      0|      return false;
  146|   103k|#endif
  147|   103k|  }
  148|   103k|  return false;
  149|   103k|}
_ZN6hermes6ESTree7isAsyncEPNS0_16FunctionLikeNodeE:
  172|   206k|bool isAsync(FunctionLikeNode *node) {
  173|   206k|  switch (node->getKind()) {
  174|      0|    default:
  ------------------
  |  Branch (174:5): [True: 0, False: 206k]
  ------------------
  175|      0|      assert(
  176|      0|          node->getKind() == NodeKind::Program && "invalid FunctionLikeNode");
  177|      0|      return false;
  178|    164|    case NodeKind::FunctionExpression:
  ------------------
  |  Branch (178:5): [True: 164, False: 206k]
  ------------------
  179|    164|      return cast<FunctionExpressionNode>(node)->_async;
  180|   206k|    case NodeKind::ArrowFunctionExpression:
  ------------------
  |  Branch (180:5): [True: 206k, False: 164]
  ------------------
  181|   206k|      return cast<ArrowFunctionExpressionNode>(node)->_async;
  182|      0|    case NodeKind::FunctionDeclaration:
  ------------------
  |  Branch (182:5): [True: 0, False: 206k]
  ------------------
  183|      0|      return cast<FunctionDeclarationNode>(node)->_async;
  184|      0|#if HERMES_PARSE_FLOW
  185|      0|    case NodeKind::ComponentDeclaration:
  ------------------
  |  Branch (185:5): [True: 0, False: 206k]
  ------------------
  186|      0|      return false;
  187|      0|    case NodeKind::HookDeclaration:
  ------------------
  |  Branch (187:5): [True: 0, False: 206k]
  ------------------
  188|      0|      return false;
  189|   206k|#endif
  190|   206k|  }
  191|   206k|}

_ZN6hermes3sem11validateASTERNS_7ContextERNS0_10SemContextEPNS_6ESTree4NodeE:
   18|    204|bool validateAST(Context &astContext, SemContext &semCtx, Node *root) {
   19|    204|  PerfSection validation("Validating JavaScript function AST");
   20|    204|  if (astContext.getCodeGenerationSettings().enableBlockScoping) {
  ------------------
  |  Branch (20:7): [True: 0, False: 204]
  ------------------
   21|      0|    canonicalizeForBlockScoping(astContext, root);
   22|      0|  }
   23|    204|  if (astContext.getConvertES6Classes()) {
  ------------------
  |  Branch (23:7): [True: 0, False: 204]
  ------------------
   24|       |    // Convert ES6 classes to functions
   25|      0|    transformES6Classes(astContext, root);
   26|      0|  }
   27|       |
   28|       |  // Validate the entire AST.
   29|    204|  SemanticValidator validator{astContext, semCtx, true};
   30|    204|  return validator.doIt(root);
   31|    204|}

_ZN6hermes3sem8KeywordsC2ERNS_7ContextE:
   30|    204|          astContext.getIdentifier("arguments").getUnderlyingPointer()),
   31|    204|      identEval(astContext.getIdentifier("eval").getUnderlyingPointer()),
   32|    204|      identDelete(astContext.getIdentifier("delete").getUnderlyingPointer()),
   33|    204|      identThis(astContext.getIdentifier("this").getUnderlyingPointer()),
   34|       |      identUseStrict(
   35|    204|          astContext.getIdentifier("use strict").getUnderlyingPointer()),
   36|       |      identShowSource(
   37|    204|          astContext.getIdentifier("show source").getUnderlyingPointer()),
   38|       |      identHideSource(
   39|    204|          astContext.getIdentifier("hide source").getUnderlyingPointer()),
   40|       |      identSensitive(
   41|    204|          astContext.getIdentifier("sensitive").getUnderlyingPointer()),
   42|    204|      identVar(astContext.getIdentifier("var").getUnderlyingPointer()),
   43|    204|      identLet(astContext.getIdentifier("let").getUnderlyingPointer()),
   44|    204|      identConst(astContext.getIdentifier("const").getUnderlyingPointer()),
   45|    204|      identPlus(astContext.getIdentifier("+").getUnderlyingPointer()),
   46|    204|      identMinus(astContext.getIdentifier("-").getUnderlyingPointer()),
   47|    204|      identAssign(astContext.getIdentifier("=").getUnderlyingPointer()) {}
_ZN6hermes3sem17SemanticValidatorC2ERNS_7ContextERNS0_10SemContextEb:
   56|    204|    : astContext_(astContext),
   57|    204|      sm_(astContext.getSourceErrorManager()),
   58|    204|      bufferMessages_{&sm_},
   59|    204|      semCtx_(semCtx),
   60|    204|      initialErrorCount_(sm_.getErrorCount()),
   61|    204|      kw_(astContext),
   62|    204|      compile_(compile) {}
_ZN6hermes3sem17SemanticValidator4doItEPNS_6ESTree4NodeE:
   64|    204|bool SemanticValidator::doIt(Node *rootNode) {
   65|    204|  visitESTreeNode(*this, rootNode);
   66|    204|  return sm_.getErrorCount() == initialErrorCount_;
   67|    204|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree11ProgramNodeE:
   89|    204|void SemanticValidator::visit(ProgramNode *node) {
   90|    204|  FunctionContext newFuncCtx{this, astContext_.isStrictMode(), node, node};
   91|       |
   92|    204|  scanDirectivePrologue(node->_body);
   93|    204|  setDirectiveDerivedInfo(node);
   94|       |
   95|    204|  visitESTreeChildren(*this, node);
   96|    204|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree14IdentifierNodeE:
  150|   926k|void SemanticValidator::visit(IdentifierNode *identifier) {
  151|   926k|  if (identifier->_name == kw_.identEval && !astContext_.getEnableEval())
  ------------------
  |  Branch (151:7): [True: 0, False: 926k]
  |  Branch (151:45): [True: 0, False: 0]
  ------------------
  152|      0|    sm_.error(identifier->getSourceRange(), "'eval' is disabled");
  153|       |
  154|   926k|  if (identifier->_name == kw_.identArguments) {
  ------------------
  |  Branch (154:7): [True: 174, False: 925k]
  ------------------
  155|    174|    if (forbidArguments_)
  ------------------
  |  Branch (155:9): [True: 0, False: 174]
  ------------------
  156|      0|      sm_.error(identifier->getSourceRange(), "invalid use of 'arguments'");
  157|    174|    curFunction()->semInfo->usesArguments = true;
  158|    174|  }
  159|   926k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree22FunctionExpressionNodeE:
  168|     82|void SemanticValidator::visit(FunctionExpressionNode *funcExpr) {
  169|     82|  visitFunction(funcExpr, funcExpr->_id, funcExpr->_params, funcExpr->_body);
  170|     82|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree27ArrowFunctionExpressionNodeE:
  172|   103k|void SemanticValidator::visit(ArrowFunctionExpressionNode *arrowFunc) {
  173|       |  // Convert expression functions to a full-body to simplify IRGen.
  174|   103k|  if (compile_ && arrowFunc->_expression) {
  ------------------
  |  Branch (174:7): [True: 103k, False: 0]
  |  Branch (174:19): [True: 103k, False: 0]
  ------------------
  175|   103k|    auto *retStmt = new (astContext_) ReturnStatementNode(arrowFunc->_body);
  176|   103k|    retStmt->copyLocationFrom(arrowFunc->_body);
  177|       |
  178|   103k|    ESTree::NodeList stmtList;
  179|   103k|    stmtList.push_back(*retStmt);
  180|       |
  181|   103k|    auto *blockStmt = new (astContext_) BlockStatementNode(std::move(stmtList));
  182|   103k|    blockStmt->copyLocationFrom(arrowFunc->_body);
  183|       |
  184|   103k|    arrowFunc->_body = blockStmt;
  185|   103k|    arrowFunc->_expression = false;
  186|   103k|  }
  187|       |
  188|   103k|  visitFunction(arrowFunc, nullptr, arrowFunc->_params, arrowFunc->_body);
  189|       |
  190|   103k|  curFunction()->semInfo->containsArrowFunctions = true;
  191|   103k|  curFunction()->semInfo->containsArrowFunctionsUsingArguments =
  192|   103k|      curFunction()->semInfo->containsArrowFunctionsUsingArguments ||
  ------------------
  |  Branch (192:7): [True: 0, False: 103k]
  ------------------
  193|   103k|      arrowFunc->getSemInfo()->containsArrowFunctionsUsingArguments ||
  ------------------
  |  Branch (193:7): [True: 0, False: 103k]
  ------------------
  194|   103k|      arrowFunc->getSemInfo()->usesArguments;
  ------------------
  |  Branch (194:7): [True: 0, False: 103k]
  ------------------
  195|   103k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree18ForInStatementNodeE:
  213|     15|void SemanticValidator::visit(ForInStatementNode *forIn) {
  214|     15|  visitForInOf(forIn, forIn->_left);
  215|     15|}
_ZN6hermes3sem17SemanticValidator12visitForInOfEPNS_6ESTree17LoopStatementNodeEPNS2_4NodeE:
  225|     15|void SemanticValidator::visitForInOf(LoopStatementNode *loopNode, Node *left) {
  226|     15|  loopNode->setLabelIndex(curFunction()->allocateLabel());
  227|       |
  228|     15|  SaveAndRestore<LoopStatementNode *> saveLoop(
  229|     15|      curFunction()->activeLoop, loopNode);
  230|     15|  SaveAndRestore<StatementNode *> saveSwitch(
  231|     15|      curFunction()->activeSwitchOrLoop, loopNode);
  232|       |
  233|     15|  if (auto *VD = dyn_cast<VariableDeclarationNode>(left)) {
  ------------------
  |  Branch (233:13): [True: 0, False: 15]
  ------------------
  234|      0|    assert(
  235|      0|        VD->_declarations.size() == 1 &&
  236|      0|        "for-in/for-of must have a single binding");
  237|       |
  238|      0|    auto *declarator =
  239|      0|        cast<ESTree::VariableDeclaratorNode>(&VD->_declarations.front());
  240|       |
  241|      0|    if (declarator->_init) {
  ------------------
  |  Branch (241:9): [True: 0, False: 0]
  ------------------
  242|      0|      if (isa<ESTree::PatternNode>(declarator->_id)) {
  ------------------
  |  Branch (242:11): [True: 0, False: 0]
  ------------------
  243|      0|        sm_.error(
  244|      0|            declarator->_init->getSourceRange(),
  245|      0|            "destructuring declaration cannot be initialized in for-in/for-of loop");
  246|      0|      } else if (!(isa<ForInStatementNode>(loopNode) &&
  ------------------
  |  Branch (246:20): [True: 0, False: 0]
  ------------------
  247|      0|                   !curFunction()->strictMode && VD->_kind == kw_.identVar)) {
  ------------------
  |  Branch (247:20): [True: 0, False: 0]
  |  Branch (247:50): [True: 0, False: 0]
  ------------------
  248|      0|        sm_.error(
  249|      0|            declarator->_init->getSourceRange(),
  250|      0|            "for-in/for-of variable declaration may not be initialized");
  251|      0|      }
  252|      0|    }
  253|     15|  } else {
  254|     15|    validateAssignmentTarget(left);
  255|     15|  }
  256|     15|  visitESTreeChildren(*this, loopNode);
  257|     15|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20BinaryExpressionNodeE:
  259|   103k|void SemanticValidator::visit(BinaryExpressionNode *bin) {
  260|       |  // Handle nested +/- non-recursively.
  261|   103k|  if (bin->_operator == kw_.identPlus || bin->_operator == kw_.identMinus) {
  ------------------
  |  Branch (261:7): [True: 2.39k, False: 101k]
  |  Branch (261:42): [True: 523, False: 101k]
  ------------------
  262|  2.91k|    auto list = linearizeLeft(bin, {"+", "-"});
  263|  2.91k|    if (list.size() > MAX_NESTED_BINARY) {
  ------------------
  |  Branch (263:9): [True: 7, False: 2.91k]
  ------------------
  264|      7|      recursionDepthExceeded(bin);
  265|      7|      return;
  266|      7|    }
  267|       |
  268|  2.91k|    visitESTreeNode(*this, list[0]->_left, list[0]);
  269|  63.8k|    for (auto *e : list) {
  ------------------
  |  Branch (269:18): [True: 63.8k, False: 2.91k]
  ------------------
  270|  63.8k|      visitESTreeNode(*this, e->_right, e);
  271|  63.8k|    }
  272|  2.91k|    return;
  273|  2.91k|  }
  274|       |
  275|   101k|  visitESTreeChildren(*this, bin);
  276|   101k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree24AssignmentExpressionNodeE:
  279|  4.55k|void SemanticValidator::visit(AssignmentExpressionNode *assignment) {
  280|       |  // Handle nested "=" non-recursively.
  281|  4.55k|  if (assignment->_operator == kw_.identAssign) {
  ------------------
  |  Branch (281:7): [True: 4.55k, False: 1]
  ------------------
  282|  4.55k|    auto list = linearizeRight(assignment, {"="});
  283|  4.55k|    if (list.size() > MAX_NESTED_ASSIGNMENTS) {
  ------------------
  |  Branch (283:9): [True: 0, False: 4.55k]
  ------------------
  284|      0|      recursionDepthExceeded(assignment);
  285|      0|      return;
  286|      0|    }
  287|       |
  288|  4.56k|    for (auto *e : list) {
  ------------------
  |  Branch (288:18): [True: 4.56k, False: 4.55k]
  ------------------
  289|  4.56k|      validateAssignmentTarget(e->_left);
  290|  4.56k|      visitESTreeNode(*this, e->_left, e);
  291|  4.56k|    }
  292|  4.55k|    visitESTreeNode(*this, list.back()->_right, list.back());
  293|  4.55k|    return;
  294|  4.55k|  }
  295|       |
  296|      1|  validateAssignmentTarget(assignment->_left);
  297|      1|  visitESTreeChildren(*this, assignment);
  298|      1|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20UpdateExpressionNodeE:
  301|      1|void SemanticValidator::visit(UpdateExpressionNode *update) {
  302|       |  // Check if the left-hand side is valid.
  303|      1|  if (!isLValue(update->_argument)) {
  ------------------
  |  Branch (303:7): [True: 0, False: 1]
  ------------------
  304|      0|    sm_.error(
  305|      0|        update->_argument->getSourceRange(),
  306|      0|        "invalid operand in update operation");
  307|      0|  }
  308|      1|  visitESTreeChildren(*this, update);
  309|      1|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20LabeledStatementNodeE:
  312|   245k|void SemanticValidator::visit(LabeledStatementNode *labelStmt) {
  313|   245k|  auto id = cast<IdentifierNode>(labelStmt->_label);
  314|       |
  315|   245k|  labelStmt->setLabelIndex(curFunction()->allocateLabel());
  316|       |
  317|       |  // Determine the target statement. We need to check if it directly encloses
  318|       |  // a loop or another label enclosing a loop.
  319|   245k|  StatementNode *targetStmt = labelStmt;
  320|   245k|  {
  321|   245k|    LabeledStatementNode *curStmt = labelStmt;
  322|   256k|    do {
  323|   256k|      if (auto *LS = dyn_cast<LoopStatementNode>(curStmt->_body)) {
  ------------------
  |  Branch (323:17): [True: 0, False: 256k]
  ------------------
  324|      0|        targetStmt = LS;
  325|      0|        break;
  326|      0|      }
  327|   256k|    } while ((curStmt = dyn_cast<LabeledStatementNode>(curStmt->_body)));
  ------------------
  |  Branch (327:14): [True: 10.1k, False: 245k]
  ------------------
  328|   245k|  }
  329|       |
  330|       |  // Define the new label, checking for a previous definition.
  331|      0|  auto insertRes =
  332|   245k|      curFunction()->labelMap.insert({id->_name, {id, targetStmt}});
  333|   245k|  if (!insertRes.second) {
  ------------------
  |  Branch (333:7): [True: 0, False: 245k]
  ------------------
  334|      0|    sm_.error(
  335|      0|        id->getSourceRange(),
  336|      0|        llvh::Twine("label '") + id->_name->str() + "' is already defined");
  337|      0|    sm_.note(
  338|      0|        insertRes.first->second.declarationNode->getSourceRange(),
  339|      0|        "previous definition");
  340|      0|  }
  341|       |  // Auto-erase the label on exit, if we inserted it.
  342|   245k|  const auto &deleter = llvh::make_scope_exit([=]() {
  343|   245k|    if (insertRes.second)
  344|   245k|      curFunction()->labelMap.erase(id->_name);
  345|   245k|  });
  346|   245k|  (void)deleter;
  347|       |
  348|   245k|  visitESTreeChildren(*this, labelStmt);
  349|   245k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree17RegExpLiteralNodeE:
  352|    120|void SemanticValidator::visit(RegExpLiteralNode *regexp) {
  353|    120|  llvh::StringRef regexpError;
  354|    120|  if (compile_) {
  ------------------
  |  Branch (354:7): [True: 120, False: 0]
  ------------------
  355|    120|    if (auto compiled = CompiledRegExp::tryCompile(
  ------------------
  |  Branch (355:14): [True: 119, False: 1]
  ------------------
  356|    120|            regexp->_pattern->str(), regexp->_flags->str(), &regexpError)) {
  357|    119|      astContext_.addCompiledRegExp(
  358|    119|          regexp->_pattern, regexp->_flags, std::move(*compiled));
  359|    119|    } else {
  360|      1|      sm_.error(
  361|      1|          regexp->getSourceRange(),
  362|      1|          "Invalid regular expression: " + Twine(regexpError));
  363|      1|    }
  364|    120|  }
  365|    120|  visitESTreeChildren(*this, regexp);
  366|    120|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree19ReturnStatementNodeE:
  585|   103k|void SemanticValidator::visit(ReturnStatementNode *returnStmt) {
  586|   103k|  if (curFunction()->isGlobalScope() &&
  ------------------
  |  Branch (586:7): [True: 0, False: 103k]
  ------------------
  587|   103k|      !astContext_.allowReturnOutsideFunction())
  ------------------
  |  Branch (587:7): [True: 0, False: 0]
  ------------------
  588|      0|    sm_.error(returnStmt->getSourceRange(), "'return' not in a function");
  589|   103k|  visitESTreeChildren(*this, returnStmt);
  590|   103k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree19UnaryExpressionNodeE:
  617|  25.9k|void SemanticValidator::visit(UnaryExpressionNode *unaryExpr) {
  618|       |  // Check for unqualified delete in strict mode.
  619|  25.9k|  if (unaryExpr->_operator == kw_.identDelete) {
  ------------------
  |  Branch (619:7): [True: 0, False: 25.9k]
  ------------------
  620|      0|    if (curFunction()->strictMode &&
  ------------------
  |  Branch (620:9): [True: 0, False: 0]
  ------------------
  621|      0|        isa<IdentifierNode>(unaryExpr->_argument)) {
  ------------------
  |  Branch (621:9): [True: 0, False: 0]
  ------------------
  622|      0|      sm_.error(
  623|      0|          unaryExpr->getSourceRange(),
  624|      0|          "'delete' of a variable is not allowed in strict mode");
  625|      0|    }
  626|      0|  }
  627|  25.9k|  visitESTreeChildren(*this, unaryExpr);
  628|  25.9k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree16ArrayPatternNodeE:
  630|  22.3k|void SemanticValidator::visit(ArrayPatternNode *AP) {
  631|  22.3k|  visitESTreeChildren(*this, AP);
  632|  22.3k|}
_ZN6hermes3sem17SemanticValidator13visitFunctionEPNS_6ESTree16FunctionLikeNodeEPNS2_4NodeERN4llvh12simple_ilistIS5_JEEES6_:
  821|   103k|    Node *body) {
  822|   103k|  FunctionContext newFuncCtx{
  823|   103k|      this,
  824|   103k|      haveActiveContext() && curFunction()->strictMode,
  ------------------
  |  Branch (824:7): [True: 103k, False: 0]
  |  Branch (824:30): [True: 0, False: 103k]
  ------------------
  825|   103k|      node,
  826|   103k|      body,
  827|   103k|      haveActiveContext() ? curFunction()->sourceVisibility
  ------------------
  |  Branch (827:7): [True: 103k, False: 0]
  ------------------
  828|   103k|                          : SourceVisibility::Default};
  829|       |
  830|   103k|  if (compile_ && ESTree::isAsync(node) && ESTree::isGenerator(node)) {
  ------------------
  |  Branch (830:7): [True: 103k, False: 0]
  |  Branch (830:19): [True: 0, False: 103k]
  |  Branch (830:44): [True: 0, False: 0]
  ------------------
  831|      0|    sm_.error(node->getSourceRange(), "async generators are unsupported");
  832|      0|  }
  833|       |
  834|       |  // It is a Syntax Error if UniqueFormalParameters Contains YieldExpression
  835|       |  // is true.
  836|       |  // NOTE: isFormalParams_ is reset to false on encountering a new function,
  837|       |  // because the semantics for "x Contains y" always return `false` when "x" is
  838|       |  // a function definition.
  839|   103k|  llvh::SaveAndRestore<bool> oldIsFormalParamsFn{isFormalParams_, false};
  840|       |
  841|   103k|  Node *useStrictNode = nullptr;
  842|       |
  843|       |  // Note that body might me empty (for lazy functions) or an expression (for
  844|       |  // arrow functions).
  845|   103k|  if (auto *bodyNode = dyn_cast<ESTree::BlockStatementNode>(body)) {
  ------------------
  |  Branch (845:13): [True: 103k, False: 0]
  ------------------
  846|   103k|    if (bodyNode->isLazyFunctionBody) {
  ------------------
  |  Branch (846:9): [True: 81, False: 103k]
  ------------------
  847|       |      // If it is a lazy function body, then the directive nodes in the body are
  848|       |      // fabricated without location, so don't set useStrictNode.
  849|     81|      scanDirectivePrologue(bodyNode->_body);
  850|   103k|    } else {
  851|   103k|      useStrictNode = scanDirectivePrologue(bodyNode->_body);
  852|   103k|    }
  853|   103k|    setDirectiveDerivedInfo(node);
  854|   103k|  }
  855|       |
  856|   103k|  if (id)
  ------------------
  |  Branch (856:7): [True: 0, False: 103k]
  ------------------
  857|      0|    validateDeclarationNames(
  858|      0|        FunctionInfo::VarDecl::Kind::Var, id, nullptr, nullptr);
  859|       |
  860|   103k|#if HERMES_PARSE_FLOW
  861|   103k|  if (astContext_.getParseFlow() && !params.empty()) {
  ------------------
  |  Branch (861:7): [True: 0, False: 103k]
  |  Branch (861:37): [True: 0, False: 0]
  ------------------
  862|       |    // Skip 'this' parameter annotation, and error if it's an arrow parameter,
  863|       |    // because arrow functions inherit 'this'.
  864|      0|    if (auto *ident = dyn_cast<ESTree::IdentifierNode>(&params.front())) {
  ------------------
  |  Branch (864:15): [True: 0, False: 0]
  ------------------
  865|      0|      if (ident->_name == kw_.identThis) {
  ------------------
  |  Branch (865:11): [True: 0, False: 0]
  ------------------
  866|      0|        if (isa<ArrowFunctionExpressionNode>(node)) {
  ------------------
  |  Branch (866:13): [True: 0, False: 0]
  ------------------
  867|      0|          sm_.error(
  868|      0|              ident->getSourceRange(), "'this' not allowed as parameter name");
  869|      0|        }
  870|      0|        if (compile_) {
  ------------------
  |  Branch (870:13): [True: 0, False: 0]
  ------------------
  871|       |          // Delete the node because it cannot be compiled.
  872|      0|          params.erase(params.begin());
  873|      0|        }
  874|      0|      }
  875|      0|    }
  876|      0|  }
  877|   103k|#endif
  878|       |
  879|   103k|  for (auto &param : params) {
  ------------------
  |  Branch (879:20): [True: 103k, False: 103k]
  ------------------
  880|   103k|#if HERMES_PARSE_FLOW
  881|   103k|    if (isa<ComponentParameterNode>(param)) {
  ------------------
  |  Branch (881:9): [True: 0, False: 103k]
  ------------------
  882|      0|      validateDeclarationNames(
  883|      0|          FunctionInfo::VarDecl::Kind::Var,
  884|      0|          dyn_cast<ComponentParameterNode>(&param)->_local,
  885|      0|          &newFuncCtx.semInfo->paramNames,
  886|      0|          nullptr);
  887|      0|      continue;
  888|      0|    }
  889|   103k|#endif
  890|   103k|    validateDeclarationNames(
  891|   103k|        FunctionInfo::VarDecl::Kind::Var,
  892|   103k|        &param,
  893|   103k|        &newFuncCtx.semInfo->paramNames,
  894|   103k|        nullptr);
  895|   103k|  }
  896|       |
  897|   103k|  bool simpleParameterList = ESTree::hasSimpleParams(node);
  898|   103k|  if (!simpleParameterList && useStrictNode) {
  ------------------
  |  Branch (898:7): [True: 0, False: 103k]
  |  Branch (898:31): [True: 0, False: 0]
  ------------------
  899|      0|    sm_.error(
  900|      0|        useStrictNode->getSourceRange(),
  901|      0|        "'use strict' not allowed inside function with non-simple parameter list");
  902|      0|  }
  903|       |
  904|       |  // Check repeated parameter names when they are supposed to be unique.
  905|   103k|  if (!simpleParameterList || curFunction()->strictMode ||
  ------------------
  |  Branch (905:7): [True: 0, False: 103k]
  |  Branch (905:31): [True: 0, False: 103k]
  ------------------
  906|   103k|      isa<ArrowFunctionExpressionNode>(node)) {
  ------------------
  |  Branch (906:7): [True: 103k, False: 82]
  ------------------
  907|   103k|    llvh::SmallSet<NodeLabel, 8> paramNameSet;
  908|   103k|    for (const auto &curIdNode : newFuncCtx.semInfo->paramNames) {
  ------------------
  |  Branch (908:32): [True: 103k, False: 103k]
  ------------------
  909|   103k|      auto insert_result = paramNameSet.insert(curIdNode.identifier->_name);
  910|   103k|      if (insert_result.second == false) {
  ------------------
  |  Branch (910:11): [True: 0, False: 103k]
  ------------------
  911|      0|        sm_.error(
  912|      0|            curIdNode.identifier->getSourceRange(),
  913|      0|            "cannot declare two parameters with the same name '" +
  914|      0|                curIdNode.identifier->_name->str() + "'");
  915|      0|      }
  916|   103k|    }
  917|   103k|  }
  918|       |
  919|       |  // 'await' forbidden outside async functions.
  920|   103k|  llvh::SaveAndRestore<bool> oldForbidAwait{
  921|   103k|      forbidAwaitExpression_, !ESTree::isAsync(node)};
  922|       |  // Forbidden-ness of 'arguments' passes through arrow functions because they
  923|       |  // use the same 'arguments'.
  924|   103k|  llvh::SaveAndRestore<bool> oldForbidArguments{
  925|   103k|      forbidArguments_,
  926|   103k|      llvh::isa<ESTree::ArrowFunctionExpressionNode>(node) ? forbidArguments_
  ------------------
  |  Branch (926:7): [True: 103k, False: 82]
  ------------------
  927|   103k|                                                           : false};
  928|       |
  929|   103k|  visitParamsAndBody(node);
  930|   103k|}
_ZN6hermes3sem17SemanticValidator18visitParamsAndBodyEPNS_6ESTree16FunctionLikeNodeE:
  932|   103k|void SemanticValidator::visitParamsAndBody(FunctionLikeNode *node) {
  933|   103k|  switch (node->getKind()) {
  934|     82|    case NodeKind::FunctionExpression: {
  ------------------
  |  Branch (934:5): [True: 82, False: 103k]
  ------------------
  935|     82|      auto *fe = cast<ESTree::FunctionExpressionNode>(node);
  936|     82|      visitESTreeNode(*this, fe->_id, fe);
  937|     82|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (937:24): [True: 0, False: 82]
  ------------------
  938|      0|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  939|      0|        visitESTreeNode(*this, &param, fe);
  940|      0|      }
  941|     82|      visitBody(fe->_body, fe);
  942|     82|      break;
  943|      0|    }
  944|   103k|    case NodeKind::ArrowFunctionExpression: {
  ------------------
  |  Branch (944:5): [True: 103k, False: 82]
  ------------------
  945|   103k|      auto *fe = cast<ESTree::ArrowFunctionExpressionNode>(node);
  946|   103k|      visitESTreeNode(*this, fe->_id, fe);
  947|   103k|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (947:24): [True: 103k, False: 103k]
  ------------------
  948|   103k|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  949|   103k|        visitESTreeNode(*this, &param, fe);
  950|   103k|      }
  951|   103k|      visitBody(fe->_body, fe);
  952|   103k|      break;
  953|      0|    }
  954|      0|    case NodeKind::FunctionDeclaration: {
  ------------------
  |  Branch (954:5): [True: 0, False: 103k]
  ------------------
  955|      0|      auto *fe = cast<ESTree::FunctionDeclarationNode>(node);
  956|      0|      visitESTreeNode(*this, fe->_id, fe);
  957|      0|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (957:24): [True: 0, False: 0]
  ------------------
  958|      0|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  959|      0|        visitESTreeNode(*this, &param, fe);
  960|      0|      }
  961|      0|      visitBody(fe->_body, fe);
  962|      0|      visitESTreeNode(*this, fe->_returnType, fe);
  963|      0|      break;
  964|      0|    }
  965|      0|#if HERMES_PARSE_FLOW
  966|      0|    case NodeKind::ComponentDeclaration: {
  ------------------
  |  Branch (966:5): [True: 0, False: 103k]
  ------------------
  967|      0|      auto *fe = cast<ESTree::ComponentDeclarationNode>(node);
  968|      0|      visitESTreeNode(*this, fe->_id, fe);
  969|      0|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (969:24): [True: 0, False: 0]
  ------------------
  970|      0|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  971|      0|        visitESTreeNode(*this, &param, fe);
  972|      0|      }
  973|      0|      visitBody(fe->_body, fe);
  974|      0|      visitESTreeNode(*this, fe->_rendersType, fe);
  975|      0|      break;
  976|      0|    }
  977|      0|    case NodeKind::HookDeclaration: {
  ------------------
  |  Branch (977:5): [True: 0, False: 103k]
  ------------------
  978|      0|      auto *fe = cast<ESTree::HookDeclarationNode>(node);
  979|      0|      visitESTreeNode(*this, fe->_id, fe);
  980|      0|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (980:24): [True: 0, False: 0]
  ------------------
  981|      0|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  982|      0|        visitESTreeNode(*this, &param, fe);
  983|      0|      }
  984|      0|      visitBody(fe->_body, fe);
  985|      0|      visitESTreeNode(*this, fe->_returnType, fe);
  986|      0|      break;
  987|      0|    }
  988|      0|#endif
  989|      0|    default:
  ------------------
  |  Branch (989:5): [True: 0, False: 103k]
  ------------------
  990|      0|      visitESTreeChildren(*this, node);
  991|   103k|  }
  992|   103k|}
_ZN6hermes3sem17SemanticValidator9visitBodyEPNS_6ESTree4NodeEPNS2_16FunctionLikeNodeE:
  994|   103k|void SemanticValidator::visitBody(Node *body, FunctionLikeNode *func) {
  995|   103k|  if (auto *block = dyn_cast<ESTree::BlockStatementNode>(body)) {
  ------------------
  |  Branch (995:13): [True: 103k, False: 0]
  ------------------
  996|       |    // Avoid creating yet another block scope for function declarations like
  997|       |    //
  998|       |    // (function func() { ... })
  999|       |    //                  ^ BlockStatementNode
 1000|       |    //
 1001|       |    // In those cases, the scope for the BlockStatementNode is the same as
 1002|       |    // func's.
 1003|   103k|    for (auto &stmt : block->_body) {
  ------------------
  |  Branch (1003:21): [True: 103k, False: 103k]
  ------------------
 1004|   103k|      visitESTreeNode(*this, &stmt, block);
 1005|   103k|    }
 1006|   103k|    return;
 1007|   103k|  }
 1008|       |
 1009|      0|  visitESTreeNode(*this, body, func);
 1010|      0|}
_ZN6hermes3sem17SemanticValidator21scanDirectivePrologueERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
 1019|   103k|Node *SemanticValidator::scanDirectivePrologue(NodeList &body) {
 1020|   103k|  Node *result = nullptr;
 1021|   103k|  for (auto &nodeRef : body) {
  ------------------
  |  Branch (1021:22): [True: 103k, False: 83]
  ------------------
 1022|   103k|    auto *exprSt = dyn_cast<ESTree::ExpressionStatementNode>(&nodeRef);
 1023|   103k|    if (!exprSt || !exprSt->_directive)
  ------------------
  |  Branch (1023:9): [True: 103k, False: 182]
  |  Branch (1023:20): [True: 180, False: 2]
  ------------------
 1024|   103k|      break;
 1025|       |
 1026|      2|    auto *directive = exprSt->_directive;
 1027|       |
 1028|      2|    if (directive == kw_.identUseStrict) {
  ------------------
  |  Branch (1028:9): [True: 0, False: 2]
  ------------------
 1029|      0|      curFunction()->strictMode = true;
 1030|      0|      if (!result)
  ------------------
  |  Branch (1030:11): [True: 0, False: 0]
  ------------------
 1031|      0|        result = &nodeRef;
 1032|      0|    }
 1033|      2|    if (directive == kw_.identShowSource) {
  ------------------
  |  Branch (1033:9): [True: 0, False: 2]
  ------------------
 1034|      0|      tryOverrideSourceVisibility(SourceVisibility::ShowSource);
 1035|      0|    }
 1036|      2|    if (directive == kw_.identHideSource) {
  ------------------
  |  Branch (1036:9): [True: 0, False: 2]
  ------------------
 1037|      0|      tryOverrideSourceVisibility(SourceVisibility::HideSource);
 1038|      0|    }
 1039|      2|    if (directive == kw_.identSensitive) {
  ------------------
  |  Branch (1039:9): [True: 0, False: 2]
  ------------------
 1040|      0|      tryOverrideSourceVisibility(SourceVisibility::Sensitive);
 1041|      0|    }
 1042|      2|  }
 1043|       |
 1044|   103k|  return result;
 1045|   103k|}
_ZNK6hermes3sem17SemanticValidator8isLValueEPKNS_6ESTree4NodeE:
 1047|  24.8k|bool SemanticValidator::isLValue(const Node *node) const {
 1048|  24.8k|  if (isa<MemberExpressionNode>(node))
  ------------------
  |  Branch (1048:7): [True: 67, False: 24.8k]
  ------------------
 1049|     67|    return true;
 1050|  24.8k|  if (!isa<IdentifierNode>(node))
  ------------------
  |  Branch (1050:7): [True: 22.3k, False: 2.42k]
  ------------------
 1051|  22.3k|    return false;
 1052|       |
 1053|  2.42k|  auto *idNode = cast<IdentifierNode>(node);
 1054|       |
 1055|       |  /// 'arguments' cannot be modified in strict mode, but we also don't
 1056|       |  /// support modifying it in non-strict mode yet.
 1057|  2.42k|  if (idNode->_name == kw_.identArguments)
  ------------------
  |  Branch (1057:7): [True: 0, False: 2.42k]
  ------------------
 1058|      0|    return false;
 1059|       |
 1060|       |  // 'eval' cannot be used as a variable in strict mode. If it is disabled we
 1061|       |  // we don't report an error because it will be reported separately.
 1062|  2.42k|  if (idNode->_name == kw_.identEval && curFunction()->strictMode &&
  ------------------
  |  Branch (1062:7): [True: 0, False: 2.42k]
  |  Branch (1062:41): [True: 0, False: 0]
  ------------------
 1063|  2.42k|      astContext_.getEnableEval())
  ------------------
  |  Branch (1063:7): [True: 0, False: 0]
  ------------------
 1064|      0|    return false;
 1065|       |
 1066|  2.42k|  return true;
 1067|  2.42k|}
_ZNK6hermes3sem17SemanticValidator22isValidDeclarationNameEPKNS_6ESTree14IdentifierNodeE:
 1070|   103k|    const IdentifierNode *idNode) const {
 1071|       |  // 'arguments' cannot be redeclared in strict mode.
 1072|   103k|  if (idNode->_name == kw_.identArguments && curFunction()->strictMode)
  ------------------
  |  Branch (1072:7): [True: 0, False: 103k]
  |  Branch (1072:46): [True: 0, False: 0]
  ------------------
 1073|      0|    return false;
 1074|       |
 1075|       |  // 'eval' cannot be redeclared in strict mode. If it is disabled we
 1076|       |  // we don't report an error because it will be reported separately.
 1077|   103k|  if (idNode->_name == kw_.identEval && curFunction()->strictMode &&
  ------------------
  |  Branch (1077:7): [True: 0, False: 103k]
  |  Branch (1077:41): [True: 0, False: 0]
  ------------------
 1078|   103k|      astContext_.getEnableEval())
  ------------------
  |  Branch (1078:7): [True: 0, False: 0]
  ------------------
 1079|      0|    return false;
 1080|       |
 1081|   103k|  return true;
 1082|   103k|}
_ZN6hermes3sem17SemanticValidator24validateDeclarationNamesENS_18JavaScriptDeclKindEPNS_6ESTree4NodeEPN4llvh11SmallVectorINS0_12FunctionInfo7VarDeclELj4EEESB_:
 1088|   103k|    FunctionInfo::BlockDecls *scopedIdents) {
 1089|   103k|  assert(
 1090|   103k|      (varIdents || !scopedIdents) &&
 1091|   103k|      "Variable scope must always be provided if a scoped scope is provided.");
 1092|       |  // The identifier is sometimes optional, in which case it is valid.
 1093|   103k|  if (!node)
  ------------------
  |  Branch (1093:7): [True: 0, False: 103k]
  ------------------
 1094|      0|    return;
 1095|       |
 1096|   103k|  if (auto *idNode = dyn_cast<IdentifierNode>(node)) {
  ------------------
  |  Branch (1096:13): [True: 103k, False: 0]
  ------------------
 1097|   103k|    if (!blockScopingEnabled()) {
  ------------------
  |  Branch (1097:9): [True: 103k, False: 0]
  ------------------
 1098|       |      // Block scoping is disabled, so short-circuit both BlockDecls to use the
 1099|       |      // var environment.
 1100|   103k|      scopedIdents = varIdents;
 1101|   103k|    }
 1102|   103k|    if (varIdents) {
  ------------------
  |  Branch (1102:9): [True: 103k, False: 0]
  ------------------
 1103|   103k|      if (declKind == FunctionInfo::VarDecl::Kind::Var) {
  ------------------
  |  Branch (1103:11): [True: 103k, False: 0]
  ------------------
 1104|   103k|        varIdents->emplace_back(FunctionInfo::VarDecl{declKind, idNode});
 1105|   103k|      } else {
 1106|      0|        assert(
 1107|      0|            scopedIdents &&
 1108|      0|            "const/let declaration, but no scopedIdents array.");
 1109|      0|        scopedIdents->emplace_back(FunctionInfo::VarDecl{declKind, idNode});
 1110|      0|      }
 1111|   103k|    }
 1112|   103k|    if (!isValidDeclarationName(idNode)) {
  ------------------
  |  Branch (1112:9): [True: 0, False: 103k]
  ------------------
 1113|      0|      sm_.error(
 1114|      0|          node->getSourceRange(),
 1115|      0|          "cannot declare '" + cast<IdentifierNode>(node)->_name->str() + "'");
 1116|      0|    }
 1117|       |
 1118|   103k|    if (declKind != FunctionInfo::VarDecl::Kind::Var &&
  ------------------
  |  Branch (1118:9): [True: 0, False: 103k]
  ------------------
 1119|   103k|        idNode->_name == kw_.identLet) {
  ------------------
  |  Branch (1119:9): [True: 0, False: 0]
  ------------------
 1120|       |      // ES9.0 13.3.1.1
 1121|       |      // LexicalDeclaration : LetOrConst BindingList
 1122|       |      // It is a Syntax Error if the BoundNames of BindingList
 1123|       |      // contains "let".
 1124|      0|      sm_.error(
 1125|      0|          node->getSourceRange(),
 1126|      0|          "'let' is disallowed as a lexically bound name");
 1127|      0|    }
 1128|       |
 1129|   103k|    return;
 1130|   103k|  }
 1131|       |
 1132|      0|  if (isa<EmptyNode>(node))
  ------------------
  |  Branch (1132:7): [True: 0, False: 0]
  ------------------
 1133|      0|    return;
 1134|       |
 1135|      0|  if (auto *assign = dyn_cast<AssignmentPatternNode>(node))
  ------------------
  |  Branch (1135:13): [True: 0, False: 0]
  ------------------
 1136|      0|    return validateDeclarationNames(
 1137|      0|        declKind, assign->_left, varIdents, scopedIdents);
 1138|       |
 1139|      0|  if (auto *array = dyn_cast<ArrayPatternNode>(node)) {
  ------------------
  |  Branch (1139:13): [True: 0, False: 0]
  ------------------
 1140|      0|    for (auto &elem : array->_elements) {
  ------------------
  |  Branch (1140:21): [True: 0, False: 0]
  ------------------
 1141|      0|      validateDeclarationNames(declKind, &elem, varIdents, scopedIdents);
 1142|      0|    }
 1143|      0|    return;
 1144|      0|  }
 1145|       |
 1146|      0|  if (auto *restElem = dyn_cast<RestElementNode>(node)) {
  ------------------
  |  Branch (1146:13): [True: 0, False: 0]
  ------------------
 1147|      0|    return validateDeclarationNames(
 1148|      0|        declKind, restElem->_argument, varIdents, scopedIdents);
 1149|      0|  }
 1150|       |
 1151|      0|  if (auto *obj = dyn_cast<ObjectPatternNode>(node)) {
  ------------------
  |  Branch (1151:13): [True: 0, False: 0]
  ------------------
 1152|      0|    for (auto &propNode : obj->_properties) {
  ------------------
  |  Branch (1152:25): [True: 0, False: 0]
  ------------------
 1153|      0|      if (auto *prop = dyn_cast<PropertyNode>(&propNode)) {
  ------------------
  |  Branch (1153:17): [True: 0, False: 0]
  ------------------
 1154|      0|        validateDeclarationNames(
 1155|      0|            declKind, prop->_value, varIdents, scopedIdents);
 1156|      0|      } else {
 1157|      0|        auto *rest = cast<RestElementNode>(&propNode);
 1158|      0|        validateDeclarationNames(
 1159|      0|            declKind, rest->_argument, varIdents, scopedIdents);
 1160|      0|      }
 1161|      0|    }
 1162|      0|    return;
 1163|      0|  }
 1164|       |
 1165|      0|  sm_.error(node->getSourceRange(), "invalid destructuring target");
 1166|      0|}
_ZN6hermes3sem17SemanticValidator24validateAssignmentTargetEPKNS_6ESTree4NodeE:
 1168|  24.8k|void SemanticValidator::validateAssignmentTarget(const Node *node) {
 1169|  24.8k|  if (isa<EmptyNode>(node) || isLValue(node)) {
  ------------------
  |  Branch (1169:7): [True: 0, False: 24.8k]
  |  Branch (1169:31): [True: 2.48k, False: 22.3k]
  ------------------
 1170|  2.48k|    return;
 1171|  2.48k|  }
 1172|       |
 1173|  22.3k|  if (auto *assign = dyn_cast<AssignmentPatternNode>(node)) {
  ------------------
  |  Branch (1173:13): [True: 0, False: 22.3k]
  ------------------
 1174|      0|    return validateAssignmentTarget(assign->_left);
 1175|      0|  }
 1176|       |
 1177|  22.3k|  if (auto *APN = dyn_cast<ArrayPatternNode>(node)) {
  ------------------
  |  Branch (1177:13): [True: 22.3k, False: 1]
  ------------------
 1178|  22.3k|    for (auto &elem : APN->_elements) {
  ------------------
  |  Branch (1178:21): [True: 20.3k, False: 22.3k]
  ------------------
 1179|  20.3k|      validateAssignmentTarget(&elem);
 1180|  20.3k|    }
 1181|  22.3k|    return;
 1182|  22.3k|  }
 1183|       |
 1184|      1|  if (auto *RP = dyn_cast<RestElementNode>(node)) {
  ------------------
  |  Branch (1184:13): [True: 0, False: 1]
  ------------------
 1185|      0|    return validateAssignmentTarget(RP->_argument);
 1186|      0|  }
 1187|       |
 1188|      1|  if (auto *obj = dyn_cast<ObjectPatternNode>(node)) {
  ------------------
  |  Branch (1188:13): [True: 0, False: 1]
  ------------------
 1189|      0|    for (auto &propNode : obj->_properties) {
  ------------------
  |  Branch (1189:25): [True: 0, False: 0]
  ------------------
 1190|      0|      if (auto *prop = dyn_cast<PropertyNode>(&propNode)) {
  ------------------
  |  Branch (1190:17): [True: 0, False: 0]
  ------------------
 1191|      0|        assert(
 1192|      0|            prop->_kind->str() == "init" &&
 1193|      0|            "getters and setters must have been reported by the parser");
 1194|      0|        validateAssignmentTarget(prop->_value);
 1195|      0|      } else {
 1196|      0|        auto *rest = cast<RestElementNode>(&propNode);
 1197|      0|        validateAssignmentTarget(rest->_argument);
 1198|      0|      }
 1199|      0|    }
 1200|      0|    return;
 1201|      0|  }
 1202|       |
 1203|      1|  sm_.error(node->getSourceRange(), "invalid assignment left-hand side");
 1204|      1|}
_ZN6hermes3sem17SemanticValidator23setDirectiveDerivedInfoEPNS_6ESTree16FunctionLikeNodeE:
 1206|   103k|void SemanticValidator::setDirectiveDerivedInfo(FunctionLikeNode *node) {
 1207|   103k|  node->strictness = ESTree::makeStrictness(curFunction()->strictMode);
 1208|   103k|  node->sourceVisibility = curFunction()->sourceVisibility;
 1209|   103k|}
_ZN6hermes3sem17SemanticValidator22recursionDepthExceededEPNS_6ESTree4NodeE:
 1227|      8|void SemanticValidator::recursionDepthExceeded(Node *n) {
 1228|      8|  sm_.error(
 1229|      8|      n->getEndLoc(), "Too many nested expressions/statements/declarations");
 1230|      8|}
_ZN6hermes3sem12BlockContextC2EPNS0_17SemanticValidatorEPNS0_15FunctionContextEPNS_6ESTree4NodeE:
 1270|   103k|    : validator_(validator),
 1271|   103k|      curFunction_(curFunction),
 1272|   103k|      previousScopedDecls_(curFunction_->scopedDecls),
 1273|   103k|      previousScopedClosures_(curFunction_->scopedClosures),
 1274|   103k|      varDeclaredBegin_(curFunction_->semInfo->varScoped.size()) {
 1275|   103k|  if (nextScopeNode) {
  ------------------
  |  Branch (1275:7): [True: 103k, False: 0]
  ------------------
 1276|       |    // nextScopeNode is nullptr for lazy compilation's wrapper context -- in
 1277|       |    // which case there is no need for setting up the block environment.
 1278|       |
 1279|   103k|    if (!validator->blockScopingEnabled()) {
  ------------------
  |  Branch (1279:9): [True: 103k, False: 0]
  ------------------
 1280|       |      // Block scope is disabled, so short-circuit nextScopeNode to be the
 1281|       |      // function body (or the Program node if the semantic validator is
 1282|       |      // currently traversing the global scope). This means all declarations
 1283|       |      // will be placed in the top-level function/global scope.
 1284|   103k|      nextScopeNode = curFunction->body;
 1285|   103k|    }
 1286|       |
 1287|       |    // Now set up curFunction_'s scopedDecls and scopedClosures pointer. Note
 1288|       |    // that this will either create new containers (when block scoping is
 1289|       |    // enabled), or reuse the existing containers for the function's top-level
 1290|       |    // scope
 1291|   103k|    curFunction_->scopedDecls =
 1292|   103k|        initializeIfNull(curFunction_->semInfo->lexicallyScoped[nextScopeNode])
 1293|   103k|            .get();
 1294|   103k|    curFunction_->scopedClosures =
 1295|   103k|        initializeIfNull(curFunction_->semInfo->closures[nextScopeNode]).get();
 1296|   103k|  }
 1297|   103k|}
_ZN6hermes3sem12BlockContextD2Ev:
 1299|   103k|BlockContext::~BlockContext() {
 1300|   103k|  curFunction_->scopedDecls = previousScopedDecls_;
 1301|   103k|  curFunction_->scopedClosures = previousScopedClosures_;
 1302|   103k|}
_ZN6hermes3sem12BlockContext26ensureScopedNamesAreUniqueENS1_14IsFunctionBodyEPNS_6ESTree14IdentifierNodeE:
 1320|   103k|    IdentifierNode *catchParam) {
 1321|   103k|  if (!validator_->blockScopingEnabled()) {
  ------------------
  |  Branch (1321:7): [True: 103k, False: 0]
  ------------------
 1322|   103k|    return;
 1323|   103k|  }
 1324|       |
 1325|      0|  if (isFunctionBody == IsFunctionBody::Yes) {
  ------------------
  |  Branch (1325:7): [True: 0, False: 0]
  ------------------
 1326|      0|    if (!curFunction_->scopedClosures) {
  ------------------
  |  Branch (1326:9): [True: 0, False: 0]
  ------------------
 1327|       |      // This happens during semantic validation for lazy compilation.
 1328|      0|      return;
 1329|      0|    }
 1330|      0|  }
 1331|       |
 1332|      0|  llvh::SmallDenseMap<UniqueString *, IdentifierNode *, 8>
 1333|      0|      lexicallyDeclaredNames;
 1334|       |
 1335|       |  // It is a Syntax Error if the LexicallyDeclaredNames of StatementList
 1336|       |  // contains any duplicate entries. LexicallyDeclaredNames includes let/const
 1337|       |  // declarations. Function identifiers are not considered
 1338|       |  // LexicallyDeclaredNames in function scopes.
 1339|      0|  if (isFunctionBody != IsFunctionBody::Yes) {
  ------------------
  |  Branch (1339:7): [True: 0, False: 0]
  ------------------
 1340|       |    // Keep track of all scopedClosures that are not regular functions (i.e.,
 1341|       |    // generators and async functions).
 1342|      0|    llvh::SmallDenseSet<UniqueString *, 8> generatorOrAsync;
 1343|      0|    for (FunctionDeclarationNode *scopedClosure :
  ------------------
  |  Branch (1343:49): [True: 0, False: 0]
  ------------------
 1344|      0|         *curFunction_->scopedClosures) {
 1345|      0|      auto *funName =
 1346|      0|          llvh::dyn_cast_or_null<IdentifierNode>(scopedClosure->_id);
 1347|       |
 1348|      0|      if (!funName) {
  ------------------
  |  Branch (1348:11): [True: 0, False: 0]
  ------------------
 1349|       |        // Anonymous function names are always unique.
 1350|      0|        assert(
 1351|      0|            !scopedClosure->_id &&
 1352|      0|            "FunctionLikeNode's _id is not an IdentifierNode");
 1353|      0|        continue;
 1354|      0|      }
 1355|       |
 1356|       |      // ES2023 B.3.2.4 requires that duplicate identifiers within
 1357|       |      // FunctionDeclarations is not an error in non-strict mode. Thus, keep
 1358|       |      // track of the closures that are not regular function declarations so the
 1359|       |      // error can be reported. N.B.: adding the name here ensures that, should
 1360|       |      // the check for duplicate below fail, an error would still be reported
 1361|       |      // even if all previous instances of the duplicate symbol were
 1362|       |      // FunctionDeclarations and scopedClosure was not.
 1363|      0|      if (ESTree::isAsync(scopedClosure) || scopedClosure->_generator) {
  ------------------
  |  Branch (1363:11): [True: 0, False: 0]
  |  Branch (1363:45): [True: 0, False: 0]
  ------------------
 1364|      0|        generatorOrAsync.insert(funName->_name);
 1365|      0|      }
 1366|       |
 1367|      0|      auto res = lexicallyDeclaredNames.insert(
 1368|      0|          std::make_pair(funName->_name, funName));
 1369|      0|      if (!res.second) {
  ------------------
  |  Branch (1369:11): [True: 0, False: 0]
  ------------------
 1370|       |        // ES2023 B.3.2.4 Changes to Block Static Semantics: Early Errors
 1371|       |        //
 1372|       |        // Block: {StatementList}
 1373|       |        //     It is a Syntax Error if the LexicallyDeclaredNames of
 1374|       |        //     StatementList contains any duplicate entries, **unless the
 1375|       |        //     source code matching this production is not strict mode code
 1376|       |        //     and the duplicate entries are only bound by
 1377|       |        //     FunctionDeclarations**.
 1378|      0|        if (ESTree::isStrict(scopedClosure->strictness) ||
  ------------------
  |  Branch (1378:13): [True: 0, False: 0]
  ------------------
 1379|      0|            generatorOrAsync.count(funName->_name)) {
  ------------------
  |  Branch (1379:13): [True: 0, False: 0]
  ------------------
 1380|      0|          validator_->reportRedeclaredIdentifier(*res.first->second, *funName);
 1381|      0|          return;
 1382|      0|        }
 1383|       |
 1384|       |        // Keep the ID that was declared earliest in the JS source. This is fine
 1385|       |        // since the validation stops on the first duplicate ID found.
 1386|      0|        if (funName->getSourceRange().Start.getPointer() <
  ------------------
  |  Branch (1386:13): [True: 0, False: 0]
  ------------------
 1387|      0|            res.first->second->getSourceRange().Start.getPointer()) {
 1388|      0|          res.first->second = funName;
 1389|      0|        }
 1390|      0|      }
 1391|      0|    }
 1392|      0|  }
 1393|       |
 1394|       |  // Nothing special for const/let declarations -- thus, just iterate over them,
 1395|       |  // and complain about duplicates.
 1396|      0|  for (const FunctionInfo::VarDecl &scopedDecl : *curFunction_->scopedDecls) {
  ------------------
  |  Branch (1396:48): [True: 0, False: 0]
  ------------------
 1397|       |    // According to ES2023 B.3.2.1 and ES2023 B.3.2.2 functions should not be
 1398|       |    // hoisted if doing so would cause early errors. Therefore, any functions
 1399|       |    // that share its ID with scopedDecl cannot possibly be hoisted past this
 1400|       |    // scope.
 1401|      0|    stopHoisting(scopedDecl.identifier);
 1402|       |
 1403|      0|    auto res = lexicallyDeclaredNames.insert(
 1404|      0|        std::make_pair(scopedDecl.identifier->_name, scopedDecl.identifier));
 1405|      0|    if (!res.second) {
  ------------------
  |  Branch (1405:9): [True: 0, False: 0]
  ------------------
 1406|      0|      validator_->reportRedeclaredIdentifier(
 1407|      0|          *res.first->second, *scopedDecl.identifier);
 1408|      0|      return;
 1409|      0|    }
 1410|      0|  }
 1411|       |
 1412|      0|  if (catchParam) {
  ------------------
  |  Branch (1412:7): [True: 0, False: 0]
  ------------------
 1413|      0|    auto it = lexicallyDeclaredNames.find(catchParam->_name);
 1414|      0|    if (it != lexicallyDeclaredNames.end()) {
  ------------------
  |  Branch (1414:9): [True: 0, False: 0]
  ------------------
 1415|      0|      validator_->reportRedeclaredIdentifier(*it->second, *catchParam);
 1416|      0|      return;
 1417|      0|    }
 1418|      0|  }
 1419|       |
 1420|       |  // Now ensure that the var decls in this scope don't clash with its
 1421|       |  // LexicallyDeclaredNames.
 1422|      0|  for (auto it = curFunction_->semInfo->varScoped.begin() + varDeclaredBegin_,
 1423|      0|            end = curFunction_->semInfo->varScoped.end();
 1424|      0|       it != end;
  ------------------
  |  Branch (1424:8): [True: 0, False: 0]
  ------------------
 1425|      0|       ++it) {
 1426|      0|    IdentifierNode *name = it->identifier;
 1427|      0|    auto pos = lexicallyDeclaredNames.find(name->_name);
 1428|      0|    if (pos != lexicallyDeclaredNames.end()) {
  ------------------
  |  Branch (1428:9): [True: 0, False: 0]
  ------------------
 1429|      0|      validator_->reportRedeclaredIdentifier(*pos->second, *name);
 1430|      0|      return;
 1431|      0|    }
 1432|      0|  }
 1433|      0|}
_ZN6hermes3sem15FunctionContextC2EPNS0_17SemanticValidatorEbPNS_6ESTree16FunctionLikeNodeEPNS4_4NodeENS_16SourceVisibilityE:
 1444|   103k|    : validator_(validator),
 1445|   103k|      oldContextValue_(validator->funcCtx_),
 1446|   103k|      node(node),
 1447|   103k|      body(body),
 1448|   103k|      semInfo(validator->semCtx_.createFunction()),
 1449|   103k|      varDecls(&semInfo->varScoped),
 1450|   103k|      strictMode(strictMode),
 1451|   103k|      sourceVisibility(sourceVisibility),
 1452|   103k|      functionScope_(validator, this, body) {
 1453|   103k|  validator->funcCtx_ = this;
 1454|       |
 1455|   103k|  if (node)
  ------------------
  |  Branch (1455:7): [True: 103k, False: 0]
  ------------------
 1456|   103k|    node->setSemInfo(semInfo);
 1457|   103k|}
_ZN6hermes3sem15FunctionContextD2Ev:
 1459|   103k|FunctionContext::~FunctionContext() {
 1460|   103k|  functionScope_.ensureScopedNamesAreUnique(BlockContext::IsFunctionBody::Yes);
 1461|   103k|  validator_->funcCtx_ = oldContextValue_;
 1462|   103k|  finalizeHoisting();
 1463|   103k|}
_ZN6hermes3sem15FunctionContext16finalizeHoistingEv:
 1475|   103k|void FunctionContext::finalizeHoisting() {
 1476|   103k|  assert(
 1477|   103k|      (functionHoistingEnabled() || hoistingCandidates_.size() == 0) &&
 1478|   103k|      "should not have hoisting candidates in strict mode.");
 1479|       |
 1480|   103k|  if (node && !ESTree::isStrict(node->strictness)) {
  ------------------
  |  Branch (1480:7): [True: 103k, False: 0]
  |  Branch (1480:15): [True: 103k, False: 0]
  ------------------
 1481|       |    // Hoisting only happens in non-strict mode per ES2023 B.3.2.1 and
 1482|       |    // ES2023 B.3.2.2;
 1483|   103k|    for (const auto &[name, nodes] : hoistingCandidates_) {
  ------------------
  |  Branch (1483:36): [True: 0, False: 103k]
  ------------------
 1484|      0|      assert(
 1485|      0|          !nodes.empty() && "empty vectors should be removed by stopHoisting");
 1486|       |
 1487|       |      // Add a new var declaration to this function's varDecls. Only one
 1488|       |      // declaration per identifier is needed regardless of how many
 1489|       |      // functions with that id are hoisted.
 1490|      0|      FunctionDeclarationNode *first = nodes[0];
 1491|      0|      varDecls->emplace_back(FunctionInfo::VarDecl::withoutInitializer(
 1492|      0|          FunctionInfo::VarDecl::Kind::Var,
 1493|      0|          cast<ESTree::IdentifierNode>(first->_id)));
 1494|       |
 1495|       |      // Now mark all functions as hoisted, which prevents creation of the
 1496|       |      // binding identifier below.
 1497|      0|      for (FunctionDeclarationNode *fdn : nodes) {
  ------------------
  |  Branch (1497:41): [True: 0, False: 0]
  ------------------
 1498|      0|        fdn->getSemInfo()->hoisted = true;
 1499|      0|      }
 1500|      0|    }
 1501|   103k|  }
 1502|       |
 1503|       |  // Now add a scoped var decl (in the proper scope) for all functions that
 1504|       |  // weren't hoisted.
 1505|   103k|  assert(
 1506|   103k|      (validator_->astContext_.getCodeGenerationSettings().enableBlockScoping ||
 1507|   103k|       semInfo->closures.size() <= 1) &&
 1508|   103k|      "All closures should be added to the same container when block scoping "
 1509|   103k|      "is disabled");
 1510|   103k|  for (auto &[containingNode, containingNodeClosures] : semInfo->closures) {
  ------------------
  |  Branch (1510:55): [True: 103k, False: 103k]
  ------------------
 1511|   103k|    if (containingNodeClosures->empty()) {
  ------------------
  |  Branch (1511:9): [True: 103k, False: 0]
  ------------------
 1512|   103k|      continue;
 1513|   103k|    }
 1514|       |
 1515|       |    // For nested functions at the top level of an enclosing function,
 1516|       |    // the nested function is added to the enclosing function's
 1517|       |    // var list.  For nested functions in blocks in an enclosing
 1518|       |    // function, the nested function is added to the scope's
 1519|       |    // list.  For functions in the global scope, the function
 1520|       |    // is added to the global scope var list.  For functions
 1521|       |    // in a scope nested in the global scope, the function is added
 1522|       |    // to the scope's list.
 1523|      0|    FunctionInfo::BlockDecls *decls =
 1524|      0|        (containingNode == body && functionHoistingEnabled())
  ------------------
  |  Branch (1524:10): [True: 0, False: 0]
  |  Branch (1524:36): [True: 0, False: 0]
  ------------------
 1525|      0|        ? &semInfo->varScoped
 1526|      0|        : semInfo->lexicallyScoped[containingNode].get();
 1527|       |
 1528|      0|    for (auto it = containingNodeClosures->begin(),
 1529|      0|              end = containingNodeClosures->end();
 1530|      0|         it < end;
  ------------------
  |  Branch (1530:10): [True: 0, False: 0]
  ------------------
 1531|      0|         ++it) {
 1532|      0|      if (!(*it)->getSemInfo()->hoisted) {
  ------------------
  |  Branch (1532:11): [True: 0, False: 0]
  ------------------
 1533|      0|        decls->emplace_back(FunctionInfo::VarDecl::withoutInitializer(
 1534|      0|            FunctionInfo::VarDecl::Kind::Var,
 1535|      0|            cast<ESTree::IdentifierNode>((*it)->_id)));
 1536|      0|      }
 1537|      0|    }
 1538|      0|  }
 1539|   103k|}
SemanticValidator.cpp:_ZZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20LabeledStatementNodeEENK3$_0clEv:
  342|   245k|  const auto &deleter = llvh::make_scope_exit([=]() {
  343|   245k|    if (insertRes.second)
  ------------------
  |  Branch (343:9): [True: 245k, False: 0]
  ------------------
  344|   245k|      curFunction()->labelMap.erase(id->_name);
  345|   245k|  });
_ZN6hermes3sem16initializeIfNullIN4llvh11SmallVectorINS0_12FunctionInfo7VarDeclELj4EEEEERNSt3__110unique_ptrIT_NS7_14default_deleteIS9_EEEESD_:
 1259|   103k|std::unique_ptr<T> &initializeIfNull(std::unique_ptr<T> &ptr) {
 1260|   103k|  if (!ptr) {
  ------------------
  |  Branch (1260:7): [True: 103k, False: 0]
  ------------------
 1261|   103k|    ptr.reset(new T);
 1262|   103k|  }
 1263|   103k|  return ptr;
 1264|   103k|}
_ZN6hermes3sem16initializeIfNullIN4llvh11SmallVectorIPNS_6ESTree23FunctionDeclarationNodeELj2EEEEERNSt3__110unique_ptrIT_NS8_14default_deleteISA_EEEESE_:
 1259|   103k|std::unique_ptr<T> &initializeIfNull(std::unique_ptr<T> &ptr) {
 1260|   103k|  if (!ptr) {
  ------------------
  |  Branch (1260:7): [True: 103k, False: 0]
  ------------------
 1261|   103k|    ptr.reset(new T);
 1262|   103k|  }
 1263|   103k|  return ptr;
 1264|   103k|}

_ZN6hermes3sem17SemanticValidator17incRecursionDepthEPNS_6ESTree4NodeE:
  141|  3.99M|  bool incRecursionDepth(Node *n) {
  142|  3.99M|    if (LLVM_UNLIKELY(recursionDepth_ == 0))
  ------------------
  |  |  189|  3.99M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.02k, False: 3.99M]
  |  |  ------------------
  ------------------
  143|  1.02k|      return false;
  144|  3.99M|    --recursionDepth_;
  145|  3.99M|    if (LLVM_UNLIKELY(recursionDepth_ == 0)) {
  ------------------
  |  |  189|  3.99M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 3.99M]
  |  |  ------------------
  ------------------
  146|      1|      recursionDepthExceeded(n);
  147|      1|      return false;
  148|      1|    }
  149|  3.99M|    return true;
  150|  3.99M|  }
_ZN6hermes3sem17SemanticValidator17decRecursionDepthEv:
  155|  3.99M|  void decRecursionDepth() {
  156|  3.99M|    assert(
  157|  3.99M|        recursionDepth_ < MAX_RECURSION_DEPTH &&
  158|  3.99M|        "recursionDepth_ cannot go negative");
  159|  3.99M|    if (LLVM_LIKELY(recursionDepth_ != 0))
  ------------------
  |  |  188|  3.99M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.99M, False: 1.02k]
  |  |  ------------------
  ------------------
  160|  3.99M|      ++recursionDepth_;
  161|  3.99M|  }
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree4NodeE:
  165|  2.45M|  void visit(Node *node) {
  166|  2.45M|    visitESTreeChildren(*this, node);
  167|  2.45M|  }
_ZNK6hermes3sem17SemanticValidator17haveActiveContextEv:
  239|   206k|  inline bool haveActiveContext() const {
  240|   206k|    return funcCtx_ != nullptr;
  241|   206k|  }
_ZN6hermes3sem17SemanticValidator11curFunctionEv:
  243|  1.66M|  inline FunctionContext *curFunction() {
  244|  1.66M|    assert(funcCtx_ && "No active function context");
  245|  1.66M|    return funcCtx_;
  246|  1.66M|  }
_ZNK6hermes3sem17SemanticValidator19blockScopingEnabledEv:
  334|   413k|  bool blockScopingEnabled() const {
  335|   413k|    return astContext_.getCodeGenerationSettings().enableBlockScoping;
  336|   413k|  }
_ZNK6hermes3sem15FunctionContext13isGlobalScopeEv:
  453|   103k|  bool isGlobalScope() const {
  454|   103k|    return !oldContextValue_;
  455|   103k|  }
_ZN6hermes3sem15FunctionContext13allocateLabelEv:
  458|   246k|  unsigned allocateLabel() {
  459|   246k|    return semInfo->allocateLabel();
  460|   246k|  }
_ZNK6hermes3sem15FunctionContext23functionHoistingEnabledEv:
  480|   103k|  bool functionHoistingEnabled() const {
  481|   103k|    return !strictMode && validator_->blockScopingEnabled();
  ------------------
  |  Branch (481:12): [True: 103k, False: 0]
  |  Branch (481:27): [True: 0, False: 103k]
  ------------------
  482|   103k|  }

_ZN6hermes17constructCatchMapEPNS_8FunctionERN4llvh8DenseMapIPNS_9CatchInstENS_17CatchCoverageInfoENS2_12DenseMapInfoIS5_EENS2_6detail12DenseMapPairIS5_S6_EEEERNS2_15SmallVectorImplIS5_EERNS2_15SmallPtrSetImplIPNS_10BasicBlockEEESJ_j:
   27|  40.6k|    uint32_t maxRecursionDepth) {
   28|  40.6k|  assert(
   29|  40.6k|      !llvh::isa<CatchInst>(startBlock->front()) &&
   30|  40.6k|      "Functions and try bodies should never start with a catch instruction.");
   31|  40.6k|  if (maxRecursionDepth == 0) {
  ------------------
  |  Branch (31:7): [True: 0, False: 40.6k]
  ------------------
   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|  40.6k|  llvh::SmallVector<BasicBlock *, 4> stack;
   39|       |  // Track each of the basic blocks that start with a TryEndInst corresponding
   40|       |  // to the current try.
   41|  40.6k|  llvh::SmallPtrSet<BasicBlock *, 4> tryEndBlocks;
   42|       |
   43|  40.6k|  visited.insert(startBlock);
   44|  40.6k|  stack.push_back(startBlock);
   45|   644k|  while (!stack.empty()) {
  ------------------
  |  Branch (45:10): [True: 604k, False: 40.6k]
  ------------------
   46|   604k|    BasicBlock *currentBlock = stack.pop_back_val();
   47|   604k|    assert(
   48|   604k|        visited.count(currentBlock) &&
   49|   604k|        "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|   604k|    for (const auto &aliveCatch : aliveCatches)
  ------------------
  |  Branch (52:33): [True: 10.7M, False: 604k]
  ------------------
   53|  10.7M|      catchInfoMap[aliveCatch].coveredBlockList.push_back(currentBlock);
   54|       |
   55|   604k|    auto *tryStartInst =
   56|   604k|        llvh::dyn_cast<TryStartInst>(currentBlock->getTerminator());
   57|       |
   58|   604k|    if (!tryStartInst) {
  ------------------
  |  Branch (58:9): [True: 563k, False: 40.6k]
  ------------------
   59|       |      // Common case: no TryStartInst, we add successors to the stack.
   60|   618k|      for (BasicBlock *successor : successors(currentBlock)) {
  ------------------
  |  Branch (60:34): [True: 618k, False: 563k]
  ------------------
   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|   618k|        if (llvh::isa<TryEndInst>(&successor->front()))
  ------------------
  |  Branch (64:13): [True: 40.6k, False: 578k]
  ------------------
   65|  40.6k|          tryEndBlocks.insert(successor);
   66|   578k|        else if (visited.insert(successor).second)
  ------------------
  |  Branch (66:18): [True: 482k, False: 95.8k]
  ------------------
   67|   482k|          stack.push_back(successor);
   68|   618k|      }
   69|   563k|      continue;
   70|   563k|    }
   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|  40.6k|    auto catchInst = cast<CatchInst>(&tryStartInst->getCatchTarget()->front());
   75|  40.6k|    catchInfoMap[catchInst].depth = aliveCatches.size();
   76|       |
   77|       |    // Pushing the CatchInst to the try stack, and continue scan the try body.
   78|  40.6k|    aliveCatches.push_back(catchInst);
   79|  40.6k|    auto endBlocks = constructCatchMap(
   80|  40.6k|        F,
   81|  40.6k|        catchInfoMap,
   82|  40.6k|        aliveCatches,
   83|  40.6k|        visited,
   84|  40.6k|        tryStartInst->getTryBody(),
   85|  40.6k|        maxRecursionDepth - 1);
   86|  40.6k|    if (!endBlocks)
  ------------------
  |  Branch (86:9): [True: 0, False: 40.6k]
  ------------------
   87|      0|      return llvh::None;
   88|  40.6k|    aliveCatches.pop_back();
   89|       |
   90|  40.6k|    for (BasicBlock *endBlock : *endBlocks) {
  ------------------
  |  Branch (90:31): [True: 40.6k, False: 40.6k]
  ------------------
   91|  40.6k|      assert(
   92|  40.6k|          visited.count(endBlock) == 0 &&
   93|  40.6k|          "End blocks must be dominated by the try start.");
   94|  40.6k|      assert(
   95|  40.6k|          llvh::isa<TryEndInst>(&endBlock->front()) &&
   96|  40.6k|          "End blocks must start with TryEndInst.");
   97|  40.6k|      visited.insert(endBlock);
   98|  40.6k|      stack.push_back(endBlock);
   99|  40.6k|    }
  100|       |
  101|       |    // We also want to continue scan into the catch blocks.
  102|  40.6k|    BasicBlock *catchTarget = tryStartInst->getCatchTarget();
  103|  40.6k|    assert(
  104|  40.6k|        visited.count(catchTarget) == 0 &&
  105|  40.6k|        "Catch block must be dominated by the try start.");
  106|  40.6k|    visited.insert(catchTarget);
  107|  40.6k|    stack.push_back(catchTarget);
  108|  40.6k|  }
  109|  40.6k|  assert(
  110|  40.6k|      (aliveCatches.size() || !tryEndBlocks.size()) &&
  111|  40.6k|      "Block without live catches cannot have TryEndInst.");
  112|  40.6k|  return tryEndBlocks;
  113|  40.6k|}
_ZN6hermes25generateExceptionHandlersERN4llvh8DenseMapIPNS_9CatchInstENS_17CatchCoverageInfoENS0_12DenseMapInfoIS3_EENS0_6detail12DenseMapPairIS3_S4_EEEERNS1_IPNS_10BasicBlockENSt3__14pairIjjEENS5_ISD_EENS8_ISD_SG_EEEEPNS_8FunctionE:
  118|     18|    Function *F) {
  119|       |  // Construct the list of blocks and depth covered by each CatchInst.
  120|     18|  llvh::SmallVector<CatchInst *, 4> aliveCatches{};
  121|     18|  llvh::SmallPtrSet<BasicBlock *, 32> visited{};
  122|     18|  static constexpr uint32_t MAX_RECURSION_DEPTH = 1024;
  123|     18|  if (!constructCatchMap(
  ------------------
  |  Branch (123:7): [True: 0, False: 18]
  ------------------
  124|     18|          F,
  125|     18|          catchInfoMap,
  126|     18|          aliveCatches,
  127|     18|          visited,
  128|     18|          &F->front(),
  129|     18|          MAX_RECURSION_DEPTH))
  130|      0|    return {};
  131|       |
  132|     18|  ExceptionEntryList exception_entries;
  133|  40.6k|  for (auto I : catchInfoMap) {
  ------------------
  |  Branch (133:15): [True: 40.6k, False: 18]
  ------------------
  134|  40.6k|    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|  40.6k|    llvh::SmallVector<std::pair<uint32_t, uint32_t>, 4> catch_ranges;
  139|  10.7M|    for (auto BB : catchInfo.coveredBlockList) {
  ------------------
  |  Branch (139:18): [True: 10.7M, False: 40.6k]
  ------------------
  140|  10.7M|      auto it = bbMap.find(BB);
  141|  10.7M|      assert(it != bbMap.end() && "Basic Block missing.");
  142|       |
  143|  10.7M|      auto resolved_loc = it->second;
  144|  10.7M|      if (resolved_loc.first == resolved_loc.second) {
  ------------------
  |  Branch (144:11): [True: 3.36M, False: 7.35M]
  ------------------
  145|       |        // Empty basic block, skip.
  146|  3.36M|        continue;
  147|  3.36M|      }
  148|  7.35M|      catch_ranges.push_back(resolved_loc);
  149|  7.35M|    }
  150|  40.6k|    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|  40.6k|    int nextIndex = 0;
  155|  7.35M|    for (auto resolved_loc : catch_ranges) {
  ------------------
  |  Branch (155:28): [True: 7.35M, False: 40.6k]
  ------------------
  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|  7.35M|      if (nextIndex == 0 ||
  ------------------
  |  Branch (158:11): [True: 20.3k, False: 7.33M]
  ------------------
  159|  7.35M|          catch_ranges[nextIndex - 1].second != resolved_loc.first) {
  ------------------
  |  Branch (159:11): [True: 18.2k, False: 7.31M]
  ------------------
  160|  38.5k|        catch_ranges[nextIndex++] = resolved_loc;
  161|  38.5k|        continue;
  162|  38.5k|      }
  163|       |      // Otherwise we merge with the previous range.
  164|  7.31M|      catch_ranges[nextIndex - 1].second = resolved_loc.second;
  165|  7.31M|    }
  166|       |    // The merging happened in-place. Hence we need to throw away the rest.
  167|  40.6k|    catch_ranges.resize(nextIndex);
  168|       |    // For each range, we register it as an exception handler entry.
  169|  40.6k|    for (auto range : catch_ranges) {
  ------------------
  |  Branch (169:21): [True: 38.5k, False: 40.6k]
  ------------------
  170|  38.5k|      exception_entries.push_back(
  171|  38.5k|          {(uint32_t)range.first,
  172|  38.5k|           (uint32_t)range.second,
  173|  38.5k|           (uint32_t)catchInfo.catchLocation,
  174|  38.5k|           catchInfo.depth});
  175|  38.5k|    }
  176|  40.6k|  }
  177|       |  // Sort ranges by depth. In hermes, depth increase when you nest try inside
  178|       |  // try/catch/finally.
  179|     18|  std::sort(exception_entries.begin(), exception_entries.end());
  180|     18|  return exception_entries;
  181|     18|}

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

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

_ZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormE:
  204|    320|    BytecodeForm form) {
  205|    320|  if (!sanityCheck(buffer, form, outError)) {
  ------------------
  |  Branch (205:7): [True: 0, False: 320]
  ------------------
  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|    320|  struct BytecodeFileFieldsPopulator {
  212|       |    /// The fields being populated.
  213|    320|    BytecodeFileFields &f;
  214|       |
  215|       |    /// Current buffer position.
  216|    320|    Pointer<uint8_t> buf;
  217|       |
  218|       |    /// A pointer to the bytecode file header.
  219|    320|    const BytecodeFileHeader *h;
  220|       |
  221|       |    /// End of buffer.
  222|    320|    const uint8_t *end;
  223|       |
  224|    320|    BytecodeFileFieldsPopulator(
  225|    320|        BytecodeFileFields &fields,
  226|    320|        Pointer<uint8_t> buffer,
  227|    320|        const uint8_t *bufEnd)
  228|    320|        : f(fields), buf(buffer), end(bufEnd) {
  229|    320|      f.header = castData<BytecodeFileHeader>(buf);
  230|    320|      h = f.header;
  231|    320|    }
  232|       |
  233|    320|    void visitFunctionHeaders() {
  234|    320|      align(buf);
  235|    320|      f.functionHeaders =
  236|    320|          castArrayRef<SmallFuncHeader>(buf, h->functionCount, end);
  237|    320|    }
  238|       |
  239|    320|    void visitStringKinds() {
  240|    320|      align(buf);
  241|    320|      f.stringKinds =
  242|    320|          castArrayRef<StringKind::Entry>(buf, h->stringKindCount, end);
  243|    320|    }
  244|       |
  245|    320|    void visitIdentifierHashes() {
  246|    320|      align(buf);
  247|    320|      f.identifierHashes = castArrayRef<uint32_t>(buf, h->identifierCount, end);
  248|    320|    }
  249|       |
  250|    320|    void visitSmallStringTable() {
  251|    320|      align(buf);
  252|    320|      f.stringTableEntries =
  253|    320|          castArrayRef<SmallStringTableEntry>(buf, h->stringCount, end);
  254|    320|    }
  255|       |
  256|    320|    void visitOverflowStringTable() {
  257|    320|      align(buf);
  258|    320|      f.stringTableOverflowEntries = castArrayRef<OverflowStringTableEntry>(
  259|    320|          buf, h->overflowStringCount, end);
  260|    320|    }
  261|       |
  262|    320|    void visitStringStorage() {
  263|    320|      align(buf);
  264|    320|      f.stringStorage =
  265|    320|          castArrayRef<unsigned char>(buf, h->stringStorageSize, end);
  266|    320|    }
  267|    320|    void visitArrayBuffer() {
  268|    320|      align(buf);
  269|    320|      f.arrayBuffer = castArrayRef<unsigned char>(buf, h->arrayBufferSize, end);
  270|    320|    }
  271|    320|    void visitObjectKeyBuffer() {
  272|    320|      align(buf);
  273|    320|      f.objKeyBuffer =
  274|    320|          castArrayRef<unsigned char>(buf, h->objKeyBufferSize, end);
  275|    320|    }
  276|    320|    void visitObjectValueBuffer() {
  277|    320|      align(buf);
  278|    320|      f.objValueBuffer =
  279|    320|          castArrayRef<unsigned char>(buf, h->objValueBufferSize, end);
  280|    320|    }
  281|    320|    void visitBigIntTable() {
  282|    320|      align(buf);
  283|    320|      f.bigIntTable =
  284|    320|          castArrayRef<bigint::BigIntTableEntry>(buf, h->bigIntCount, end);
  285|    320|    }
  286|    320|    void visitBigIntStorage() {
  287|    320|      align(buf);
  288|    320|      f.bigIntStorage =
  289|    320|          castArrayRef<unsigned char>(buf, h->bigIntStorageSize, end);
  290|    320|    }
  291|    320|    void visitRegExpTable() {
  292|    320|      align(buf);
  293|    320|      f.regExpTable = castArrayRef<RegExpTableEntry>(buf, h->regExpCount, end);
  294|    320|    }
  295|    320|    void visitRegExpStorage() {
  296|    320|      align(buf);
  297|    320|      f.regExpStorage =
  298|    320|          castArrayRef<unsigned char>(buf, h->regExpStorageSize, end);
  299|    320|    }
  300|    320|    void visitCJSModuleTable() {
  301|    320|      align(buf);
  302|    320|      if (h->options.cjsModulesStaticallyResolved) {
  303|       |        // Modules have been statically resolved.
  304|    320|        f.cjsModuleTableStatic = castArrayRef<std::pair<uint32_t, uint32_t>>(
  305|    320|            buf, h->cjsModuleCount, end);
  306|    320|      } else {
  307|       |        // Modules are not resolved, use the filename -> function ID mapping.
  308|    320|        f.cjsModuleTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  309|    320|            buf, h->cjsModuleCount, end);
  310|    320|      }
  311|    320|    }
  312|    320|    void visitFunctionSourceTable() {
  313|    320|      align(buf);
  314|    320|      f.functionSourceTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  315|    320|          buf, h->functionSourceCount, end);
  316|    320|    }
  317|    320|  };
  318|       |
  319|    320|  BytecodeFileFieldsPopulator populator{*this, buffer.data(), buffer.end()};
  320|    320|  visitBytecodeSegmentsInOrder(populator);
  321|    320|  return true;
  322|    320|}
_ZNK6hermes3hbc14BCProviderBase21findCatchTargetOffsetEjj:
  330|     52|    uint32_t exceptionOffset) const {
  331|     52|  auto exceptions = getExceptionTable(functionID);
  332|  38.5k|  for (unsigned i = 0, e = exceptions.size(); i < e; ++i) {
  ------------------
  |  Branch (332:47): [True: 38.5k, False: 52]
  ------------------
  333|  38.5k|    if (exceptions[i].start <= exceptionOffset &&
  ------------------
  |  Branch (333:9): [True: 0, False: 38.5k]
  ------------------
  334|  38.5k|        exceptionOffset < exceptions[i].end) {
  ------------------
  |  Branch (334:9): [True: 0, False: 0]
  ------------------
  335|      0|      return exceptions[i].target;
  336|      0|    }
  337|  38.5k|  }
  338|       |  // No handler is found.
  339|     52|  return -1;
  340|     52|}
_ZN6hermes3hbc20BCProviderFromBuffer10stopWarmupEv:
  393|    320|void BCProviderFromBuffer::stopWarmup() {
  394|    320|  if (warmupThread_) {
  ------------------
  |  Branch (394:7): [True: 0, False: 320]
  ------------------
  395|      0|    warmupAbortFlag_.store(true, std::memory_order_release);
  396|      0|    warmupThread_->join();
  397|      0|    warmupThread_.reset();
  398|      0|  }
  399|    320|}
_ZN6hermes3hbc20BCProviderFromBufferC2ENSt3__110unique_ptrIKNS_6BufferENS2_14default_deleteIS5_EEEENS0_12BytecodeFormE:
  555|    320|    : buffer_(std::move(buffer)),
  556|    320|      bufferPtr_(buffer_->data()),
  557|    320|      end_(bufferPtr_ + buffer_->size()) {
  558|    320|  ConstBytecodeFileFields fields;
  559|    320|  if (!fields.populateFromBuffer(
  ------------------
  |  Branch (559:7): [True: 0, False: 320]
  ------------------
  560|    320|          {bufferPtr_, buffer_->size()}, &errstr_, form)) {
  561|      0|    return;
  562|      0|  }
  563|    320|  const auto *fileHeader = fields.header;
  564|    320|  options_ = fileHeader->options;
  565|    320|  functionCount_ = fileHeader->functionCount;
  566|    320|  globalFunctionIndex_ = fileHeader->globalCodeIndex;
  567|    320|  debugInfoOffset_ = fileHeader->debugInfoOffset;
  568|    320|  functionHeaders_ = fields.functionHeaders.data();
  569|    320|  stringKinds_ = fields.stringKinds;
  570|    320|  identifierHashes_ = fields.identifierHashes;
  571|    320|  stringCount_ = fileHeader->stringCount;
  572|    320|  stringTableEntries_ = fields.stringTableEntries.data();
  573|    320|  overflowStringTableEntries_ = fields.stringTableOverflowEntries;
  574|    320|  stringStorage_ = fields.stringStorage;
  575|    320|  arrayBuffer_ = fields.arrayBuffer;
  576|    320|  objKeyBuffer_ = fields.objKeyBuffer;
  577|    320|  objValueBuffer_ = fields.objValueBuffer;
  578|    320|  bigIntTable_ = fields.bigIntTable;
  579|    320|  bigIntStorage_ = fields.bigIntStorage;
  580|    320|  regExpTable_ = fields.regExpTable;
  581|    320|  regExpStorage_ = fields.regExpStorage;
  582|    320|  segmentID_ = fileHeader->segmentID;
  583|    320|  cjsModuleTable_ = fields.cjsModuleTable;
  584|    320|  cjsModuleTableStatic_ = fields.cjsModuleTableStatic;
  585|    320|  functionSourceTable_ = fields.functionSourceTable;
  586|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulatorC2ERS2_PKhSI_:
  228|    320|        : f(fields), buf(buffer), end(bufEnd) {
  229|    320|      f.header = castData<BytecodeFileHeader>(buf);
  230|    320|      h = f.header;
  231|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_111sanityCheckEN4llvh8ArrayRefIhEENS0_12BytecodeFormEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
   56|    320|    std::string *errorMessage) {
   57|    320|  if (aref.size() < sizeof(hbc::BytecodeFileHeader)) {
  ------------------
  |  Branch (57:7): [True: 0, False: 320]
  ------------------
   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|    320|  if (llvh::alignAddr(aref.data(), BYTECODE_ALIGNMENT) !=
  ------------------
  |  Branch (68:7): [True: 0, False: 320]
  ------------------
   69|    320|      (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|    320|  const auto *header =
   77|    320|      reinterpret_cast<const hbc::BytecodeFileHeader *>(aref.data());
   78|       |
   79|    320|  auto magic = (form == BytecodeForm::Delta ? DELTA_MAGIC : MAGIC);
  ------------------
  |  Branch (79:17): [True: 0, False: 320]
  ------------------
   80|    320|  if (header->magic != magic) {
  ------------------
  |  Branch (80:7): [True: 0, False: 320]
  ------------------
   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|    320|  if (header->version != hbc::BYTECODE_VERSION) {
  ------------------
  |  Branch (86:7): [True: 0, False: 320]
  ------------------
   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|    320|  if (header->functionCount == 0) {
  ------------------
  |  Branch (94:7): [True: 0, False: 320]
  ------------------
   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|    320|  if (aref.size() < header->fileLength) {
  ------------------
  |  Branch (100:7): [True: 0, False: 320]
  ------------------
  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|    320|#ifdef HERMES_SLOW_DEBUG
  110|    320|  if (!hashIsValid(aref)) {
  ------------------
  |  Branch (110:7): [True: 0, False: 320]
  ------------------
  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|    320|#endif
  117|    320|  return true;
  118|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_18castDataINS0_18BytecodeFileHeaderEEEPKT_RPKh:
  149|    320|const T *castData(const uint8_t *&buf) {
  150|    320|  auto ret = alignCheckCast<T>(buf);
  151|    320|  buf += sizeof(T);
  152|    320|  return ret;
  153|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_18BytecodeFileHeaderEEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefIhEEN4llvh8ArrayRefIT_EERPKhmS8_:
  168|  1.92k|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|  1.92k|  auto ptr = alignCheckCast<T>(buf);
  170|  1.92k|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|  3.84k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.92k]
  |  |  |  Branch (189:53): [True: 0, False: 1.92k]
  |  |  |  Branch (189:53): [True: 0, False: 1.92k]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|  1.92k|  buf += size * sizeof(T);
  173|  1.92k|  return {ptr, size};
  174|  1.92k|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastIhEEPKT_PKh:
  123|  1.92k|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.92k|  static_assert(
  128|  1.92k|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|  1.92k|  assert(
  130|  1.92k|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|  1.92k|      "buf is not properly aligned");
  132|  1.92k|  return reinterpret_cast<const T *>(buf);
  133|  1.92k|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_15alignERPKhj:
  189|  4.80k|void align(const uint8_t *&buf, uint32_t alignment = BYTECODE_ALIGNMENT) {
  190|  4.80k|  buf = (const uint8_t *)llvh::alignAddr(buf, alignment);
  191|  4.80k|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_111hashIsValidEN4llvh8ArrayRefIhEE:
   23|    320|static bool hashIsValid(llvh::ArrayRef<uint8_t> aref) {
   24|    320|  const auto *header =
   25|    320|      reinterpret_cast<const hbc::BytecodeFileHeader *>(aref.data());
   26|    320|  assert(
   27|    320|      header->version == hbc::BYTECODE_VERSION &&
   28|    320|      "must perform basic checks first");
   29|       |  // Use fileLength rather than aref.end() since there may be an epilogue.
   30|    320|  const auto *footer = reinterpret_cast<const hbc::BytecodeFileFooter *>(
   31|    320|      aref.data() + header->fileLength - sizeof(BytecodeFileFooter));
   32|    320|  SHA1 actual = llvh::SHA1::hash(llvh::ArrayRef<uint8_t>(
   33|    320|      aref.begin(), reinterpret_cast<const uint8_t *>(footer)));
   34|    320|  return std::equal(actual.begin(), actual.end(), footer->fileHash);
   35|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator20visitFunctionHeadersEv:
  233|    320|    void visitFunctionHeaders() {
  234|    320|      align(buf);
  235|    320|      f.functionHeaders =
  236|    320|          castArrayRef<SmallFuncHeader>(buf, h->functionCount, end);
  237|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS0_15SmallFuncHeaderEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    320|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    320|  auto ptr = alignCheckCast<T>(buf);
  170|    320|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    640|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    320|  buf += size * sizeof(T);
  173|    320|  return {ptr, size};
  174|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_15SmallFuncHeaderEEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitStringKindsEv:
  239|    320|    void visitStringKinds() {
  240|    320|      align(buf);
  241|    320|      f.stringKinds =
  242|    320|          castArrayRef<StringKind::Entry>(buf, h->stringKindCount, end);
  243|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS_10StringKind5EntryEEEN4llvh8ArrayRefIT_EERPKhmSA_:
  168|    320|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    320|  auto ptr = alignCheckCast<T>(buf);
  170|    320|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    640|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    320|  buf += size * sizeof(T);
  173|    320|  return {ptr, size};
  174|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS_10StringKind5EntryEEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator21visitIdentifierHashesEv:
  245|    320|    void visitIdentifierHashes() {
  246|    320|      align(buf);
  247|    320|      f.identifierHashes = castArrayRef<uint32_t>(buf, h->identifierCount, end);
  248|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefIjEEN4llvh8ArrayRefIT_EERPKhmS8_:
  168|    320|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    320|  auto ptr = alignCheckCast<T>(buf);
  170|    320|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    640|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    320|  buf += size * sizeof(T);
  173|    320|  return {ptr, size};
  174|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastIjEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator21visitSmallStringTableEv:
  250|    320|    void visitSmallStringTable() {
  251|    320|      align(buf);
  252|    320|      f.stringTableEntries =
  253|    320|          castArrayRef<SmallStringTableEntry>(buf, h->stringCount, end);
  254|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS0_21SmallStringTableEntryEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    320|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    320|  auto ptr = alignCheckCast<T>(buf);
  170|    320|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    640|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    320|  buf += size * sizeof(T);
  173|    320|  return {ptr, size};
  174|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_21SmallStringTableEntryEEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator24visitOverflowStringTableEv:
  256|    320|    void visitOverflowStringTable() {
  257|    320|      align(buf);
  258|    320|      f.stringTableOverflowEntries = castArrayRef<OverflowStringTableEntry>(
  259|    320|          buf, h->overflowStringCount, end);
  260|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS0_24OverflowStringTableEntryEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    320|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    320|  auto ptr = alignCheckCast<T>(buf);
  170|    320|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    640|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    320|  buf += size * sizeof(T);
  173|    320|  return {ptr, size};
  174|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_24OverflowStringTableEntryEEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator18visitStringStorageEv:
  262|    320|    void visitStringStorage() {
  263|    320|      align(buf);
  264|    320|      f.stringStorage =
  265|    320|          castArrayRef<unsigned char>(buf, h->stringStorageSize, end);
  266|    320|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitArrayBufferEv:
  267|    320|    void visitArrayBuffer() {
  268|    320|      align(buf);
  269|    320|      f.arrayBuffer = castArrayRef<unsigned char>(buf, h->arrayBufferSize, end);
  270|    320|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator20visitObjectKeyBufferEv:
  271|    320|    void visitObjectKeyBuffer() {
  272|    320|      align(buf);
  273|    320|      f.objKeyBuffer =
  274|    320|          castArrayRef<unsigned char>(buf, h->objKeyBufferSize, end);
  275|    320|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator22visitObjectValueBufferEv:
  276|    320|    void visitObjectValueBuffer() {
  277|    320|      align(buf);
  278|    320|      f.objValueBuffer =
  279|    320|          castArrayRef<unsigned char>(buf, h->objValueBufferSize, end);
  280|    320|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitBigIntTableEv:
  281|    320|    void visitBigIntTable() {
  282|    320|      align(buf);
  283|    320|      f.bigIntTable =
  284|    320|          castArrayRef<bigint::BigIntTableEntry>(buf, h->bigIntCount, end);
  285|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS_6bigint16BigIntTableEntryEEEN4llvh8ArrayRefIT_EERPKhmSA_:
  168|    320|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    320|  auto ptr = alignCheckCast<T>(buf);
  170|    320|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    640|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    320|  buf += size * sizeof(T);
  173|    320|  return {ptr, size};
  174|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS_6bigint16BigIntTableEntryEEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator18visitBigIntStorageEv:
  286|    320|    void visitBigIntStorage() {
  287|    320|      align(buf);
  288|    320|      f.bigIntStorage =
  289|    320|          castArrayRef<unsigned char>(buf, h->bigIntStorageSize, end);
  290|    320|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitRegExpTableEv:
  291|    320|    void visitRegExpTable() {
  292|    320|      align(buf);
  293|    320|      f.regExpTable = castArrayRef<RegExpTableEntry>(buf, h->regExpCount, end);
  294|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS_16RegExpTableEntryEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    320|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    320|  auto ptr = alignCheckCast<T>(buf);
  170|    320|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    640|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  |  Branch (189:53): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    320|  buf += size * sizeof(T);
  173|    320|  return {ptr, size};
  174|    320|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS_16RegExpTableEntryEEEPKT_PKh:
  123|    320|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|    320|  static_assert(
  128|    320|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    320|  assert(
  130|    320|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    320|      "buf is not properly aligned");
  132|    320|  return reinterpret_cast<const T *>(buf);
  133|    320|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator18visitRegExpStorageEv:
  295|    320|    void visitRegExpStorage() {
  296|    320|      align(buf);
  297|    320|      f.regExpStorage =
  298|    320|          castArrayRef<unsigned char>(buf, h->regExpStorageSize, end);
  299|    320|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator19visitCJSModuleTableEv:
  300|    320|    void visitCJSModuleTable() {
  301|    320|      align(buf);
  302|    320|      if (h->options.cjsModulesStaticallyResolved) {
  ------------------
  |  Branch (302:11): [True: 0, False: 320]
  ------------------
  303|       |        // Modules have been statically resolved.
  304|      0|        f.cjsModuleTableStatic = castArrayRef<std::pair<uint32_t, uint32_t>>(
  305|      0|            buf, h->cjsModuleCount, end);
  306|    320|      } else {
  307|       |        // Modules are not resolved, use the filename -> function ID mapping.
  308|    320|        f.cjsModuleTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  309|    320|            buf, h->cjsModuleCount, end);
  310|    320|      }
  311|    320|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINSt3__14pairIjjEEEEN4llvh8ArrayRefIT_EERPKhmSB_:
  168|    640|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    640|  auto ptr = alignCheckCast<T>(buf);
  170|    640|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|  1.28k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 640]
  |  |  |  Branch (189:53): [True: 0, False: 640]
  |  |  |  Branch (189:53): [True: 0, False: 640]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    640|  buf += size * sizeof(T);
  173|    640|  return {ptr, size};
  174|    640|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINSt3__14pairIjjEEEEPKT_PKh:
  123|    640|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|    640|  static_assert(
  128|    640|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    640|  assert(
  130|    640|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    640|      "buf is not properly aligned");
  132|    640|  return reinterpret_cast<const T *>(buf);
  133|    640|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator24visitFunctionSourceTableEv:
  312|    320|    void visitFunctionSourceTable() {
  313|    320|      align(buf);
  314|    320|      f.functionSourceTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  315|    320|          buf, h->functionSourceCount, end);
  316|    320|    }

_ZNK6hermes3hbc25BytecodeFunctionGenerator11getStringIDEPNS_13LiteralStringE:
   20|   394k|unsigned BytecodeFunctionGenerator::getStringID(LiteralString *value) const {
   21|   394k|  return BMGen_.getStringID(value->getValue().str());
   22|   394k|}
_ZNK6hermes3hbc25BytecodeFunctionGenerator15getIdentifierIDEPNS_13LiteralStringE:
   25|   571k|    LiteralString *value) const {
   26|   571k|  return BMGen_.getIdentifierID(value->getValue().str());
   27|   571k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator9addBigIntENS_6bigint12ParsedBigIntE:
   29|      5|uint32_t BytecodeFunctionGenerator::addBigInt(bigint::ParsedBigInt bigint) {
   30|      5|  assert(
   31|      5|      !complete_ &&
   32|      5|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   33|      5|  return BMGen_.addBigInt(std::move(bigint));
   34|      5|}
_ZN6hermes3hbc25BytecodeFunctionGenerator9addRegExpEPNS_14CompiledRegExpE:
   36|    119|uint32_t BytecodeFunctionGenerator::addRegExp(CompiledRegExp *regexp) {
   37|    119|  assert(
   38|    119|      !complete_ &&
   39|    119|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   40|    119|  return BMGen_.addRegExp(regexp);
   41|    119|}
_ZN6hermes3hbc25BytecodeFunctionGenerator11addFilenameEN4llvh9StringRefE:
   43|    196|uint32_t BytecodeFunctionGenerator::addFilename(llvh::StringRef filename) {
   44|    196|  assert(
   45|    196|      !complete_ &&
   46|    196|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   47|    196|  return BMGen_.addFilename(filename);
   48|    196|}
_ZN6hermes3hbc25BytecodeFunctionGenerator19addExceptionHandlerENS0_23HBCExceptionHandlerInfoE:
   51|  38.5k|    HBCExceptionHandlerInfo info) {
   52|  38.5k|  assert(
   53|  38.5k|      !complete_ &&
   54|  38.5k|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   55|  38.5k|  exceptionHandlers_.push_back(info);
   56|  38.5k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator25patchDebugSourceLocationsERKN4llvh8DenseMapIjjNS2_12DenseMapInfoIjEENS2_6detail12DenseMapPairIjjEEEE:
   59|   103k|    const llvh::DenseMap<unsigned, unsigned> &scopeDescOffsetMap) {
   60|   103k|  if (debugLocations_.empty()) {
  ------------------
  |  Branch (60:7): [True: 0, False: 103k]
  ------------------
   61|      0|    return;
   62|      0|  }
   63|       |
   64|   103k|  auto offset = scopeDescOffsetMap.find(sourceLocation_.scopeAddress);
   65|   103k|  assert(offset != scopeDescOffsetMap.end());
   66|   103k|  sourceLocation_.scopeAddress = offset->second;
   67|  3.84M|  for (DebugSourceLocation &dl : debugLocations_) {
  ------------------
  |  Branch (67:32): [True: 3.84M, False: 103k]
  ------------------
   68|  3.84M|    offset = scopeDescOffsetMap.find(dl.scopeAddress);
   69|  3.84M|    assert(offset != scopeDescOffsetMap.end());
   70|  3.84M|    dl.scopeAddress = offset->second;
   71|  3.84M|  }
   72|   103k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator22addDebugSourceLocationERKNS0_19DebugSourceLocationE:
   75|  4.18M|    const DebugSourceLocation &info) {
   76|  4.18M|  assert(
   77|  4.18M|      !complete_ &&
   78|  4.18M|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   79|       |  // If an address is repeated, it means no actual bytecode was emitted for the
   80|       |  // previous source location.
   81|  4.18M|  if (!debugLocations_.empty() &&
  ------------------
  |  Branch (81:7): [True: 4.07M, False: 103k]
  ------------------
   82|  4.18M|      debugLocations_.back().address == info.address) {
  ------------------
  |  Branch (82:7): [True: 337k, False: 3.73M]
  ------------------
   83|   337k|    debugLocations_.back() = info;
   84|  3.84M|  } else {
   85|  3.84M|    debugLocations_.push_back(info);
   86|  3.84M|  }
   87|  4.18M|}
_ZN6hermes3hbc25BytecodeFunctionGenerator24generateBytecodeFunctionENS_8Function14DefinitionKindENS_9ValueKindEbjjj:
  106|   103k|    uint32_t nameID) {
  107|   103k|  if (!complete_) {
  ------------------
  |  Branch (107:7): [True: 81, False: 103k]
  ------------------
  108|     81|    bytecodeGenerationComplete();
  109|     81|  }
  110|       |
  111|   103k|  FunctionHeader header{
  112|   103k|      bytecodeSize_,
  113|   103k|      paramCount,
  114|   103k|      frameSize_,
  115|   103k|      environmentSize,
  116|   103k|      nameID,
  117|   103k|      highestReadCacheIndex_,
  118|   103k|      highestWriteCacheIndex_};
  119|       |
  120|   103k|  switch (definitionKind) {
  121|   103k|    case Function::DefinitionKind::ES6Arrow:
  ------------------
  |  Branch (121:5): [True: 103k, False: 278]
  ------------------
  122|   103k|    case Function::DefinitionKind::ES6Method:
  ------------------
  |  Branch (122:5): [True: 0, False: 103k]
  ------------------
  123|   103k|      header.flags.prohibitInvoke = FunctionHeaderFlag::ProhibitConstruct;
  124|   103k|      break;
  125|      0|    case Function::DefinitionKind::ES6Constructor:
  ------------------
  |  Branch (125:5): [True: 0, False: 103k]
  ------------------
  126|      0|      header.flags.prohibitInvoke = FunctionHeaderFlag::ProhibitCall;
  127|      0|      break;
  128|    278|    default:
  ------------------
  |  Branch (128:5): [True: 278, False: 103k]
  ------------------
  129|       |      // ES9.0 9.2.3 step 4 states that generator functions and async
  130|       |      // functions cannot be constructed.
  131|       |      // We place this check outside the `DefinitionKind` because generator
  132|       |      // functions may also be ES6 methods, for example, and are not included
  133|       |      // in the DefinitionKind enum.
  134|       |      // Note that we only have to check for GeneratorFunctionKind in this
  135|       |      // case, because ES6 methods are already checked above, and ES6
  136|       |      // constructors are prohibited from being generator functions.
  137|       |      // As such, this is the only case in which we must change the
  138|       |      // prohibitInvoke flag based on valueKind.
  139|    278|      header.flags.prohibitInvoke =
  140|    278|          (valueKind == ValueKind::GeneratorFunctionKind ||
  ------------------
  |  Branch (140:12): [True: 0, False: 278]
  ------------------
  141|    278|           valueKind == ValueKind::AsyncFunctionKind)
  ------------------
  |  Branch (141:12): [True: 0, False: 278]
  ------------------
  142|    278|          ? FunctionHeaderFlag::ProhibitConstruct
  143|    278|          : FunctionHeaderFlag::ProhibitNone;
  144|    278|      break;
  145|   103k|  }
  146|       |
  147|   103k|  header.flags.strictMode = strictMode;
  148|   103k|  header.flags.hasExceptionHandler = exceptionHandlers_.size();
  149|       |
  150|   103k|  return std::make_unique<BytecodeFunction>(
  151|   103k|      std::move(opcodes_), std::move(header), std::move(exceptionHandlers_));
  152|   103k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator13getFunctionIDEPNS_8FunctionE:
  154|   103k|unsigned BytecodeFunctionGenerator::getFunctionID(Function *F) {
  155|   103k|  return BMGen_.addFunction(F);
  156|   103k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator14getScopeDescIDEPNS_9ScopeDescE:
  158|  4.28M|unsigned BytecodeFunctionGenerator::getScopeDescID(ScopeDesc *S) {
  159|  4.28M|  return BMGen_.addScopeDesc(S);
  160|  4.28M|}
_ZN6hermes3hbc25BytecodeFunctionGenerator10shrinkJumpEj:
  162|   107k|void BytecodeFunctionGenerator::shrinkJump(offset_t loc) {
  163|       |  // We are shrinking a long jump into a short jump.
  164|       |  // The size of operand reduces from 4 bytes to 1 byte, a delta of 3.
  165|   107k|  opcodes_.erase(opcodes_.begin() + loc, opcodes_.begin() + loc + 3);
  166|       |
  167|       |  // Change this instruction from long jump to short jump.
  168|   107k|  longToShortJump(loc - 1);
  169|   107k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator16updateJumpTargetEjii:
  174|  20.6M|    int bytes) {
  175|       |  // The jump target is encoded in little-endian. Update it correctly
  176|       |  // regardless of host byte order.
  177|  73.3M|  for (; bytes; --bytes, ++loc) {
  ------------------
  |  Branch (177:10): [True: 52.7M, False: 20.6M]
  ------------------
  178|  52.7M|    opcodes_[loc] = (opcode_atom_t)(newVal);
  179|  52.7M|    newVal >>= 8;
  180|  52.7M|  }
  181|  20.6M|}
_ZN6hermes3hbc25BytecodeFunctionGenerator26bytecodeGenerationCompleteEv:
  197|   103k|void BytecodeFunctionGenerator::bytecodeGenerationComplete() {
  198|   103k|  assert(!complete_ && "Can only call bytecodeGenerationComplete once");
  199|   103k|  complete_ = true;
  200|   103k|  bytecodeSize_ = opcodes_.size();
  201|       |
  202|       |  // Add the jump tables inline with the opcodes, as a 4-byte aligned section at
  203|       |  // the end of the opcode array.
  204|   103k|  if (!jumpTable_.empty()) {
  ------------------
  |  Branch (204:7): [True: 0, False: 103k]
  ------------------
  205|      0|    uint32_t alignedOpcodes = llvh::alignTo<sizeof(uint32_t)>(bytecodeSize_);
  206|      0|    uint32_t jumpTableBytes = jumpTable_.size() * sizeof(uint32_t);
  207|      0|    opcodes_.reserve(alignedOpcodes + jumpTableBytes);
  208|      0|    opcodes_.resize(alignedOpcodes, 0);
  209|      0|    const opcode_atom_t *jumpTableStart =
  210|      0|        reinterpret_cast<opcode_atom_t *>(jumpTable_.data());
  211|      0|    opcodes_.insert(
  212|      0|        opcodes_.end(), jumpTableStart, jumpTableStart + jumpTableBytes);
  213|      0|  }
  214|   103k|}
_ZN6hermes3hbc23BytecodeModuleGenerator11addFunctionEPNS_8FunctionE:
  216|   206k|unsigned BytecodeModuleGenerator::addFunction(Function *F) {
  217|   206k|  lazyFunctions_ |= F->isLazy();
  218|   206k|  asyncFunctions_ |= llvh::isa<AsyncFunction>(F);
  219|   206k|  return functionIDMap_.allocate(F);
  220|   206k|}
_ZN6hermes3hbc23BytecodeModuleGenerator12addScopeDescEPNS_9ScopeDescE:
  222|  4.69M|unsigned BytecodeModuleGenerator::addScopeDesc(ScopeDesc *S) {
  223|  4.69M|  if (S && S->hasFunction() &&
  ------------------
  |  Branch (223:7): [True: 4.69M, False: 0]
  |  Branch (223:12): [True: 4.69M, False: 0]
  ------------------
  224|  4.69M|      S->getFunction()->getContext().getDebugInfoSetting() !=
  ------------------
  |  Branch (224:7): [True: 0, False: 4.69M]
  ------------------
  225|  4.69M|          DebugInfoSetting::ALL) {
  226|       |    // short-circuit S to be nullptr when not emitting the debug information,
  227|       |    // which effectively causes all scopes to use the same (empty) descriptor.
  228|      0|    S = nullptr;
  229|      0|  }
  230|       |
  231|  4.69M|  newScopeDescs_.insert(S);
  232|  4.69M|  return scopeDescIDMap_.allocate(S);
  233|  4.69M|}
_ZN6hermes3hbc23BytecodeModuleGenerator19serializeScopeChainERNS_11StringTableERNS0_18DebugInfoGeneratorEPNS_9ScopeDescE:
  269|   412k|    ScopeDesc *S) {
  270|   412k|  unsigned ID = addScopeDesc(S);
  271|   412k|  auto it = scopeDescIDAddr_.find(ID);
  272|   412k|  if (it != scopeDescIDAddr_.end()) {
  ------------------
  |  Branch (272:7): [True: 309k, False: 103k]
  ------------------
  273|   309k|    return it->second;
  274|   309k|  }
  275|       |
  276|   103k|  OptValue<unsigned> parentScopeOffset;
  277|   103k|  DebugScopeDescriptor::Flags flags;
  278|   103k|  llvh::SmallVector<Identifier, 4> names;
  279|   103k|  if (S) {
  ------------------
  |  Branch (279:7): [True: 103k, False: 0]
  ------------------
  280|   103k|    if (S->getParent() && S->getParent()->hasFunction()) {
  ------------------
  |  Branch (280:9): [True: 103k, False: 0]
  |  Branch (280:27): [True: 103k, False: 196]
  ------------------
  281|   103k|      parentScopeOffset = serializeScopeChain(st, debugInfoGen, S->getParent());
  282|   103k|    }
  283|   103k|    flags.isInnerScope =
  284|   103k|        S->hasFunction() && S->getFunction()->getFunctionScopeDesc() != S;
  ------------------
  |  Branch (284:9): [True: 103k, False: 0]
  |  Branch (284:29): [True: 0, False: 103k]
  ------------------
  285|       |
  286|   103k|    flags.isDynamic = S->getDynamic();
  287|       |
  288|       |    // All names in the scope are accessible from S, ...
  289|   103k|    std::string nameUTF8Buffer;
  290|   103k|    for (Variable *V : S->getVariables()) {
  ------------------
  |  Branch (290:22): [True: 103k, False: 103k]
  ------------------
  291|   103k|      Identifier nameUTF8 =
  292|   103k|          ensureUTF8Identifer(st, V->getName(), nameUTF8Buffer);
  293|   103k|      names.push_back(nameUTF8);
  294|   103k|    }
  295|   103k|  }
  296|       |
  297|   103k|  unsigned offset =
  298|   103k|      debugInfoGen.appendScopeDesc(parentScopeOffset, flags, names);
  299|   103k|  scopeDescIDAddr_[ID] = offset;
  300|   103k|  return offset;
  301|   412k|}
_ZN6hermes3hbc23BytecodeModuleGenerator20setFunctionGeneratorEPNS_8FunctionENSt3__110unique_ptrINS0_25BytecodeFunctionGeneratorENS4_14default_deleteIS6_EEEE:
  305|   103k|    unique_ptr<BytecodeFunctionGenerator> BFG) {
  306|   103k|  assert(
  307|   103k|      functionGenerators_.find(F) == functionGenerators_.end() &&
  308|   103k|      "Adding same function twice.");
  309|   103k|  assert(
  310|   103k|      !BFG->hasEncodingError() && "Error should have been reported already.");
  311|   103k|  functionGenerators_[F] = std::move(BFG);
  312|   103k|}
_ZNK6hermes3hbc23BytecodeModuleGenerator11getStringIDEN4llvh9StringRefE:
  314|   498k|unsigned BytecodeModuleGenerator::getStringID(llvh::StringRef str) const {
  315|   498k|  return stringTable_.getStringID(str);
  316|   498k|}
_ZNK6hermes3hbc23BytecodeModuleGenerator15getIdentifierIDEN4llvh9StringRefE:
  318|   571k|unsigned BytecodeModuleGenerator::getIdentifierID(llvh::StringRef str) const {
  319|   571k|  return stringTable_.getIdentifierID(str);
  320|   571k|}
_ZN6hermes3hbc23BytecodeModuleGenerator21initializeStringTableENS0_18StringLiteralTableE:
  323|    196|    StringLiteralTable stringTable) {
  324|    196|  assert(stringTable_.empty() && "String table must be empty");
  325|    196|  stringTable_ = std::move(stringTable);
  326|    196|}
_ZN6hermes3hbc23BytecodeModuleGenerator9addBigIntENS_6bigint12ParsedBigIntE:
  328|      5|uint32_t BytecodeModuleGenerator::addBigInt(bigint::ParsedBigInt bigint) {
  329|      5|  return bigIntTable_.addBigInt(std::move(bigint));
  330|      5|}
_ZN6hermes3hbc23BytecodeModuleGenerator28initializeSerializedLiteralsEONSt3__16vectorIhNS2_9allocatorIhEEEES7_S7_ON4llvh8DenseMapIPKNS_11InstructionENS2_4pairIjjEENS8_12DenseMapInfoISC_EENS8_6detail12DenseMapPairISC_SE_EEEE:
  336|    196|    hermes::hbc::BytecodeModuleGenerator::LiteralOffsetMapTy &&offsetMap) {
  337|    196|  assert(
  338|    196|      arrayBuffer_.empty() && objKeyBuffer_.empty() && objValBuffer_.empty() &&
  339|    196|      literalOffsetMap_.empty() && "serialized literals already initialized");
  340|    196|  arrayBuffer_ = std::move(arrayBuffer);
  341|    196|  objKeyBuffer_ = std::move(keyBuffer);
  342|    196|  objValBuffer_ = std::move(valBuffer);
  343|    196|  literalOffsetMap_ = std::move(offsetMap);
  344|    196|}
_ZN6hermes3hbc23BytecodeModuleGenerator9addRegExpEPNS_14CompiledRegExpE:
  346|    119|uint32_t BytecodeModuleGenerator::addRegExp(CompiledRegExp *regexp) {
  347|    119|  return regExpTable_.addRegExp(regexp);
  348|    119|}
_ZN6hermes3hbc23BytecodeModuleGenerator11addFilenameEN4llvh9StringRefE:
  350|    196|uint32_t BytecodeModuleGenerator::addFilename(llvh::StringRef filename) {
  351|    196|  return filenameTable_.addFilename(filename);
  352|    196|}
_ZN6hermes3hbc23BytecodeModuleGenerator8generateEv:
  376|    196|std::unique_ptr<BytecodeModule> BytecodeModuleGenerator::generate() {
  377|    196|  assert(
  378|    196|      valid_ &&
  379|    196|      "BytecodeModuleGenerator::generate() cannot be called more than once");
  380|    196|  valid_ = false;
  381|       |
  382|    196|  assert(
  383|    196|      functionIDMap_.getElements().size() == functionGenerators_.size() &&
  384|    196|      "Missing functions.");
  385|       |
  386|    196|  auto kinds = stringTable_.getStringKinds();
  387|    196|  auto hashes = stringTable_.getIdentifierHashes();
  388|       |
  389|    196|  BytecodeOptions bytecodeOptions;
  390|    196|  bytecodeOptions.hasAsync = asyncFunctions_;
  391|    196|  bytecodeOptions.staticBuiltins = options_.staticBuiltinsEnabled;
  392|    196|  bytecodeOptions.cjsModulesStaticallyResolved = !cjsModulesStatic_.empty();
  393|    196|  std::unique_ptr<BytecodeModule> BM{new BytecodeModule(
  394|    196|      functionGenerators_.size(),
  395|    196|      std::move(kinds),
  396|    196|      std::move(hashes),
  397|    196|      stringTable_.acquireStringTable(),
  398|    196|      stringTable_.acquireStringStorage(),
  399|    196|      bigIntTable_.getEntryList(),
  400|    196|      bigIntTable_.getDigitsBuffer(),
  401|    196|      regExpTable_.getEntryList(),
  402|    196|      regExpTable_.getBytecodeBuffer(),
  403|    196|      entryPointIndex_,
  404|    196|      std::move(arrayBuffer_),
  405|    196|      std::move(objKeyBuffer_),
  406|    196|      std::move(objValBuffer_),
  407|    196|      segmentID_,
  408|    196|      std::move(cjsModules_),
  409|    196|      std::move(cjsModulesStatic_),
  410|    196|      std::move(functionSourceTable_),
  411|    196|      bytecodeOptions)};
  412|       |
  413|    196|  DebugInfoGenerator debugInfoGen{std::move(filenameTable_)};
  414|       |
  415|    196|  const uint32_t strippedFunctionNameId =
  416|    196|      options_.stripFunctionNames ? getStringID(kStrippedFunctionName) : 0;
  ------------------
  |  Branch (416:7): [True: 0, False: 196]
  ------------------
  417|    196|  auto functions = functionIDMap_.getElements();
  418|   103k|  for (unsigned i = 0, e = functions.size(); i < e; ++i) {
  ------------------
  |  Branch (418:46): [True: 103k, False: 196]
  ------------------
  419|   103k|    auto *F = functions[i];
  420|   103k|    auto &BFG = *functionGenerators_[F];
  421|       |
  422|   103k|    uint32_t functionNameId = options_.stripFunctionNames
  ------------------
  |  Branch (422:31): [True: 0, False: 103k]
  ------------------
  423|   103k|        ? strippedFunctionNameId
  424|   103k|        : getStringID(functions[i]->getOriginalOrInferredName().str());
  425|       |
  426|   103k|    std::unique_ptr<BytecodeFunction> func = BFG.generateBytecodeFunction(
  427|   103k|        F->getDefinitionKind(),
  428|   103k|        F->getKind(),
  429|   103k|        F->isStrictMode(),
  430|   103k|        F->getExpectedParamCountIncludingThis(),
  431|   103k|        F->getFunctionScopeDesc()->getVariables().size(),
  432|   103k|        functionNameId);
  433|       |
  434|   103k|    if (F->isLazy()) {
  ------------------
  |  Branch (434:9): [True: 81, False: 103k]
  ------------------
  435|     81|      auto lazyData = std::make_unique<LazyCompilationData>();
  436|     81|      lazyData->context = F->getParent()->shareContext();
  437|     81|      lazyData->parentScope = F->getLazyScope();
  438|     81|      lazyData->span = F->getLazySource().functionRange;
  439|     81|      lazyData->nodeKind = F->getLazySource().nodeKind;
  440|     81|      lazyData->paramYield = F->getLazySource().paramYield;
  441|     81|      lazyData->paramAwait = F->getLazySource().paramAwait;
  442|     81|      lazyData->bufferId = F->getLazySource().bufferId;
  443|     81|      lazyData->originalName = F->getOriginalOrInferredName();
  444|     81|      lazyData->closureAlias = F->getLazyClosureAlias()
  ------------------
  |  Branch (444:32): [True: 0, False: 81]
  ------------------
  445|     81|          ? F->getLazyClosureAlias()->getName()
  446|     81|          : Identifier();
  447|     81|      lazyData->strictMode = F->isStrictMode();
  448|     81|      func->setLazyCompilationData(std::move(lazyData));
  449|     81|    }
  450|       |
  451|   103k|    if (BFG.hasDebugInfo()) {
  ------------------
  |  Branch (451:9): [True: 103k, False: 81]
  ------------------
  452|       |      // Only serialize the scopes if any debug info has been output. Note that
  453|       |      // using a for each construct is wrong as serializeScopeChain may add
  454|       |      // entries to newScopeDescs_ (via addScopeDesc) which may in turn
  455|       |      // re-allocate the vector being iterated on.
  456|   309k|      for (uint32_t s = 0, end = newScopeDescs_.size(); s < end; ++s) {
  ------------------
  |  Branch (456:57): [True: 206k, False: 103k]
  ------------------
  457|   206k|        serializeScopeChain(
  458|   206k|            F->getContext().getStringTable(), debugInfoGen, newScopeDescs_[s]);
  459|   206k|      }
  460|       |
  461|       |      // All scopes in newScopeDesc_ have already been serialized, thus
  462|       |      // newScopeDescs_ can be cleared.
  463|   103k|      newScopeDescs_.clear();
  464|       |
  465|       |      // The scope descriptor table is serialized, thus it can be used to patch
  466|       |      // any references to it in the current function's debug data.
  467|   103k|      BFG.patchDebugSourceLocations(scopeDescIDAddr_);
  468|       |
  469|   103k|      uint32_t sourceLocOffset = debugInfoGen.appendSourceLocations(
  470|   103k|          BFG.getSourceLocation(), i, BFG.getDebugLocations());
  471|   103k|      uint32_t topLevelScopeDescDataOffset = serializeScopeChain(
  472|   103k|          F->getContext().getStringTable(),
  473|   103k|          debugInfoGen,
  474|   103k|          F->getFunctionScopeDesc());
  475|   103k|      uint32_t textifiedCalleesOffset =
  476|   103k|          debugInfoGen.appendTextifiedCalleeData(BFG.getTextifiedCallees());
  477|   103k|      func->setDebugOffsets(
  478|   103k|          {sourceLocOffset,
  479|   103k|           topLevelScopeDescDataOffset,
  480|   103k|           textifiedCalleesOffset});
  481|   103k|    }
  482|       |
  483|   103k|    BM->setFunction(i, std::move(func));
  484|   103k|  }
  485|       |
  486|    196|  BM->setDebugInfo(debugInfoGen.serializeWithMove());
  487|    196|  return BM;
  488|    196|}
BytecodeGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_119ensureUTF8IdentiferERNS_11StringTableENS_10IdentifierERNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
  241|   103k|    std::string &nameUTF8Buffer) {
  242|       |  // Check if name has any surrogates. If it doesn't, then it already is a valid
  243|       |  // UTF8 string, and as such can be written to the debug info.
  244|   103k|  bool hasSurrogate = false;
  245|   103k|  const char *it = name.str().begin();
  246|   103k|  const char *nameEnd = name.str().end();
  247|   270k|  while (it < nameEnd && !hasSurrogate) {
  ------------------
  |  Branch (247:10): [True: 167k, False: 103k]
  |  Branch (247:26): [True: 167k, False: 4]
  ------------------
  248|   167k|    constexpr bool allowSurrogates = false;
  249|   167k|    decodeUTF8<allowSurrogates>(
  250|   167k|        it, [&hasSurrogate](const llvh::Twine &) { hasSurrogate = true; });
  251|   167k|  }
  252|       |
  253|   103k|  if (hasSurrogate) {
  ------------------
  |  Branch (253:7): [True: 4, False: 103k]
  ------------------
  254|      4|    nameUTF8Buffer.clear();
  255|       |
  256|       |    // name has surrogates, meaning it is not a valid UTF8 string (these strings
  257|       |    // are still valid within Hermes itself).
  258|      4|    convertUTF8WithSurrogatesToUTF8WithReplacements(nameUTF8Buffer, name.str());
  259|      4|    name = st.getIdentifier(nameUTF8Buffer);
  260|      4|  }
  261|       |
  262|   103k|  return name;
  263|   103k|}
BytecodeGenerator.cpp:_ZZN6hermes3hbc12_GLOBAL__N_119ensureUTF8IdentiferERNS_11StringTableENS_10IdentifierERNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEENK3$_0clERKN4llvh5TwineE:
  250|      4|        it, [&hasSurrogate](const llvh::Twine &) { hasSurrogate = true; });

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

_ZN6hermes3hbc24ConsecutiveStringStorageC2INSt3__116__deque_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPSA_RSA_PSB_lLl170EEENS3_17integral_constantIbLb0EEEEET_SH_T0_b:
  721|    196|    bool optimize) {
  722|       |  // Prepare to build our string table.
  723|       |  // Generate storage for our ASCII and u16 strings.
  724|    196|  StringTableBuilder builder(begin, end, Force8Bit{});
  725|    196|  std::vector<unsigned char> asciiStorage;
  726|    196|  std::vector<char16_t> u16Storage;
  727|    196|  builder.packIntoStorage(&asciiStorage, &u16Storage, optimize);
  728|       |
  729|       |  // Append the u16 storage to the ASCII storage, to form our combined storage.
  730|    196|  storage_.insert(storage_.end(), asciiStorage.begin(), asciiStorage.end());
  731|    196|  auto u16Offset = StringTableBuilder::appendU16Storage(u16Storage, &storage_);
  732|       |
  733|       |  // Build our table over the storage.
  734|    196|  strTable_ = builder.generateStringTable(storage_, u16Offset);
  735|       |
  736|       |  // Record some stats.
  737|    196|  size_t unpackedSize = builder.unpackedSize();
  738|    196|  StringTableSize += unpackedSize;
  739|    196|  StringTableSavings += unpackedSize - storage_.size();
  740|    196|}
_ZN6hermes3hbc24ConsecutiveStringStorageC2IPKN4llvh9StringRefENSt3__117integral_constantIbLb0EEEEET_SA_T0_b:
  721|    196|    bool optimize) {
  722|       |  // Prepare to build our string table.
  723|       |  // Generate storage for our ASCII and u16 strings.
  724|    196|  StringTableBuilder builder(begin, end, Force8Bit{});
  725|    196|  std::vector<unsigned char> asciiStorage;
  726|    196|  std::vector<char16_t> u16Storage;
  727|    196|  builder.packIntoStorage(&asciiStorage, &u16Storage, optimize);
  728|       |
  729|       |  // Append the u16 storage to the ASCII storage, to form our combined storage.
  730|    196|  storage_.insert(storage_.end(), asciiStorage.begin(), asciiStorage.end());
  731|    196|  auto u16Offset = StringTableBuilder::appendU16Storage(u16Storage, &storage_);
  732|       |
  733|       |  // Build our table over the storage.
  734|    196|  strTable_ = builder.generateStringTable(storage_, u16Offset);
  735|       |
  736|       |  // Record some stats.
  737|    196|  size_t unpackedSize = builder.unpackedSize();
  738|    196|  StringTableSize += unpackedSize;
  739|    196|  StringTableSavings += unpackedSize - storage_.size();
  740|    196|}
_ZN6hermes3hbc24ConsecutiveStringStorageC2INSt3__116__deque_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPKSA_RSB_PKSC_lLl170EEENS3_17integral_constantIbLb1EEEEET_SJ_T0_b:
  721|    588|    bool optimize) {
  722|       |  // Prepare to build our string table.
  723|       |  // Generate storage for our ASCII and u16 strings.
  724|    588|  StringTableBuilder builder(begin, end, Force8Bit{});
  725|    588|  std::vector<unsigned char> asciiStorage;
  726|    588|  std::vector<char16_t> u16Storage;
  727|    588|  builder.packIntoStorage(&asciiStorage, &u16Storage, optimize);
  728|       |
  729|       |  // Append the u16 storage to the ASCII storage, to form our combined storage.
  730|    588|  storage_.insert(storage_.end(), asciiStorage.begin(), asciiStorage.end());
  731|    588|  auto u16Offset = StringTableBuilder::appendU16Storage(u16Storage, &storage_);
  732|       |
  733|       |  // Build our table over the storage.
  734|    588|  strTable_ = builder.generateStringTable(storage_, u16Offset);
  735|       |
  736|       |  // Record some stats.
  737|    588|  size_t unpackedSize = builder.unpackedSize();
  738|    588|  StringTableSize += unpackedSize;
  739|    588|  StringTableSavings += unpackedSize - storage_.size();
  740|    588|}
_ZNK6hermes3hbc24ConsecutiveStringStorage12getEntryHashEm:
  766|  3.29k|uint32_t ConsecutiveStringStorage::getEntryHash(size_t i) const {
  767|  3.29k|  ensureTableValid();
  768|  3.29k|  ensureStorageValid();
  769|       |
  770|  3.29k|  auto &entry = strTable_[i];
  771|  3.29k|  uint32_t length = entry.getLength();
  772|  3.29k|  assert(
  773|  3.29k|      entry.getOffset() + (entry.isUTF16() ? length * 2 : length) <=
  774|  3.29k|          storage_.size() &&
  775|  3.29k|      "entry past end");
  776|  3.29k|  const unsigned char *data = storage_.data() + entry.getOffset();
  777|  3.29k|  if (entry.isUTF16()) {
  ------------------
  |  Branch (777:7): [True: 261, False: 3.03k]
  ------------------
  778|    261|    const char16_t *u16data = reinterpret_cast<const char16_t *>(data);
  779|    261|    return hermes::hashString(ArrayRef<char16_t>{u16data, length});
  780|  3.03k|  } else {
  781|  3.03k|    return hermes::hashString(ArrayRef<char>{(const char *)data, length});
  782|  3.03k|  }
  783|  3.29k|}
_ZN6hermes3hbc24ConsecutiveStringStorage13appendStorageEOS1_:
  785|    196|void ConsecutiveStringStorage::appendStorage(ConsecutiveStringStorage &&rhs) {
  786|    196|  ensureTableValid();
  787|    196|  ensureStorageValid();
  788|       |  // If we have not yet been written, just acquire the rhs.
  789|    196|  if (strTable_.empty()) {
  ------------------
  |  Branch (789:7): [True: 196, False: 0]
  ------------------
  790|    196|    *this = std::move(rhs);
  791|    196|    return;
  792|    196|  }
  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|  5.08k|    std::string &utf8ConversionStorage) const {
  809|  5.08k|  ensureTableValid();
  810|  5.08k|  ensureStorageValid();
  811|  5.08k|  assert(idx < strTable_.size() && "getStringAtIndex: invalid index");
  812|  5.08k|  return getStringFromEntry(strTable_[idx], storage_, utf8ConversionStorage);
  813|  5.08k|}
_ZN6hermes3hbc18getStringFromEntryERKNS_16StringTableEntryEN4llvh8ArrayRefIhEERNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEE:
  818|  5.13k|    std::string &utf8ConversionStorage) {
  819|  5.13k|  uint32_t offset = entry.getOffset();
  820|  5.13k|  uint32_t length = entry.getLength();
  821|  5.13k|  assert(
  822|  5.13k|      offset + length <= storage.size() && offset + length >= offset &&
  823|  5.13k|      "Invalid entry");
  824|  5.13k|  if (!entry.isUTF16()) {
  ------------------
  |  Branch (824:7): [True: 4.74k, False: 388]
  ------------------
  825|  4.74k|    return llvh::StringRef{(const char *)storage.data() + offset, length};
  826|  4.74k|  } else {
  827|    388|    const char16_t *s =
  828|    388|        reinterpret_cast<const char16_t *>(storage.data() + offset);
  829|    388|    llvh::ArrayRef<char16_t> u16String(s, length);
  830|    388|    convertUTF16ToUTF8WithSingleSurrogates(utf8ConversionStorage, u16String);
  831|    388|    return utf8ConversionStorage;
  832|    388|  }
  833|  5.13k|}
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilder15packIntoStorageEPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_IDsNS3_IDsEEEEb:
  624|    980|      bool optimize) {
  625|    980|    NamedRegionTimer timer(
  626|    980|        "",
  627|    980|        optimize ? "optimizingPackStrings" : "fastPackStrings",
  ------------------
  |  Branch (627:9): [True: 0, False: 980]
  ------------------
  628|    980|        "",
  629|    980|        StringTableTimersName,
  630|    980|        AreStatisticsEnabled());
  631|       |    // Note these assignments use efficient move-assignment, not copying.
  632|    980|    if (optimize) {
  ------------------
  |  Branch (632:9): [True: 0, False: 980]
  ------------------
  633|      0|      *asciiStorage =
  634|      0|          StringPacker<unsigned char>::optimizingPackStrings(asciiStrings_);
  635|      0|      *u16Storage = StringPacker<char16_t>::optimizingPackStrings(u16Strings_);
  636|    980|    } else {
  637|    980|      *asciiStorage =
  638|    980|          StringPacker<unsigned char>::fastPackStrings(asciiStrings_);
  639|    980|      *u16Storage = StringPacker<char16_t>::fastPackStrings(u16Strings_);
  640|    980|    }
  641|       |
  642|    980|#ifndef NDEBUG
  643|       |    // Ensure that our packing was correct.
  644|    980|    StringPacker<unsigned char>::validateStringPacking(
  645|    980|        asciiStrings_, *asciiStorage);
  646|    980|    StringPacker<char16_t>::validateStringPacking(u16Strings_, *u16Storage);
  647|    980|#endif
  648|    980|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIhE15fastPackStringsEN4llvh15MutableArrayRefINS1_11StringEntryEEE:
  519|    980|      MutableArrayRef<StringEntry> strings) {
  520|    980|    std::vector<CharT> result;
  521|  4.91k|    for (StringEntry &str : strings) {
  ------------------
  |  Branch (521:27): [True: 4.91k, False: 980]
  ------------------
  522|  4.91k|      str.offsetInStorage_ = result.size();
  523|  4.91k|      result.insert(result.end(), str.chars_.begin(), str.chars_.end());
  524|  4.91k|    }
  525|       |    // Note efficient move-semantics on return.
  526|    980|    return result;
  527|    980|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIDsE15fastPackStringsEN4llvh15MutableArrayRefINS1_11StringEntryEEE:
  519|    980|      MutableArrayRef<StringEntry> strings) {
  520|    980|    std::vector<CharT> result;
  521|    980|    for (StringEntry &str : strings) {
  ------------------
  |  Branch (521:27): [True: 388, False: 980]
  ------------------
  522|    388|      str.offsetInStorage_ = result.size();
  523|    388|      result.insert(result.end(), str.chars_.begin(), str.chars_.end());
  524|    388|    }
  525|       |    // Note efficient move-semantics on return.
  526|    980|    return result;
  527|    980|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIhE21validateStringPackingEN4llvh8ArrayRefINS1_11StringEntryEEENS3_IhEE:
  534|    980|      ArrayRef<CharT> storage) {
  535|  4.91k|    for (const auto &entry : strings) {
  ------------------
  |  Branch (535:28): [True: 4.91k, False: 980]
  ------------------
  536|  4.91k|      auto offset = entry.offsetInStorage_;
  537|  4.91k|      auto size = entry.chars_.size();
  538|  4.91k|      assert(
  539|  4.91k|          offset + size >= offset && offset + size <= storage.size() &&
  540|  4.91k|          "Invalid offset or size for string entry");
  541|  4.91k|      assert(
  542|  4.91k|          entry.chars_ == storage.slice(offset, size) &&
  543|  4.91k|          "String does not appear at claimed offset in storage");
  544|  4.91k|    }
  545|    980|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIDsE21validateStringPackingEN4llvh8ArrayRefINS1_11StringEntryEEENS3_IDsEE:
  534|    980|      ArrayRef<CharT> storage) {
  535|    980|    for (const auto &entry : strings) {
  ------------------
  |  Branch (535:28): [True: 388, False: 980]
  ------------------
  536|    388|      auto offset = entry.offsetInStorage_;
  537|    388|      auto size = entry.chars_.size();
  538|    388|      assert(
  539|    388|          offset + size >= offset && offset + size <= storage.size() &&
  540|    388|          "Invalid offset or size for string entry");
  541|    388|      assert(
  542|    388|          entry.chars_ == storage.slice(offset, size) &&
  543|    388|          "String does not appear at claimed offset in storage");
  544|    388|    }
  545|    980|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilder16appendU16StorageEN4llvh8ArrayRefIDsEEPNSt3__16vectorIhNS4_9allocatorIhEEEE:
  686|    980|      std::vector<unsigned char> *output) {
  687|    980|    using namespace llvh::support;
  688|    980|    static_assert(sizeof(char16_t) == 2, "sizeof char16_t unexpectedly not 2");
  689|    980|    if (u16Storage.empty()) {
  ------------------
  |  Branch (689:9): [True: 917, False: 63]
  ------------------
  690|       |      // Nothing to do, don't even bother aligning.
  691|    917|      return 0;
  692|    917|    }
  693|       |
  694|       |    // Ensure 2-byte alignment.
  695|     63|    if (output->size() % sizeof(char16_t)) {
  ------------------
  |  Branch (695:9): [True: 31, False: 32]
  ------------------
  696|     31|      output->push_back('\0');
  697|     31|    }
  698|       |
  699|       |    // Make space, and write as little endian.
  700|     63|    size_t offset = output->size();
  701|     63|    output->resize(output->size() + sizeof(char16_t) * u16Storage.size());
  702|     63|    unsigned char *cursor = &output->at(offset);
  703|  1.60M|    for (char16_t s : u16Storage) {
  ------------------
  |  Branch (703:21): [True: 1.60M, False: 63]
  ------------------
  704|  1.60M|      endian::write<char16_t, little, 0>(cursor, s);
  705|  1.60M|      cursor += sizeof(s);
  706|  1.60M|    }
  707|     63|    return offset;
  708|    980|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilder19generateStringTableEN4llvh8ArrayRefIhEEm:
  659|    980|      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|    980|    std::vector<StringTableEntry> table;
  664|    980|    table.resize(asciiStrings_.size() + u16Strings_.size());
  665|       |
  666|  4.91k|    for (const auto &asciiStr : asciiStrings_) {
  ------------------
  |  Branch (666:31): [True: 4.91k, False: 980]
  ------------------
  667|  4.91k|      table.at(asciiStr.stringID_) = {
  668|  4.91k|          static_cast<uint32_t>(asciiStr.offsetInStorage_),
  669|  4.91k|          static_cast<uint32_t>(asciiStr.chars_.size()),
  670|  4.91k|          false /* isUTF16 */};
  671|  4.91k|    }
  672|    980|    for (const auto &u16Str : u16Strings_) {
  ------------------
  |  Branch (672:29): [True: 388, False: 980]
  ------------------
  673|    388|      table.at(u16Str.stringID_) = {
  674|    388|          static_cast<uint32_t>(
  675|    388|              u16Str.offsetInStorage_ * sizeof(char16_t) + u16OffsetAdjust),
  676|    388|          static_cast<uint32_t>(u16Str.chars_.size()),
  677|    388|          true /* isUTF16 */};
  678|    388|    }
  679|    980|    return table;
  680|    980|  }
ConsecutiveStringStorage.cpp:_ZNK12_GLOBAL__N_118StringTableBuilder12unpackedSizeEv:
  604|    980|  size_t unpackedSize() const {
  605|    980|    size_t result = 0;
  606|  4.91k|    for (const auto &entry : asciiStrings_) {
  ------------------
  |  Branch (606:28): [True: 4.91k, False: 980]
  ------------------
  607|  4.91k|      result += sizeof(char) * entry.chars_.size();
  608|  4.91k|    }
  609|    980|    for (const auto &entry : u16Strings_) {
  ------------------
  |  Branch (609:28): [True: 388, False: 980]
  ------------------
  610|    388|      result += sizeof(char16_t) * entry.chars_.size();
  611|    388|    }
  612|    980|    return result;
  613|    980|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIhE11StringEntryC2EjN4llvh8ArrayRefIhEE:
   85|  4.91k|        : stringID_(stringID), chars_(chars) {}
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIDsE11StringEntryC2EjN4llvh8ArrayRefIDsEE:
   85|    388|        : 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|    196|  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|    196|    uint32_t index = 0;
  584|    392|    for (auto it = begin; it != end; ++it) {
  ------------------
  |  Branch (584:27): [True: 196, False: 196]
  ------------------
  585|    196|      auto &str = *it;
  586|    196|      static_assert(sizeof(str.data()[0]) == 1, "strings must be UTF8");
  587|    196|      const unsigned char *begin = (const unsigned char *)str.data();
  588|    196|      const unsigned char *end = begin + str.size();
  589|    196|      if (Force8Bit::value || isAllASCII(begin, end)) {
  ------------------
  |  Branch (589:11): [Folded - Ignored]
  |  Branch (589:31): [True: 195, False: 1]
  ------------------
  590|    195|        ArrayRef<unsigned char> astr(begin, end);
  591|    195|        asciiStrings_.emplace_back(index, astr);
  592|    195|      } else {
  593|      1|        u16StringStorage_.emplace_back();
  594|      1|        std::vector<char16_t> &ustr = u16StringStorage_.back();
  595|      1|        convertUTF8WithSurrogatesToUTF16(
  596|      1|            std::back_inserter(ustr), (const char *)begin, (const char *)end);
  597|      1|        u16Strings_.emplace_back(index, ustr);
  598|      1|      }
  599|    196|      index++;
  600|    196|    }
  601|    196|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilderC2IPKN4llvh9StringRefENSt3__117integral_constantIbLb0EEEEET_S9_T0_:
  575|    196|  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|    196|    uint32_t index = 0;
  584|  5.27k|    for (auto it = begin; it != end; ++it) {
  ------------------
  |  Branch (584:27): [True: 5.08k, False: 196]
  ------------------
  585|  5.08k|      auto &str = *it;
  586|  5.08k|      static_assert(sizeof(str.data()[0]) == 1, "strings must be UTF8");
  587|  5.08k|      const unsigned char *begin = (const unsigned char *)str.data();
  588|  5.08k|      const unsigned char *end = begin + str.size();
  589|  5.08k|      if (Force8Bit::value || isAllASCII(begin, end)) {
  ------------------
  |  Branch (589:11): [Folded - Ignored]
  |  Branch (589:31): [True: 4.69k, False: 387]
  ------------------
  590|  4.69k|        ArrayRef<unsigned char> astr(begin, end);
  591|  4.69k|        asciiStrings_.emplace_back(index, astr);
  592|  4.69k|      } else {
  593|    387|        u16StringStorage_.emplace_back();
  594|    387|        std::vector<char16_t> &ustr = u16StringStorage_.back();
  595|    387|        convertUTF8WithSurrogatesToUTF16(
  596|    387|            std::back_inserter(ustr), (const char *)begin, (const char *)end);
  597|    387|        u16Strings_.emplace_back(index, ustr);
  598|    387|      }
  599|  5.08k|      index++;
  600|  5.08k|    }
  601|    196|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilderC2INSt3__116__deque_iteratorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKS9_RSA_PKSB_lLl170EEENS2_17integral_constantIbLb1EEEEET_SI_T0_:
  575|    588|  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|    588|    uint32_t index = 0;
  584|    617|    for (auto it = begin; it != end; ++it) {
  ------------------
  |  Branch (584:27): [True: 29, False: 588]
  ------------------
  585|     29|      auto &str = *it;
  586|     29|      static_assert(sizeof(str.data()[0]) == 1, "strings must be UTF8");
  587|     29|      const unsigned char *begin = (const unsigned char *)str.data();
  588|     29|      const unsigned char *end = begin + str.size();
  589|     29|      if (Force8Bit::value || isAllASCII(begin, end)) {
  ------------------
  |  Branch (589:11): [Folded - Ignored]
  |  Branch (589:31): [True: 0, False: 0]
  ------------------
  590|     29|        ArrayRef<unsigned char> astr(begin, end);
  591|     29|        asciiStrings_.emplace_back(index, astr);
  592|     29|      } 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|     29|      index++;
  600|     29|    }
  601|    588|  }

_ZN6hermes3hbc20DebugScopeDescriptor5FlagsC2Ej:
   88|   103k|DebugScopeDescriptor::Flags::Flags(uint32_t bits) {
   89|   103k|  uint32_t mask = 1;
   90|   103k|  assert(
   91|   103k|      mask == (1 << static_cast<uint32_t>(Bits::InnerScope)) &&
   92|   103k|      "mask is not Bits::InnerScope");
   93|   103k|  isInnerScope = (bits & mask) != 0;
   94|       |
   95|   103k|  mask <<= 1;
   96|   103k|  assert(
   97|   103k|      mask == (1 << static_cast<uint32_t>(Bits::Dynamic)) &&
   98|   103k|      "mask is not Bits::Dynamic");
   99|   103k|  isDynamic = (bits & mask) != 0;
  100|   103k|}
_ZNK6hermes3hbc20DebugScopeDescriptor5Flags8toUint32Ev:
  102|   103k|uint32_t DebugScopeDescriptor::Flags::toUint32() const {
  103|   103k|  uint32_t bits = 0;
  104|       |
  105|   103k|  uint32_t mask = 1;
  106|   103k|  assert(
  107|   103k|      mask == (1 << static_cast<uint32_t>(Bits::InnerScope)) &&
  108|   103k|      "mask is not Bits::InnerScope");
  109|   103k|  bits |= isInnerScope ? mask : 0;
  ------------------
  |  Branch (109:11): [True: 0, False: 103k]
  ------------------
  110|       |
  111|   103k|  mask <<= 1;
  112|   103k|  assert(
  113|   103k|      mask == (1 << static_cast<uint32_t>(Bits::Dynamic)) &&
  114|   103k|      "mask is not Bits::Dynamic");
  115|   103k|  bits |= isDynamic ? mask : 0;
  ------------------
  |  Branch (115:11): [True: 0, False: 103k]
  ------------------
  116|       |
  117|   103k|  return bits;
  118|   103k|}
_ZN6hermes3hbc18DebugInfoGenerator12appendStringERNSt3__16vectorIhNS2_9allocatorIhEEEENS_10IdentifierE:
  144|   103k|    Identifier str) {
  145|   103k|  auto res = stringTableIndex_.try_emplace(
  146|   103k|      str.getUnderlyingPointer(), stringTable_.size());
  147|       |
  148|   103k|  if (res.second) {
  ------------------
  |  Branch (148:7): [True: 97, False: 103k]
  ------------------
  149|     97|#ifndef NDEBUG
  150|       |    // Check that the given string is a valid UTF8 string.
  151|     97|    const char *it = str.str().begin();
  152|  1.26k|    while (it < str.str().end()) {
  ------------------
  |  Branch (152:12): [True: 1.17k, False: 97]
  ------------------
  153|  1.17k|      constexpr bool allowSurrogates = false;
  154|       |      // keep the current position alive so it can be inspected in the debugger
  155|       |      // if the assert fails.
  156|  1.17k|      const char *pos = it;
  157|  1.17k|      (void)pos;
  158|  1.17k|      decodeUTF8<allowSurrogates>(it, [](const llvh::Twine &) {
  159|  1.17k|        assert(false && "invalid utf8 char");
  160|  1.17k|      });
  161|  1.17k|    }
  162|     97|    assert(
  163|     97|        it == str.str().end() && "Invalid utf8 string -- read past end of str");
  164|     97|#endif // NDEBUG
  165|     97|    appendSignedLEB128(stringTable_, int64_t(str.str().size()));
  166|     97|    stringTable_.insert(stringTable_.end(), str.str().begin(), str.str().end());
  167|     97|  }
  168|       |
  169|   103k|  appendSignedLEB128(data, res.first->second);
  170|   103k|}
_ZNK6hermes3hbc9DebugInfo12decodeStringEPjN4llvh8ArrayRefIhEE:
  174|      1|    llvh::ArrayRef<uint8_t> data) const {
  175|      1|  int64_t strOffset;
  176|      1|  *inoutOffset += readSignedLEB128(data, *inoutOffset, &strOffset);
  177|      1|  uint32_t strOffsetU = strOffset;
  178|      1|  return getString(&strOffsetU, stringTableData());
  179|      1|}
_ZNK6hermes3hbc9DebugInfo21getFilenameForAddressEj:
  182|     52|    uint32_t debugOffset) const {
  183|     52|  OptValue<uint32_t> value = llvh::None;
  184|       |  // This is sorted list of (address, filename) pairs so we could use
  185|       |  // binary search. However, we expect the number of entries to be
  186|       |  // between zero and one.
  187|    104|  for (int i = 0, e = files_.size(); i < e; i++) {
  ------------------
  |  Branch (187:38): [True: 52, False: 52]
  ------------------
  188|     52|    if (files_[i].fromAddress <= debugOffset) {
  ------------------
  |  Branch (188:9): [True: 52, False: 0]
  ------------------
  189|     52|      value = files_[i].filenameId;
  190|     52|    } else
  191|      0|      break;
  192|     52|  }
  193|     52|  return value;
  194|     52|}
_ZNK6hermes3hbc9DebugInfo21getLocationForAddressEjj:
  198|     52|    uint32_t offsetInFunction) const {
  199|     52|  assert(debugOffset < data_.size() && "Debug offset out of range");
  200|     52|  FunctionDebugInfoDeserializer fdid(data_.getData(), debugOffset);
  201|     52|  DebugSourceLocation lastLocation = fdid.getCurrent();
  202|     52|  uint32_t lastLocationOffset = debugOffset;
  203|     52|  uint32_t nextLocationOffset = fdid.getOffset();
  204|  87.2k|  while (auto loc = fdid.next()) {
  ------------------
  |  Branch (204:15): [True: 87.2k, False: 0]
  ------------------
  205|  87.2k|    if (loc->address > offsetInFunction)
  ------------------
  |  Branch (205:9): [True: 52, False: 87.2k]
  ------------------
  206|     52|      break;
  207|  87.2k|    lastLocation = *loc;
  208|  87.2k|    lastLocationOffset = nextLocationOffset;
  209|  87.2k|    nextLocationOffset = fdid.getOffset();
  210|  87.2k|  }
  211|     52|  if (auto file = getFilenameForAddress(lastLocationOffset)) {
  ------------------
  |  Branch (211:12): [True: 52, False: 0]
  ------------------
  212|     52|    lastLocation.address = offsetInFunction;
  213|     52|    lastLocation.filenameId = *file;
  214|     52|    return lastLocation;
  215|     52|  }
  216|      0|  return llvh::None;
  217|     52|}
_ZNK6hermes3hbc9DebugInfo22getTextifiedCalleeUTF8Ejj:
  287|      1|    uint32_t offsetInFunction) const {
  288|      1|  llvh::ArrayRef<uint8_t> data = textifiedCalleeData();
  289|      1|  int64_t entries;
  290|      1|  debugOffset += readSignedLEB128(data, debugOffset, &entries);
  291|      1|  while (entries--) {
  ------------------
  |  Branch (291:10): [True: 1, False: 0]
  ------------------
  292|      1|    int64_t location;
  293|      1|    debugOffset += readSignedLEB128(data, debugOffset, &location);
  294|      1|    llvh::StringRef name = decodeString(&debugOffset, data);
  295|      1|    if (location == offsetInFunction) {
  ------------------
  |  Branch (295:9): [True: 0, False: 1]
  ------------------
  296|      0|      return name;
  297|      0|    }
  298|      1|    if (location > offsetInFunction) {
  ------------------
  |  Branch (298:9): [True: 1, False: 0]
  ------------------
  299|      1|      break;
  300|      1|    }
  301|      1|  }
  302|       |
  303|      1|  return llvh::None;
  304|      1|}
_ZN6hermes3hbc18DebugInfoGenerator21appendSourceLocationsERKNS0_19DebugSourceLocationEjN4llvh8ArrayRefIS2_EE:
  511|   103k|    llvh::ArrayRef<DebugSourceLocation> offsets) {
  512|   103k|  assert(validData && "DebugInfoGenerator not valid");
  513|       |
  514|       |  // The start of the function isn't part of a statement,
  515|       |  // so require that statement = 0 for the start debug value.
  516|   103k|  assert(start.statement == 0 && "function must start at statement 0");
  517|       |
  518|   103k|  if (offsets.empty()) {
  ------------------
  |  Branch (518:7): [True: 0, False: 103k]
  ------------------
  519|      0|    return DebugOffsets::NO_OFFSET;
  520|      0|  }
  521|   103k|  const uint32_t startOffset = sourcesData_.size();
  522|       |
  523|   103k|  if (files_.empty() || files_.back().filenameId != start.filenameId) {
  ------------------
  |  Branch (523:7): [True: 196, False: 103k]
  |  Branch (523:25): [True: 0, False: 103k]
  ------------------
  524|    196|    files_.push_back(DebugFileRegion{
  525|    196|        startOffset, start.filenameId, start.sourceMappingUrlId});
  526|    196|  }
  527|       |
  528|   103k|  appendSignedLEB128(sourcesData_, functionIndex);
  529|   103k|  appendSignedLEB128(sourcesData_, start.line);
  530|   103k|  appendSignedLEB128(sourcesData_, start.column);
  531|   103k|  const DebugSourceLocation *previous = &start;
  532|       |
  533|  3.84M|  for (auto &next : offsets) {
  ------------------
  |  Branch (533:19): [True: 3.84M, False: 103k]
  ------------------
  534|  3.84M|    if (next.filenameId != previous->filenameId) {
  ------------------
  |  Branch (534:9): [True: 0, False: 3.84M]
  ------------------
  535|      0|      files_.push_back(DebugFileRegion{
  536|      0|          (unsigned)sourcesData_.size(),
  537|      0|          next.filenameId,
  538|      0|          start.sourceMappingUrlId});
  539|      0|    }
  540|       |
  541|  3.84M|    int32_t adelta = delta(next.address, previous->address);
  542|       |    // ldelta needs 64 bits because we will use it to encode an extra bit.
  543|  3.84M|    int64_t ldelta = delta(next.line, previous->line);
  544|  3.84M|    int32_t cdelta = delta(next.column, previous->column);
  545|  3.84M|    int32_t sdelta = delta(next.statement, previous->statement);
  546|       |
  547|       |    // Encode the presence of statementNo as a bit in the line delta, which is
  548|       |    // usually very small.
  549|       |    // ldelta encoding: bits 1..32 contain the line delta. Bit 0 indicates the
  550|       |    // presence of statementNo.
  551|  3.84M|    ldelta = (ldelta * 2) + (sdelta != 0);
  552|       |
  553|  3.84M|    appendSignedLEB128(sourcesData_, adelta);
  554|  3.84M|    appendSignedLEB128(sourcesData_, ldelta);
  555|  3.84M|    appendSignedLEB128(sourcesData_, cdelta);
  556|  3.84M|    appendSignedLEB128(sourcesData_, next.scopeAddress);
  557|  3.84M|    appendSignedLEB128(sourcesData_, next.envReg);
  558|  3.84M|    if (sdelta)
  ------------------
  |  Branch (558:9): [True: 467k, False: 3.37M]
  ------------------
  559|   467k|      appendSignedLEB128(sourcesData_, sdelta);
  560|  3.84M|    previous = &next;
  561|  3.84M|  }
  562|   103k|  appendSignedLEB128(sourcesData_, -1);
  563|       |
  564|   103k|  return startOffset;
  565|   103k|}
_ZN6hermes3hbc18DebugInfoGeneratorC2EONS0_21UniquingFilenameTableE:
  569|    196|          UniquingFilenameTable::toStorage(std::move(filenameTable))) {
  570|    196|  assert(
  571|    196|      textifiedCallees_.size() == kMostCommonEntryOffset &&
  572|    196|      "Textified callee should initially be kMostCommonEntryOffset");
  573|    196|  assert(
  574|    196|      scopeDescData_.size() == kMostCommonEntryOffset &&
  575|    196|      "Scope desc data should initially be kMostCommonEntryOffset");
  576|       |
  577|       |  // Initialize the empty data entry in debug lexical table.
  578|       |  // Initialize the empty data entry in debug lexical table.
  579|    196|  appendSignedLEB128(scopeDescData_, -1); // parent function
  580|    196|  appendSignedLEB128(scopeDescData_, 0); // flags
  581|    196|  appendSignedLEB128(scopeDescData_, 0); // name count
  582|       |
  583|       |  // Textified callee table.
  584|    196|  appendSignedLEB128(textifiedCallees_, 0);
  585|    196|}
_ZN6hermes3hbc18DebugInfoGenerator25appendTextifiedCalleeDataEN4llvh8ArrayRefINS0_20DebugTextifiedCalleeEEE:
  588|   103k|    llvh::ArrayRef<DebugTextifiedCallee> textifiedCallees) {
  589|   103k|  if (textifiedCallees.empty()) {
  ------------------
  |  Branch (589:7): [True: 103k, False: 6]
  ------------------
  590|   103k|    return kMostCommonEntryOffset;
  591|   103k|  }
  592|      6|  const uint32_t startOffset = textifiedCallees_.size();
  593|      6|  appendSignedLEB128(textifiedCallees_, textifiedCallees.size());
  594|     19|  for (const DebugTextifiedCallee &callee : textifiedCallees) {
  ------------------
  |  Branch (594:43): [True: 19, False: 6]
  ------------------
  595|     19|    appendSignedLEB128(textifiedCallees_, callee.address);
  596|     19|    appendString(textifiedCallees_, callee.textifiedCallee);
  597|     19|  }
  598|      6|  return startOffset;
  599|   103k|}
_ZN6hermes3hbc18DebugInfoGenerator15appendScopeDescENS_8OptValueIjEENS0_20DebugScopeDescriptor5FlagsEN4llvh8ArrayRefINS_10IdentifierEEE:
  604|   103k|    llvh::ArrayRef<Identifier> names) {
  605|   103k|  assert(validData && "DebugInfoGenerator not valid");
  606|   103k|  if (!parentScopeOffset.hasValue() && names.empty()) {
  ------------------
  |  Branch (606:7): [True: 196, False: 103k]
  |  Branch (606:40): [True: 187, False: 9]
  ------------------
  607|    187|    return kMostCommonEntryOffset;
  608|    187|  }
  609|   103k|  const uint32_t startOffset = scopeDescData_.size();
  610|   103k|  appendSignedLEB128(
  611|   103k|      scopeDescData_, !parentScopeOffset.hasValue() ? -1 : *parentScopeOffset);
  ------------------
  |  Branch (611:23): [True: 9, False: 103k]
  ------------------
  612|   103k|  appendSignedLEB128(scopeDescData_, flags.toUint32());
  613|   103k|  appendSignedLEB128(scopeDescData_, names.size());
  614|   103k|  for (Identifier name : names) {
  ------------------
  |  Branch (614:24): [True: 103k, False: 103k]
  ------------------
  615|   103k|    appendString(scopeDescData_, name);
  616|   103k|  }
  617|   103k|  return startOffset;
  618|   103k|}
_ZN6hermes3hbc18DebugInfoGenerator17serializeWithMoveEv:
  620|    196|DebugInfo DebugInfoGenerator::serializeWithMove() {
  621|    196|  assert(validData);
  622|    196|  validData = false;
  623|       |
  624|    196|  auto combinedData = std::move(sourcesData_);
  625|       |
  626|    196|  combinedData.reserve(
  627|    196|      combinedData.size() + scopeDescData_.size() + textifiedCallees_.size() +
  628|    196|      stringTable_.size());
  629|       |
  630|    196|  uint32_t scopeDescStart = combinedData.size();
  631|    196|  combinedData.insert(
  632|    196|      combinedData.end(), scopeDescData_.begin(), scopeDescData_.end());
  633|       |
  634|    196|  uint32_t textifiedCalleeStart = combinedData.size();
  635|    196|  combinedData.insert(
  636|    196|      combinedData.end(), textifiedCallees_.begin(), textifiedCallees_.end());
  637|       |
  638|       |  // Append the string table data.
  639|    196|  uint32_t stringTableStart = combinedData.size();
  640|    196|  combinedData.insert(
  641|    196|      combinedData.end(), stringTable_.begin(), stringTable_.end());
  642|       |
  643|    196|  return DebugInfo(
  644|    196|      std::move(filenameStrings_),
  645|    196|      std::move(files_),
  646|    196|      scopeDescStart,
  647|    196|      textifiedCalleeStart,
  648|    196|      stringTableStart,
  649|    196|      StreamVector<uint8_t>(std::move(combinedData)));
  650|    196|}
DebugInfo.cpp:_ZL9getStringPjN4llvh8ArrayRefIhEE:
  124|      1|    llvh::ArrayRef<uint8_t> data) {
  125|       |  // The string is represented as its LEB-encoded length, followed by
  126|       |  // the bytes. This format matches DebugInfoGenerator::appendString().
  127|      1|  uint32_t offset = *inoutOffset;
  128|      1|  int64_t strSize;
  129|      1|  offset += readSignedLEB128(data, offset, &strSize);
  130|      1|  assert(
  131|      1|      strSize >= 0 && // can't be negative
  132|      1|      strSize <= UINT_MAX && // can't overflow uint32
  133|      1|      uint32_t(strSize) + offset >= offset && // sum can't overflow
  134|      1|      uint32_t(strSize) + offset <= data.size() && // validate range
  135|      1|      "Invalid string size");
  136|      1|  const unsigned char *ptr = data.data() + offset;
  137|      1|  offset += strSize;
  138|      1|  *inoutOffset = offset;
  139|      1|  return llvh::StringRef(reinterpret_cast<const char *>(ptr), size_t(strSize));
  140|      1|}
DebugInfo.cpp:_ZN12_GLOBAL__N_129FunctionDebugInfoDeserializerC2EN4llvh8ArrayRefIhEEj:
   26|     52|      : data_(data), offset_(offset) {
   27|     52|    functionIndex_ = decode1Int();
   28|     52|    current_.line = decode1Int();
   29|     52|    current_.column = decode1Int();
   30|     52|  }
DebugInfo.cpp:_ZN12_GLOBAL__N_129FunctionDebugInfoDeserializer10decode1IntEv:
   74|   436k|  int64_t decode1Int() {
   75|   436k|    int64_t result;
   76|   436k|    offset_ += readSignedLEB128(data_, offset_, &result);
   77|   436k|    return result;
   78|   436k|  }
DebugInfo.cpp:_ZNK12_GLOBAL__N_129FunctionDebugInfoDeserializer10getCurrentEv:
   68|     52|  const DebugSourceLocation &getCurrent() const {
   69|     52|    return current_;
   70|     52|  }
DebugInfo.cpp:_ZNK12_GLOBAL__N_129FunctionDebugInfoDeserializer9getOffsetEv:
   58|  87.2k|  uint32_t getOffset() const {
   59|  87.2k|    return offset_;
   60|  87.2k|  }
DebugInfo.cpp:_ZN12_GLOBAL__N_129FunctionDebugInfoDeserializer4nextEv:
   34|  87.2k|  OptValue<DebugSourceLocation> next() {
   35|  87.2k|    auto addressDelta = decode1Int();
   36|  87.2k|    if (addressDelta == -1)
  ------------------
  |  Branch (36:9): [True: 0, False: 87.2k]
  ------------------
   37|      0|      return llvh::None;
   38|       |    // Presence of the statement delta is LSB of line delta.
   39|  87.2k|    int64_t lineDelta = decode1Int();
   40|  87.2k|    int64_t columnDelta = decode1Int();
   41|  87.2k|    int64_t scopeAddress = decode1Int();
   42|  87.2k|    int64_t envReg = decode1Int();
   43|  87.2k|    int64_t statementDelta = 0;
   44|  87.2k|    if (lineDelta & 1)
  ------------------
  |  Branch (44:9): [True: 71, False: 87.2k]
  ------------------
   45|     71|      statementDelta = decode1Int();
   46|  87.2k|    lineDelta >>= 1;
   47|       |
   48|  87.2k|    current_.address += addressDelta;
   49|  87.2k|    current_.line += lineDelta;
   50|  87.2k|    current_.column += columnDelta;
   51|  87.2k|    current_.statement += statementDelta;
   52|  87.2k|    current_.scopeAddress = scopeAddress;
   53|  87.2k|    current_.envReg = envReg;
   54|  87.2k|    return current_;
   55|  87.2k|  }

_ZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionERKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEE:
  383|    196|    std::unique_ptr<BCProviderBase> baseBCProvider) {
  384|    196|  return generateBytecodeModule(
  385|    196|      M,
  386|    196|      entryPoint,
  387|    196|      entryPoint,
  388|    196|      options,
  389|    196|      segment,
  390|    196|      sourceMapGen,
  391|    196|      std::move(baseBCProvider));
  392|    196|}
_ZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEE:
  424|    196|    std::unique_ptr<BCProviderBase> baseBCProvider) {
  425|    196|  PerfSection perf("Bytecode Generation");
  426|    196|  lowerIR(M, options);
  427|       |
  428|    196|  if (options.format == DumpLIR)
  ------------------
  |  Branch (428:7): [True: 0, False: 196]
  ------------------
  429|      0|    M->dump();
  430|       |
  431|    196|  BytecodeModuleGenerator BMGen(options);
  432|       |
  433|    196|  if (segment) {
  ------------------
  |  Branch (433:7): [True: 0, False: 196]
  ------------------
  434|      0|    BMGen.setSegmentID(*segment);
  435|      0|  }
  436|       |  // Empty if all functions should be generated (i.e. bundle splitting was not
  437|       |  // requested).
  438|    196|  llvh::DenseSet<Function *> functionsToGenerate = segment
  ------------------
  |  Branch (438:52): [True: 0, False: 196]
  ------------------
  439|    196|      ? M->getFunctionsInSegment(*segment)
  440|    196|      : llvh::DenseSet<Function *>{};
  441|       |
  442|       |  /// \return true if we should generate function \p f.
  443|    196|  std::function<bool(const Function *)> shouldGenerate;
  444|    196|  if (segment) {
  ------------------
  |  Branch (444:7): [True: 0, False: 196]
  ------------------
  445|      0|    shouldGenerate = [entryPoint, &functionsToGenerate](const Function *f) {
  446|      0|      return f == entryPoint || functionsToGenerate.count(f) > 0;
  447|      0|    };
  448|    196|  } else {
  449|    196|    shouldGenerate = [](const Function *) { return true; };
  450|    196|  }
  451|       |
  452|       |  /// Mapping of the source text UTF-8 to the modified UTF-16-like
  453|       |  /// representation used by string literal encoding.
  454|       |  /// See appendUnicodeToStorage.
  455|       |  /// If a function source isn't in this map, then it's entirely ASCII and can
  456|       |  /// be added to the string table unmodified.
  457|       |  /// This allows us to add strings to the StringLiteralTable,
  458|       |  /// which will convert actual UTF-8 to UTF-16 automatically if it's detected,
  459|       |  /// meaning we'd not be able to directly look up the original function source
  460|       |  /// in the table.
  461|    196|  llvh::DenseMap<llvh::StringRef, llvh::SmallVector<char, 32>>
  462|    196|      unicodeFunctionSources{};
  463|       |
  464|    196|  { // Collect all the strings in the bytecode module into a storage.
  465|       |    // If we are in delta optimizing mode, start with the string storage from
  466|       |    // our base bytecode provider.
  467|    196|    auto strings = baseBCProvider
  ------------------
  |  Branch (467:20): [True: 0, False: 196]
  ------------------
  468|    196|        ? stringAccumulatorFromBCProvider(*baseBCProvider)
  469|    196|        : UniquingStringLiteralAccumulator{};
  470|       |
  471|    196|    auto addStringOrIdent = [&strings](llvh::StringRef str, bool isIdentifier) {
  472|    196|      strings.addString(str, isIdentifier);
  473|    196|    };
  474|       |
  475|    196|    auto addString = [&strings](llvh::StringRef str) {
  476|    196|      strings.addString(str, /* isIdentifier */ false);
  477|    196|    };
  478|       |
  479|    196|    traverseLiteralStrings(M, shouldGenerate, addStringOrIdent);
  480|       |
  481|    196|    if (options.stripFunctionNames) {
  ------------------
  |  Branch (481:9): [True: 0, False: 196]
  ------------------
  482|      0|      addString(kStrippedFunctionName);
  483|      0|    }
  484|       |
  485|       |    /// Add the original function source \p str to the \c strings table.
  486|       |    /// If it's not ASCII, re-encode it using the string table's string literal
  487|       |    /// encoding and map from the original source to the newly encoded source in
  488|       |    /// unicodeFunctionSources,so it can be reused below.
  489|    196|    auto addFunctionSource = [&strings,
  490|    196|                              &unicodeFunctionSources](llvh::StringRef str) {
  491|    196|      if (hermes::isAllASCII(str.begin(), str.end())) {
  492|       |        // Fast path, no re-encoding needed.
  493|    196|        strings.addString(str, /* isIdentifier */ false);
  494|    196|      } else {
  495|    196|        auto &storage = unicodeFunctionSources[str];
  496|    196|        if (!storage.empty())
  497|    196|          return;
  498|    196|        for (const char *cur = str.begin(), *e = str.end(); cur != e;
  499|    196|             /* increment in body */) {
  500|    196|          if (LLVM_UNLIKELY(isUTF8Start(*cur))) {
  501|       |            // Decode and re-encode the character and append it to the string
  502|       |            // storage
  503|    196|            appendUnicodeToStorage(
  504|    196|                hermes::_decodeUTF8SlowPath<false>(
  505|    196|                    cur, [](const llvh::Twine &) {}),
  506|    196|                storage);
  507|    196|          } else {
  508|    196|            storage.push_back(*cur);
  509|    196|            ++cur;
  510|    196|          }
  511|    196|        }
  512|    196|        strings.addString(
  513|    196|            llvh::StringRef{storage.begin(), storage.size()},
  514|    196|            /* isIdentifier */ false);
  515|    196|      }
  516|    196|    };
  517|       |
  518|       |    // Populate strings table and if the source of a function contains unicode,
  519|       |    // add an entry to the unicodeFunctionSources.
  520|    196|    traverseFunctions(
  521|    196|        M,
  522|    196|        shouldGenerate,
  523|    196|        addString,
  524|    196|        addFunctionSource,
  525|    196|        options.stripFunctionNames);
  526|       |
  527|    196|    if (!M->getCJSModulesResolved()) {
  ------------------
  |  Branch (527:9): [True: 196, False: 0]
  ------------------
  528|    196|      traverseCJSModuleNames(M, shouldGenerate, addString);
  529|    196|    }
  530|       |
  531|    196|    BMGen.initializeStringTable(UniquingStringLiteralAccumulator::toTable(
  532|    196|        std::move(strings), options.optimizationEnabled));
  533|    196|  }
  534|       |
  535|       |  // Generate the serialized literal buffers.
  536|    196|  {
  537|    196|    LiteralBufferBuilder litBuilder{
  538|    196|        M, shouldGenerate, BMGen, options.optimizationEnabled};
  539|    196|    litBuilder.generate();
  540|    196|  }
  541|       |
  542|       |  // Add each function to BMGen so that each function has a unique ID.
  543|   103k|  for (auto &F : *M) {
  ------------------
  |  Branch (543:16): [True: 103k, False: 196]
  ------------------
  544|   103k|    if (!shouldGenerate(&F)) {
  ------------------
  |  Branch (544:9): [True: 0, False: 103k]
  ------------------
  545|      0|      continue;
  546|      0|    }
  547|       |
  548|   103k|    unsigned index = BMGen.addFunction(&F);
  549|   103k|    if (&F == entryPoint) {
  ------------------
  |  Branch (549:9): [True: 196, False: 103k]
  ------------------
  550|    196|      BMGen.setEntryPointIndex(index);
  551|    196|    }
  552|       |
  553|   103k|    auto *cjsModule = M->findCJSModule(&F);
  554|   103k|    if (cjsModule) {
  ------------------
  |  Branch (554:9): [True: 0, False: 103k]
  ------------------
  555|      0|      if (M->getCJSModulesResolved()) {
  ------------------
  |  Branch (555:11): [True: 0, False: 0]
  ------------------
  556|      0|        BMGen.addCJSModuleStatic(cjsModule->id, index);
  557|      0|      } else {
  558|      0|        BMGen.addCJSModule(index, BMGen.getStringID(cjsModule->filename.str()));
  559|      0|      }
  560|      0|    }
  561|       |
  562|       |    // Add entries to function source table for non-default source.
  563|   103k|    if (!F.isGlobalScope()) {
  ------------------
  |  Branch (563:9): [True: 103k, False: 196]
  ------------------
  564|   103k|      if (auto source = F.getSourceRepresentationStr()) {
  ------------------
  |  Branch (564:16): [True: 0, False: 103k]
  ------------------
  565|      0|        auto it = unicodeFunctionSources.find(*source);
  566|       |        // If the original source was mapped to a re-encoded one in
  567|       |        // unicodeFunctionSources, then use the re-encoded source to lookup the
  568|       |        // string ID. Otherwise it's ASCII and can be used directly.
  569|      0|        if (it != unicodeFunctionSources.end()) {
  ------------------
  |  Branch (569:13): [True: 0, False: 0]
  ------------------
  570|      0|          BMGen.addFunctionSource(
  571|      0|              index,
  572|      0|              BMGen.getStringID(
  573|      0|                  llvh::StringRef{it->second.begin(), it->second.size()}));
  574|      0|        } else {
  575|      0|          BMGen.addFunctionSource(index, BMGen.getStringID(*source));
  576|      0|        }
  577|      0|      }
  578|   103k|    }
  579|   103k|  }
  580|    196|  assert(BMGen.getEntryPointIndex() != -1 && "Entry point not added");
  581|       |
  582|       |  // Construct the relative function scope depth map.
  583|    196|  FunctionScopeAnalysis scopeAnalysis{lexicalTopLevel};
  584|       |
  585|       |  // Allow reusing the debug cache between functions
  586|    196|  FileAndSourceMapIdCache debugCache{};
  587|       |
  588|       |  // Bytecode generation for each function.
  589|   103k|  for (auto &F : *M) {
  ------------------
  |  Branch (589:16): [True: 103k, False: 196]
  ------------------
  590|   103k|    if (!shouldGenerate(&F)) {
  ------------------
  |  Branch (590:9): [True: 0, False: 103k]
  ------------------
  591|      0|      continue;
  592|      0|    }
  593|       |
  594|   103k|    std::unique_ptr<BytecodeFunctionGenerator> funcGen;
  595|       |
  596|   103k|    if (F.isLazy()) {
  ------------------
  |  Branch (596:9): [True: 81, False: 103k]
  ------------------
  597|     81|      funcGen = BytecodeFunctionGenerator::create(BMGen, 0);
  598|   103k|    } else {
  599|   103k|      HVMRegisterAllocator RA(&F);
  600|   103k|      ScopeRegisterAnalysis SRA(&F, RA);
  601|   103k|      if (!options.optimizationEnabled) {
  ------------------
  |  Branch (601:11): [True: 103k, False: 0]
  ------------------
  602|   103k|        RA.setFastPassThreshold(kFastRegisterAllocationThreshold);
  603|   103k|        RA.setMemoryLimit(kRegisterAllocationMemoryLimit);
  604|   103k|      }
  605|   103k|      PostOrderAnalysis PO(&F);
  606|       |      /// The order of the blocks is reverse-post-order, which is a simply
  607|       |      /// topological sort.
  608|   103k|      llvh::SmallVector<BasicBlock *, 16> order(PO.rbegin(), PO.rend());
  609|   103k|      RA.allocate(order);
  610|       |
  611|   103k|      if (options.format == DumpRA) {
  ------------------
  |  Branch (611:11): [True: 0, False: 103k]
  ------------------
  612|      0|        RA.dump();
  613|      0|      }
  614|       |
  615|   103k|      PassManager PM{M->getContext().getCodeGenerationSettings()};
  616|   103k|      PM.addPass<LowerStoreInstrs>(RA);
  617|   103k|      PM.addPass<LowerCalls>(RA);
  618|   103k|      if (options.optimizationEnabled) {
  ------------------
  |  Branch (618:11): [True: 0, False: 103k]
  ------------------
  619|      0|        PM.addPass<MovElimination>(RA);
  620|      0|        PM.addPass<RecreateCheapValues>(RA);
  621|      0|        PM.addPass<LoadConstantValueNumbering>(RA);
  622|      0|      }
  623|   103k|      PM.addPass<SpillRegisters>(RA);
  624|   103k|      if (options.basicBlockProfiling) {
  ------------------
  |  Branch (624:11): [True: 0, False: 103k]
  ------------------
  625|       |        // Insert after all other passes so that it sees final basic block
  626|       |        // list.
  627|      0|        PM.addPass<InsertProfilePoint>();
  628|      0|      }
  629|   103k|      PM.run(&F);
  630|       |
  631|   103k|      if (options.format == DumpLRA)
  ------------------
  |  Branch (631:11): [True: 0, False: 103k]
  ------------------
  632|      0|        RA.dump();
  633|       |
  634|   103k|      if (options.format == DumpPostRA)
  ------------------
  |  Branch (634:11): [True: 0, False: 103k]
  ------------------
  635|      0|        F.dump();
  636|       |
  637|   103k|      funcGen =
  638|   103k|          BytecodeFunctionGenerator::create(BMGen, RA.getMaxRegisterUsage());
  639|   103k|      HBCISel hbciSel(
  640|   103k|          &F, funcGen.get(), RA, scopeAnalysis, SRA, options, debugCache);
  641|   103k|      hbciSel.generate(sourceMapGen);
  642|   103k|    }
  643|       |
  644|   103k|    if (funcGen->hasEncodingError()) {
  ------------------
  |  Branch (644:9): [True: 0, False: 103k]
  ------------------
  645|      0|      M->getContext().getSourceErrorManager().error(
  646|      0|          F.getSourceRange().Start, "Error encoding bytecode");
  647|      0|      return nullptr;
  648|      0|    }
  649|   103k|    BMGen.setFunctionGenerator(&F, std::move(funcGen));
  650|   103k|  }
  651|       |
  652|    196|  return BMGen.generate();
  653|    196|}
HBC.cpp:_ZN12_GLOBAL__N_17lowerIREPN6hermes6ModuleERKNS0_25BytecodeGenerationOptionsE:
   50|    196|void lowerIR(Module *M, const BytecodeGenerationOptions &options) {
   51|    196|  if (M->isLowered())
  ------------------
  |  Branch (51:7): [True: 0, False: 196]
  ------------------
   52|      0|    return;
   53|       |
   54|    196|  PassManager PM{M->getContext().getCodeGenerationSettings()};
   55|    196|  PM.addPass<LowerLoadStoreFrameInst>();
   56|    196|  if (options.optimizationEnabled) {
  ------------------
  |  Branch (56:7): [True: 0, False: 196]
  ------------------
   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|    196|  PM.addPass<LowerExponentiationOperator>();
   63|       |  // LowerBuiltinCalls needs to run before the rest of the lowering.
   64|    196|  PM.addPass<LowerBuiltinCalls>();
   65|       |  // It is important to run LowerNumericProperties before LoadConstants
   66|       |  // as LowerNumericProperties could generate new constants.
   67|    196|  PM.addPass<LowerNumericProperties>();
   68|    196|  PM.addPass<LowerConstruction>();
   69|    196|  PM.addPass<LowerArgumentsArray>();
   70|    196|  PM.addPass<LimitAllocArray>(UINT16_MAX);
   71|    196|  PM.addPass<DedupReifyArguments>();
   72|    196|  PM.addPass<LowerSwitchIntoJumpTables>();
   73|    196|  PM.addPass<SwitchLowering>();
   74|    196|  PM.addPass<LoadConstants>();
   75|    196|  PM.addPass<LoadParameters>();
   76|    196|  if (options.optimizationEnabled) {
  ------------------
  |  Branch (76:7): [True: 0, False: 196]
  ------------------
   77|       |    // Lowers AllocObjects and its sequential literal properties into a single
   78|       |    // HBCAllocObjectFromBufferInst
   79|      0|    PM.addPass<LowerAllocObject>();
   80|       |    // Reduce comparison and conditional jump to single comparison jump
   81|      0|    PM.addPass<LowerCondBranch>();
   82|       |    // Turn Calls into CallNs.
   83|      0|    PM.addPass<FuncCallNOpts>();
   84|       |    // Move loads to child blocks if possible.
   85|      0|    PM.addCodeMotion();
   86|       |    // Eliminate common HBCLoadConstInsts.
   87|      0|    PM.addCSE();
   88|       |    // Drop unused HBCLoadParamInsts.
   89|      0|    PM.addDCE();
   90|      0|  }
   91|       |
   92|       |  // Move StartGenerator instructions to the start of functions.
   93|    196|  PM.addHoistStartGenerator();
   94|       |
   95|    196|  PM.run(M);
   96|    196|  M->setLowered(true);
   97|       |
   98|    196|  if (options.verifyIR &&
  ------------------
  |  Branch (98:7): [True: 0, False: 196]
  ------------------
   99|    196|      verifyModule(*M, &llvh::errs(), VerificationMode::IR_VALID)) {
  ------------------
  |  Branch (99:7): [True: 0, False: 0]
  ------------------
  100|      0|    M->dump();
  101|      0|    hermes_fatal("IR verification failed");
  102|      0|  }
  103|    196|}
HBC.cpp:_ZZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEEENK3$_3clEN4llvh9StringRefE:
  475|   103k|    auto addString = [&strings](llvh::StringRef str) {
  476|   103k|      strings.addString(str, /* isIdentifier */ false);
  477|   103k|    };
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilderC2EPN6hermes6ModuleERKNSt3__18functionIFbPKNS1_8FunctionEEEERNS1_3hbc23BytecodeModuleGeneratorEb:
  203|    196|      : M_(m),
  204|    196|        shouldVisitFunction_(shouldVisitFunction),
  205|    196|        bmGen_(bmGen),
  206|    196|        optimize_(optimize),
  207|    196|        literalGenerator_(bmGen) {}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder8generateEv:
  269|    196|void LiteralBufferBuilder::generate() {
  270|    196|  traverse();
  271|       |
  272|       |  // Construct the serialized storage, optionally optimizing it.
  273|    196|  ConsecutiveStringStorage arrayStorage{
  274|    196|      arrays_.beginSet(), arrays_.endSet(), std::true_type{}, optimize_};
  275|    196|  ConsecutiveStringStorage keyStorage{
  276|    196|      objKeys_.beginSet(), objKeys_.endSet(), std::true_type{}, optimize_};
  277|    196|  ConsecutiveStringStorage valStorage{
  278|    196|      objVals_.beginSet(), objVals_.endSet(), std::true_type{}, optimize_};
  279|       |
  280|       |  // Populate the offset map.
  281|    196|  BytecodeModuleGenerator::LiteralOffsetMapTy literalOffsetMap{};
  282|       |
  283|       |  // Visit all array literals.
  284|    196|  auto arrayView = const_cast<const ConsecutiveStringStorage &>(arrayStorage)
  285|    196|                       .getStringTableView();
  286|    297|  for (size_t i = 0, e = arraysInst_.size(); i != e; ++i) {
  ------------------
  |  Branch (286:46): [True: 101, False: 196]
  ------------------
  287|    101|    assert(
  288|    101|        literalOffsetMap.count(arraysInst_[i]) == 0 &&
  289|    101|        "instruction literal can't be serialized twice");
  290|    101|    uint32_t arrayIndexInSet = arrays_.indexInSet(i);
  291|    101|    literalOffsetMap[arraysInst_[i]] = BytecodeModuleGenerator::LiteralOffset{
  292|    101|        arrayView[arrayIndexInSet].getOffset(), UINT32_MAX};
  293|    101|  }
  294|       |
  295|       |  // Visit all object literals - they are split in two buffers.
  296|    196|  auto keyView = const_cast<const ConsecutiveStringStorage &>(keyStorage)
  297|    196|                     .getStringTableView();
  298|    196|  auto valView = const_cast<const ConsecutiveStringStorage &>(valStorage)
  299|    196|                     .getStringTableView();
  300|    196|  for (size_t i = 0, e = objInst_.size(); i != e; ++i) {
  ------------------
  |  Branch (300:43): [True: 0, False: 196]
  ------------------
  301|      0|    assert(
  302|      0|        literalOffsetMap.count(objInst_[i]) == 0 &&
  303|      0|        "instruction literal can't be serialized twice");
  304|      0|    uint32_t keyIndexInSet = objKeys_.indexInSet(i);
  305|      0|    uint32_t valIndexInSet = objVals_.indexInSet(i);
  306|      0|    literalOffsetMap[objInst_[i]] = BytecodeModuleGenerator::LiteralOffset{
  307|      0|        keyView[keyIndexInSet].getOffset(), valView[valIndexInSet].getOffset()};
  308|      0|  }
  309|       |
  310|    196|  bmGen_.initializeSerializedLiterals(
  311|    196|      arrayStorage.acquireStringStorage(),
  312|    196|      keyStorage.acquireStringStorage(),
  313|    196|      valStorage.acquireStringStorage(),
  314|    196|      std::move(literalOffsetMap));
  315|    196|}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder8traverseEv:
  317|    196|void LiteralBufferBuilder::traverse() {
  318|   103k|  for (auto &F : *M_) {
  ------------------
  |  Branch (318:16): [True: 103k, False: 196]
  ------------------
  319|   103k|    if (!shouldVisitFunction_(&F))
  ------------------
  |  Branch (319:9): [True: 0, False: 103k]
  ------------------
  320|      0|      continue;
  321|       |
  322|   843k|    for (auto &BB : F) {
  ------------------
  |  Branch (322:19): [True: 843k, False: 103k]
  ------------------
  323|  6.18M|      for (auto &I : BB) {
  ------------------
  |  Branch (323:20): [True: 6.18M, False: 843k]
  ------------------
  324|  6.18M|        if (auto *AAI = dyn_cast<AllocArrayInst>(&I)) {
  ------------------
  |  Branch (324:19): [True: 101, False: 6.18M]
  ------------------
  325|    101|          serializeLiteralFor(AAI);
  326|  6.18M|        } else if (auto *AOFB = dyn_cast<HBCAllocObjectFromBufferInst>(&I)) {
  ------------------
  |  Branch (326:26): [True: 0, False: 6.18M]
  ------------------
  327|      0|          serializeLiteralFor(AOFB);
  328|      0|        }
  329|  6.18M|      }
  330|   843k|    }
  331|   103k|  }
  332|    196|}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder19serializeLiteralForEPN6hermes14AllocArrayInstE:
  344|    101|void LiteralBufferBuilder::serializeLiteralFor(AllocArrayInst *AAI) {
  345|    101|  SmallVector<Literal *, 8> elements;
  346|   411k|  for (unsigned i = 0, e = AAI->getElementCount(); i < e; ++i) {
  ------------------
  |  Branch (346:52): [True: 411k, False: 101]
  ------------------
  347|   411k|    elements.push_back(cast<Literal>(AAI->getArrayElement(i)));
  348|   411k|  }
  349|       |
  350|    101|  serializeInto(arrays_, elements, false);
  351|    101|  arraysInst_.push_back(AAI);
  352|    101|}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder13serializeIntoERNS_19UniquedStringVectorEN4llvh8ArrayRefIPN6hermes7LiteralEEEb:
  337|    101|    bool isKeyBuffer) {
  338|    101|  tempBuffer_.clear();
  339|    101|  literalGenerator_.serializeBuffer(elements, tempBuffer_, isKeyBuffer);
  340|    101|  dest.push_back(
  341|    101|      llvh::StringRef((const char *)tempBuffer_.data(), tempBuffer_.size()));
  342|    101|}
HBC.cpp:_ZN12_GLOBAL__N_119UniquedStringVector9push_backEN4llvh9StringRefE:
  151|    101|  void push_back(llvh::StringRef str) {
  152|    101|    indexInSet_.push_back(set_.insert(str));
  153|    101|  }
HBC.cpp:_ZNK12_GLOBAL__N_119UniquedStringVector8beginSetEv:
  163|    588|  StringSetVector::const_iterator beginSet() const {
  164|    588|    return set_.begin();
  165|    588|  }
HBC.cpp:_ZNK12_GLOBAL__N_119UniquedStringVector6endSetEv:
  168|    588|  StringSetVector::const_iterator endSet() const {
  169|    588|    return set_.end();
  170|    588|  }
HBC.cpp:_ZNK12_GLOBAL__N_119UniquedStringVector10indexInSetEm:
  174|    101|  uint32_t indexInSet(size_t insertionIndex) const {
  175|    101|    return indexInSet_[insertionIndex];
  176|    101|  }
HBC.cpp:_ZZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEEENK3$_1clEPKS3_:
  449|   620k|    shouldGenerate = [](const Function *) { return true; };
HBC.cpp:_ZZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEEENK3$_2clEN4llvh9StringRefEb:
  471|   966k|    auto addStringOrIdent = [&strings](llvh::StringRef str, bool isIdentifier) {
  472|   966k|      strings.addString(str, isIdentifier);
  473|   966k|    };

_ZN6hermes3hbc20HVMRegisterAllocator17handleInstructionEPNS_11InstructionE:
   59|  5.98M|void HVMRegisterAllocator::handleInstruction(Instruction *I) {
   60|  5.98M|  if (auto *CI = llvh::dyn_cast<CallInst>(I)) {
  ------------------
  |  Branch (60:13): [True: 30.7k, False: 5.95M]
  ------------------
   61|  30.7k|    return allocateCallInst(CI);
   62|  30.7k|  }
   63|  5.98M|}
_ZN6hermes3hbc20HVMRegisterAllocator25hasTargetSpecificLoweringEPNS_11InstructionE:
   65|     80|bool HVMRegisterAllocator::hasTargetSpecificLowering(Instruction *I) {
   66|     80|  return llvh::isa<CallInst>(I);
   67|     80|}
_ZN6hermes3hbc20HVMRegisterAllocator16allocateCallInstEPNS_8CallInstE:
   69|  30.7k|void HVMRegisterAllocator::allocateCallInst(CallInst *I) {
   70|  30.7k|  allocateParameterCount(I->getNumArguments() + CALL_EXTRA_REGISTERS);
   71|  30.7k|}
_ZN6hermes3hbc7HBCISel11encodeValueEPNS_5ValueE:
   73|  14.5M|unsigned HBCISel::encodeValue(Value *value) {
   74|  14.5M|  if (llvh::isa<Instruction>(value)) {
  ------------------
  |  Branch (74:7): [True: 14.4M, False: 104k]
  ------------------
   75|  14.4M|    return RA_.getRegister(value).getIndex();
   76|  14.4M|  } else if (auto *var = llvh::dyn_cast<Variable>(value)) {
  ------------------
  |  Branch (76:20): [True: 104k, False: 0]
  ------------------
   77|   104k|    return var->getIndexInVariableList();
   78|   104k|  } else {
   79|      0|    llvm_unreachable("Do not support other value types");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   80|      0|  }
   81|  14.5M|}
_ZN6hermes3hbc7HBCISel16registerLongJumpEjPNS_10BasicBlockE:
   83|   116k|void HBCISel::registerLongJump(offset_t loc, BasicBlock *target) {
   84|   116k|  relocations_.push_back(
   85|   116k|      {loc, Relocation::RelocationType::LongJumpType, target});
   86|   116k|}
_ZN6hermes3hbc7HBCISel18resolveRelocationsEv:
   93|   103k|void HBCISel::resolveRelocations() {
   94|   103k|  bool changed;
   95|   106k|  do {
   96|   106k|    int totalShift = 0;
   97|   106k|    changed = false;
   98|   617M|    for (auto &relocation : relocations_) {
  ------------------
  |  Branch (98:27): [True: 617M, False: 106k]
  ------------------
   99|   617M|      auto loc = relocation.loc;
  100|   617M|      auto *pointer = relocation.pointer;
  101|   617M|      auto type = relocation.type;
  102|   617M|      loc -= totalShift;
  103|   617M|      relocation.loc = loc;
  104|   617M|      switch (type) {
  ------------------
  |  Branch (104:15): [True: 0, False: 617M]
  ------------------
  105|  10.8M|        case Relocation::LongJumpType: {
  ------------------
  |  Branch (105:9): [True: 10.8M, False: 606M]
  ------------------
  106|  10.8M|          int targetLoc = basicBlockMap_[cast<BasicBlock>(pointer)].first;
  107|  10.8M|          int jumpOffset = targetLoc - loc;
  108|  10.8M|          if (-128 <= jumpOffset && jumpOffset < 128) {
  ------------------
  |  Branch (108:15): [True: 10.8M, False: 1]
  |  Branch (108:37): [True: 107k, False: 10.7M]
  ------------------
  109|       |            // The jump offset can fit into one byte.
  110|   107k|            totalShift += 3;
  111|   107k|            BCFGen_->shrinkJump(loc + 1);
  112|   107k|            BCFGen_->updateJumpTarget(loc + 1, jumpOffset, 1);
  113|   107k|            relocation.type = Relocation::JumpType;
  114|   107k|            changed = true;
  115|  10.7M|          } else {
  116|  10.7M|            BCFGen_->updateJumpTarget(loc + 1, jumpOffset, 4);
  117|  10.7M|          }
  118|  10.8M|          break;
  119|      0|        }
  120|   102M|        case Relocation::BasicBlockType:
  ------------------
  |  Branch (120:9): [True: 102M, False: 514M]
  ------------------
  121|   102M|          basicBlockMap_[cast<BasicBlock>(pointer)].first = loc;
  122|   102M|          break;
  123|  9.76M|        case Relocation::JumpType: {
  ------------------
  |  Branch (123:9): [True: 9.76M, False: 607M]
  ------------------
  124|  9.76M|          int targetLoc = basicBlockMap_[cast<BasicBlock>(pointer)].first;
  125|  9.76M|          int jumpOffset = targetLoc - loc;
  126|  9.76M|          BCFGen_->updateJumpTarget(loc + 1, jumpOffset, 1);
  127|  9.76M|          break;
  128|      0|        }
  129|  8.49M|        case Relocation::CatchType:
  ------------------
  |  Branch (129:9): [True: 8.49M, False: 608M]
  ------------------
  130|  8.49M|          catchInfoMap_[cast<CatchInst>(pointer)].catchLocation = loc;
  131|  8.49M|          break;
  132|   485M|        case Relocation::DebugInfo:
  ------------------
  |  Branch (132:9): [True: 485M, False: 131M]
  ------------------
  133|       |          // Nothing, just keep track of the location.
  134|   485M|          break;
  135|     51|        case Relocation::TextifiedCallee:
  ------------------
  |  Branch (135:9): [True: 51, False: 617M]
  ------------------
  136|       |          // Nothing to update.
  137|     51|          break;
  138|      0|        case Relocation::JumpTableDispatch:
  ------------------
  |  Branch (138:9): [True: 0, False: 617M]
  ------------------
  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|   617M|      }
  147|       |
  148|   617M|      NumJumpPass++;
  149|   617M|    }
  150|   106k|  } while (changed);
  ------------------
  |  Branch (150:12): [True: 3.16k, False: 103k]
  ------------------
  151|   103k|}
_ZN6hermes3hbc7HBCISel24resolveExceptionHandlersEv:
  153|   103k|void HBCISel::resolveExceptionHandlers() {
  154|   103k|  if (catchInfoMap_.empty()) {
  ------------------
  |  Branch (154:7): [True: 103k, False: 18]
  ------------------
  155|       |    // No exception handling, no need to do anything.
  156|   103k|    return;
  157|   103k|  }
  158|       |
  159|     18|  BasicBlockInfoMap bbMap;
  160|   604k|  for (auto it : basicBlockMap_) {
  ------------------
  |  Branch (160:16): [True: 604k, False: 18]
  ------------------
  161|   604k|    bbMap[it.first] =
  162|   604k|        std::make_pair(it.second.first, basicBlockMap_[it.second.second].first);
  163|   604k|  }
  164|     18|  auto exceptionEntries = generateExceptionHandlers(catchInfoMap_, bbMap, F_);
  165|  38.5k|  for (auto entry : exceptionEntries) {
  ------------------
  |  Branch (165:19): [True: 38.5k, False: 18]
  ------------------
  166|  38.5k|    BCFGen_->addExceptionHandler(
  167|  38.5k|        HBCExceptionHandlerInfo{entry.start, entry.end, entry.target});
  168|  38.5k|  }
  169|     18|}
_ZN6hermes3hbc7HBCISel17generateJumpTableEv:
  171|   103k|void HBCISel::generateJumpTable() {
  172|   103k|  using SwitchInfoEntry =
  173|   103k|      llvh::DenseMap<SwitchImmInst *, SwitchImmInfo>::iterator::value_type;
  174|       |
  175|   103k|  if (switchImmInfo_.empty())
  ------------------
  |  Branch (175:7): [True: 103k, False: 0]
  ------------------
  176|   103k|    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|  4.28M|    DebugSourceLocation *out) {
  212|  4.28M|  SourceErrorManager::SourceCoords coords{};
  213|  4.28M|  if (!manager.findBufferLineAndLoc(loc, coords, /*translate*/ true)) {
  ------------------
  |  Branch (213:7): [True: 0, False: 4.28M]
  ------------------
  214|      0|    return false;
  215|      0|  }
  216|       |
  217|  4.28M|  auto ids = obtainFileAndSourceMapId(manager, coords.bufId);
  218|       |
  219|  4.28M|  out->line = coords.line;
  220|  4.28M|  out->column = coords.col;
  221|  4.28M|  out->filenameId = ids.filenameId;
  222|  4.28M|  out->sourceMappingUrlId = ids.sourceMappingUrlId;
  223|       |
  224|  4.28M|  return true;
  225|  4.28M|}
_ZN6hermes3hbc7HBCISel26addDebugSourceLocationInfoEPNS_18SourceMapGeneratorE:
  277|   103k|void HBCISel::addDebugSourceLocationInfo(SourceMapGenerator *outSourceMap) {
  278|   103k|  bool needDebugStatementNo =
  279|   103k|      F_->getContext().getDebugInfoSetting() == DebugInfoSetting::ALL ||
  ------------------
  |  Branch (279:7): [True: 103k, False: 0]
  ------------------
  280|   103k|      F_->getContext().getDebugInfoSetting() == DebugInfoSetting::SOURCE_MAP;
  ------------------
  |  Branch (280:7): [True: 0, False: 0]
  ------------------
  281|   103k|  auto &manager = F_->getContext().getSourceErrorManager();
  282|   103k|  IRBuilder builder(F_);
  283|       |
  284|   103k|  DebugSourceLocation info{};
  285|       |
  286|   103k|  bool hasDebugInfo = false;
  287|  5.07M|  for (auto &reloc : relocations_) {
  ------------------
  |  Branch (287:20): [True: 5.07M, False: 103k]
  ------------------
  288|  5.07M|    if (reloc.type != Relocation::DebugInfo)
  ------------------
  |  Branch (288:9): [True: 897k, False: 4.18M]
  ------------------
  289|   897k|      continue;
  290|  4.18M|    hasDebugInfo = true;
  291|  4.18M|    auto *inst = cast<Instruction>(reloc.pointer);
  292|       |
  293|  4.18M|    assert(inst->hasLocation() && "Missing location");
  294|  4.18M|    auto location = inst->getLocation();
  295|       |
  296|  4.18M|    if (LLVM_UNLIKELY(!getDebugSourceLocation(manager, location, &info))) {
  ------------------
  |  |  189|  4.18M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.18M]
  |  |  ------------------
  ------------------
  297|      0|      hermes_fatal("Unable to get source location");
  298|      0|    }
  299|  4.18M|    std::pair<Register, ScopeDesc *> regAndScopeDesc =
  300|  4.18M|        SRA_.registerAndScopeForInstruction(inst);
  301|  4.18M|    info.address = reloc.loc;
  302|  4.18M|    info.statement = needDebugStatementNo ? inst->getStatementIndex() : 0;
  ------------------
  |  Branch (302:22): [True: 4.18M, False: 0]
  ------------------
  303|       |    /// The scope offset in the debug information is only available very late in
  304|       |    /// the compilation pipeline; Thus, populate info.scopeAddress with and ID
  305|       |    /// that is then used to find the correct value for this field.
  306|  4.18M|    info.scopeAddress = BCFGen_->getScopeDescID(regAndScopeDesc.second);
  307|  4.18M|    info.envReg = !regAndScopeDesc.first.isValid()
  ------------------
  |  Branch (307:19): [True: 0, False: 4.18M]
  ------------------
  308|  4.18M|        ? DebugSourceLocation::NO_REG
  309|  4.18M|        : regAndScopeDesc.first.getIndex();
  310|  4.18M|    BCFGen_->addDebugSourceLocation(info);
  311|  4.18M|  }
  312|       |
  313|       |  // If there's no debug info, don't set the function location.
  314|       |  // This avoids polluting the string table with source file names.
  315|   103k|  if (hasDebugInfo) {
  ------------------
  |  Branch (315:7): [True: 103k, False: 0]
  ------------------
  316|   103k|    getDebugSourceLocation(manager, F_->getSourceRange().Start, &info);
  317|   103k|    info.address = 0;
  318|   103k|    info.statement = 0;
  319|   103k|    info.scopeAddress = BCFGen_->getScopeDescID(F_->getFunctionScopeDesc());
  320|   103k|    info.envReg = 0;
  321|   103k|    BCFGen_->setSourceLocation(info);
  322|   103k|  }
  323|   103k|}
_ZN6hermes3hbc7HBCISel27addDebugTextifiedCalleeInfoEv:
  325|   103k|void HBCISel::addDebugTextifiedCalleeInfo() {
  326|  5.07M|  for (auto &reloc : relocations_) {
  ------------------
  |  Branch (326:20): [True: 5.07M, False: 103k]
  ------------------
  327|  5.07M|    if (reloc.type != Relocation::TextifiedCallee)
  ------------------
  |  Branch (327:9): [True: 5.07M, False: 19]
  ------------------
  328|  5.07M|      continue;
  329|     19|    BCFGen_->addDebugTextfiedCallee(
  330|     19|        {reloc.loc, llvh::cast<LiteralString>(reloc.pointer)->getValue()});
  331|     19|  }
  332|   103k|}
_ZN6hermes3hbc7HBCISel27populatePropertyCachingInfoEv:
  334|   103k|void HBCISel::populatePropertyCachingInfo() {
  335|   103k|  BCFGen_->setHighestReadCacheIndex(lastPropertyReadCacheIndex_);
  336|   103k|  BCFGen_->setHighestWriteCacheIndex(lastPropertyWriteCacheIndex_);
  337|   103k|}
_ZN6hermes3hbc7HBCISel20generateAsNumberInstEPNS_12AsNumberInstEPNS_10BasicBlockE:
  372|    509|void HBCISel::generateAsNumberInst(AsNumberInst *Inst, BasicBlock *next) {
  373|    509|  auto dst = encodeValue(Inst);
  374|    509|  auto src = encodeValue(Inst->getSingleOperand());
  375|    509|  BCFGen_->emitToNumber(dst, src);
  376|    509|}
_ZN6hermes3hbc7HBCISel15emitMovIfNeededEll:
  390|  3.86M|void HBCISel::emitMovIfNeeded(param_t dest, param_t src) {
  391|  3.86M|  if (dest == src)
  ------------------
  |  Branch (391:7): [True: 18.5k, False: 3.84M]
  ------------------
  392|  18.5k|    return;
  393|  3.84M|  if (dest <= UINT8_MAX && src <= UINT8_MAX) {
  ------------------
  |  Branch (393:7): [True: 960k, False: 2.88M]
  |  Branch (393:28): [True: 228k, False: 732k]
  ------------------
  394|   228k|    BCFGen_->emitMov(dest, src);
  395|  3.61M|  } else {
  396|  3.61M|    BCFGen_->emitMovLong(dest, src);
  397|  3.61M|  }
  398|  3.84M|}
_ZN6hermes3hbc7HBCISel10verifyCallEPNS_8CallInstE:
  406|  30.7k|void HBCISel::verifyCall(CallInst *Inst) {
  407|  30.7k|#ifndef NDEBUG
  408|  30.7k|  const auto lastArgReg = RA_.getLastRegister().getIndex() -
  409|  30.7k|      HVMRegisterAllocator::CALL_EXTRA_REGISTERS;
  410|       |
  411|  30.7k|  const bool isBuiltin = llvh::isa<CallBuiltinInst>(Inst);
  412|  30.7k|  const bool isCallN = llvh::isa<HBCCallNInst>(Inst);
  413|       |
  414|   795k|  for (unsigned i = 0, max = Inst->getNumArguments(); i < max; i++) {
  ------------------
  |  Branch (414:55): [True: 764k, False: 30.7k]
  ------------------
  415|   764k|    Value *argument = Inst->getArgument(i);
  416|       |    // The first argument (thisArg) of CallBuiltin LiteralUndefined.
  417|   764k|    if (isBuiltin && i == 0) {
  ------------------
  |  Branch (417:9): [True: 382k, False: 382k]
  |  Branch (417:22): [True: 2.82k, False: 379k]
  ------------------
  418|  2.82k|      assert(
  419|  2.82k|          llvh::isa<LiteralUndefined>(argument) && !RA_.isAllocated(argument) &&
  420|  2.82k|          "Register for 'this' argument is misallocated");
  421|   761k|    } else if (isCallN) {
  ------------------
  |  Branch (421:16): [True: 0, False: 761k]
  ------------------
  422|       |      // CallN may take arguments from anywhere except for the last N registers
  423|       |      // of the frame, because the bytecode instruction overwrites those
  424|       |      // registers. Note that <= is correct because lastArgReg is the index of
  425|       |      // the last register, not the count of registers.
  426|      0|      assert(
  427|      0|          llvh::isa<Instruction>(argument) &&
  428|      0|          RA_.getRegister(argument).getIndex() <= lastArgReg - max);
  429|   761k|    } else {
  430|       |      // Calls require that the arguments be at the end of the frame, in reverse
  431|       |      // order.
  432|   761k|      assert(
  433|   761k|          llvh::isa<Instruction>(argument) &&
  434|   761k|          RA_.getRegister(argument).getIndex() == lastArgReg - i &&
  435|   761k|          "Register is misallocated");
  436|   761k|    }
  437|   764k|  }
  438|  30.7k|#endif
  439|  30.7k|}
_ZN6hermes3hbc7HBCISel21generateLoadStackInstEPNS_13LoadStackInstEPNS_10BasicBlockE:
  441|   128k|void HBCISel::generateLoadStackInst(LoadStackInst *Inst, BasicBlock *next) {
  442|   128k|  auto dst = encodeValue(Inst);
  443|   128k|  auto src = encodeValue(Inst->getSingleOperand());
  444|   128k|  emitMovIfNeeded(dst, src);
  445|   128k|}
_ZN6hermes3hbc7HBCISel15generateMovInstEPNS_7MovInstEPNS_10BasicBlockE:
  446|  1.34M|void HBCISel::generateMovInst(MovInst *Inst, BasicBlock *next) {
  447|  1.34M|  auto dst = encodeValue(Inst);
  448|  1.34M|  auto src = encodeValue(Inst->getSingleOperand());
  449|  1.34M|  emitMovIfNeeded(dst, src);
  450|  1.34M|}
_ZN6hermes3hbc7HBCISel23generateImplicitMovInstEPNS_15ImplicitMovInstEPNS_10BasicBlockE:
  452|  2.82k|void HBCISel::generateImplicitMovInst(ImplicitMovInst *Inst, BasicBlock *next) {
  453|       |  // ImplicitMovs produce no bytecode, they only express that a subsequent
  454|       |  // instruction will perform the equivalent of a 'Mov'.
  455|  2.82k|}
_ZN6hermes3hbc7HBCISel25generateUnaryOperatorInstEPNS_17UnaryOperatorInstEPNS_10BasicBlockE:
  459|  25.3k|    BasicBlock *next) {
  460|  25.3k|  auto opReg = encodeValue(Inst->getSingleOperand());
  461|  25.3k|  auto resReg = encodeValue(Inst);
  462|       |
  463|  25.3k|  using OpKind = UnaryOperatorInst::OpKind;
  464|       |
  465|  25.3k|  switch (Inst->getOperatorKind()) {
  466|     10|    case OpKind::TypeofKind: { // typeof
  ------------------
  |  Branch (466:5): [True: 10, False: 25.3k]
  ------------------
  467|     10|      BCFGen_->emitTypeOf(resReg, opReg);
  468|     10|      break;
  469|      0|    }
  470|  21.8k|    case OpKind::MinusKind: { // -
  ------------------
  |  Branch (470:5): [True: 21.8k, False: 3.57k]
  ------------------
  471|  21.8k|      BCFGen_->emitNegate(resReg, opReg);
  472|  21.8k|      break;
  473|      0|    }
  474|  3.54k|    case OpKind::TildeKind: { // ~
  ------------------
  |  Branch (474:5): [True: 3.54k, False: 21.8k]
  ------------------
  475|  3.54k|      BCFGen_->emitBitNot(resReg, opReg);
  476|  3.54k|      break;
  477|      0|    }
  478|     24|    case OpKind::BangKind: { // !
  ------------------
  |  Branch (478:5): [True: 24, False: 25.3k]
  ------------------
  479|     24|      BCFGen_->emitNot(resReg, opReg);
  480|     24|      break;
  481|      0|    }
  482|      0|    case OpKind::VoidKind: { // Void operator.
  ------------------
  |  Branch (482:5): [True: 0, False: 25.3k]
  ------------------
  483|      0|      BCFGen_->emitLoadConstUndefined(resReg);
  484|      0|      break;
  485|      0|    }
  486|      1|    case OpKind::IncKind: { // ++
  ------------------
  |  Branch (486:5): [True: 1, False: 25.3k]
  ------------------
  487|      1|      BCFGen_->emitInc(resReg, opReg);
  488|      1|      break;
  489|      0|    }
  490|      0|    case OpKind::DecKind: { // --
  ------------------
  |  Branch (490:5): [True: 0, False: 25.3k]
  ------------------
  491|      0|      BCFGen_->emitDec(resReg, opReg);
  492|      0|      break;
  493|      0|    }
  494|      0|    default:
  ------------------
  |  Branch (494:5): [True: 0, False: 25.3k]
  ------------------
  495|      0|      llvm_unreachable("Can't handle this operation");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  496|      0|      break;
  497|  25.3k|  }
  498|  25.3k|}
_ZN6hermes3hbc7HBCISel15generatePhiInstEPNS_7PhiInstEPNS_10BasicBlockE:
  502|  4.39k|void HBCISel::generatePhiInst(PhiInst *Inst, BasicBlock *next) {
  503|       |  // PhiInst has been translated into a sequence of MOVs in RegAlloc
  504|       |  // Nothing to do here.
  505|  4.39k|}
_ZN6hermes3hbc7HBCISel26generateBinaryOperatorInstEPNS_18BinaryOperatorInstEPNS_10BasicBlockE:
  508|   157k|    BasicBlock *next) {
  509|   157k|  auto left = encodeValue(Inst->getLeftHandSide());
  510|   157k|  auto right = encodeValue(Inst->getRightHandSide());
  511|   157k|  auto res = encodeValue(Inst);
  512|       |
  513|   157k|  bool isBothNumber = Inst->getLeftHandSide()->getType().isNumberType() &&
  ------------------
  |  Branch (513:23): [True: 35, False: 157k]
  ------------------
  514|   157k|      Inst->getRightHandSide()->getType().isNumberType();
  ------------------
  |  Branch (514:7): [True: 26, False: 9]
  ------------------
  515|       |
  516|   157k|  using OpKind = BinaryOperatorInst::OpKind;
  517|       |
  518|   157k|  switch (Inst->getOperatorKind()) {
  519|    955|    case OpKind::EqualKind: // ==
  ------------------
  |  Branch (519:5): [True: 955, False: 156k]
  ------------------
  520|       |      // TODO: optimize the case for null check.
  521|    955|      BCFGen_->emitEq(res, left, right);
  522|    955|      break;
  523|      0|    case OpKind::NotEqualKind: // !=
  ------------------
  |  Branch (523:5): [True: 0, False: 157k]
  ------------------
  524|       |      // TODO: optimize the case for null check.
  525|      0|      BCFGen_->emitNeq(res, left, right);
  526|      0|      break;
  527|  20.3k|    case OpKind::StrictlyEqualKind: // ===
  ------------------
  |  Branch (527:5): [True: 20.3k, False: 136k]
  ------------------
  528|  20.3k|      BCFGen_->emitStrictEq(res, left, right);
  529|  20.3k|      break;
  530|      0|    case OpKind::StrictlyNotEqualKind: // !===
  ------------------
  |  Branch (530:5): [True: 0, False: 157k]
  ------------------
  531|      0|      BCFGen_->emitStrictNeq(res, left, right);
  532|      0|      break;
  533|      7|    case OpKind::LessThanKind: // <
  ------------------
  |  Branch (533:5): [True: 7, False: 157k]
  ------------------
  534|      7|      BCFGen_->emitLess(res, left, right);
  535|      7|      break;
  536|      0|    case OpKind::LessThanOrEqualKind: // <=
  ------------------
  |  Branch (536:5): [True: 0, False: 157k]
  ------------------
  537|      0|      BCFGen_->emitLessEq(res, left, right);
  538|      0|      break;
  539|  1.21k|    case OpKind::GreaterThanKind: // >
  ------------------
  |  Branch (539:5): [True: 1.21k, False: 155k]
  ------------------
  540|  1.21k|      BCFGen_->emitGreater(res, left, right);
  541|  1.21k|      break;
  542|      0|    case OpKind::GreaterThanOrEqualKind: // >=
  ------------------
  |  Branch (542:5): [True: 0, False: 157k]
  ------------------
  543|      0|      BCFGen_->emitGreaterEq(res, left, right);
  544|      0|      break;
  545|      0|    case OpKind::LeftShiftKind: // <<  (<<=)
  ------------------
  |  Branch (545:5): [True: 0, False: 157k]
  ------------------
  546|      0|      BCFGen_->emitLShift(res, left, right);
  547|      0|      break;
  548|      6|    case OpKind::RightShiftKind: // >>  (>>=)
  ------------------
  |  Branch (548:5): [True: 6, False: 157k]
  ------------------
  549|      6|      BCFGen_->emitRShift(res, left, right);
  550|      6|      break;
  551|      0|    case OpKind::UnsignedRightShiftKind: // >>> (>>>=)
  ------------------
  |  Branch (551:5): [True: 0, False: 157k]
  ------------------
  552|      0|      BCFGen_->emitURshift(res, left, right);
  553|      0|      break;
  554|  34.2k|    case OpKind::AddKind: // +   (+=)
  ------------------
  |  Branch (554:5): [True: 34.2k, False: 122k]
  ------------------
  555|  34.2k|      if (isBothNumber) {
  ------------------
  |  Branch (555:11): [True: 2, False: 34.2k]
  ------------------
  556|      2|        BCFGen_->emitAddN(res, left, right);
  557|  34.2k|      } else {
  558|  34.2k|        BCFGen_->emitAdd(res, left, right);
  559|  34.2k|      }
  560|  34.2k|      break;
  561|    637|    case OpKind::SubtractKind: // -   (-=)
  ------------------
  |  Branch (561:5): [True: 637, False: 156k]
  ------------------
  562|    637|      if (isBothNumber) {
  ------------------
  |  Branch (562:11): [True: 1, False: 636]
  ------------------
  563|      1|        BCFGen_->emitSubN(res, left, right);
  564|    636|      } else {
  565|    636|        BCFGen_->emitSub(res, left, right);
  566|    636|      }
  567|    637|      break;
  568|    935|    case OpKind::MultiplyKind: // *   (*=)
  ------------------
  |  Branch (568:5): [True: 935, False: 156k]
  ------------------
  569|    935|      if (isBothNumber) {
  ------------------
  |  Branch (569:11): [True: 1, False: 934]
  ------------------
  570|      1|        BCFGen_->emitMulN(res, left, right);
  571|    934|      } else {
  572|    934|        BCFGen_->emitMul(res, left, right);
  573|    934|      }
  574|    935|      break;
  575|  3.22k|    case OpKind::DivideKind: // /   (/=)
  ------------------
  |  Branch (575:5): [True: 3.22k, False: 153k]
  ------------------
  576|  3.22k|      if (isBothNumber) {
  ------------------
  |  Branch (576:11): [True: 22, False: 3.19k]
  ------------------
  577|     22|        BCFGen_->emitDivN(res, left, right);
  578|  3.19k|      } else {
  579|  3.19k|        BCFGen_->emitDiv(res, left, right);
  580|  3.19k|      }
  581|  3.22k|      break;
  582|      0|    case OpKind::ExponentiationKind: // ** (**=)
  ------------------
  |  Branch (582:5): [True: 0, False: 157k]
  ------------------
  583|      0|      llvm_unreachable("ExponentiationKind emits a HermesInternal call");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  584|      0|      break;
  585|  28.0k|    case OpKind::ModuloKind: // %   (%=)
  ------------------
  |  Branch (585:5): [True: 28.0k, False: 129k]
  ------------------
  586|  28.0k|      BCFGen_->emitMod(res, left, right);
  587|  28.0k|      break;
  588|  51.1k|    case OpKind::OrKind: // |   (|=)
  ------------------
  |  Branch (588:5): [True: 51.1k, False: 105k]
  ------------------
  589|  51.1k|      BCFGen_->emitBitOr(res, left, right);
  590|  51.1k|      break;
  591|      0|    case OpKind::XorKind: // ^   (^=)
  ------------------
  |  Branch (591:5): [True: 0, False: 157k]
  ------------------
  592|      0|      BCFGen_->emitBitXor(res, left, right);
  593|      0|      break;
  594|  16.3k|    case OpKind::AndKind: // &   (^=)
  ------------------
  |  Branch (594:5): [True: 16.3k, False: 140k]
  ------------------
  595|  16.3k|      BCFGen_->emitBitAnd(res, left, right);
  596|  16.3k|      break;
  597|     10|    case OpKind::InKind: // "in"
  ------------------
  |  Branch (597:5): [True: 10, False: 157k]
  ------------------
  598|     10|      BCFGen_->emitIsIn(res, left, right);
  599|     10|      break;
  600|     12|    case OpKind::InstanceOfKind: // instanceof
  ------------------
  |  Branch (600:5): [True: 12, False: 157k]
  ------------------
  601|     12|      BCFGen_->emitInstanceOf(res, left, right);
  602|     12|      break;
  603|       |
  604|      0|    default:
  ------------------
  |  Branch (604:5): [True: 0, False: 157k]
  ------------------
  605|      0|      break;
  606|   157k|  }
  607|   157k|}
_ZN6hermes3hbc7HBCISel25generateStorePropertyInstEPNS_17StorePropertyInstEPNS_10BasicBlockE:
  610|  1.32k|    BasicBlock *next) {
  611|  1.32k|  auto valueReg = encodeValue(Inst->getStoredValue());
  612|  1.32k|  auto objReg = encodeValue(Inst->getObject());
  613|  1.32k|  auto prop = Inst->getProperty();
  614|       |
  615|  1.32k|  if (auto *Lit = llvh::dyn_cast<LiteralString>(prop)) {
  ------------------
  |  Branch (615:13): [True: 1.26k, False: 67]
  ------------------
  616|       |    // Property is a string
  617|  1.26k|    auto id = BCFGen_->getIdentifierID(Lit);
  618|  1.26k|    if (id <= UINT16_MAX)
  ------------------
  |  Branch (618:9): [True: 1.26k, False: 0]
  ------------------
  619|  1.26k|      BCFGen_->emitPutById(
  620|  1.26k|          objReg, valueReg, acquirePropertyWriteCacheIndex(id), id);
  621|      0|    else
  622|      0|      BCFGen_->emitPutByIdLong(
  623|      0|          objReg, valueReg, acquirePropertyWriteCacheIndex(id), id);
  624|  1.26k|    return;
  625|  1.26k|  }
  626|       |
  627|     67|  auto propReg = encodeValue(prop);
  628|     67|  BCFGen_->emitPutByVal(objReg, propReg, valueReg);
  629|     67|}
_ZN6hermes3hbc7HBCISel28generateStoreOwnPropertyInstEPNS_20StoreOwnPropertyInstEPNS_10BasicBlockE:
  652|   826k|    BasicBlock *next) {
  653|   826k|  auto valueReg = encodeValue(Inst->getStoredValue());
  654|   826k|  auto objReg = encodeValue(Inst->getObject());
  655|   826k|  Value *prop = Inst->getProperty();
  656|   826k|  bool isEnumerable = Inst->getIsEnumerable();
  657|       |
  658|       |  // If the property is a LiteralNumber, the property is enumerable, and it is a
  659|       |  // valid array index, it is coming from an array initialization and we will
  660|       |  // emit it as PutByIndex.
  661|   826k|  auto *numProp = llvh::dyn_cast<LiteralNumber>(prop);
  662|   826k|  if (numProp && isEnumerable) {
  ------------------
  |  Branch (662:7): [True: 826k, False: 0]
  |  Branch (662:18): [True: 826k, False: 0]
  ------------------
  663|   826k|    if (auto arrayIndex = numProp->convertToArrayIndex()) {
  ------------------
  |  Branch (663:14): [True: 826k, False: 0]
  ------------------
  664|   826k|      uint32_t index = arrayIndex.getValue();
  665|   826k|      if (index <= UINT8_MAX) {
  ------------------
  |  Branch (665:11): [True: 12, False: 826k]
  ------------------
  666|     12|        BCFGen_->emitPutOwnByIndex(objReg, valueReg, index);
  667|   826k|      } else {
  668|   826k|        BCFGen_->emitPutOwnByIndexL(objReg, valueReg, index);
  669|   826k|      }
  670|       |
  671|   826k|      return;
  672|   826k|    }
  673|   826k|  }
  674|       |
  675|       |  // It is a register operand.
  676|      0|  auto propReg = encodeValue(Inst->getProperty());
  677|      0|  BCFGen_->emitPutOwnByVal(objReg, valueReg, propReg, Inst->getIsEnumerable());
  678|      0|}
_ZN6hermes3hbc7HBCISel31generateStoreNewOwnPropertyInstEPNS_23StoreNewOwnPropertyInstEPNS_10BasicBlockE:
  682|      1|    BasicBlock *next) {
  683|      1|  auto valueReg = encodeValue(Inst->getStoredValue());
  684|      1|  auto objReg = encodeValue(Inst->getObject());
  685|      1|  auto prop = Inst->getProperty();
  686|      1|  bool isEnumerable = Inst->getIsEnumerable();
  687|       |
  688|      1|  if (auto *numProp = llvh::dyn_cast<LiteralNumber>(prop)) {
  ------------------
  |  Branch (688:13): [True: 0, False: 1]
  ------------------
  689|      0|    assert(
  690|      0|        isEnumerable &&
  691|      0|        "No way to generate non-enumerable indexed StoreNewOwnPropertyInst.");
  692|      0|    uint32_t index = *numProp->convertToArrayIndex();
  693|      0|    if (index <= UINT8_MAX) {
  ------------------
  |  Branch (693:9): [True: 0, False: 0]
  ------------------
  694|      0|      BCFGen_->emitPutOwnByIndex(objReg, valueReg, index);
  695|      0|    } else {
  696|      0|      BCFGen_->emitPutOwnByIndexL(objReg, valueReg, index);
  697|      0|    }
  698|      0|    return;
  699|      0|  }
  700|       |
  701|      1|  auto strProp = cast<LiteralString>(prop);
  702|      1|  auto id = BCFGen_->getIdentifierID(strProp);
  703|       |
  704|      1|  if (isEnumerable) {
  ------------------
  |  Branch (704:7): [True: 1, False: 0]
  ------------------
  705|      1|    if (id > UINT16_MAX) {
  ------------------
  |  Branch (705:9): [True: 0, False: 1]
  ------------------
  706|      0|      BCFGen_->emitPutNewOwnByIdLong(objReg, valueReg, id);
  707|      1|    } else if (id > UINT8_MAX) {
  ------------------
  |  Branch (707:16): [True: 0, False: 1]
  ------------------
  708|      0|      BCFGen_->emitPutNewOwnById(objReg, valueReg, id);
  709|      1|    } else {
  710|      1|      BCFGen_->emitPutNewOwnByIdShort(objReg, valueReg, id);
  711|      1|    }
  712|      1|  } else {
  713|      0|    if (id > UINT16_MAX) {
  ------------------
  |  Branch (713:9): [True: 0, False: 0]
  ------------------
  714|      0|      BCFGen_->emitPutNewOwnNEByIdLong(objReg, valueReg, id);
  715|      0|    } else {
  716|      0|      BCFGen_->emitPutNewOwnNEById(objReg, valueReg, id);
  717|      0|    }
  718|      0|  }
  719|      1|}
_ZN6hermes3hbc7HBCISel24generateLoadPropertyInstEPNS_16LoadPropertyInstEPNS_10BasicBlockE:
  754|  68.4k|    BasicBlock *next) {
  755|  68.4k|  auto resultReg = encodeValue(Inst);
  756|  68.4k|  auto objReg = encodeValue(Inst->getObject());
  757|  68.4k|  auto prop = Inst->getProperty();
  758|       |
  759|  68.4k|  if (auto *Lit = llvh::dyn_cast<LiteralString>(prop)) {
  ------------------
  |  Branch (759:13): [True: 68.4k, False: 5]
  ------------------
  760|  68.4k|    auto id = BCFGen_->getIdentifierID(Lit);
  761|  68.4k|    if (id > UINT16_MAX) {
  ------------------
  |  Branch (761:9): [True: 0, False: 68.4k]
  ------------------
  762|      0|      BCFGen_->emitGetByIdLong(
  763|      0|          resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  764|  68.4k|    } else if (id > UINT8_MAX) {
  ------------------
  |  Branch (764:16): [True: 0, False: 68.4k]
  ------------------
  765|      0|      BCFGen_->emitGetById(
  766|      0|          resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  767|  68.4k|    } else {
  768|  68.4k|      BCFGen_->emitGetByIdShort(
  769|  68.4k|          resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  770|  68.4k|    }
  771|  68.4k|    return;
  772|  68.4k|  }
  773|       |
  774|      5|  auto propReg = encodeValue(prop);
  775|      5|  BCFGen_->emitGetByVal(resultReg, objReg, propReg);
  776|      5|}
_ZN6hermes3hbc7HBCISel33generateTryLoadGlobalPropertyInstEPNS_25TryLoadGlobalPropertyInstEPNS_10BasicBlockE:
  780|   501k|    BasicBlock *next) {
  781|   501k|  auto resultReg = encodeValue(Inst);
  782|   501k|  auto objReg = encodeValue(Inst->getObject());
  783|   501k|  auto prop = Inst->getProperty();
  784|       |
  785|   501k|  auto *Lit = cast<LiteralString>(prop);
  786|       |
  787|   501k|  auto id = BCFGen_->getIdentifierID(Lit);
  788|   501k|  if (id > UINT16_MAX) {
  ------------------
  |  Branch (788:7): [True: 0, False: 501k]
  ------------------
  789|      0|    BCFGen_->emitTryGetByIdLong(
  790|      0|        resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  791|   501k|  } else {
  792|   501k|    BCFGen_->emitTryGetById(
  793|   501k|        resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  794|   501k|  }
  795|   501k|}
_ZN6hermes3hbc7HBCISel22generateAllocStackInstEPNS_14AllocStackInstEPNS_10BasicBlockE:
  803|   134k|void HBCISel::generateAllocStackInst(AllocStackInst *Inst, BasicBlock *next) {
  804|       |  // This is a no-op.
  805|   134k|}
_ZN6hermes3hbc7HBCISel23generateAllocObjectInstEPNS_15AllocObjectInstEPNS_10BasicBlockE:
  806|      2|void HBCISel::generateAllocObjectInst(AllocObjectInst *Inst, BasicBlock *next) {
  807|      2|  auto result = encodeValue(Inst);
  808|       |  // TODO: Utilize sizeHint.
  809|      2|  if (llvh::isa<EmptySentinel>(Inst->getParentObject())) {
  ------------------
  |  Branch (809:7): [True: 2, False: 0]
  ------------------
  810|      2|    BCFGen_->emitNewObject(result);
  811|      2|  } else {
  812|      0|    auto parentReg = encodeValue(Inst->getParentObject());
  813|      0|    BCFGen_->emitNewObjectWithParent(result, parentReg);
  814|      0|  }
  815|      2|}
_ZN6hermes3hbc7HBCISel22generateAllocArrayInstEPNS_14AllocArrayInstEPNS_10BasicBlockE:
  816|    101|void HBCISel::generateAllocArrayInst(AllocArrayInst *Inst, BasicBlock *next) {
  817|    101|  auto dstReg = encodeValue(Inst);
  818|    101|  auto elementCount = Inst->getElementCount();
  819|    101|  uint32_t sizeHint =
  820|    101|      std::min((uint32_t)UINT16_MAX, Inst->getSizeHint()->asUInt32());
  821|       |
  822|    101|  if (elementCount == 0) {
  ------------------
  |  Branch (822:7): [True: 87, False: 14]
  ------------------
  823|     87|    BCFGen_->emitNewArray(dstReg, sizeHint);
  824|     87|  } else {
  825|     14|    auto bufIndex = BCFGen_->BMGen_.serializedLiteralOffsetFor(Inst);
  826|     14|    if (bufIndex.first <= UINT16_MAX) {
  ------------------
  |  Branch (826:9): [True: 14, False: 0]
  ------------------
  827|     14|      BCFGen_->emitNewArrayWithBuffer(
  828|     14|          encodeValue(Inst), sizeHint, elementCount, bufIndex.first);
  829|     14|    } else {
  830|      0|      BCFGen_->emitNewArrayWithBufferLong(
  831|      0|          encodeValue(Inst), sizeHint, elementCount, bufIndex.first);
  832|      0|    }
  833|     14|  }
  834|    101|}
_ZN6hermes3hbc7HBCISel29generateHBCCreateFunctionInstEPNS_21HBCCreateFunctionInstEPNS_10BasicBlockE:
  862|   103k|    BasicBlock *) {
  863|   103k|  auto env = encodeValue(Inst->getEnvironment());
  864|   103k|  auto output = encodeValue(Inst);
  865|   103k|  auto code = BCFGen_->getFunctionID(Inst->getFunctionCode());
  866|   103k|  bool isGen = llvh::isa<GeneratorFunction>(Inst->getFunctionCode());
  867|   103k|  bool isAsync = llvh::isa<AsyncFunction>(Inst->getFunctionCode());
  868|   103k|  if (LLVM_LIKELY(code <= UINT16_MAX)) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 0]
  |  |  ------------------
  ------------------
  869|       |    // Most of the cases, function index will be less than 2^16.
  870|   103k|    if (isAsync) {
  ------------------
  |  Branch (870:9): [True: 0, False: 103k]
  ------------------
  871|      0|      BCFGen_->emitCreateAsyncClosure(output, env, code);
  872|   103k|    } else if (isGen) {
  ------------------
  |  Branch (872:16): [True: 0, False: 103k]
  ------------------
  873|      0|      BCFGen_->emitCreateGeneratorClosure(output, env, code);
  874|   103k|    } else {
  875|   103k|      BCFGen_->emitCreateClosure(output, env, code);
  876|   103k|    }
  877|   103k|  } else {
  878|      0|    if (isAsync) {
  ------------------
  |  Branch (878:9): [True: 0, False: 0]
  ------------------
  879|      0|      BCFGen_->emitCreateAsyncClosureLongIndex(output, env, code);
  880|      0|    } else if (isGen) {
  ------------------
  |  Branch (880:16): [True: 0, False: 0]
  ------------------
  881|      0|      BCFGen_->emitCreateGeneratorClosureLongIndex(output, env, code);
  882|      0|    } else {
  883|      0|      BCFGen_->emitCreateClosureLongIndex(output, env, code);
  884|      0|    }
  885|      0|  }
  886|   103k|}
_ZN6hermes3hbc7HBCISel17generateCatchInstEPNS_9CatchInstEPNS_10BasicBlockE:
  908|  40.6k|void HBCISel::generateCatchInst(CatchInst *Inst, BasicBlock *next) {
  909|  40.6k|  auto loc = BCFGen_->emitCatch(encodeValue(Inst));
  910|  40.6k|  relocations_.push_back({loc, Relocation::CatchType, Inst});
  911|  40.6k|  catchInfoMap_[Inst] = CatchCoverageInfo(loc);
  912|  40.6k|}
_ZN6hermes3hbc7HBCISel24generateCreateRegExpInstEPNS_16CreateRegExpInstEPNS_10BasicBlockE:
  918|    119|    BasicBlock *next) {
  919|    119|  const auto &pattern = Inst->getPattern()->getValue();
  920|    119|  const auto &flags = Inst->getFlags()->getValue();
  921|    119|  auto &ctx = F_->getParent()->getContext();
  922|    119|  auto &regexp = ctx.getCompiledRegExp(
  923|    119|      pattern.getUnderlyingPointer(), flags.getUnderlyingPointer());
  924|    119|  uint32_t reBytecodeID = BCFGen_->addRegExp(&regexp);
  925|    119|  auto patternStrID = BCFGen_->getStringID(Inst->getPattern());
  926|    119|  auto flagsStrID = BCFGen_->getStringID(Inst->getFlags());
  927|    119|  BCFGen_->emitCreateRegExp(
  928|    119|      encodeValue(Inst), patternStrID, flagsStrID, reBytecodeID);
  929|    119|}
_ZN6hermes3hbc7HBCISel18generateTryEndInstEPNS_10TryEndInstEPNS_10BasicBlockE:
  930|  40.6k|void HBCISel::generateTryEndInst(TryEndInst *Inst, BasicBlock *next) {
  931|       |  // This is a no-op.
  932|       |  // TryEndInst is used to mark the end of a try region to construct
  933|       |  // the list of basic blocks covered by a catch.
  934|       |  // The range of try regions are stored in exception handlers,
  935|       |  // and are therefore not encoded in the instruction stream.
  936|  40.6k|}
_ZN6hermes3hbc7HBCISel18generateBranchInstEPNS_10BranchInstEPNS_10BasicBlockE:
  940|   484k|void HBCISel::generateBranchInst(BranchInst *Inst, BasicBlock *next) {
  941|   484k|  auto *dst = Inst->getBranchDest();
  942|   484k|  if (dst == next)
  ------------------
  |  Branch (942:7): [True: 459k, False: 24.7k]
  ------------------
  943|   459k|    return;
  944|       |
  945|  24.7k|  auto loc = BCFGen_->emitJmpLong(0);
  946|  24.7k|  registerLongJump(loc, dst);
  947|  24.7k|}
_ZN6hermes3hbc7HBCISel18generateReturnInstEPNS_10ReturnInstEPNS_10BasicBlockE:
  948|   103k|void HBCISel::generateReturnInst(ReturnInst *Inst, BasicBlock *next) {
  949|   103k|  auto value = encodeValue(Inst->getValue());
  950|   103k|  Function *F = Inst->getParent()->getParent();
  951|   103k|  if (llvh::isa<GeneratorInnerFunction>(F)) {
  ------------------
  |  Branch (951:7): [True: 0, False: 103k]
  ------------------
  952|       |    // Generator inner functions must complete before `return`,
  953|       |    // unlike when they yield.
  954|      0|    BCFGen_->emitCompleteGenerator();
  955|      0|  }
  956|   103k|  BCFGen_->emitRet(value);
  957|   103k|}
_ZN6hermes3hbc7HBCISel17generateThrowInstEPNS_9ThrowInstEPNS_10BasicBlockE:
  958|  20.3k|void HBCISel::generateThrowInst(ThrowInst *Inst, BasicBlock *next) {
  959|  20.3k|  BCFGen_->emitThrow(encodeValue(Inst->getThrownValue()));
  960|  20.3k|}
_ZN6hermes3hbc7HBCISel22generateCondBranchInstEPNS_14CondBranchInstEPNS_10BasicBlockE:
 1009|  91.9k|void HBCISel::generateCondBranchInst(CondBranchInst *Inst, BasicBlock *next) {
 1010|  91.9k|  auto condReg = encodeValue(Inst->getCondition());
 1011|       |
 1012|  91.9k|  BasicBlock *trueBlock = Inst->getTrueDest();
 1013|  91.9k|  BasicBlock *falseBlock = Inst->getFalseDest();
 1014|       |
 1015|       |  // Emit a conditional jump to the 'False' destination and a fall-through to
 1016|       |  // the 'True' side.
 1017|  91.9k|  if (next == trueBlock) {
  ------------------
  |  Branch (1017:7): [True: 16.3k, False: 75.6k]
  ------------------
 1018|  16.3k|    auto loc = BCFGen_->emitJmpFalseLong(0, condReg);
 1019|  16.3k|    registerLongJump(loc, falseBlock);
 1020|  16.3k|    return;
 1021|  16.3k|  }
 1022|       |
 1023|       |  // Emit a conditional jump to the 'True' destination and a fall-through to the
 1024|       |  // 'False' side.
 1025|  75.6k|  auto loc = BCFGen_->emitJmpTrueLong(0, condReg);
 1026|  75.6k|  registerLongJump(loc, trueBlock);
 1027|       |
 1028|       |  // Try to eliminate the branch by using a fall-through. If the destination
 1029|       |  // is also the basic block we'll generate next then no need to emit the
 1030|       |  // jmp.
 1031|  75.6k|  if (next == falseBlock) {
  ------------------
  |  Branch (1031:7): [True: 75.6k, False: 0]
  ------------------
 1032|  75.6k|    return;
 1033|  75.6k|  }
 1034|       |
 1035|      0|  loc = BCFGen_->emitJmpLong(0);
 1036|      0|  registerLongJump(loc, falseBlock);
 1037|      0|}
_ZN6hermes3hbc7HBCISel21generateGetPNamesInstEPNS_13GetPNamesInstEPNS_10BasicBlockE:
 1130|     15|void HBCISel::generateGetPNamesInst(GetPNamesInst *Inst, BasicBlock *next) {
 1131|     15|  auto itrReg = encodeValue(Inst->getIterator());
 1132|     15|  BCFGen_->emitGetPNameList(
 1133|     15|      itrReg,
 1134|     15|      encodeValue(Inst->getBase()),
 1135|     15|      encodeValue(Inst->getIndex()),
 1136|     15|      encodeValue(Inst->getSize()));
 1137|       |  // If the returned iterator is empty value, quit the iteration directly.
 1138|     15|  registerLongJump(
 1139|     15|      BCFGen_->emitJmpUndefinedLong(0, itrReg), Inst->getOnEmptyDest());
 1140|       |
 1141|     15|  auto *onSomeBlock = Inst->getOnSomeDest();
 1142|     15|  if (next != onSomeBlock) {
  ------------------
  |  Branch (1142:7): [True: 0, False: 15]
  ------------------
 1143|      0|    auto loc = BCFGen_->emitJmpLong(0);
 1144|      0|    registerLongJump(loc, onSomeBlock);
 1145|      0|  }
 1146|     15|}
_ZN6hermes3hbc7HBCISel24generateGetNextPNameInstEPNS_16GetNextPNameInstEPNS_10BasicBlockE:
 1149|     15|    BasicBlock *next) {
 1150|     15|  auto indexReg = encodeValue(Inst->getIndexAddr());
 1151|     15|  auto sizeReg = encodeValue(Inst->getSizeAddr());
 1152|     15|  auto propReg = encodeValue(Inst->getPropertyAddr());
 1153|       |
 1154|     15|  BCFGen_->emitGetNextPName(
 1155|     15|      propReg,
 1156|     15|      encodeValue(Inst->getIteratorAddr()),
 1157|     15|      encodeValue(Inst->getBaseAddr()),
 1158|     15|      indexReg,
 1159|     15|      sizeReg);
 1160|       |
 1161|       |  // If the returned property is empty, terminate the iteration.
 1162|     15|  registerLongJump(
 1163|     15|      BCFGen_->emitJmpUndefinedLong(0, propReg), Inst->getOnLastDest());
 1164|       |
 1165|     15|  auto *onSomeBlock = Inst->getOnSomeDest();
 1166|     15|  if (next != onSomeBlock) {
  ------------------
  |  Branch (1166:7): [True: 0, False: 15]
  ------------------
 1167|      0|    auto loc = BCFGen_->emitJmpLong(0);
 1168|      0|    registerLongJump(loc, onSomeBlock);
 1169|      0|  }
 1170|     15|}
_ZN6hermes3hbc7HBCISel20generateTryStartInstEPNS_12TryStartInstEPNS_10BasicBlockE:
 1176|  40.6k|void HBCISel::generateTryStartInst(TryStartInst *Inst, BasicBlock *next) {
 1177|       |  // TryStartInst is the same as BranchInst in bytecode gen.
 1178|  40.6k|  BasicBlock *destination = Inst->getTryBody();
 1179|       |
 1180|  40.6k|  assert(
 1181|  40.6k|      Inst->getParent()->getTerminator() == Inst &&
 1182|  40.6k|      "BI is not the terminator!");
 1183|       |
 1184|       |  // Try to eliminate the branch by using a fall-through. If the destination
 1185|       |  // is also the basic block we'll generate next then no need to emit the
 1186|       |  // jmp.
 1187|  40.6k|  if (next == destination) {
  ------------------
  |  Branch (1187:7): [True: 40.6k, False: 0]
  ------------------
 1188|  40.6k|    return;
 1189|  40.6k|  }
 1190|       |
 1191|       |  // Emit the jump and remember to update the relocation location.
 1192|      0|  auto loc = BCFGen_->emitJmpLong(0);
 1193|      0|  registerLongJump(loc, destination);
 1194|      0|}
_ZN6hermes3hbc7HBCISel16generateCallInstEPNS_8CallInstEPNS_10BasicBlockE:
 1195|  2.84k|void HBCISel::generateCallInst(CallInst *Inst, BasicBlock *next) {
 1196|  2.84k|  auto output = encodeValue(Inst);
 1197|  2.84k|  auto function = encodeValue(Inst->getCallee());
 1198|  2.84k|  verifyCall(Inst);
 1199|       |
 1200|  2.84k|  if (Inst->getNumArguments() <= UINT8_MAX) {
  ------------------
  |  Branch (1200:7): [True: 2.82k, False: 19]
  ------------------
 1201|  2.82k|    BCFGen_->emitCall(output, function, Inst->getNumArguments());
 1202|  2.82k|  } else {
 1203|     19|    BCFGen_->emitCallLong(output, function, Inst->getNumArguments());
 1204|     19|  }
 1205|  2.84k|}
_ZN6hermes3hbc7HBCISel23generateCallBuiltinInstEPNS_15CallBuiltinInstEPNS_10BasicBlockE:
 1253|  2.82k|void HBCISel::generateCallBuiltinInst(CallBuiltinInst *Inst, BasicBlock *next) {
 1254|  2.82k|  auto output = encodeValue(Inst);
 1255|  2.82k|  verifyCall(Inst);
 1256|       |
 1257|  2.82k|  if (Inst->getNumArguments() <= UINT8_MAX) {
  ------------------
  |  Branch (1257:7): [True: 2.80k, False: 19]
  ------------------
 1258|  2.80k|    BCFGen_->emitCallBuiltin(
 1259|  2.80k|        output, Inst->getBuiltinIndex(), Inst->getNumArguments());
 1260|  2.80k|  } else {
 1261|     19|    BCFGen_->emitCallBuiltinLong(
 1262|     19|        output, Inst->getBuiltinIndex(), Inst->getNumArguments());
 1263|     19|  }
 1264|  2.82k|}
_ZN6hermes3hbc7HBCISel33generateHBCStoreToEnvironmentInstEPNS_25HBCStoreToEnvironmentInstEPNS_10BasicBlockE:
 1389|   104k|    BasicBlock *next) {
 1390|   104k|  Variable *var = Inst->getResolvedName();
 1391|   104k|  auto valueReg = encodeValue(Inst->getStoredValue());
 1392|   104k|  auto envReg = encodeValue(Inst->getEnvironment());
 1393|   104k|  auto varIdx = encodeValue(var);
 1394|   104k|  if (Inst->getStoredValue()->getType().isNonPtr()) {
  ------------------
  |  Branch (1394:7): [True: 0, False: 104k]
  ------------------
 1395|      0|    if (varIdx <= UINT8_MAX) {
  ------------------
  |  Branch (1395:9): [True: 0, False: 0]
  ------------------
 1396|      0|      BCFGen_->emitStoreNPToEnvironment(envReg, varIdx, valueReg);
 1397|      0|    } else {
 1398|      0|      BCFGen_->emitStoreNPToEnvironmentL(envReg, varIdx, valueReg);
 1399|      0|    }
 1400|   104k|  } else {
 1401|   104k|    if (varIdx <= UINT8_MAX) {
  ------------------
  |  Branch (1401:9): [True: 104k, False: 0]
  ------------------
 1402|   104k|      BCFGen_->emitStoreToEnvironment(envReg, varIdx, valueReg);
 1403|   104k|    } else {
 1404|      0|      BCFGen_->emitStoreToEnvironmentL(envReg, varIdx, valueReg);
 1405|      0|    }
 1406|   104k|  }
 1407|   104k|}
_ZN6hermes3hbc7HBCISel34generateHBCLoadFromEnvironmentInstEPNS_26HBCLoadFromEnvironmentInstEPNS_10BasicBlockE:
 1410|      4|    BasicBlock *next) {
 1411|      4|  auto dstReg = encodeValue(Inst);
 1412|      4|  Variable *var = Inst->getResolvedName();
 1413|      4|  auto envReg = encodeValue(Inst->getEnvironment());
 1414|      4|  auto varIdx = encodeValue(var);
 1415|      4|  if (varIdx <= UINT8_MAX) {
  ------------------
  |  Branch (1415:7): [True: 4, False: 0]
  ------------------
 1416|      4|    BCFGen_->emitLoadFromEnvironment(dstReg, envReg, varIdx);
 1417|      4|  } else {
 1418|      0|    BCFGen_->emitLoadFromEnvironmentL(dstReg, envReg, varIdx);
 1419|      0|  }
 1420|      4|}
_ZN6hermes3hbc7HBCISel24generateHBCLoadConstInstEPNS_16HBCLoadConstInstEPNS_10BasicBlockE:
 1423|  1.64M|    hermes::BasicBlock *next) {
 1424|  1.64M|  auto output = encodeValue(Inst);
 1425|  1.64M|  Literal *literal = Inst->getConst();
 1426|  1.64M|  switch (literal->getKind()) {
 1427|      0|    case ValueKind::LiteralEmptyKind:
  ------------------
  |  Branch (1427:5): [True: 0, False: 1.64M]
  ------------------
 1428|      0|      BCFGen_->emitLoadConstEmpty(output);
 1429|      0|      break;
 1430|  66.8k|    case ValueKind::LiteralUndefinedKind:
  ------------------
  |  Branch (1430:5): [True: 66.8k, False: 1.58M]
  ------------------
 1431|  66.8k|      BCFGen_->emitLoadConstUndefined(output);
 1432|  66.8k|      break;
 1433|    949|    case ValueKind::LiteralNullKind:
  ------------------
  |  Branch (1433:5): [True: 949, False: 1.64M]
  ------------------
 1434|    949|      BCFGen_->emitLoadConstNull(output);
 1435|    949|      break;
 1436|  2.82k|    case ValueKind::LiteralBoolKind: {
  ------------------
  |  Branch (1436:5): [True: 2.82k, False: 1.64M]
  ------------------
 1437|  2.82k|      auto *litBool = cast<LiteralBool>(literal);
 1438|  2.82k|      if (litBool->getValue()) {
  ------------------
  |  Branch (1438:11): [True: 2.69k, False: 128]
  ------------------
 1439|  2.69k|        BCFGen_->emitLoadConstTrue(output);
 1440|  2.69k|      } else {
 1441|    128|        BCFGen_->emitLoadConstFalse(output);
 1442|    128|      }
 1443|  2.82k|      break;
 1444|      0|    }
 1445|  1.18M|    case ValueKind::LiteralNumberKind: {
  ------------------
  |  Branch (1445:5): [True: 1.18M, False: 464k]
  ------------------
 1446|  1.18M|      auto *litNum = cast<LiteralNumber>(literal);
 1447|       |      // Check for +0.0.
 1448|  1.18M|      if (litNum->isPositiveZero()) {
  ------------------
  |  Branch (1448:11): [True: 634k, False: 549k]
  ------------------
 1449|   634k|        BCFGen_->emitLoadConstZero(output);
 1450|   634k|      } else {
 1451|   549k|        if (litNum->isUInt8Representible()) {
  ------------------
  |  Branch (1451:13): [True: 482k, False: 66.9k]
  ------------------
 1452|   482k|          BCFGen_->emitLoadConstUInt8(output, litNum->asUInt8());
 1453|   482k|        } else if (litNum->isInt32Representible()) {
  ------------------
  |  Branch (1453:20): [True: 45.1k, False: 21.8k]
  ------------------
 1454|  45.1k|          BCFGen_->emitLoadConstInt(output, litNum->asInt32());
 1455|  45.1k|        } else {
 1456|       |          // param_t is int64_t, we cannot directly convert a double into that.
 1457|       |          // Instead we are going to copy it as if it is binary.
 1458|  21.8k|          BCFGen_->emitLoadConstDoubleDirect(output, litNum->getValue());
 1459|  21.8k|        }
 1460|   549k|      }
 1461|  1.18M|      break;
 1462|      0|    }
 1463|      5|    case ValueKind::LiteralBigIntKind: {
  ------------------
  |  Branch (1463:5): [True: 5, False: 1.64M]
  ------------------
 1464|      5|      auto parsedBigInt = bigint::ParsedBigInt::parsedBigIntFromNumericValue(
 1465|      5|          cast<LiteralBigInt>(literal)->getValue()->str());
 1466|      5|      assert(parsedBigInt && "should be valid");
 1467|      5|      if (bigint::tooManyBytes(parsedBigInt->getBytes().size())) {
  ------------------
  |  Branch (1467:11): [True: 0, False: 5]
  ------------------
 1468|       |        // TODO: move this to the semantic analysis so we can get a proper
 1469|       |        // warning (i.e., with the correct location for the literal).
 1470|      0|        std::string sizeStr;
 1471|      0|        {
 1472|      0|          llvh::raw_string_ostream OS(sizeStr);
 1473|      0|          OS << parsedBigInt->getBytes().size();
 1474|      0|        }
 1475|      0|        F_->getContext().getSourceErrorManager().warning(
 1476|      0|            Inst->getLocation(),
 1477|      0|            Twine("BigInt literal has too many bytes (") + sizeStr +
 1478|      0|                ") and a RangeError will be raised at runtime time if it "
 1479|      0|                "is referenced.");
 1480|      0|      }
 1481|      5|      auto idx = BCFGen_->addBigInt(std::move(*parsedBigInt));
 1482|      5|      if (idx <= UINT16_MAX) {
  ------------------
  |  Branch (1482:11): [True: 5, False: 0]
  ------------------
 1483|      5|        BCFGen_->emitLoadConstBigInt(output, idx);
 1484|      5|      } else {
 1485|      0|        BCFGen_->emitLoadConstBigIntLongIndex(output, idx);
 1486|      0|      }
 1487|      5|      break;
 1488|      5|    }
 1489|   394k|    case ValueKind::LiteralStringKind: {
  ------------------
  |  Branch (1489:5): [True: 394k, False: 1.25M]
  ------------------
 1490|   394k|      auto idx = BCFGen_->getStringID(cast<LiteralString>(literal));
 1491|   394k|      if (idx <= UINT16_MAX) {
  ------------------
  |  Branch (1491:11): [True: 394k, False: 0]
  ------------------
 1492|   394k|        BCFGen_->emitLoadConstString(output, idx);
 1493|   394k|      } else {
 1494|      0|        BCFGen_->emitLoadConstStringLongIndex(output, idx);
 1495|      0|      }
 1496|   394k|      break;
 1497|      5|    }
 1498|      0|    default:
  ------------------
  |  Branch (1498:5): [True: 0, False: 1.64M]
  ------------------
 1499|      0|      llvm_unreachable("Invalid literal type");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1500|  1.64M|  }
 1501|  1.64M|}
_ZN6hermes3hbc7HBCISel24generateHBCLoadParamInstEPNS_16HBCLoadParamInstEPNS_10BasicBlockE:
 1504|   103k|    hermes::BasicBlock *next) {
 1505|   103k|  auto output = encodeValue(Inst);
 1506|   103k|  LiteralNumber *number = Inst->getIndex();
 1507|   103k|  auto value = number->asUInt32();
 1508|   103k|  if (value <= UINT8_MAX) {
  ------------------
  |  Branch (1508:7): [True: 103k, False: 0]
  ------------------
 1509|   103k|    BCFGen_->emitLoadParam(output, value);
 1510|   103k|  } else {
 1511|      0|    BCFGen_->emitLoadParamLong(output, value);
 1512|      0|  }
 1513|   103k|}
_ZN6hermes3hbc7HBCISel32generateHBCCreateEnvironmentInstEPNS_24HBCCreateEnvironmentInstEPNS_10BasicBlockE:
 1517|   103k|    hermes::BasicBlock *next) {
 1518|   103k|  auto dstReg = encodeValue(Inst);
 1519|   103k|  BCFGen_->emitCreateEnvironment(dstReg);
 1520|   103k|}
_ZN6hermes3hbc7HBCISel30generateHBCGetGlobalObjectInstEPNS_22HBCGetGlobalObjectInstEPNS_10BasicBlockE:
 1539|   503k|    hermes::BasicBlock *next) {
 1540|   503k|  auto dstReg = encodeValue(Inst);
 1541|   503k|  BCFGen_->emitGetGlobalObject(dstReg);
 1542|   503k|}
_ZN6hermes3hbc7HBCISel24generateGetNewTargetInstEPNS_16GetNewTargetInstEPNS_10BasicBlockE:
 1546|      9|    hermes::BasicBlock *next) {
 1547|      9|  auto dstReg = encodeValue(Inst);
 1548|      9|  BCFGen_->emitGetNewTarget(dstReg);
 1549|      9|}
_ZN6hermes3hbc7HBCISel24generateHBCGetThisNSInstEPNS_16HBCGetThisNSInstEPNS_10BasicBlockE:
 1553|      9|    hermes::BasicBlock *next) {
 1554|      9|  auto dstReg = encodeValue(Inst);
 1555|      9|  BCFGen_->emitLoadThisNS(dstReg);
 1556|      9|}
_ZN6hermes3hbc7HBCISel29generateHBCReifyArgumentsInstEPNS_21HBCReifyArgumentsInstEPNS_10BasicBlockE:
 1581|     13|    hermes::BasicBlock *next) {
 1582|     13|  auto reg = encodeValue(Inst->getLazyRegister());
 1583|     13|  BCFGen_->emitReifyArguments(reg);
 1584|     13|}
_ZN6hermes3hbc7HBCISel25generateHBCCreateThisInstEPNS_17HBCCreateThisInstEPNS_10BasicBlockE:
 1587|  25.0k|    BasicBlock *next) {
 1588|  25.0k|  auto output = encodeValue(Inst);
 1589|  25.0k|  auto proto = encodeValue(Inst->getPrototype());
 1590|  25.0k|  auto closure = encodeValue(Inst->getClosure());
 1591|  25.0k|  BCFGen_->emitCreateThis(output, proto, closure);
 1592|  25.0k|}
_ZN6hermes3hbc7HBCISel24generateHBCConstructInstEPNS_16HBCConstructInstEPNS_10BasicBlockE:
 1595|  25.0k|    BasicBlock *next) {
 1596|  25.0k|  auto output = encodeValue(Inst);
 1597|  25.0k|  auto function = encodeValue(Inst->getCallee());
 1598|  25.0k|  verifyCall(cast<CallInst>(Inst));
 1599|       |
 1600|  25.0k|  if (Inst->getNumArguments() <= UINT8_MAX) {
  ------------------
  |  Branch (1600:7): [True: 25.0k, False: 0]
  ------------------
 1601|  25.0k|    BCFGen_->emitConstruct(output, function, Inst->getNumArguments());
 1602|  25.0k|  } else {
 1603|      0|    BCFGen_->emitConstructLong(output, function, Inst->getNumArguments());
 1604|      0|  }
 1605|  25.0k|}
_ZN6hermes3hbc7HBCISel35generateHBCGetConstructedObjectInstEPNS_27HBCGetConstructedObjectInstEPNS_10BasicBlockE:
 1608|  25.0k|    BasicBlock *next) {
 1609|  25.0k|  auto output = encodeValue(Inst);
 1610|  25.0k|  auto thisValue = encodeValue(Inst->getThisValue());
 1611|  25.0k|  auto constructed = encodeValue(Inst->getConstructorReturnValue());
 1612|  25.0k|  BCFGen_->emitSelectObject(output, thisValue, constructed);
 1613|  25.0k|}
_ZN6hermes3hbc7HBCISel23generateHBCSpillMovInstEPNS_15HBCSpillMovInstEPNS_10BasicBlockE:
 1614|  2.38M|void HBCISel::generateHBCSpillMovInst(HBCSpillMovInst *Inst, BasicBlock *next) {
 1615|  2.38M|  auto dst = encodeValue(Inst);
 1616|  2.38M|  auto src = encodeValue(Inst->getValue());
 1617|  2.38M|  emitMovIfNeeded(dst, src);
 1618|  2.38M|}
_ZN6hermes3hbc7HBCISel25generateIteratorBeginInstEPNS_17IteratorBeginInstEPNS_10BasicBlockE:
 1627|  22.3k|    hermes::BasicBlock *next) {
 1628|  22.3k|  auto iter = encodeValue(Inst);
 1629|  22.3k|  auto src = encodeValue(Inst->getSourceOrNext());
 1630|  22.3k|  BCFGen_->emitIteratorBegin(iter, src);
 1631|  22.3k|}
_ZN6hermes3hbc7HBCISel24generateIteratorNextInstEPNS_16IteratorNextInstEPNS_10BasicBlockE:
 1635|  20.3k|    hermes::BasicBlock *next) {
 1636|  20.3k|  auto dst = encodeValue(Inst);
 1637|  20.3k|  auto iter = encodeValue(Inst->getIterator());
 1638|  20.3k|  auto src = encodeValue(Inst->getSourceOrNext());
 1639|  20.3k|  BCFGen_->emitIteratorNext(dst, iter, src);
 1640|  20.3k|}
_ZN6hermes3hbc7HBCISel25generateIteratorCloseInstEPNS_17IteratorCloseInstEPNS_10BasicBlockE:
 1644|  42.7k|    hermes::BasicBlock *next) {
 1645|  42.7k|  auto iter = encodeValue(Inst->getIterator());
 1646|  42.7k|  bool ignoreInnerException = Inst->getIgnoreInnerException();
 1647|  42.7k|  BCFGen_->emitIteratorClose(iter, ignoreInnerException);
 1648|  42.7k|}
_ZN6hermes3hbc7HBCISel10initializeEv:
 1681|   103k|void HBCISel::initialize() {
 1682|   103k|  IRBuilder builder(F_->getParent());
 1683|   103k|  if (F_->isGlobalScope()) {
  ------------------
  |  Branch (1683:7): [True: 196, False: 103k]
  ------------------
 1684|  9.38k|    for (auto *prop : F_->getParent()->getGlobalProperties()) {
  ------------------
  |  Branch (1684:21): [True: 9.38k, False: 196]
  ------------------
 1685|       |      // Declare every "declared" global variable.
 1686|  9.38k|      if (!prop->isDeclared())
  ------------------
  |  Branch (1686:11): [True: 9.38k, False: 0]
  ------------------
 1687|  9.38k|        continue;
 1688|      0|      auto id = BCFGen_->getIdentifierID(
 1689|      0|          builder.getLiteralString(prop->getName()->getValue()));
 1690|      0|      BCFGen_->emitDeclareGlobalVar(id);
 1691|      0|    }
 1692|    196|  }
 1693|   103k|}
_ZN6hermes3hbc7HBCISel8generateEPNS_10BasicBlockES3_:
 1695|   740k|void HBCISel::generate(BasicBlock *BB, BasicBlock *next) {
 1696|       |  // Register the address of the current basic block.
 1697|   740k|  auto begin_loc = BCFGen_->getCurrentLocation();
 1698|       |
 1699|       |  // It is important to register the basic block before processing it,
 1700|       |  // as we require the relocations to be sorted by their offset.
 1701|   740k|  relocations_.push_back(
 1702|   740k|      {begin_loc, Relocation::RelocationType::BasicBlockType, BB});
 1703|   740k|  basicBlockMap_[BB] = std::make_pair(begin_loc, next);
 1704|       |
 1705|   740k|  if (BB == &F_->front()) {
  ------------------
  |  Branch (1705:7): [True: 103k, False: 637k]
  ------------------
 1706|   103k|    initialize();
 1707|   103k|  }
 1708|       |
 1709|       |  // Emit an async break check before the terminator if necessary.
 1710|       |  // We do this at the end of the block so that we come after any
 1711|       |  // CreateEnvironment instruction.
 1712|   740k|  const Instruction *asyncBreakCheckLoc =
 1713|   740k|      asyncBreakChecks_.count(BB) ? BB->getTerminator() : nullptr;
  ------------------
  |  Branch (1713:7): [True: 103k, False: 637k]
  ------------------
 1714|  9.14M|  for (auto &I : *BB) {
  ------------------
  |  Branch (1714:16): [True: 9.14M, False: 740k]
  ------------------
 1715|  9.14M|    if (&I == asyncBreakCheckLoc) {
  ------------------
  |  Branch (1715:9): [True: 103k, False: 9.03M]
  ------------------
 1716|   103k|      BCFGen_->emitAsyncBreakCheck();
 1717|   103k|    }
 1718|  9.14M|    generate(&I, next);
 1719|  9.14M|  }
 1720|   740k|  auto end_loc = BCFGen_->getCurrentLocation();
 1721|   740k|  if (!next) {
  ------------------
  |  Branch (1721:7): [True: 103k, False: 637k]
  ------------------
 1722|       |    // When next is nullptr, we are hitting the last BB.
 1723|       |    // We should also register that null BB with it's location.
 1724|   103k|    assert(
 1725|   103k|        basicBlockMap_.find(nullptr) == basicBlockMap_.end() &&
 1726|   103k|        "Multiple nullptr BBs encountered");
 1727|   103k|    basicBlockMap_[nullptr] = std::make_pair(end_loc, nullptr);
 1728|   103k|  }
 1729|       |
 1730|   740k|  LLVM_DEBUG(
  ------------------
  |  |  123|   740k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   740k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 740k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   740k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1731|   740k|      dbgs() << "Generated the block " << BB << " from " << begin_loc << " .. "
 1732|   740k|             << end_loc << "\n");
 1733|   740k|}
_ZN6hermes3hbc7HBCISel8generateEPNS_11InstructionEPNS_10BasicBlockE:
 1735|  9.14M|void HBCISel::generate(Instruction *ii, BasicBlock *next) {
 1736|  9.14M|  LLVM_DEBUG(dbgs() << "Generating the instruction " << ii->getName() << "\n");
  ------------------
  |  |  123|  9.14M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  9.14M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 9.14M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  9.14M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1737|       |
 1738|       |  // Generate the debug info.
 1739|  9.14M|  bool isDebugInfoLevelThrowing = false;
 1740|  9.14M|  switch (F_->getContext().getDebugInfoSetting()) {
  ------------------
  |  Branch (1740:11): [True: 0, False: 9.14M]
  ------------------
 1741|      0|    case DebugInfoSetting::THROWING:
  ------------------
  |  Branch (1741:5): [True: 0, False: 9.14M]
  ------------------
 1742|      0|      if (!ii->mayExecute()) {
  ------------------
  |  Branch (1742:11): [True: 0, False: 0]
  ------------------
 1743|      0|        break;
 1744|      0|      }
 1745|      0|      isDebugInfoLevelThrowing = true;
 1746|      0|      [[fallthrough]];
 1747|      0|    case DebugInfoSetting::SOURCE_MAP:
  ------------------
  |  Branch (1747:5): [True: 0, False: 9.14M]
  ------------------
 1748|  9.14M|    case DebugInfoSetting::ALL:
  ------------------
  |  Branch (1748:5): [True: 9.14M, False: 0]
  ------------------
 1749|  9.14M|      if (ii->hasLocation()) {
  ------------------
  |  Branch (1749:11): [True: 4.18M, False: 4.95M]
  ------------------
 1750|  4.18M|        relocations_.push_back(
 1751|  4.18M|            {BCFGen_->getCurrentLocation(),
 1752|  4.18M|             Relocation::RelocationType::DebugInfo,
 1753|  4.18M|             ii});
 1754|  4.18M|      }
 1755|  9.14M|      if (!isDebugInfoLevelThrowing) {
  ------------------
  |  Branch (1755:11): [True: 9.14M, False: 0]
  ------------------
 1756|  9.14M|        if (auto *call = llvh::dyn_cast<CallInst>(ii)) {
  ------------------
  |  Branch (1756:19): [True: 30.7k, False: 9.10M]
  ------------------
 1757|  30.7k|          if (LiteralString *textifiedCallee = call->getTextifiedCallee()) {
  ------------------
  |  Branch (1757:30): [True: 19, False: 30.6k]
  ------------------
 1758|     19|            relocations_.push_back(
 1759|     19|                {BCFGen_->getCurrentLocation(),
 1760|     19|                 Relocation::RelocationType::TextifiedCallee,
 1761|     19|                 textifiedCallee});
 1762|     19|          }
 1763|  30.7k|        }
 1764|  9.14M|      }
 1765|  9.14M|      break;
 1766|  9.14M|  }
 1767|       |
 1768|  9.14M|  switch (ii->getKind()) {
 1769|      0|#define DEF_VALUE(CLASS, PARENT) \
 1770|      0|  case ValueKind::CLASS##Kind:   \
 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
 1772|      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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   27|       |
  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   32|   103k|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1770|   103k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 103k, False: 9.03M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   103k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   34|      0|#endif
  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |   36|      0|DEF_VALUE(NestedScopeCreationInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   40|      0|#endif
  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |   43|       |
  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   47|    509|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|    509|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 509, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|    509|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   50|   128k|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|   128k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 128k, False: 9.01M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   128k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   51|  1.34M|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|  1.34M|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 1.34M, False: 7.79M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  1.34M|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   52|  2.82k|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  2.82k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 2.82k, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  2.82k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   54|  25.3k|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|  25.3k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 25.3k, False: 9.11M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  25.3k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   56|  1.64M|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|  1.64M|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 1.64M, False: 7.49M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  1.64M|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   57|   103k|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|   103k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 103k, False: 9.03M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   103k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   59|     13|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|     13|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 13, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|     13|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   60|  2.38M|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1770|  2.38M|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 2.38M, False: 6.75M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  2.38M|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   61|      0|#endif
  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |   63|       |
  |  |   64|  4.39k|DEF_VALUE(PhiInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  4.39k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 4.39k, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  4.39k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   65|   157k|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|   157k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 157k, False: 8.98M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   157k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |   67|  1.32k|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  1.32k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 1.32k, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  1.32k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |   70|       |
  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |   72|   826k|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|   826k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 826k, False: 8.31M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   826k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   73|      1|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  ------------------
  |  |  |  | 1770|      1|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 1, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      1|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |   75|       |
  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |   79|  68.4k|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  68.4k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 68.4k, False: 9.07M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  68.4k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   80|   501k|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  ------------------
  |  |  |  | 1770|   501k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 501k, False: 8.63M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   501k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   85|   134k|DEF_VALUE(AllocStackInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|   134k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 134k, False: 9.00M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   134k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   86|      2|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      2|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 2, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      2|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   87|    101|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|    101|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 101, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|    101|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   89|  40.6k|DEF_VALUE(CatchInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  40.6k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 40.6k, False: 9.09M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  40.6k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   92|    119|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|    119|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 119, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|    119|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   93|  40.6k|DEF_VALUE(TryEndInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  40.6k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 40.6k, False: 9.09M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  40.6k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   94|      9|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      9|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 9, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      9|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   96|  22.3k|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  22.3k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 22.3k, False: 9.11M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  22.3k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   97|  20.3k|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  20.3k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 20.3k, False: 9.11M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  20.3k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   98|  42.7k|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  42.7k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 42.7k, False: 9.09M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  42.7k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  100|   104k|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|   104k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 104k, False: 9.03M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   104k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  101|      4|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      4|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 4, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      4|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  102|      0|#endif
  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  104|       |
  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  109|   103k|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  ------------------
  |  |  |  | 1770|   103k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 103k, False: 9.03M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   103k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  111|      0|#endif
  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  115|       |#endif
  |  |  116|       |
  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  119|   484k|TERMINATOR(BranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|   484k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|   484k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 484k, False: 8.65M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|   484k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|   103k|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|   103k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|   103k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 103k, False: 9.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|   103k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|  20.3k|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|  20.3k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|  20.3k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 20.3k, False: 9.11M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|  20.3k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  122|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|  91.9k|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|  91.9k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|  91.9k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 91.9k, False: 9.04M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|  91.9k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  124|     15|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|     15|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|     15|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 15, False: 9.14M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|     15|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  125|     15|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|     15|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|     15|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 15, False: 9.14M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|     15|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  127|  40.6k|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|  40.6k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|  40.6k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 40.6k, False: 9.09M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|  40.6k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  132|       |
  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  134|  2.84k|DEF_VALUE(CallInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  2.84k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 2.84k, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  2.84k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  136|  2.82k|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  ------------------
  |  |  |  | 1770|  2.82k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 2.82k, False: 9.13M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  2.82k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  138|  25.0k|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  ------------------
  |  |  |  | 1770|  25.0k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 25.0k, False: 9.11M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  25.0k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  141|      0|#endif
  |  |  142|      0|MARK_LAST(CallInst)
  |  |  143|       |
  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  147|       |
  |  |  148|       |// These are target dependent instructions:
  |  |  149|       |
  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  151|   503k|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|   503k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 503k, False: 8.63M]
  |  |  |  |  ------------------
  |  |  |  | 1771|   503k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  152|      9|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      9|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 9, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      9|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  153|  25.0k|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  25.0k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 25.0k, False: 9.11M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  25.0k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  155|  25.0k|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|  25.0k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 25.0k, False: 9.11M]
  |  |  |  |  ------------------
  |  |  |  | 1771|  25.0k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  ------------------
  |  |  |  | 1770|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1770:3): [True: 0, False: 9.14M]
  |  |  |  |  ------------------
  |  |  |  | 1771|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  158|      0|#endif
  |  |  159|       |
  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  161|       |
  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  163|       |// these macros are still used after the #include.
  |  |  164|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  165|      0|#undef DEF_VALUE
  |  |  166|      0|#undef MARK_FIRST
  |  |  167|      0|#undef MARK_LAST
  |  |  168|      0|#undef TERMINATOR
  |  |  169|      0|#endif
  ------------------
 1773|       |
 1774|      0|    default:
  ------------------
  |  Branch (1774:5): [True: 0, False: 9.14M]
  ------------------
 1775|      0|      llvm_unreachable("Invalid kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1776|  9.14M|  }
 1777|  9.14M|}
_ZN6hermes3hbc7HBCISel8generateEPNS_18SourceMapGeneratorE:
 1779|   103k|void HBCISel::generate(SourceMapGenerator *outSourceMap) {
 1780|   103k|  PostOrderAnalysis PO(F_);
 1781|       |
 1782|       |  /// The order of the blocks is reverse-post-order, which is a simply
 1783|       |  /// topological sort.
 1784|   103k|  llvh::SmallVector<BasicBlock *, 16> order(PO.rbegin(), PO.rend());
 1785|       |
 1786|       |  // If we are compiling with debugger or otherwise need async break checks,
 1787|       |  // decide which blocks need runtime async break checks: blocks with backwards
 1788|       |  // jumps, and the first block if this is a function (i.e. not the
 1789|       |  // global scope).
 1790|   103k|  if (F_->getContext().getDebugInfoSetting() == DebugInfoSetting::ALL ||
  ------------------
  |  Branch (1790:7): [True: 103k, False: 0]
  ------------------
 1791|   103k|      F_->getContext().getEmitAsyncBreakCheck()) {
  ------------------
  |  Branch (1791:7): [True: 0, False: 0]
  ------------------
 1792|   103k|    asyncBreakChecks_ = basicBlocksWithBackwardSuccessors(order);
 1793|   103k|    asyncBreakChecks_.insert(order.front());
 1794|   103k|  }
 1795|       |
 1796|   843k|  for (int i = 0, e = order.size(); i < e; ++i) {
  ------------------
  |  Branch (1796:37): [True: 740k, False: 103k]
  ------------------
 1797|   740k|    BasicBlock *BB = order[i];
 1798|   740k|    BasicBlock *next = ((i + 1) == e) ? nullptr : order[i + 1];
  ------------------
  |  Branch (1798:24): [True: 103k, False: 637k]
  ------------------
 1799|   740k|    LLVM_DEBUG(dbgs() << "Generating bytecode for basic block " << BB << "\n");
  ------------------
  |  |  123|   740k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   740k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 740k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   740k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1800|   740k|    generate(BB, next);
 1801|   740k|  }
 1802|       |
 1803|   103k|  resolveRelocations();
 1804|   103k|  resolveExceptionHandlers();
 1805|   103k|  addDebugSourceLocationInfo(outSourceMap);
 1806|   103k|  addDebugTextifiedCalleeInfo();
 1807|   103k|  generateJumpTable();
 1808|   103k|  populatePropertyCachingInfo();
 1809|   103k|  BCFGen_->bytecodeGenerationComplete();
 1810|   103k|}
_ZN6hermes3hbc7HBCISel29acquirePropertyReadCacheIndexEj:
 1812|   570k|uint8_t HBCISel::acquirePropertyReadCacheIndex(unsigned id) {
 1813|   570k|  const bool reuse = F_->getContext().getOptimizationSettings().reusePropCache;
 1814|       |  // Zero is reserved for indicating no-cache, so cannot be a value in the map.
 1815|   570k|  uint8_t dummyZero = 0;
 1816|   570k|  auto &idx = reuse ? propertyReadCacheIndexForId_[id] : dummyZero;
  ------------------
  |  Branch (1816:15): [True: 570k, False: 0]
  ------------------
 1817|   570k|  if (idx) {
  ------------------
  |  Branch (1817:7): [True: 520k, False: 49.9k]
  ------------------
 1818|   520k|    ++NumCachedNodes;
 1819|   520k|    return idx;
 1820|   520k|  }
 1821|       |
 1822|  49.9k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  49.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 21, False: 49.8k]
  |  |  ------------------
  ------------------
 1823|  49.9k|          lastPropertyReadCacheIndex_ == std::numeric_limits<uint8_t>::max())) {
 1824|     21|    ++NumUncachedNodes;
 1825|     21|    return PROPERTY_CACHING_DISABLED;
 1826|     21|  }
 1827|       |
 1828|  49.8k|  ++NumCachedNodes;
 1829|  49.8k|  ++NumCacheSlots;
 1830|  49.8k|  idx = ++lastPropertyReadCacheIndex_;
 1831|  49.8k|  return idx;
 1832|  49.9k|}
_ZN6hermes3hbc7HBCISel30acquirePropertyWriteCacheIndexEj:
 1834|  1.26k|uint8_t HBCISel::acquirePropertyWriteCacheIndex(unsigned id) {
 1835|  1.26k|  const bool reuse = F_->getContext().getOptimizationSettings().reusePropCache;
 1836|       |  // Zero is reserved for indicating no-cache, so cannot be a value in the map.
 1837|  1.26k|  uint8_t dummyZero = 0;
 1838|  1.26k|  auto &idx = reuse ? propertyWriteCacheIndexForId_[id] : dummyZero;
  ------------------
  |  Branch (1838:15): [True: 1.26k, False: 0]
  ------------------
 1839|  1.26k|  if (idx) {
  ------------------
  |  Branch (1839:7): [True: 38, False: 1.22k]
  ------------------
 1840|     38|    ++NumCachedNodes;
 1841|     38|    return idx;
 1842|     38|  }
 1843|       |
 1844|  1.22k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  1.22k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.22k]
  |  |  ------------------
  ------------------
 1845|  1.22k|          lastPropertyWriteCacheIndex_ ==
 1846|  1.22k|          std::numeric_limits<uint8_t>::max())) {
 1847|      0|    ++NumUncachedNodes;
 1848|      0|    return PROPERTY_CACHING_DISABLED;
 1849|      0|  }
 1850|       |
 1851|  1.22k|  ++NumCachedNodes;
 1852|  1.22k|  ++NumCacheSlots;
 1853|  1.22k|  idx = ++lastPropertyWriteCacheIndex_;
 1854|  1.22k|  return idx;
 1855|  1.22k|}
_ZN6hermes3hbc7HBCISel24obtainFileAndSourceMapIdERNS_18SourceErrorManagerEj:
  229|  4.28M|    unsigned bufId) {
  230|  4.28M|  if (LLVM_LIKELY(
  ------------------
  |  |  188|  8.46M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.18M, False: 103k]
  |  |  |  Branch (188:51): [True: 4.18M, False: 103k]
  |  |  |  Branch (188:51): [True: 4.18M, False: 0]
  |  |  ------------------
  ------------------
  231|  4.28M|          lastFoundFileSourceMapId_ &&
  232|  4.28M|          lastFoundFileSourceMapId_->first == bufId)) {
  233|  4.18M|    return lastFoundFileSourceMapId_->second;
  234|  4.18M|  }
  235|       |
  236|   103k|  auto it = fileAndSourceMapIdCache_.find(bufId);
  237|   103k|  if (LLVM_LIKELY(it != fileAndSourceMapIdCache_.end())) {
  ------------------
  |  |  188|   103k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 196]
  |  |  ------------------
  ------------------
  238|   103k|    lastFoundFileSourceMapId_ = &*it;
  239|   103k|    return it->second;
  240|   103k|  }
  241|       |
  242|    196|  llvh::StringRef filename = sm.getSourceUrl(bufId);
  243|       |
  244|    196|  uint32_t currentFilenameId = BCFGen_->addFilename(filename);
  245|    196|  uint32_t currentSourceMappingUrlId;
  246|       |
  247|    196|  llvh::StringRef sourceMappingUrl{};
  248|       |  // Only fetch the source map URL if we are not stripping it and if we are
  249|       |  // generating full debug info.
  250|    196|  if (!bytecodeGenerationOptions_.stripSourceMappingURL &&
  ------------------
  |  Branch (250:7): [True: 196, False: 0]
  ------------------
  251|    196|      F_->getContext().getDebugInfoSetting() >= DebugInfoSetting::ALL) {
  ------------------
  |  Branch (251:7): [True: 196, False: 0]
  ------------------
  252|    196|    sourceMappingUrl = sm.getSourceMappingUrl(bufId);
  253|    196|  }
  254|       |
  255|       |  // Lazily compiled functions ask to strip the source mapping URL because
  256|       |  // it was already encoded in the top level module, and it could be a 1MB+
  257|       |  // data url that we don't want to duplicate once per function.
  258|    196|  if (sourceMappingUrl.empty()) {
  ------------------
  |  Branch (258:7): [True: 196, False: 0]
  ------------------
  259|    196|    currentSourceMappingUrlId = facebook::hermes::debugger::kInvalidBreakpoint;
  260|    196|  } else {
  261|       |    // NOTE: this is potentially a very expensive operation, since the source
  262|       |    // mapping URL could be many megabytes (when it is a data URL). Looking it
  263|       |    // up in the hash table potentially requires scanning it three times.
  264|      0|    currentSourceMappingUrlId = BCFGen_->addFilename(
  265|      0|        F_->getParent()->getContext().getIdentifier(sourceMappingUrl).str());
  266|      0|  }
  267|       |
  268|    196|  it = fileAndSourceMapIdCache_
  269|    196|           .try_emplace(
  270|    196|               bufId,
  271|    196|               FileAndSourceMapId{currentFilenameId, currentSourceMappingUrlId})
  272|    196|           .first;
  273|    196|  lastFoundFileSourceMapId_ = &*it;
  274|    196|  return it->second;
  275|   103k|}
ISel.cpp:_ZL33basicBlocksWithBackwardSuccessorsN4llvh8ArrayRefIPN6hermes10BasicBlockEEE:
   45|   103k|    ArrayRef<BasicBlock *> blocks) {
   46|   103k|  llvh::SmallDenseSet<const BasicBlock *, 16> seen;
   47|   103k|  DenseSet<const BasicBlock *> result;
   48|   740k|  for (const BasicBlock *BB : blocks) {
  ------------------
  |  Branch (48:29): [True: 740k, False: 103k]
  ------------------
   49|   740k|    seen.insert(BB);
   50|       |    // Add all successors that are in our seen set.
   51|   749k|    for (const auto *successor : successors(BB)) {
  ------------------
  |  Branch (51:32): [True: 749k, False: 740k]
  ------------------
   52|   749k|      if (seen.count(successor))
  ------------------
  |  Branch (52:11): [True: 15, False: 749k]
  ------------------
   53|     15|        result.insert(successor);
   54|   749k|    }
   55|   740k|  }
   56|   103k|  return result;
   57|   103k|}

_ZN6hermes3hbc13LoadConstants20operandMustBeLiteralEPNS_11InstructionEj:
   90|  4.94M|bool LoadConstants::operandMustBeLiteral(Instruction *Inst, unsigned opIndex) {
   91|       |  // HBCLoadConstInst is meant to load a constant
   92|  4.94M|  if (llvh::isa<HBCLoadConstInst>(Inst))
  ------------------
  |  Branch (92:7): [True: 725, False: 4.94M]
  ------------------
   93|    725|    return true;
   94|       |
   95|       |  // The operand of HBCLoadParamInst is a literal index.
   96|  4.94M|  if (llvh::isa<HBCLoadParamInst>(Inst))
  ------------------
  |  Branch (96:7): [True: 0, False: 4.94M]
  ------------------
   97|      0|    return true;
   98|       |
   99|  4.94M|  if (llvh::isa<HBCAllocObjectFromBufferInst>(Inst))
  ------------------
  |  Branch (99:7): [True: 0, False: 4.94M]
  ------------------
  100|      0|    return true;
  101|       |
  102|       |  // All operands of AllocArrayInst are literals.
  103|  4.94M|  if (llvh::isa<AllocArrayInst>(Inst))
  ------------------
  |  Branch (103:7): [True: 411k, False: 4.53M]
  ------------------
  104|   411k|    return true;
  105|       |
  106|  4.53M|  if (llvh::isa<AllocObjectInst>(Inst)) {
  ------------------
  |  Branch (106:7): [True: 2, False: 4.53M]
  ------------------
  107|       |    // The AllocObjectInst::SizeIdx is a literal.
  108|      2|    if (opIndex == AllocObjectInst::SizeIdx)
  ------------------
  |  Branch (108:9): [True: 2, False: 0]
  ------------------
  109|      2|      return true;
  110|       |    // AllocObjectInst::ParentObjectIdx is a literal if it is the EmptySentinel.
  111|      0|    if (opIndex == AllocObjectInst::ParentObjectIdx &&
  ------------------
  |  Branch (111:9): [True: 0, False: 0]
  |  Branch (111:9): [True: 0, False: 0]
  ------------------
  112|      0|        llvh::isa<EmptySentinel>(Inst->getOperand(opIndex)))
  ------------------
  |  Branch (112:9): [True: 0, False: 0]
  ------------------
  113|      0|      return true;
  114|       |
  115|      0|    return false;
  116|      0|  }
  117|       |
  118|       |  // SwitchInst's rest of the operands are case values,
  119|       |  // hence they will stay as constant.
  120|  4.53M|  if (llvh::isa<SwitchInst>(Inst) && opIndex > 0)
  ------------------
  |  Branch (120:7): [True: 0, False: 4.53M]
  |  Branch (120:38): [True: 0, False: 0]
  ------------------
  121|      0|    return true;
  122|       |
  123|       |  // StoreOwnPropertyInst and StoreNewOwnPropertyInst.
  124|  4.53M|  if (auto *SOP = llvh::dyn_cast<StoreOwnPropertyInst>(Inst)) {
  ------------------
  |  Branch (124:13): [True: 2.48M, False: 2.05M]
  ------------------
  125|  2.48M|    if (opIndex == StoreOwnPropertyInst::PropertyIdx) {
  ------------------
  |  Branch (125:9): [True: 826k, False: 1.65M]
  ------------------
  126|   826k|      if (llvh::isa<StoreNewOwnPropertyInst>(Inst)) {
  ------------------
  |  Branch (126:11): [True: 1, False: 826k]
  ------------------
  127|       |        // In StoreNewOwnPropertyInst the property name must be a literal.
  128|      1|        return true;
  129|      1|      }
  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|   826k|      if (auto *LN = llvh::dyn_cast<LiteralNumber>(Inst->getOperand(opIndex))) {
  ------------------
  |  Branch (134:17): [True: 826k, False: 0]
  ------------------
  135|   826k|        if (SOP->getIsEnumerable() && LN->convertToArrayIndex().hasValue())
  ------------------
  |  Branch (135:13): [True: 826k, False: 0]
  |  Branch (135:13): [True: 826k, False: 0]
  |  Branch (135:39): [True: 826k, False: 0]
  ------------------
  136|   826k|          return true;
  137|   826k|      }
  138|   826k|    }
  139|       |
  140|       |    // StoreOwnPropertyInst's isEnumerable is a boolean constant.
  141|  1.65M|    if (opIndex == StoreOwnPropertyInst::IsEnumerableIdx)
  ------------------
  |  Branch (141:9): [True: 826k, False: 826k]
  ------------------
  142|   826k|      return true;
  143|       |
  144|   826k|    return false;
  145|  1.65M|  }
  146|       |
  147|       |  // If StorePropertyInst's property ID is a LiteralString, we will keep it
  148|       |  // untouched and emit try_put_by_id eventually.
  149|  2.05M|  if (llvh::isa<StorePropertyInst>(Inst) &&
  ------------------
  |  Branch (149:7): [True: 2.52k, False: 2.05M]
  |  Branch (149:7): [True: 1.26k, False: 2.05M]
  ------------------
  150|  2.05M|      opIndex == StorePropertyInst::PropertyIdx &&
  ------------------
  |  Branch (150:7): [True: 1.26k, False: 1.26k]
  ------------------
  151|  2.05M|      llvh::isa<LiteralString>(Inst->getOperand(opIndex)))
  ------------------
  |  Branch (151:7): [True: 1.26k, False: 1]
  ------------------
  152|  1.26k|    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|  2.05M|  if (llvh::isa<LoadPropertyInst>(Inst) &&
  ------------------
  |  Branch (156:7): [True: 1.07M, False: 981k]
  |  Branch (156:7): [True: 570k, False: 1.48M]
  ------------------
  157|  2.05M|      opIndex == LoadPropertyInst::PropertyIdx &&
  ------------------
  |  Branch (157:7): [True: 570k, False: 501k]
  ------------------
  158|  2.05M|      llvh::isa<LiteralString>(Inst->getOperand(opIndex)))
  ------------------
  |  Branch (158:7): [True: 570k, False: 5]
  ------------------
  159|   570k|    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.48M|  if (llvh::isa<DeletePropertyInst>(Inst) &&
  ------------------
  |  Branch (163:7): [True: 0, False: 1.48M]
  |  Branch (163:7): [True: 0, False: 1.48M]
  ------------------
  164|  1.48M|      opIndex == DeletePropertyInst::PropertyIdx &&
  ------------------
  |  Branch (164:7): [True: 0, False: 0]
  ------------------
  165|  1.48M|      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.48M|  if (llvh::isa<StoreGetterSetterInst>(Inst) &&
  ------------------
  |  Branch (169:7): [True: 0, False: 1.48M]
  ------------------
  170|  1.48M|      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.48M|  if (llvh::isa<CreateRegExpInst>(Inst))
  ------------------
  |  Branch (175:7): [True: 238, False: 1.48M]
  ------------------
  176|    238|    return true;
  177|       |
  178|  1.48M|  if (llvh::isa<SwitchImmInst>(Inst) &&
  ------------------
  |  Branch (178:7): [True: 0, False: 1.48M]
  ------------------
  179|  1.48M|      (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.48M|  if (llvh::isa<CallBuiltinInst>(Inst) &&
  ------------------
  |  Branch (185:7): [True: 388k, False: 1.09M]
  ------------------
  186|  1.48M|      (opIndex == CallBuiltinInst::CalleeIdx ||
  ------------------
  |  Branch (186:8): [True: 2.82k, False: 385k]
  ------------------
  187|   388k|       opIndex == CallBuiltinInst::ThisIdx))
  ------------------
  |  Branch (187:8): [True: 2.82k, False: 382k]
  ------------------
  188|  5.64k|    return true;
  189|       |
  190|       |  /// Call's new.target must be literal if it is undefined (well, it doesn't,
  191|       |  /// but an undefined new.target won't be emitted to bytecode, hence it doesn't
  192|       |  /// need to be loaded).
  193|  1.47M|  if (llvh::isa<CallInst>(Inst) && opIndex == CallInst::NewTargetIdx)
  ------------------
  |  Branch (193:7): [True: 720k, False: 756k]
  |  Branch (193:36): [True: 5.66k, False: 714k]
  ------------------
  194|  5.66k|    return true;
  195|       |
  196|       |  /// GetBuiltinClosureInst's builtin index is always literal.
  197|  1.47M|  if (llvh::isa<GetBuiltinClosureInst>(Inst) &&
  ------------------
  |  Branch (197:7): [True: 0, False: 1.47M]
  ------------------
  198|  1.47M|      opIndex == GetBuiltinClosureInst::BuiltinIndexIdx)
  ------------------
  |  Branch (198:7): [True: 0, False: 0]
  ------------------
  199|      0|    return true;
  200|       |
  201|       |#ifdef HERMES_RUN_WASM
  202|       |  /// CallIntrinsic's IntrinsicIndexIdx should always be literals.
  203|       |  if (llvh::isa<CallIntrinsicInst>(Inst) &&
  204|       |      (opIndex == CallIntrinsicInst::IntrinsicIndexIdx))
  205|       |    return true;
  206|       |#endif
  207|       |
  208|  1.47M|  if (llvh::isa<IteratorCloseInst>(Inst) &&
  ------------------
  |  Branch (208:7): [True: 42.7k, False: 1.42M]
  ------------------
  209|  1.47M|      opIndex == IteratorCloseInst::IgnoreInnerExceptionIdx) {
  ------------------
  |  Branch (209:7): [True: 42.7k, False: 0]
  ------------------
  210|  42.7k|    return true;
  211|  42.7k|  }
  212|       |
  213|  1.42M|  if (llvh::isa<ThrowIfHasRestrictedGlobalPropertyInst>(Inst) &&
  ------------------
  |  Branch (213:7): [True: 0, False: 1.42M]
  ------------------
  214|  1.42M|      opIndex == ThrowIfHasRestrictedGlobalPropertyInst::PropertyIdx) {
  ------------------
  |  Branch (214:7): [True: 0, False: 0]
  ------------------
  215|      0|    return true;
  216|      0|  }
  217|       |  // DirectEvalInst's isStrict is a boolean constant.
  218|  1.42M|  if (llvh::isa<DirectEvalInst>(Inst) &&
  ------------------
  |  Branch (218:7): [True: 0, False: 1.42M]
  ------------------
  219|  1.42M|      opIndex == DirectEvalInst::IsStrictIdx) {
  ------------------
  |  Branch (219:7): [True: 0, False: 0]
  ------------------
  220|      0|    return true;
  221|      0|  }
  222|       |
  223|  1.42M|  return false;
  224|  1.42M|}
_ZN6hermes3hbc13LoadConstants13runOnFunctionEPNS_8FunctionE:
  226|   103k|bool LoadConstants::runOnFunction(Function *F) {
  227|   103k|  IRBuilder builder(F);
  228|   103k|  bool changed = false;
  229|       |
  230|       |  /// Inserts and returns a load instruction for \p literal before \p where.
  231|   103k|  auto createLoadLiteral = [&builder](Literal *literal, Instruction *where) {
  232|   103k|    builder.setInsertionPoint(where);
  233|   103k|    return llvh::isa<GlobalObject>(literal)
  234|   103k|        ? cast<Instruction>(builder.createHBCGetGlobalObjectInst())
  235|   103k|        : cast<Instruction>(builder.createHBCLoadConstInst(literal));
  236|   103k|  };
  237|       |
  238|   843k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (238:23): [True: 843k, False: 103k]
  ------------------
  239|  3.82M|    for (auto &I : BB) {
  ------------------
  |  Branch (239:18): [True: 3.82M, False: 843k]
  ------------------
  240|  3.82M|      if (auto *phi = llvh::dyn_cast<PhiInst>(&I)) {
  ------------------
  |  Branch (240:17): [True: 4.39k, False: 3.82M]
  ------------------
  241|       |        // Since PhiInsts must always be at the start of a basic block, we have
  242|       |        // to insert the load instruction in the predecessor. This lowering is
  243|       |        // sub-optimal: for conditional branches, the load constant operation
  244|       |        // will be performed before the branch decides which path to take.
  245|  13.1k|        for (unsigned i = 0, e = phi->getNumEntries(); i < e; ++i) {
  ------------------
  |  Branch (245:56): [True: 8.78k, False: 4.39k]
  ------------------
  246|  8.78k|          auto [val, bb] = phi->getEntry(i);
  247|  8.78k|          if (auto *literal = llvh::dyn_cast<Literal>(val)) {
  ------------------
  |  Branch (247:21): [True: 725, False: 8.06k]
  ------------------
  248|    725|            auto *load = createLoadLiteral(literal, bb->getTerminator());
  249|    725|            phi->updateEntry(i, load, bb);
  250|    725|            changed = true;
  251|    725|          }
  252|  8.78k|        }
  253|  4.39k|        continue;
  254|  4.39k|      }
  255|       |      // For all other instructions, insert load constants right before the they
  256|       |      // are needed. This minimizes their live range and therefore reduces
  257|       |      // register pressure. CodeMotion and CSE can later hoist and deduplicate
  258|       |      // them.
  259|  13.2M|      for (unsigned i = 0, e = I.getNumOperands(); i < e; ++i) {
  ------------------
  |  Branch (259:52): [True: 9.38M, False: 3.82M]
  ------------------
  260|  9.38M|        if (auto *literal = llvh::dyn_cast<Literal>(I.getOperand(i))) {
  ------------------
  |  Branch (260:19): [True: 4.94M, False: 4.43M]
  ------------------
  261|  4.94M|          if (!operandMustBeLiteral(&I, i)) {
  ------------------
  |  Branch (261:15): [True: 2.25M, False: 2.69M]
  ------------------
  262|  2.25M|            auto *load = createLoadLiteral(literal, &I);
  263|  2.25M|            I.setOperand(load, i);
  264|  2.25M|            changed = true;
  265|  2.25M|          }
  266|  4.94M|        }
  267|  9.38M|      }
  268|  3.82M|    }
  269|   843k|  }
  270|   103k|  return changed;
  271|   103k|}
_ZN6hermes3hbc14LoadParameters13runOnFunctionEPNS_8FunctionE:
  273|   103k|bool LoadParameters::runOnFunction(Function *F) {
  274|   103k|  IRBuilder builder(F);
  275|   103k|  bool changed = false;
  276|       |
  277|   103k|  updateToEntryInsertionPoint(builder, F);
  278|       |
  279|       |  // Index of 0 is the "this" parameter.
  280|   103k|  unsigned index = 1;
  281|   103k|  for (Parameter *p : F->getParameters()) {
  ------------------
  |  Branch (281:21): [True: 103k, False: 103k]
  ------------------
  282|   103k|    auto *load =
  283|   103k|        builder.createHBCLoadParamInst(builder.getLiteralNumber(index));
  284|   103k|    p->replaceAllUsesWith(load);
  285|   103k|    index++;
  286|   103k|    changed = true;
  287|   103k|  }
  288|       |
  289|       |  // Lower accesses to "this".
  290|   103k|  auto *thisParam = F->getThisParameter();
  291|   103k|  if (thisParam && thisParam->hasUsers()) {
  ------------------
  |  Branch (291:7): [True: 103k, False: 0]
  |  Branch (291:20): [True: 9, False: 103k]
  ------------------
  292|       |    // In strict mode just use param 0 directly. In non-strict, we must coerce
  293|       |    // it to an object.
  294|      9|    Value *getThisInst = F->isStrictMode()
  ------------------
  |  Branch (294:26): [True: 0, False: 9]
  ------------------
  295|      9|        ? cast<Value>(
  296|      0|              builder.createHBCLoadParamInst(builder.getLiteralNumber(0)))
  297|      9|        : cast<Value>(builder.createHBCGetThisNSInst());
  298|      9|    thisParam->replaceAllUsesWith(getThisInst);
  299|      9|    changed = true;
  300|      9|  }
  301|   103k|  return changed;
  302|   103k|}
_ZN6hermes3hbc23LowerLoadStoreFrameInst8getScopeERNS_9IRBuilderEPNS_8VariableEPNS_17ScopeCreationInstE:
  307|   104k|    ScopeCreationInst *environment) {
  308|   104k|  if (var->getParent() == environment->getCreatedScopeDesc()) {
  ------------------
  |  Branch (308:7): [True: 104k, False: 0]
  ------------------
  309|       |    // Var's scope belongs to the current function.
  310|   104k|    assert(
  311|   104k|        var->getParent()->getFunction() == builder.getFunction() &&
  312|   104k|        "Scope should only be found if var is not captured from another "
  313|   104k|        "function");
  314|   104k|    return environment;
  315|   104k|  }
  316|       |
  317|      0|  auto *environmentWithParent =
  318|      0|      llvh::dyn_cast<NestedScopeCreationInst>(environment);
  319|      0|  if (!environmentWithParent) {
  ------------------
  |  Branch (319:7): [True: 0, False: 0]
  ------------------
  320|       |    // Failed to find the variable in the current Function -- the first scope in
  321|       |    // a Function is always an non-NestedScopeCreationInst.
  322|      0|    assert(
  323|      0|        var->getParent()->getFunction() != builder.getFunction() &&
  324|      0|        "Failed to find scope in current function for local variable.");
  325|      0|    return builder.createHBCResolveEnvironment(
  326|      0|        environment->getCreatedScopeDesc(), var->getParent());
  327|      0|  }
  328|       |
  329|       |  // Keep looking.
  330|      0|  return getScope(builder, var, environmentWithParent->getParentScope());
  331|      0|}
_ZN6hermes3hbc23LowerLoadStoreFrameInst13runOnFunctionEPNS_8FunctionE:
  333|   103k|bool LowerLoadStoreFrameInst::runOnFunction(Function *F) {
  334|   103k|  IRBuilder builder(F);
  335|   103k|  bool changed = false;
  336|       |
  337|   103k|  bool fnScopeCreated = false;
  338|   843k|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (338:23): [True: 843k, False: 103k]
  ------------------
  339|  4.46M|    for (auto I = BB.begin(), E = BB.end(); I != E; /* nothing */) {
  ------------------
  |  Branch (339:45): [True: 3.62M, False: 843k]
  ------------------
  340|  3.62M|      Instruction *Inst = &*I;
  341|  3.62M|      ++I;
  342|  3.62M|      if (auto *csi = llvh::dyn_cast<CreateScopeInst>(Inst)) {
  ------------------
  |  Branch (342:17): [True: 103k, False: 3.52M]
  ------------------
  343|   103k|        fnScopeCreated |=
  344|   103k|            csi->getCreatedScopeDesc() == F->getFunctionScopeDesc();
  345|   103k|        builder.setInsertionPoint(csi);
  346|   103k|        Instruction *llInst =
  347|   103k|            builder.createHBCCreateEnvironmentInst(csi->getCreatedScopeDesc());
  348|   103k|        Inst->replaceAllUsesWith(llInst);
  349|   103k|        Inst->eraseFromParent();
  350|   103k|        changed = true;
  351|  3.52M|      } else if (auto cisi = llvh::dyn_cast<CreateInnerScopeInst>(Inst)) {
  ------------------
  |  Branch (351:23): [True: 0, False: 3.52M]
  ------------------
  352|      0|        builder.setInsertionPoint(cisi);
  353|      0|        assert(
  354|      0|            llvh::isa<HBCCreateEnvironmentInst>(cisi->getParentScope()) ||
  355|      0|            llvh::isa<HBCCreateInnerEnvironmentInst>(cisi->getParentScope()));
  356|       |
  357|      0|        Instruction *llInst = builder.createHBCCreateInnerEnvironmentInst(
  358|      0|            cisi->getParentScope(), cisi->getCreatedScopeDesc());
  359|      0|        Inst->replaceAllUsesWith(llInst);
  360|      0|        Inst->eraseFromParent();
  361|      0|        changed = true;
  362|      0|      }
  363|  3.62M|    }
  364|   843k|  }
  365|       |
  366|       |  // At this point all scopes used in F should be materialized. However, not
  367|       |  // materializing F's scope potentially breaks lazy compilation as the compiler
  368|       |  // always assumes all "external" scopes (i.e., those that have already been
  369|       |  // compiled) have been materialized. Therefore, materialize the function scope
  370|       |  // now. This instruction will be optimized out if unused in optimized builds.
  371|   103k|  assert(fnScopeCreated && "Function body scope not materialized.");
  372|   103k|  (void)fnScopeCreated;
  373|       |
  374|   843k|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (374:23): [True: 843k, False: 103k]
  ------------------
  375|  4.46M|    for (auto I = BB.begin(), E = BB.end(); I != E; /* nothing */) {
  ------------------
  |  Branch (375:45): [True: 3.62M, False: 843k]
  ------------------
  376|       |      // Keep the reference and increment iterator first.
  377|  3.62M|      Instruction *Inst = &*I;
  378|  3.62M|      ++I;
  379|       |
  380|  3.62M|      builder.setLocation(Inst->getLocation());
  381|  3.62M|      builder.setCurrentSourceLevelScope(Inst->getSourceLevelScope());
  382|       |
  383|  3.62M|      switch (Inst->getKind()) {
  384|      4|        case ValueKind::LoadFrameInstKind: {
  ------------------
  |  Branch (384:9): [True: 4, False: 3.62M]
  ------------------
  385|      4|          auto *LFI = cast<LoadFrameInst>(Inst);
  386|      4|          auto *var = LFI->getLoadVariable();
  387|      4|          auto *environment = LFI->getEnvironment();
  388|       |
  389|      4|          builder.setInsertionPoint(Inst);
  390|      4|          ScopeCreationInst *scope = getScope(builder, var, environment);
  391|      4|          Instruction *newInst =
  392|      4|              builder.createHBCLoadFromEnvironmentInst(scope, var);
  393|       |
  394|      4|          Inst->replaceAllUsesWith(newInst);
  395|      4|          Inst->eraseFromParent();
  396|      4|          changed = true;
  397|      4|          break;
  398|      0|        }
  399|   104k|        case ValueKind::StoreFrameInstKind: {
  ------------------
  |  Branch (399:9): [True: 104k, False: 3.51M]
  ------------------
  400|   104k|          auto *SFI = cast<StoreFrameInst>(Inst);
  401|   104k|          auto *var = SFI->getVariable();
  402|   104k|          auto *val = SFI->getValue();
  403|   104k|          auto *environment = SFI->getEnvironment();
  404|       |
  405|   104k|          builder.setInsertionPoint(Inst);
  406|   104k|          ScopeCreationInst *scope = getScope(builder, var, environment);
  407|   104k|          builder.createHBCStoreToEnvironmentInst(scope, val, var);
  408|       |
  409|   104k|          Inst->eraseFromParent();
  410|   104k|          changed = true;
  411|   104k|          break;
  412|      0|        }
  413|   103k|        case ValueKind::CreateFunctionInstKind: {
  ------------------
  |  Branch (413:9): [True: 103k, False: 3.52M]
  ------------------
  414|   103k|          auto *CFI = cast<CreateFunctionInst>(Inst);
  415|   103k|          auto *environment = CFI->getEnvironment();
  416|       |
  417|   103k|          builder.setInsertionPoint(Inst);
  418|   103k|          auto *newInst = builder.createHBCCreateFunctionInst(
  419|   103k|              CFI->getFunctionCode(), environment);
  420|       |
  421|   103k|          Inst->replaceAllUsesWith(newInst);
  422|   103k|          Inst->eraseFromParent();
  423|   103k|          changed = true;
  424|   103k|          break;
  425|      0|        }
  426|      0|        case ValueKind::CreateGeneratorInstKind: {
  ------------------
  |  Branch (426:9): [True: 0, False: 3.62M]
  ------------------
  427|      0|          auto *CFI = cast<CreateGeneratorInst>(Inst);
  428|      0|          auto *environment = CFI->getEnvironment();
  429|       |
  430|      0|          builder.setInsertionPoint(Inst);
  431|      0|          auto *newInst = builder.createHBCCreateGeneratorInst(
  432|      0|              CFI->getFunctionCode(), environment);
  433|       |
  434|      0|          Inst->replaceAllUsesWith(newInst);
  435|      0|          Inst->eraseFromParent();
  436|      0|          changed = true;
  437|      0|          break;
  438|      0|        }
  439|  3.41M|        default:
  ------------------
  |  Branch (439:9): [True: 3.41M, False: 207k]
  ------------------
  440|  3.41M|          break;
  441|  3.62M|      }
  442|  3.62M|    }
  443|   843k|  }
  444|   103k|  return changed;
  445|   103k|}
_ZN6hermes3hbc19LowerArgumentsArray22getCreateArgumentsInstEPNS_8FunctionE:
  447|   103k|CreateArgumentsInst *LowerArgumentsArray::getCreateArgumentsInst(Function *F) {
  448|       |  // CreateArgumentsInst is always in the first block in normal functions,
  449|       |  // but is in the second block in GeneratorInnerFunctions.
  450|   103k|  if (llvh::isa<GeneratorInnerFunction>(F)) {
  ------------------
  |  Branch (450:7): [True: 0, False: 103k]
  ------------------
  451|      0|    for (BasicBlock *succ : F->front().getTerminator()->successors()) {
  ------------------
  |  Branch (451:27): [True: 0, False: 0]
  ------------------
  452|      0|      for (auto &inst : *succ) {
  ------------------
  |  Branch (452:23): [True: 0, False: 0]
  ------------------
  453|      0|        if (auto *target = llvh::dyn_cast<CreateArgumentsInst>(&inst)) {
  ------------------
  |  Branch (453:19): [True: 0, False: 0]
  ------------------
  454|      0|          return target;
  455|      0|        }
  456|      0|      }
  457|      0|    }
  458|   103k|  } else {
  459|  1.39M|    for (auto &inst : F->front()) {
  ------------------
  |  Branch (459:21): [True: 1.39M, False: 103k]
  ------------------
  460|  1.39M|      if (auto *target = llvh::dyn_cast<CreateArgumentsInst>(&inst)) {
  ------------------
  |  Branch (460:17): [True: 13, False: 1.39M]
  ------------------
  461|     13|        return target;
  462|     13|      }
  463|  1.39M|    }
  464|   103k|  }
  465|   103k|  return nullptr;
  466|   103k|}
_ZN6hermes3hbc19LowerArgumentsArray13runOnFunctionEPNS_8FunctionE:
  468|   103k|bool LowerArgumentsArray::runOnFunction(Function *F) {
  469|   103k|  IRBuilder builder(F);
  470|   103k|  updateToEntryInsertionPoint(builder, F);
  471|       |
  472|   103k|  CreateArgumentsInst *createArguments = getCreateArgumentsInst(F);
  473|   103k|  if (!createArguments) {
  ------------------
  |  Branch (473:7): [True: 103k, False: 13]
  ------------------
  474|   103k|    return false;
  475|   103k|  }
  476|       |
  477|     13|  builder.setInsertionPoint(createArguments);
  478|     13|  AllocStackInst *lazyReg = builder.createAllocStackInst("arguments");
  479|     13|  builder.createStoreStackInst(builder.getLiteralUndefined(), lazyReg);
  480|       |
  481|       |  // Process all LoadPropertyInst's first because they may add another user
  482|       |  // to the list of users of createArguments.
  483|       |  // Specifically the case when `arguments[arguments]` is accessed.
  484|       |  // Note that in such a case, a single LoadPropertyInst will appear twice in
  485|       |  // the use list. Use a set so we only remove it once.
  486|     13|  llvh::SmallSetVector<Instruction *, 16> uniqueUsers;
  487|     13|  uniqueUsers.insert(
  488|     13|      createArguments->getUsers().begin(), createArguments->getUsers().end());
  489|    174|  for (Value *user : uniqueUsers) {
  ------------------
  |  Branch (489:20): [True: 174, False: 13]
  ------------------
  490|    174|    auto *load = llvh::dyn_cast<LoadPropertyInst>(user);
  491|    174|    if (load && load->getObject() == createArguments) {
  ------------------
  |  Branch (491:9): [True: 0, False: 174]
  |  Branch (491:17): [True: 0, False: 0]
  ------------------
  492|      0|      builder.setInsertionPoint(load);
  493|      0|      builder.setLocation(load->getLocation());
  494|      0|      builder.setCurrentSourceLevelScope(load->getSourceLevelScope());
  495|      0|      auto *propertyString = llvh::dyn_cast<LiteralString>(load->getProperty());
  496|      0|      if (propertyString && propertyString->getValue().str() == "length") {
  ------------------
  |  Branch (496:11): [True: 0, False: 0]
  |  Branch (496:11): [True: 0, False: 0]
  |  Branch (496:29): [True: 0, False: 0]
  ------------------
  497|       |        // For `arguments.length`, get the length.
  498|      0|        auto *length = builder.createHBCGetArgumentsLengthInst(lazyReg);
  499|      0|        load->replaceAllUsesWith(length);
  500|      0|        load->eraseFromParent();
  501|      0|      } else {
  502|       |        // For all other property loads, get by index.
  503|      0|        auto *get = builder.createHBCGetArgumentsPropByValInst(
  504|      0|            load->getProperty(), lazyReg);
  505|      0|        load->replaceAllUsesWith(get);
  506|      0|        load->eraseFromParent();
  507|      0|      }
  508|      0|    }
  509|    174|  }
  510|       |
  511|     13|  uniqueUsers.clear();
  512|     13|  uniqueUsers.insert(
  513|     13|      createArguments->getUsers().begin(), createArguments->getUsers().end());
  514|    174|  for (Value *user : uniqueUsers) {
  ------------------
  |  Branch (514:20): [True: 174, False: 13]
  ------------------
  515|    174|    if (auto *phi = llvh::dyn_cast<PhiInst>(user)) {
  ------------------
  |  Branch (515:15): [True: 0, False: 174]
  ------------------
  516|       |      // We have to insert another branch where we can reify the value.
  517|      0|      for (int i = 0, n = phi->getNumEntries(); i < n; i++) {
  ------------------
  |  Branch (517:49): [True: 0, False: 0]
  ------------------
  518|      0|        auto entry = phi->getEntry(i);
  519|      0|        if (entry.first != createArguments)
  ------------------
  |  Branch (519:13): [True: 0, False: 0]
  ------------------
  520|      0|          continue;
  521|       |
  522|      0|        auto *previousBlock = cast<BasicBlock>(entry.second);
  523|      0|        auto *thisBlock = phi->getParent();
  524|       |
  525|      0|        auto *newBlock = builder.createBasicBlock(F);
  526|      0|        builder.setInsertionBlock(newBlock);
  527|      0|        builder.createHBCReifyArgumentsInst(lazyReg);
  528|      0|        auto *reifiedValue = builder.createLoadStackInst(lazyReg);
  529|      0|        builder.createBranchInst(thisBlock);
  530|       |
  531|      0|        phi->updateEntry(i, reifiedValue, newBlock);
  532|       |        // Update all other PHI nodes in thisBlock that currently reference
  533|       |        // previousBlock so they instead reference newBlock.
  534|      0|        updateIncomingPhiValues(thisBlock, previousBlock, newBlock);
  535|       |
  536|      0|        auto *branch = previousBlock->getTerminator();
  537|      0|        for (int j = 0, m = branch->getNumOperands(); j < m; j++)
  ------------------
  |  Branch (537:55): [True: 0, False: 0]
  ------------------
  538|      0|          if (branch->getOperand(j) == thisBlock)
  ------------------
  |  Branch (538:15): [True: 0, False: 0]
  ------------------
  539|      0|            branch->setOperand(newBlock, j);
  540|      0|      }
  541|    174|    } else if (auto *inst = llvh::dyn_cast<Instruction>(user)) {
  ------------------
  |  Branch (541:22): [True: 174, False: 0]
  ------------------
  542|       |      // For other users, insert a reification so we can replace
  543|       |      // the usage with this array.
  544|    174|      builder.setInsertionPoint(inst);
  545|    174|      builder.setLocation(inst->getLocation());
  546|    174|      builder.setCurrentSourceLevelScope(inst->getSourceLevelScope());
  547|    174|      builder.createHBCReifyArgumentsInst(lazyReg);
  548|    174|      auto *array = builder.createLoadStackInst(lazyReg);
  549|    522|      for (int i = 0, n = inst->getNumOperands(); i < n; i++) {
  ------------------
  |  Branch (549:51): [True: 348, False: 174]
  ------------------
  550|    348|        if (inst->getOperand(i) == createArguments) {
  ------------------
  |  Branch (550:13): [True: 174, False: 174]
  ------------------
  551|    174|          inst->setOperand(array, i);
  552|    174|        }
  553|    348|      }
  554|    174|    } else {
  555|      0|      hermes_fatal("CreateArguments used for a non-Instruction.");
  556|      0|    }
  557|    174|  }
  558|       |
  559|     13|  createArguments->eraseFromParent();
  560|     13|  return true;
  561|     13|}
_ZN6hermes3hbc19DedupReifyArguments13runOnFunctionEPNS_8FunctionE:
  563|   103k|bool DedupReifyArguments::runOnFunction(Function *F) {
  564|   103k|  bool changed = false;
  565|       |
  566|       |  // Check if there are any HBCReifyArgumentsInst in the function before
  567|       |  // calculating dominator tree and reverse post order to save compile time.
  568|   103k|  bool hasRAI = false;
  569|   385k|  for (auto &BB : *F) {
  ------------------
  |  Branch (569:17): [True: 385k, False: 103k]
  ------------------
  570|  2.25M|    for (auto &inst : BB.getInstList()) {
  ------------------
  |  Branch (570:21): [True: 2.25M, False: 385k]
  ------------------
  571|  2.25M|      if (llvh::isa<HBCReifyArgumentsInst>(&inst)) {
  ------------------
  |  Branch (571:11): [True: 13, False: 2.25M]
  ------------------
  572|     13|        hasRAI = true;
  573|     13|        break;
  574|     13|      }
  575|  2.25M|    }
  576|   385k|    if (hasRAI)
  ------------------
  |  Branch (576:9): [True: 13, False: 385k]
  ------------------
  577|     13|      break;
  578|   385k|  }
  579|       |
  580|   103k|  if (!hasRAI)
  ------------------
  |  Branch (580:7): [True: 103k, False: 13]
  ------------------
  581|   103k|    return false;
  582|       |
  583|     13|  DominanceInfo domInfo{F};
  584|     13|  PostOrderAnalysis PO(F);
  585|     13|  IRBuilder::InstructionDestroyer destroyer;
  586|       |
  587|     13|  llvh::SmallVector<BasicBlock *, 16> reversePO(PO.rbegin(), PO.rend());
  588|     13|  llvh::SmallVector<HBCReifyArgumentsInst *, 4> reifications;
  589|       |
  590|   492k|  for (auto *BB : reversePO) {
  ------------------
  |  Branch (590:17): [True: 492k, False: 13]
  ------------------
  591|  1.70M|    for (auto &inst : BB->getInstList()) {
  ------------------
  |  Branch (591:21): [True: 1.70M, False: 492k]
  ------------------
  592|  1.70M|      if (auto *reify = llvh::dyn_cast<HBCReifyArgumentsInst>(&inst)) {
  ------------------
  |  Branch (592:17): [True: 174, False: 1.70M]
  ------------------
  593|    174|        HBCReifyArgumentsInst *dominator = nullptr;
  594|    174|        for (auto *possibleParent : reifications) {
  ------------------
  |  Branch (594:35): [True: 161, False: 13]
  ------------------
  595|    161|          if (domInfo.properlyDominates(possibleParent, reify)) {
  ------------------
  |  Branch (595:15): [True: 161, False: 0]
  ------------------
  596|    161|            dominator = possibleParent;
  597|    161|            break;
  598|    161|          }
  599|    161|        }
  600|       |
  601|    174|        if (dominator) {
  ------------------
  |  Branch (601:13): [True: 161, False: 13]
  ------------------
  602|    161|          destroyer.add(reify);
  603|    161|          changed = true;
  604|    161|        } else {
  605|     13|          reifications.push_back(reify);
  606|     13|        }
  607|    174|      }
  608|  1.70M|    }
  609|   492k|  }
  610|     13|  return changed;
  611|   103k|}
_ZN6hermes3hbc17LowerConstruction13runOnFunctionEPNS_8FunctionE:
  613|   103k|bool LowerConstruction::runOnFunction(Function *F) {
  614|   103k|  IRBuilder builder(F);
  615|   103k|  auto *prototypeString = builder.getLiteralString("prototype");
  616|       |
  617|   843k|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (617:23): [True: 843k, False: 103k]
  ------------------
  618|   843k|    IRBuilder::InstructionDestroyer destroyer;
  619|  3.62M|    for (Instruction &I : BB) {
  ------------------
  |  Branch (619:25): [True: 3.62M, False: 843k]
  ------------------
  620|  3.62M|      if (auto *constructor = llvh::dyn_cast<ConstructInst>(&I)) {
  ------------------
  |  Branch (620:17): [True: 25.0k, False: 3.59M]
  ------------------
  621|  25.0k|        builder.setInsertionPoint(constructor);
  622|  25.0k|        builder.setLocation(constructor->getLocation());
  623|  25.0k|        builder.setCurrentSourceLevelScope(constructor->getSourceLevelScope());
  624|  25.0k|        auto closure = constructor->getCallee();
  625|  25.0k|        auto prototype =
  626|  25.0k|            builder.createLoadPropertyInst(closure, prototypeString);
  627|  25.0k|        auto thisObject = builder.createHBCCreateThisInst(prototype, closure);
  628|       |
  629|  25.0k|        llvh::SmallVector<Value *, 8> args;
  630|  25.0k|        for (int i = 1, n = constructor->getNumArguments(); i < n; i++) {
  ------------------
  |  Branch (630:61): [True: 0, False: 25.0k]
  ------------------
  631|      0|          args.push_back(constructor->getArgument(i));
  632|      0|        }
  633|  25.0k|        auto newConstructor = builder.createHBCConstructInst(
  634|  25.0k|            closure, constructor->getNewTarget(), thisObject, args);
  635|  25.0k|        auto finalValue = builder.createHBCGetConstructedObjectInst(
  636|  25.0k|            thisObject, newConstructor);
  637|  25.0k|        constructor->replaceAllUsesWith(finalValue);
  638|  25.0k|        destroyer.add(constructor);
  639|  25.0k|      }
  640|  3.62M|    }
  641|   843k|  }
  642|   103k|  return true;
  643|   103k|}
_ZN6hermes3hbc10LowerCalls13runOnFunctionEPNS_8FunctionE:
  645|   103k|bool LowerCalls::runOnFunction(Function *F) {
  646|   103k|  IRBuilder builder(F);
  647|   103k|  bool changed = false;
  648|       |
  649|   843k|  for (auto &BB : *F) {
  ------------------
  |  Branch (649:17): [True: 843k, False: 103k]
  ------------------
  650|  6.19M|    for (auto &I : BB) {
  ------------------
  |  Branch (650:18): [True: 6.19M, False: 843k]
  ------------------
  651|  6.19M|      auto *call = llvh::dyn_cast<CallInst>(&I);
  652|       |      // This also matches constructors.
  653|  6.19M|      if (!call)
  ------------------
  |  Branch (653:11): [True: 6.16M, False: 30.7k]
  ------------------
  654|  6.16M|        continue;
  655|  30.7k|      builder.setInsertionPoint(call);
  656|  30.7k|      changed = true;
  657|       |
  658|  30.7k|      auto reg = RA_.getLastRegister().getIndex() -
  659|  30.7k|          HVMRegisterAllocator::CALL_EXTRA_REGISTERS;
  660|       |
  661|   795k|      for (int i = 0, e = call->getNumArguments(); i < e; i++, --reg) {
  ------------------
  |  Branch (661:52): [True: 764k, False: 30.7k]
  ------------------
  662|       |        // If this is a Call instruction, emit explicit Movs to the argument
  663|       |        // registers. If this is a CallN instruction, emit ImplicitMovs
  664|       |        // instead, to express that these registers get written to by the CallN,
  665|       |        // even though they are not the destination.
  666|       |        // Lastly, if this is argument 0 of CallBuiltinInst emit ImplicitMov to
  667|       |        // encode that the "this" register is implicitly set to undefined.
  668|   764k|        Value *arg = call->getArgument(i);
  669|   764k|        if (llvh::isa<HBCCallNInst>(call) ||
  ------------------
  |  Branch (669:13): [True: 0, False: 764k]
  ------------------
  670|   764k|            (i == 0 && llvh::isa<CallBuiltinInst>(call))) {
  ------------------
  |  Branch (670:14): [True: 30.7k, False: 734k]
  |  Branch (670:24): [True: 2.82k, False: 27.8k]
  ------------------
  671|  2.82k|          auto *imov = builder.createImplicitMovInst(arg);
  672|  2.82k|          RA_.updateRegister(imov, Register(reg));
  673|   761k|        } else {
  674|   761k|          auto *mov = builder.createMovInst(arg);
  675|   761k|          RA_.updateRegister(mov, Register(reg));
  676|   761k|          call->setArgument(mov, i);
  677|   761k|        }
  678|   764k|      }
  679|  30.7k|    }
  680|   843k|  }
  681|   103k|  return changed;
  682|   103k|}
_ZN6hermes3hbc14SpillRegisters19requiresShortOutputEPNS_11InstructionE:
  790|  5.22M|bool SpillRegisters::requiresShortOutput(Instruction *I) {
  791|  5.22M|  if (llvh::isa<TerminatorInst>(I)) {
  ------------------
  |  Branch (791:7): [True: 492k, False: 4.73M]
  ------------------
  792|       |    // None of our terminators produce results at all
  793|       |    // (though GetNextPNameInst modifies operands).
  794|   492k|    return false;
  795|   492k|  }
  796|       |
  797|       |  // Instructions that produce no output, don't use the register, even when
  798|       |  // allocated.
  799|  4.73M|  if (I->getType().isNoType())
  ------------------
  |  Branch (799:7): [True: 136, False: 4.73M]
  ------------------
  800|    136|    return false;
  801|       |
  802|  4.73M|  switch (I->getKind()) {
  803|       |    // Some instructions become Movs or other opcodes with long variants:
  804|  1.66M|    case ValueKind::HBCSpillMovInstKind:
  ------------------
  |  Branch (804:5): [True: 1.66M, False: 3.06M]
  ------------------
  805|  1.77M|    case ValueKind::LoadStackInstKind:
  ------------------
  |  Branch (805:5): [True: 111k, False: 4.61M]
  ------------------
  806|  2.89M|    case ValueKind::MovInstKind:
  ------------------
  |  Branch (806:5): [True: 1.11M, False: 3.61M]
  ------------------
  807|  2.89M|    case ValueKind::PhiInstKind:
  ------------------
  |  Branch (807:5): [True: 4.28k, False: 4.72M]
  ------------------
  808|       |    // Some instructions aren't actually encoded at all:
  809|  3.01M|    case ValueKind::AllocStackInstKind:
  ------------------
  |  Branch (809:5): [True: 117k, False: 4.61M]
  ------------------
  810|  3.05M|    case ValueKind::TryEndInstKind:
  ------------------
  |  Branch (810:5): [True: 40.5k, False: 4.69M]
  ------------------
  811|  3.05M|    case ValueKind::TryStartInstKind:
  ------------------
  |  Branch (811:5): [True: 0, False: 4.73M]
  ------------------
  812|  3.05M|      return false;
  813|  1.67M|    default:
  ------------------
  |  Branch (813:5): [True: 1.67M, False: 3.05M]
  ------------------
  814|  1.67M|      return true;
  815|  4.73M|  }
  816|  4.73M|}
_ZN6hermes3hbc14SpillRegisters20requiresShortOperandEPNS_11InstructionEi:
  818|  4.40M|bool SpillRegisters::requiresShortOperand(Instruction *I, int op) {
  819|  4.40M|  switch (I->getKind()) {
  820|  8.56k|    case ValueKind::PhiInstKind:
  ------------------
  |  Branch (820:5): [True: 8.56k, False: 4.39M]
  ------------------
  821|  1.12M|    case ValueKind::MovInstKind:
  ------------------
  |  Branch (821:5): [True: 1.11M, False: 3.28M]
  ------------------
  822|  2.79M|    case ValueKind::HBCSpillMovInstKind:
  ------------------
  |  Branch (822:5): [True: 1.66M, False: 2.73M]
  ------------------
  823|  2.90M|    case ValueKind::LoadStackInstKind:
  ------------------
  |  Branch (823:5): [True: 111k, False: 4.28M]
  ------------------
  824|  2.90M|    case ValueKind::StoreStackInstKind:
  ------------------
  |  Branch (824:5): [True: 0, False: 4.40M]
  ------------------
  825|  2.90M|      return false;
  826|   359k|    case ValueKind::CallInstKind:
  ------------------
  |  Branch (826:5): [True: 359k, False: 4.04M]
  ------------------
  827|   359k|    case ValueKind::ConstructInstKind:
  ------------------
  |  Branch (827:5): [True: 0, False: 4.40M]
  ------------------
  828|   738k|    case ValueKind::CallBuiltinInstKind:
  ------------------
  |  Branch (828:5): [True: 378k, False: 4.02M]
  ------------------
  829|   738k|    case ValueKind::HBCConstructInstKind:
  ------------------
  |  Branch (829:5): [True: 0, False: 4.40M]
  ------------------
  830|   738k|    case ValueKind::HBCCallDirectInstKind:
  ------------------
  |  Branch (830:5): [True: 0, False: 4.40M]
  ------------------
  831|   738k|      return op == CallInst::CalleeIdx;
  832|   760k|    default:
  ------------------
  |  Branch (832:5): [True: 760k, False: 3.64M]
  ------------------
  833|   760k|      return true;
  834|  4.40M|  }
  835|  4.40M|}
_ZN6hermes3hbc14SpillRegisters23modifiesOperandRegisterEPNS_11InstructionEi:
  837|   723k|bool SpillRegisters::modifiesOperandRegister(Instruction *I, int op) {
  838|   723k|  return I->getChangedOperands().at((unsigned)op);
  839|   723k|}
_ZN6hermes3hbc14SpillRegisters13runOnFunctionEPNS_8FunctionE:
  841|   103k|bool SpillRegisters::runOnFunction(Function *F) {
  842|   103k|  if (RA_.getMaxRegisterUsage() < boundary_) {
  ------------------
  |  Branch (842:7): [True: 103k, False: 32]
  ------------------
  843|   103k|    return false;
  844|   103k|  }
  845|     32|  reserveLowRegisters(F);
  846|       |
  847|     32|  IRBuilder builder(F);
  848|     32|  llvh::SmallVector<std::pair<Instruction *, Register>, 2> toSpill;
  849|       |
  850|   492k|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (850:23): [True: 492k, False: 32]
  ------------------
  851|  5.22M|    for (Instruction &inst : BB) {
  ------------------
  |  Branch (851:28): [True: 5.22M, False: 492k]
  ------------------
  852|  5.22M|      if (!RA_.isAllocated(&inst)) {
  ------------------
  |  Branch (852:11): [True: 0, False: 5.22M]
  ------------------
  853|       |        // This instruction is dead. Don't bother spilling.
  854|      0|        continue;
  855|      0|      }
  856|       |
  857|  5.22M|      int tempReg = 0;
  858|  5.22M|      toSpill.clear();
  859|  5.22M|      bool replaceWithFirstSpill = false;
  860|  5.22M|      builder.setLocation(inst.getLocation());
  861|  5.22M|      builder.setCurrentSourceLevelScope(inst.getSourceLevelScope());
  862|       |
  863|  5.22M|      auto myRegister = RA_.getRegister(&inst);
  864|  5.22M|      if (requiresShortOutput(&inst) && !isShort(myRegister)) {
  ------------------
  |  Branch (864:11): [True: 1.67M, False: 3.54M]
  |  Branch (864:41): [True: 1.61M, False: 55.7k]
  ------------------
  865|  1.61M|        auto temp = getReserved(tempReg++);
  866|  1.61M|        RA_.updateRegister(&inst, temp);
  867|  1.61M|        toSpill.push_back(
  868|  1.61M|            std::pair<Instruction *, Register>(&inst, myRegister));
  869|  1.61M|        replaceWithFirstSpill = true;
  870|  1.61M|      }
  871|       |
  872|  11.5M|      for (int i = 0, e = inst.getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (872:50): [True: 6.30M, False: 5.22M]
  ------------------
  873|  6.30M|        auto *op = llvh::dyn_cast<Instruction>(inst.getOperand(i));
  874|  6.30M|        if (!op || !RA_.isAllocated(op)) {
  ------------------
  |  Branch (874:13): [True: 1.89M, False: 4.40M]
  |  Branch (874:20): [True: 0, False: 4.40M]
  ------------------
  875|       |          // This is either not an instruction, or a dead instruction.
  876|       |          // Either way, we don't have to do anything.
  877|  1.89M|          continue;
  878|  1.89M|        }
  879|  4.40M|        auto opRegister = RA_.getRegister(op);
  880|       |
  881|  4.40M|        if (requiresShortOperand(&inst, i) && !isShort(opRegister)) {
  ------------------
  |  Branch (881:13): [True: 763k, False: 3.63M]
  |  Branch (881:47): [True: 723k, False: 39.9k]
  ------------------
  882|   723k|          auto temp = getReserved(tempReg++);
  883|       |
  884|   723k|          builder.setInsertionPoint(&inst);
  885|   723k|          auto *load = builder.createHBCSpillMovInst(op);
  886|   723k|          RA_.updateRegister(load, temp);
  887|   723k|          inst.setOperand(load, i);
  888|       |
  889|   723k|          if (modifiesOperandRegister(&inst, i)) {
  ------------------
  |  Branch (889:15): [True: 42.6k, False: 680k]
  ------------------
  890|  42.6k|            toSpill.push_back(
  891|  42.6k|                std::pair<Instruction *, Register>(load, opRegister));
  892|  42.6k|          }
  893|   723k|        }
  894|  4.40M|      }
  895|       |
  896|  5.22M|      if (toSpill.size()) {
  ------------------
  |  Branch (896:11): [True: 1.61M, False: 3.60M]
  ------------------
  897|  1.61M|        auto spillPoints = getInsertionPointsAfter(builder, &inst);
  898|       |
  899|  1.61M|        assert(
  900|  1.61M|            (!replaceWithFirstSpill || spillPoints.size() <= 1) &&
  901|  1.61M|            "Asked to spill the value of a TerminatorInst. Our terminators "
  902|  1.61M|            "shouldn't produce values. It wouldn't have mattered, but it "
  903|  1.61M|            "also has multiple branches so users might need PhiInsts.");
  904|       |
  905|  1.61M|        for (auto *point : spillPoints) {
  ------------------
  |  Branch (905:26): [True: 1.61M, False: 1.61M]
  ------------------
  906|  1.61M|          builder.setInsertionPoint(point);
  907|  1.66M|          for (auto store : toSpill) {
  ------------------
  |  Branch (907:27): [True: 1.66M, False: 1.61M]
  ------------------
  908|  1.66M|            auto *storeInst = builder.createHBCSpillMovInst(store.first);
  909|  1.66M|            RA_.updateRegister(storeInst, store.second);
  910|       |
  911|  1.66M|            if (!replaceWithFirstSpill)
  ------------------
  |  Branch (911:17): [True: 42.6k, False: 1.61M]
  ------------------
  912|  42.6k|              continue;
  913|       |            // Replace all uses of the inst with the spilling inst
  914|  1.61M|            inst.replaceAllUsesWith(storeInst);
  915|       |            // Except for the actual spill of course
  916|  1.61M|            storeInst->setOperand(&inst, 0);
  917|       |            // Disable now that the job is done.
  918|  1.61M|            replaceWithFirstSpill = false;
  919|  1.61M|          }
  920|  1.61M|        }
  921|  1.61M|      }
  922|  5.22M|    }
  923|   492k|  }
  924|     32|  return true;
  925|     32|}
_ZN6hermes3hbc25LowerSwitchIntoJumpTables13runOnFunctionEPNS_8FunctionE:
  927|   103k|bool LowerSwitchIntoJumpTables::runOnFunction(Function *F) {
  928|   103k|  bool changed = false;
  929|   103k|  llvh::SmallVector<SwitchInst *, 4> switches;
  930|       |  // Collect all switch instructions.
  931|   103k|  for (BasicBlock &BB : *F)
  ------------------
  |  Branch (931:23): [True: 843k, False: 103k]
  ------------------
  932|  3.82M|    for (auto &it : BB) {
  ------------------
  |  Branch (932:19): [True: 3.82M, False: 843k]
  ------------------
  933|  3.82M|      if (auto *S = llvh::dyn_cast<SwitchInst>(&it))
  ------------------
  |  Branch (933:17): [True: 0, False: 3.82M]
  ------------------
  934|      0|        switches.push_back(S);
  935|  3.82M|    }
  936|       |
  937|   103k|  for (auto *S : switches) {
  ------------------
  |  Branch (937:16): [True: 0, False: 103k]
  ------------------
  938|      0|    if (lowerIntoJumpTable(S))
  ------------------
  |  Branch (938:9): [True: 0, False: 0]
  ------------------
  939|      0|      changed = true;
  940|      0|  }
  941|       |
  942|   103k|  return changed;
  943|   103k|}
Passes.cpp:_ZZN6hermes3hbc13LoadConstants13runOnFunctionEPNS_8FunctionEENK3$_0clEPNS_7LiteralEPNS_11InstructionE:
  231|  2.25M|  auto createLoadLiteral = [&builder](Literal *literal, Instruction *where) {
  232|  2.25M|    builder.setInsertionPoint(where);
  233|  2.25M|    return llvh::isa<GlobalObject>(literal)
  ------------------
  |  Branch (233:12): [True: 503k, False: 1.75M]
  ------------------
  234|  2.25M|        ? cast<Instruction>(builder.createHBCGetGlobalObjectInst())
  235|  2.25M|        : cast<Instruction>(builder.createHBCLoadConstInst(literal));
  236|  2.25M|  };
Passes.cpp:_ZN6hermes3hbc12_GLOBAL__N_127updateToEntryInsertionPointERNS_9IRBuilderEPNS_8FunctionE:
   77|   206k|void updateToEntryInsertionPoint(IRBuilder &builder, Function *F) {
   78|   206k|  auto &BB = F->front();
   79|   206k|  auto it = BB.begin();
   80|   206k|  auto end = BB.end();
   81|       |  // Skip all HBCCreateEnvironmentInst.
   82|   413k|  while (it != end && llvh::isa<HBCCreateEnvironmentInst>(*it))
  ------------------
  |  Branch (82:10): [True: 413k, False: 0]
  |  Branch (82:23): [True: 206k, False: 206k]
  ------------------
   83|   206k|    ++it;
   84|       |
   85|   206k|  builder.setInsertionPoint(&*it);
   86|   206k|}
Passes.cpp:_ZN6hermes3hbc12_GLOBAL__N_123getInsertionPointsAfterERNS_9IRBuilderEPNS_11InstructionE:
   48|  1.61M|    Instruction *inst) {
   49|  1.61M|  llvh::SmallVector<Instruction *, 4> points;
   50|       |
   51|  1.61M|  if (!llvh::isa<TerminatorInst>(inst)) {
  ------------------
  |  Branch (51:7): [True: 1.61M, False: 0]
  ------------------
   52|       |    // Easy case for non-terminators. Just return the next inst.
   53|  1.61M|    auto pos = inst->getIterator();
   54|  1.61M|    pos++;
   55|  1.61M|    points.push_back(&*pos);
   56|  1.61M|    return points;
   57|  1.61M|  }
   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|  1.61M|}

_ZN6hermes3hbc24LowerBuiltinCallsContextC2ERNS_11StringTableE:
   59|    196|LowerBuiltinCallsContext::LowerBuiltinCallsContext(StringTable &strTab) {
   60|    196|  hermesInternalID_ = strTab.getIdentifier("HermesInternal");
   61|       |
   62|       |  // First insert all objects.
   63|    196|  int objIndex = 0;
   64|    196|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
   65|    196|#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|    196|#ifndef BUILTIN_METHOD
  |  |   46|    196|#define BUILTIN_METHOD(object, name)
  |  |   47|    196|#endif
  |  |   48|    196|#ifndef PRIVATE_BUILTIN
  |  |   49|    196|#define PRIVATE_BUILTIN(name)
  |  |   50|    196|#endif
  |  |   51|    196|#ifndef MARK_FIRST_PRIVATE_BUILTIN
  |  |   52|    196|#define MARK_FIRST_PRIVATE_BUILTIN(name)
  |  |   53|    196|#endif
  |  |   54|    196|#ifndef JS_BUILTIN
  |  |   55|    196|#define JS_BUILTIN(name)
  |  |   56|    196|#endif
  |  |   57|    196|#ifndef MARK_FIRST_JS_BUILTIN
  |  |   58|    196|#define MARK_FIRST_JS_BUILTIN(name)
  |  |   59|    196|#endif
  |  |   60|       |
  |  |   61|    196|BUILTIN_OBJECT(Array)
  |  |  ------------------
  |  |  |  |   64|    196|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |   62|       |// BUILTIN_METHOD(Array, from)
  |  |   63|    196|BUILTIN_METHOD(Array, isArray)
  |  |   64|       |
  |  |   65|    196|BUILTIN_METHOD(Date, UTC)
  |  |   66|    196|BUILTIN_METHOD(Date, parse)
  |  |   67|       |
  |  |   68|       |// BUILTIN_OBJECT(HermesInternal)
  |  |   69|       |// BUILTIN_METHOD(HermesInternal, getEpilogues)
  |  |   70|       |
  |  |   71|    196|BUILTIN_OBJECT(JSON)
  |  |  ------------------
  |  |  |  |   64|    196|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |   72|    196|BUILTIN_METHOD(JSON, parse)
  |  |   73|    196|BUILTIN_METHOD(JSON, stringify)
  |  |   74|       |
  |  |   75|    196|BUILTIN_OBJECT(Math)
  |  |  ------------------
  |  |  |  |   64|    196|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |   76|    196|BUILTIN_METHOD(Math, abs)
  |  |   77|    196|BUILTIN_METHOD(Math, acos)
  |  |   78|    196|BUILTIN_METHOD(Math, asin)
  |  |   79|    196|BUILTIN_METHOD(Math, atan)
  |  |   80|    196|BUILTIN_METHOD(Math, atan2)
  |  |   81|    196|BUILTIN_METHOD(Math, ceil)
  |  |   82|    196|BUILTIN_METHOD(Math, cos)
  |  |   83|    196|BUILTIN_METHOD(Math, exp)
  |  |   84|    196|BUILTIN_METHOD(Math, floor)
  |  |   85|    196|BUILTIN_METHOD(Math, hypot)
  |  |   86|    196|BUILTIN_METHOD(Math, imul)
  |  |   87|    196|BUILTIN_METHOD(Math, log)
  |  |   88|    196|BUILTIN_METHOD(Math, max)
  |  |   89|    196|BUILTIN_METHOD(Math, min)
  |  |   90|    196|BUILTIN_METHOD(Math, pow)
  |  |   91|    196|BUILTIN_METHOD(Math, round)
  |  |   92|    196|BUILTIN_METHOD(Math, sin)
  |  |   93|    196|BUILTIN_METHOD(Math, sqrt)
  |  |   94|    196|BUILTIN_METHOD(Math, tan)
  |  |   95|    196|BUILTIN_METHOD(Math, trunc)
  |  |   96|       |
  |  |   97|       |// BUILTIN_OBJECT(Number)
  |  |   98|       |// BUILTIN_METHOD(Number, isNaN)
  |  |   99|       |
  |  |  100|    196|BUILTIN_OBJECT(Object)
  |  |  ------------------
  |  |  |  |   64|    196|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |  101|    196|BUILTIN_METHOD(Object, create)
  |  |  102|    196|BUILTIN_METHOD(Object, defineProperties)
  |  |  103|    196|BUILTIN_METHOD(Object, defineProperty)
  |  |  104|       |// BUILTIN_METHOD(Object, entries)
  |  |  105|    196|BUILTIN_METHOD(Object, freeze)
  |  |  106|    196|BUILTIN_METHOD(Object, getOwnPropertyDescriptor)
  |  |  107|    196|BUILTIN_METHOD(Object, getOwnPropertyNames)
  |  |  108|       |// BUILTIN_METHOD(Object, getOwnPropertySymbols)
  |  |  109|    196|BUILTIN_METHOD(Object, getPrototypeOf)
  |  |  110|    196|BUILTIN_METHOD(Object, isExtensible)
  |  |  111|    196|BUILTIN_METHOD(Object, isFrozen)
  |  |  112|    196|BUILTIN_METHOD(Object, keys)
  |  |  113|    196|BUILTIN_METHOD(Object, seal)
  |  |  114|       |// BUILTIN_METHOD(Object, setPrototypeOf)
  |  |  115|       |// BUILTIN_METHOD(Object, values)
  |  |  116|       |
  |  |  117|    196|BUILTIN_OBJECT(String)
  |  |  ------------------
  |  |  |  |   64|    196|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |  118|    196|BUILTIN_METHOD(String, fromCharCode)
  |  |  119|       |
  |  |  120|    196|PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  121|    196|MARK_FIRST_PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  122|    196|PRIVATE_BUILTIN(requireFast)
  |  |  123|    196|PRIVATE_BUILTIN(getTemplateObject)
  |  |  124|    196|PRIVATE_BUILTIN(ensureObject)
  |  |  125|    196|PRIVATE_BUILTIN(getMethod)
  |  |  126|    196|PRIVATE_BUILTIN(throwTypeError)
  |  |  127|    196|PRIVATE_BUILTIN(generatorSetDelegated)
  |  |  128|    196|PRIVATE_BUILTIN(copyDataProperties)
  |  |  129|    196|PRIVATE_BUILTIN(copyRestArgs)
  |  |  130|    196|PRIVATE_BUILTIN(arraySpread)
  |  |  131|    196|PRIVATE_BUILTIN(apply)
  |  |  132|    196|PRIVATE_BUILTIN(exportAll)
  |  |  133|    196|PRIVATE_BUILTIN(exponentiationOperator)
  |  |  134|    196|PRIVATE_BUILTIN(initRegexNamedGroups)
  |  |  135|    196|PRIVATE_BUILTIN(getOriginalNativeErrorConstructor)
  |  |  136|       |
  |  |  137|    196|JS_BUILTIN(spawnAsync)
  |  |  138|    196|MARK_FIRST_JS_BUILTIN(spawnAsync)
  |  |  139|       |
  |  |  140|    196|#undef BUILTIN_OBJECT
  |  |  141|    196|#undef BUILTIN_METHOD
  |  |  142|    196|#undef PRIVATE_BUILTIN
  |  |  143|    196|#undef MARK_FIRST_PRIVATE_BUILTIN
  |  |  144|    196|#undef JS_BUILTIN
  |  |  145|    196|#undef MARK_FIRST_JS_BUILTIN
  ------------------
   66|       |
   67|       |  // Now insert all methods.
   68|    196|  int methodIndex = 0;
   69|    196|#define BUILTIN_METHOD(object, name)                                           \
   70|    196|  methods_[std::make_pair(                                                     \
   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
   73|    196|#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|    196|#ifndef BUILTIN_OBJECT
  |  |   43|    196|#define BUILTIN_OBJECT(object)
  |  |   44|    196|#endif
  |  |   45|       |#ifndef BUILTIN_METHOD
  |  |   46|       |#define BUILTIN_METHOD(object, name)
  |  |   47|       |#endif
  |  |   48|    196|#ifndef PRIVATE_BUILTIN
  |  |   49|    196|#define PRIVATE_BUILTIN(name)
  |  |   50|    196|#endif
  |  |   51|    196|#ifndef MARK_FIRST_PRIVATE_BUILTIN
  |  |   52|    196|#define MARK_FIRST_PRIVATE_BUILTIN(name)
  |  |   53|    196|#endif
  |  |   54|    196|#ifndef JS_BUILTIN
  |  |   55|    196|#define JS_BUILTIN(name)
  |  |   56|    196|#endif
  |  |   57|    196|#ifndef MARK_FIRST_JS_BUILTIN
  |  |   58|    196|#define MARK_FIRST_JS_BUILTIN(name)
  |  |   59|    196|#endif
  |  |   60|       |
  |  |   61|    196|BUILTIN_OBJECT(Array)
  |  |   62|       |// BUILTIN_METHOD(Array, from)
  |  |   63|    196|BUILTIN_METHOD(Array, isArray)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   64|       |
  |  |   65|    196|BUILTIN_METHOD(Date, UTC)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   66|    196|BUILTIN_METHOD(Date, parse)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   67|       |
  |  |   68|       |// BUILTIN_OBJECT(HermesInternal)
  |  |   69|       |// BUILTIN_METHOD(HermesInternal, getEpilogues)
  |  |   70|       |
  |  |   71|    196|BUILTIN_OBJECT(JSON)
  |  |   72|    196|BUILTIN_METHOD(JSON, parse)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   73|    196|BUILTIN_METHOD(JSON, stringify)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   74|       |
  |  |   75|    196|BUILTIN_OBJECT(Math)
  |  |   76|    196|BUILTIN_METHOD(Math, abs)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   77|    196|BUILTIN_METHOD(Math, acos)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   78|    196|BUILTIN_METHOD(Math, asin)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   79|    196|BUILTIN_METHOD(Math, atan)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   80|    196|BUILTIN_METHOD(Math, atan2)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   81|    196|BUILTIN_METHOD(Math, ceil)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   82|    196|BUILTIN_METHOD(Math, cos)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   83|    196|BUILTIN_METHOD(Math, exp)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   84|    196|BUILTIN_METHOD(Math, floor)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   85|    196|BUILTIN_METHOD(Math, hypot)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   86|    196|BUILTIN_METHOD(Math, imul)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   87|    196|BUILTIN_METHOD(Math, log)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   88|    196|BUILTIN_METHOD(Math, max)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   89|    196|BUILTIN_METHOD(Math, min)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   90|    196|BUILTIN_METHOD(Math, pow)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   91|    196|BUILTIN_METHOD(Math, round)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   92|    196|BUILTIN_METHOD(Math, sin)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   93|    196|BUILTIN_METHOD(Math, sqrt)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   94|    196|BUILTIN_METHOD(Math, tan)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   95|    196|BUILTIN_METHOD(Math, trunc)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   96|       |
  |  |   97|       |// BUILTIN_OBJECT(Number)
  |  |   98|       |// BUILTIN_METHOD(Number, isNaN)
  |  |   99|       |
  |  |  100|    196|BUILTIN_OBJECT(Object)
  |  |  101|    196|BUILTIN_METHOD(Object, create)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  102|    196|BUILTIN_METHOD(Object, defineProperties)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  103|    196|BUILTIN_METHOD(Object, defineProperty)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  104|       |// BUILTIN_METHOD(Object, entries)
  |  |  105|    196|BUILTIN_METHOD(Object, freeze)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  106|    196|BUILTIN_METHOD(Object, getOwnPropertyDescriptor)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  107|    196|BUILTIN_METHOD(Object, getOwnPropertyNames)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  108|       |// BUILTIN_METHOD(Object, getOwnPropertySymbols)
  |  |  109|    196|BUILTIN_METHOD(Object, getPrototypeOf)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  110|    196|BUILTIN_METHOD(Object, isExtensible)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  111|    196|BUILTIN_METHOD(Object, isFrozen)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  112|    196|BUILTIN_METHOD(Object, keys)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  113|    196|BUILTIN_METHOD(Object, seal)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  114|       |// BUILTIN_METHOD(Object, setPrototypeOf)
  |  |  115|       |// BUILTIN_METHOD(Object, values)
  |  |  116|       |
  |  |  117|    196|BUILTIN_OBJECT(String)
  |  |  118|    196|BUILTIN_METHOD(String, fromCharCode)
  |  |  ------------------
  |  |  |  |   70|    196|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|    196|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|    196|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  119|       |
  |  |  120|    196|PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  121|    196|MARK_FIRST_PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  122|    196|PRIVATE_BUILTIN(requireFast)
  |  |  123|    196|PRIVATE_BUILTIN(getTemplateObject)
  |  |  124|    196|PRIVATE_BUILTIN(ensureObject)
  |  |  125|    196|PRIVATE_BUILTIN(getMethod)
  |  |  126|    196|PRIVATE_BUILTIN(throwTypeError)
  |  |  127|    196|PRIVATE_BUILTIN(generatorSetDelegated)
  |  |  128|    196|PRIVATE_BUILTIN(copyDataProperties)
  |  |  129|    196|PRIVATE_BUILTIN(copyRestArgs)
  |  |  130|    196|PRIVATE_BUILTIN(arraySpread)
  |  |  131|    196|PRIVATE_BUILTIN(apply)
  |  |  132|    196|PRIVATE_BUILTIN(exportAll)
  |  |  133|    196|PRIVATE_BUILTIN(exponentiationOperator)
  |  |  134|    196|PRIVATE_BUILTIN(initRegexNamedGroups)
  |  |  135|    196|PRIVATE_BUILTIN(getOriginalNativeErrorConstructor)
  |  |  136|       |
  |  |  137|    196|JS_BUILTIN(spawnAsync)
  |  |  138|    196|MARK_FIRST_JS_BUILTIN(spawnAsync)
  |  |  139|       |
  |  |  140|    196|#undef BUILTIN_OBJECT
  |  |  141|    196|#undef BUILTIN_METHOD
  |  |  142|    196|#undef PRIVATE_BUILTIN
  |  |  143|    196|#undef MARK_FIRST_PRIVATE_BUILTIN
  |  |  144|    196|#undef JS_BUILTIN
  |  |  145|    196|#undef MARK_FIRST_JS_BUILTIN
  ------------------
   74|    196|}
_ZN6hermes3hbc17LowerBuiltinCalls13runOnFunctionEPNS_8FunctionE:
  181|   103k|bool LowerBuiltinCalls::runOnFunction(Function *F) {
  182|   103k|  return run(F);
  183|   103k|}
LowerBuiltinCalls.cpp:_ZN6hermes3hbcL3runEPNS_8FunctionE:
   91|   103k|static bool run(Function *F) {
   92|   103k|  IRBuilder builder{F};
   93|   103k|  bool changed = false;
   94|       |
   95|   103k|  auto &builtins = LowerBuiltinCallsContext::get(F->getContext());
   96|       |
   97|   843k|  for (auto &BB : *F) {
  ------------------
  |  Branch (97:17): [True: 843k, False: 103k]
  ------------------
   98|  4.46M|    for (auto it = BB.begin(), e = BB.end(); it != e;) {
  ------------------
  |  Branch (98:46): [True: 3.62M, False: 843k]
  ------------------
   99|       |      // Get a pointer to the instruction and increment the iterator so we
  100|       |      // can delete the instruction if we want to.
  101|  3.62M|      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|  3.62M|      if (inst->getKind() != ValueKind::CallInstKind)
  ------------------
  |  Branch (111:11): [True: 3.62M, False: 2.84k]
  ------------------
  112|  3.62M|        continue;
  113|  2.84k|      auto *callInst = cast<CallInst>(inst);
  114|  2.84k|      auto *loadProp = llvh::dyn_cast<LoadPropertyInst>(callInst->getCallee());
  115|  2.84k|      if (!loadProp)
  ------------------
  |  Branch (115:11): [True: 2.77k, False: 66]
  ------------------
  116|  2.77k|        continue;
  117|     66|      auto propLit = llvh::dyn_cast<LiteralString>(loadProp->getProperty());
  118|     66|      if (!propLit)
  ------------------
  |  Branch (118:11): [True: 0, False: 66]
  ------------------
  119|      0|        continue;
  120|     66|      auto *loadGlobalProp =
  121|     66|          llvh::dyn_cast<LoadPropertyInst>(loadProp->getObject());
  122|     66|      if (!loadGlobalProp)
  ------------------
  |  Branch (122:11): [True: 50, False: 16]
  ------------------
  123|     50|        continue;
  124|     16|      if (!llvh::isa<GlobalObject>(loadGlobalProp->getObject()))
  ------------------
  |  Branch (124:11): [True: 16, False: 0]
  ------------------
  125|     16|        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|   843k|  }
  177|       |
  178|   103k|  return changed;
  179|   103k|}
_ZN6hermes3hbc24LowerBuiltinCallsContext3getERNS_7ContextE:
   29|   103k|  static LowerBuiltinCallsContext &get(Context &ctx) {
   30|   103k|    auto &BEC = BackendContext::get(ctx);
   31|   103k|    if (!BEC.lowerBuiltinCallsContext)
  ------------------
  |  Branch (31:9): [True: 196, False: 103k]
  ------------------
   32|    196|      BEC.lowerBuiltinCallsContext =
   33|    196|          std::make_shared<LowerBuiltinCallsContext>(ctx.getStringTable());
   34|       |
   35|   103k|    return *BEC.lowerBuiltinCallsContext;
   36|   103k|  }

_ZN6hermes3hbc26SerializedLiteralGenerator15serializeBufferEN4llvh8ArrayRefIPNS_7LiteralEEERNSt3__16vectorIhNS7_9allocatorIhEEEEb:
   75|    101|    bool isKeyBuffer) {
   76|       |  // Stores the last type parsed by the for loop
   77|    101|  TagType lastTag = NumberTag;
   78|       |
   79|       |  // Stores the type currently being parsed by the for loop
   80|    101|  TagType newTag = NumberTag;
   81|       |
   82|       |  // Stores the values of each serialized Literal in a sequence so that
   83|       |  // they can be added to tempBuff after the tag is finalized
   84|    101|  std::vector<unsigned char> tmpSeqBuffer;
   85|       |
   86|       |  // Stores the length of the current type sequence
   87|    101|  size_t seqLength = 0;
   88|       |
   89|   411k|  for (size_t i = 0, buffSize = literals.size(); i < buffSize; ++i) {
  ------------------
  |  Branch (89:50): [True: 411k, False: 101]
  ------------------
   90|       |    // The first switch simply sets newTag.
   91|       |    // If newTag is different from lastTag, we append the tag and the
   92|       |    // tmpSeqBuffer to buff.
   93|       |    // After this check, we serialize the value to tmpSeqBuffer if possible.
   94|       |    // Since we can only write the tmpSeqBuffer to buff once we know the
   95|       |    // sequence ends, the check has to go after the type checking switch.
   96|       |    // Since we can only write to tmpSeqBuffer after it's been cleared (if
   97|       |    // the sequence is over), the only way to delay the write to tmpSeqBuffer
   98|       |    // is to either write to a second temporary buffer, and write that to
   99|       |    // tmpSeqBuffer afterwards, or add a second switch.
  100|   411k|    switch (literals[i]->getKind()) {
  101|   411k|      case ValueKind::LiteralNumberKind:
  ------------------
  |  Branch (101:7): [True: 411k, False: 0]
  ------------------
  102|   411k|        newTag = llvh::cast<LiteralNumber>(literals[i])
  ------------------
  |  Branch (102:18): [True: 411k, False: 12]
  ------------------
  103|   411k|                     ->isIntTypeRepresentible<int32_t>()
  104|   411k|            ? IntegerTag
  105|   411k|            : NumberTag;
  106|   411k|        break;
  107|      0|      case ValueKind::LiteralStringKind: {
  ------------------
  |  Branch (107:7): [True: 0, False: 411k]
  ------------------
  108|      0|        auto str = llvh::cast<LiteralString>(literals[i])->getValue().str();
  109|      0|        int ind =
  110|      0|            isKeyBuffer ? BMGen_.getIdentifierID(str) : BMGen_.getStringID(str);
  ------------------
  |  Branch (110:13): [True: 0, False: 0]
  ------------------
  111|       |
  112|      0|        if (ind > UINT16_MAX) {
  ------------------
  |  Branch (112:13): [True: 0, False: 0]
  ------------------
  113|      0|          newTag = LongStringTag;
  114|      0|        } else if (ind > UINT8_MAX) {
  ------------------
  |  Branch (114:20): [True: 0, False: 0]
  ------------------
  115|      0|          newTag = ShortStringTag;
  116|      0|        } else {
  117|      0|          newTag = ByteStringTag;
  118|      0|        }
  119|      0|        break;
  120|      0|      }
  121|      0|      case ValueKind::LiteralBoolKind:
  ------------------
  |  Branch (121:7): [True: 0, False: 411k]
  ------------------
  122|      0|        newTag = llvh::cast<LiteralBool>(literals[i])->getValue() ? TrueTag
  ------------------
  |  Branch (122:18): [True: 0, False: 0]
  ------------------
  123|      0|                                                                  : FalseTag;
  124|      0|        break;
  125|      0|      case ValueKind::LiteralNullKind:
  ------------------
  |  Branch (125:7): [True: 0, False: 411k]
  ------------------
  126|      0|        newTag = NullTag;
  127|      0|        break;
  128|      0|      default:
  ------------------
  |  Branch (128:7): [True: 0, False: 411k]
  ------------------
  129|      0|        hermes_fatal("Invalid Literal Kind");
  130|   411k|    }
  131|       |
  132|   411k|    if (newTag != lastTag || seqLength == SequenceMax) {
  ------------------
  |  Branch (132:9): [True: 38, False: 411k]
  |  Branch (132:30): [True: 96, False: 411k]
  ------------------
  133|    134|      if (seqLength > 0) {
  ------------------
  |  Branch (133:11): [True: 120, False: 14]
  ------------------
  134|    120|        appendTagToBuffer(buff, lastTag, seqLength);
  135|    120|        buff.insert(buff.end(), tmpSeqBuffer.begin(), tmpSeqBuffer.end());
  136|    120|        tmpSeqBuffer.resize(0);
  137|    120|      }
  138|    134|      lastTag = newTag;
  139|    134|      seqLength = 0;
  140|    134|    }
  141|   411k|    seqLength++;
  142|       |
  143|   411k|    switch (literals[i]->getKind()) {
  144|   411k|      case ValueKind::LiteralNumberKind: {
  ------------------
  |  Branch (144:7): [True: 411k, False: 0]
  ------------------
  145|   411k|        auto litNum = llvh::cast<LiteralNumber>(literals[i]);
  146|   411k|        if (llvh::Optional<int> intPointer =
  ------------------
  |  Branch (146:33): [True: 411k, False: 12]
  ------------------
  147|   411k|                litNum->isIntTypeRepresentible<int32_t>()) {
  148|   411k|          int n = intPointer.getValue();
  149|   411k|          serializeValueToBuffer<uint32_t>(n, tmpSeqBuffer);
  150|   411k|        } else {
  151|     12|          double num = litNum->getValue();
  152|     12|          serializeValueToBuffer<double>(num, tmpSeqBuffer);
  153|     12|        }
  154|   411k|        break;
  155|      0|      }
  156|      0|      case ValueKind::LiteralStringKind: {
  ------------------
  |  Branch (156:7): [True: 0, False: 411k]
  ------------------
  157|       |        // For strings, we are going to store the index to the string table,
  158|       |        // which will need to be decoded at runtime.
  159|      0|        auto str = llvh::cast<LiteralString>(literals[i])->getValue().str();
  160|      0|        auto stringID =
  161|      0|            isKeyBuffer ? BMGen_.getIdentifierID(str) : BMGen_.getStringID(str);
  ------------------
  |  Branch (161:13): [True: 0, False: 0]
  ------------------
  162|       |
  163|      0|        if (stringID > UINT16_MAX) {
  ------------------
  |  Branch (163:13): [True: 0, False: 0]
  ------------------
  164|      0|          serializeValueToBuffer<uint32_t>(stringID, tmpSeqBuffer);
  165|      0|        } else if (stringID > UINT8_MAX) {
  ------------------
  |  Branch (165:20): [True: 0, False: 0]
  ------------------
  166|      0|          serializeValueToBuffer<uint16_t>(stringID, tmpSeqBuffer);
  167|      0|        } else {
  168|      0|          serializeValueToBuffer<uint8_t>(stringID, tmpSeqBuffer);
  169|      0|        }
  170|      0|        break;
  171|      0|      }
  172|      0|      case ValueKind::LiteralBoolKind:
  ------------------
  |  Branch (172:7): [True: 0, False: 411k]
  ------------------
  173|      0|      case ValueKind::LiteralNullKind:
  ------------------
  |  Branch (173:7): [True: 0, False: 411k]
  ------------------
  174|       |        /* no-op */
  175|      0|        break;
  176|      0|      default:
  ------------------
  |  Branch (176:7): [True: 0, False: 411k]
  ------------------
  177|      0|        hermes_fatal("Invalid Literal Kind");
  178|   411k|    }
  179|   411k|  }
  180|       |  // The last value in the buffer can't get serialized in the loop.
  181|    101|  appendTagToBuffer(buff, lastTag, seqLength);
  182|    101|  buff.insert(buff.end(), tmpSeqBuffer.begin(), tmpSeqBuffer.end());
  183|    101|}
SerializedLiteralGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_117appendTagToBufferERNSt3__16vectorIhNS2_9allocatorIhEEEEhi:
   19|    221|    int seqLength) {
   20|    221|  if (seqLength > 15) {
  ------------------
  |  Branch (20:7): [True: 119, False: 102]
  ------------------
   21|    119|    buff.push_back((tag | 0x80) | (seqLength >> 8));
   22|    119|    buff.push_back(seqLength & 0xffff);
   23|    119|  } else {
   24|    102|    buff.push_back(tag + seqLength);
   25|    102|  }
   26|    221|}
SerializedLiteralGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_122serializeValueToBufferIdEEvT_RNSt3__16vectorIhNS4_9allocatorIhEEEE:
   46|     12|void serializeValueToBuffer(double value, std::vector<unsigned char> &buff) {
   47|       |  // Since endian::write takes a pointer, we can write directly to
   48|       |  // the buffer. First we resize it to make sure the data fits, then
   49|       |  // we pass a pointer to the original end of the vector.
   50|       |  // Since the buffer is a char buffer, we pass in an alignment of 1
   51|       |  // to endian::write.
   52|     12|  buff.resize(buff.size() + sizeof(double));
   53|       |  // NaN may have a different bit pattern on different platforms.
   54|       |  // We need to make sure that the bit pattern is consistent.
   55|     12|  if (LLVM_UNLIKELY(std::isnan(value))) {
  ------------------
  |  |  189|     12|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 12]
  |  |  ------------------
  ------------------
   56|      0|    static_assert(
   57|      0|        sizeof(double) == sizeof(uint64_t), "double better be 64 bits");
   58|      0|    static constexpr uint64_t qnan = 0xfff8000000000000;
   59|      0|    llvh::support::endian::write<uint64_t, 1>(
   60|      0|        buff.data() + buff.size() - sizeof(uint64_t),
   61|      0|        qnan,
   62|      0|        llvh::support::endianness::little);
   63|     12|  } else {
   64|     12|    llvh::support::endian::write<double, 1>(
   65|     12|        buff.data() + buff.size() - sizeof(double),
   66|     12|        value,
   67|     12|        llvh::support::endianness::little);
   68|     12|  }
   69|     12|}
SerializedLiteralGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_122serializeValueToBufferIjEEvT_RNSt3__16vectorIhNS4_9allocatorIhEEEE:
   32|   411k|    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|   411k|  buff.resize(buff.size() + sizeof(value_type));
   39|   411k|  llvh::support::endian::write<value_type, 1>(
   40|   411k|      buff.data() + buff.size() - sizeof(value_type),
   41|   411k|      value,
   42|   411k|      llvh::support::endianness::little);
   43|   411k|}

_ZN6hermes3hbc27SerializedLiteralParserBase20parseTagAndSeqLengthEv:
   16|    134|void SerializedLiteralParserBase::parseTagAndSeqLength() {
   17|    134|  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|    134|  if (tag & 0x80) {
  ------------------
  |  Branch (22:7): [True: 119, False: 15]
  ------------------
   23|    119|    leftInSeq_ = ((tag & 0x0f) << 8) | (buffer_[currIdx_ + 1]);
   24|    119|    currIdx_ += 2;
   25|    119|  } else {
   26|     15|    leftInSeq_ = tag & 0x0f;
   27|     15|    currIdx_ += 1;
   28|     15|  }
   29|       |
   30|    134|  lastTag_ = tag & SerializedLiteralGenerator::TagMask;
   31|    134|}

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

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

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

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

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

_ZN6hermes14SwitchLowering13runOnFunctionEPNS_8FunctionE:
   20|   103k|bool SwitchLowering::runOnFunction(Function *F) {
   21|   103k|  bool changed = false;
   22|   103k|  llvh::SmallVector<SwitchInst *, 4> switches;
   23|       |  // Collect all switch instructions.
   24|   103k|  for (BasicBlock &BB : *F)
  ------------------
  |  Branch (24:23): [True: 843k, False: 103k]
  ------------------
   25|  3.82M|    for (auto &it : BB) {
  ------------------
  |  Branch (25:19): [True: 3.82M, False: 843k]
  ------------------
   26|  3.82M|      if (auto *S = llvh::dyn_cast<SwitchInst>(&it))
  ------------------
  |  Branch (26:17): [True: 0, False: 3.82M]
  ------------------
   27|      0|        switches.push_back(S);
   28|  3.82M|    }
   29|       |
   30|   103k|  for (auto *S : switches) {
  ------------------
  |  Branch (30:16): [True: 0, False: 103k]
  ------------------
   31|      0|    lowerSwitchIntoIfs(S);
   32|      0|    changed = true;
   33|      0|  }
   34|       |
   35|   103k|  return changed;
   36|   103k|}
_ZN6hermes16LowerStoreInstrs13runOnFunctionEPNS_8FunctionE:
  444|   103k|bool LowerStoreInstrs::runOnFunction(Function *F) {
  445|   103k|  IRBuilder builder(F);
  446|   103k|  IRBuilder::InstructionDestroyer destroyer;
  447|   103k|  bool changed = false;
  448|       |
  449|   103k|  PostOrderAnalysis PO(F);
  450|   103k|  llvh::SmallVector<BasicBlock *, 16> order(PO.rbegin(), PO.rend());
  451|   740k|  for (auto *bbit : order) {
  ------------------
  |  Branch (451:19): [True: 740k, False: 103k]
  ------------------
  452|  5.98M|    for (auto &it : bbit->getInstList()) {
  ------------------
  |  Branch (452:19): [True: 5.98M, False: 740k]
  ------------------
  453|  5.98M|      auto *SSI = llvh::dyn_cast<StoreStackInst>(&it);
  454|  5.98M|      if (!SSI)
  ------------------
  |  Branch (454:11): [True: 5.41M, False: 576k]
  ------------------
  455|  5.41M|        continue;
  456|       |
  457|   576k|      Value *ptr = SSI->getPtr();
  458|   576k|      Value *val = SSI->getValue();
  459|       |
  460|   576k|      builder.setInsertionPoint(&it);
  461|   576k|      auto dstReg = RA_.getRegister(ptr);
  462|   576k|      auto *mov = builder.createMovInst(val);
  463|   576k|      RA_.updateRegister(mov, dstReg);
  464|   576k|      it.replaceAllUsesWith(mov);
  465|   576k|      destroyer.add(&it);
  466|   576k|      changed = true;
  467|   576k|    }
  468|   740k|  }
  469|   103k|  return changed;
  470|   103k|}
_ZN6hermes22LowerNumericProperties23stringToNumericPropertyERNS_9IRBuilderERNS_11InstructionEj:
  475|  1.24M|    unsigned operandIdx) {
  476|  1.24M|  auto strLit = llvh::dyn_cast<LiteralString>(Inst.getOperand(operandIdx));
  477|  1.24M|  if (!strLit)
  ------------------
  |  Branch (477:7): [True: 698k, False: 546k]
  ------------------
  478|   698k|    return false;
  479|       |
  480|       |  // Check if the string looks exactly like an array index.
  481|   546k|  auto num = toArrayIndex(strLit->getValue().str());
  482|   546k|  if (num) {
  ------------------
  |  Branch (482:7): [True: 0, False: 546k]
  ------------------
  483|      0|    Inst.setOperand(builder.getLiteralNumber(*num), operandIdx);
  484|      0|    return true;
  485|      0|  }
  486|       |
  487|   546k|  return false;
  488|   546k|}
_ZN6hermes22LowerNumericProperties13runOnFunctionEPNS_8FunctionE:
  490|   103k|bool LowerNumericProperties::runOnFunction(Function *F) {
  491|   103k|  IRBuilder builder(F);
  492|   103k|  IRBuilder::InstructionDestroyer destroyer{};
  493|       |
  494|   103k|  bool changed = false;
  495|   843k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (495:23): [True: 843k, False: 103k]
  ------------------
  496|  3.62M|    for (Instruction &Inst : BB) {
  ------------------
  |  Branch (496:28): [True: 3.62M, False: 843k]
  ------------------
  497|  3.62M|      if (llvh::isa<LoadPropertyInst>(&Inst)) {
  ------------------
  |  Branch (497:11): [True: 545k, False: 3.07M]
  ------------------
  498|   545k|        changed |= stringToNumericProperty(
  499|   545k|            builder, Inst, LoadPropertyInst::PropertyIdx);
  500|  3.07M|      } else if (llvh::isa<StorePropertyInst>(&Inst)) {
  ------------------
  |  Branch (500:18): [True: 1.32k, False: 3.07M]
  ------------------
  501|  1.32k|        changed |= stringToNumericProperty(
  502|  1.32k|            builder, Inst, StorePropertyInst::PropertyIdx);
  503|  3.07M|      } else if (llvh::isa<StoreOwnPropertyInst>(&Inst)) {
  ------------------
  |  Branch (503:18): [True: 698k, False: 2.37M]
  ------------------
  504|   698k|        changed |= stringToNumericProperty(
  505|   698k|            builder, Inst, StoreOwnPropertyInst::PropertyIdx);
  506|  2.37M|      } else if (llvh::isa<DeletePropertyInst>(&Inst)) {
  ------------------
  |  Branch (506:18): [True: 0, False: 2.37M]
  ------------------
  507|      0|        changed |= stringToNumericProperty(
  508|      0|            builder, Inst, DeletePropertyInst::PropertyIdx);
  509|  2.37M|      } else if (llvh::isa<StoreGetterSetterInst>(&Inst)) {
  ------------------
  |  Branch (509:18): [True: 0, False: 2.37M]
  ------------------
  510|      0|        changed |= stringToNumericProperty(
  511|      0|            builder, Inst, StoreGetterSetterInst::PropertyIdx);
  512|      0|      }
  513|  3.62M|    }
  514|   843k|  }
  515|   103k|  return changed;
  516|   103k|}
_ZN6hermes15LimitAllocArray13runOnFunctionEPNS_8FunctionE:
  518|   103k|bool LimitAllocArray::runOnFunction(Function *F) {
  519|   103k|  bool changed = false;
  520|   843k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (520:23): [True: 843k, False: 103k]
  ------------------
  521|  3.82M|    for (Instruction &I : BB) {
  ------------------
  |  Branch (521:25): [True: 3.82M, False: 843k]
  ------------------
  522|  3.82M|      auto *inst = llvh::dyn_cast<AllocArrayInst>(&I);
  523|  3.82M|      if (!inst || inst->getElementCount() == 0)
  ------------------
  |  Branch (523:11): [True: 3.82M, False: 101]
  |  Branch (523:20): [True: 87, False: 14]
  ------------------
  524|  3.82M|        continue;
  525|       |
  526|     14|      IRBuilder builder(F);
  527|     14|      builder.setInsertionPointAfter(inst);
  528|     14|      builder.setLocation(inst->getLocation());
  529|     14|      builder.setCurrentSourceLevelScope(inst->getSourceLevelScope());
  530|       |
  531|       |      // Checks if any operand of an AllocArray is unserializable.
  532|       |      // If it finds one, the loop removes it along with every operand past it.
  533|     14|      {
  534|     14|        bool seenUnserializable = false;
  535|     14|        unsigned ind = -1;
  536|     14|        unsigned i = AllocArrayInst::ElementStartIdx;
  537|     14|        unsigned e = inst->getElementCount() + AllocArrayInst::ElementStartIdx;
  538|   540k|        while (i < e) {
  ------------------
  |  Branch (538:16): [True: 540k, False: 14]
  ------------------
  539|   540k|          ind++;
  540|   540k|          seenUnserializable |=
  541|   540k|              inst->getOperand(i)->getKind() == ValueKind::LiteralBigIntKind ||
  ------------------
  |  Branch (541:15): [True: 0, False: 540k]
  ------------------
  542|   540k|              inst->getOperand(i)->getKind() == ValueKind::LiteralUndefinedKind;
  ------------------
  |  Branch (542:15): [True: 0, False: 540k]
  ------------------
  543|   540k|          if (seenUnserializable) {
  ------------------
  |  Branch (543:15): [True: 0, False: 540k]
  ------------------
  544|      0|            e--;
  545|      0|            builder.createStoreOwnPropertyInst(
  546|      0|                inst->getOperand(i),
  547|      0|                inst,
  548|      0|                builder.getLiteralNumber(ind),
  549|      0|                IRBuilder::PropEnumerable::Yes);
  550|      0|            inst->removeOperand(i);
  551|      0|            changed = true;
  552|      0|            continue;
  553|      0|          }
  554|   540k|          i++;
  555|   540k|        }
  556|     14|      }
  557|       |
  558|     14|      if (inst->getElementCount() == 0)
  ------------------
  |  Branch (558:11): [True: 0, False: 14]
  ------------------
  559|      0|        continue;
  560|       |
  561|       |      // Since we remove elements from inst until it fits in maxSize_,
  562|       |      // the final addition to totalElems will make it equal maxSize_. Any
  563|       |      // AllocArray past that would have all its operands removed, and add
  564|       |      // 0 to totalElems.
  565|   128k|      for (unsigned i = inst->getElementCount() - 1; i >= maxSize_; i--) {
  ------------------
  |  Branch (565:54): [True: 128k, False: 14]
  ------------------
  566|   128k|        int operandOffset = AllocArrayInst::ElementStartIdx + i;
  567|   128k|        builder.createStoreOwnPropertyInst(
  568|   128k|            inst->getOperand(operandOffset),
  569|   128k|            inst,
  570|   128k|            builder.getLiteralNumber(i),
  571|   128k|            IRBuilder::PropEnumerable::Yes);
  572|   128k|        inst->removeOperand(operandOffset);
  573|   128k|      }
  574|     14|      changed = true;
  575|     14|    }
  576|   843k|  }
  577|   103k|  return changed;
  578|   103k|}
_ZN6hermes27LowerExponentiationOperator13runOnFunctionEPNS_8FunctionE:
  660|   103k|bool LowerExponentiationOperator::runOnFunction(Function *F) {
  661|   103k|  IRBuilder builder{F};
  662|   103k|  llvh::DenseSet<Instruction *> toTransform{};
  663|   103k|  bool changed = false;
  664|       |
  665|   843k|  for (BasicBlock &bb : *F) {
  ------------------
  |  Branch (665:23): [True: 843k, False: 103k]
  ------------------
  666|  4.46M|    for (auto it = bb.begin(), e = bb.end(); it != e; /* empty */) {
  ------------------
  |  Branch (666:46): [True: 3.62M, False: 843k]
  ------------------
  667|  3.62M|      auto *inst = &*it;
  668|       |      // Increment iterator before potentially erasing inst and invalidating
  669|       |      // iteration.
  670|  3.62M|      ++it;
  671|  3.62M|      if (auto *binOp = llvh::dyn_cast<BinaryOperatorInst>(inst)) {
  ------------------
  |  Branch (671:17): [True: 157k, False: 3.46M]
  ------------------
  672|   157k|        if (binOp->getOperatorKind() ==
  ------------------
  |  Branch (672:13): [True: 0, False: 157k]
  ------------------
  673|   157k|            BinaryOperatorInst::OpKind::ExponentiationKind) {
  674|      0|          changed |= lowerExponentiationOperator(builder, binOp);
  675|      0|        }
  676|   157k|      }
  677|  3.62M|    }
  678|   843k|  }
  679|       |
  680|   103k|  return changed;
  681|   103k|}

_ZN6hermes12RegisterFile6isUsedENS_8RegisterE:
   56|  9.03M|bool RegisterFile::isUsed(Register r) {
   57|  9.03M|  return !registers.test(r.getIndex());
   58|  9.03M|}
_ZN6hermes12RegisterFile6isFreeENS_8RegisterE:
   60|  5.40M|bool RegisterFile::isFree(Register r) {
   61|  5.40M|  return !isUsed(r);
   62|  5.40M|}
_ZN6hermes12RegisterFile12killRegisterENS_8RegisterE:
   64|  2.89M|void RegisterFile::killRegister(Register reg) {
   65|  2.89M|  LLVM_DEBUG(dbgs() << "-- Releasing the register " << reg << "\n");
  ------------------
  |  |  123|  2.89M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.89M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.89M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.89M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|       |
   67|  2.89M|  assert(isUsed(reg) && "Killing an unused register!");
   68|  2.89M|  registers.set(reg.getIndex());
   69|  2.89M|  assert(isFree(reg) && "Error freeing register!");
   70|  2.89M|}
_ZN6hermes12RegisterFile16allocateRegisterEv:
   82|  3.24M|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|  3.24M|  if (registers.none()) {
  ------------------
  |  Branch (86:7): [True: 735k, False: 2.50M]
  ------------------
   87|       |    // If all bits are set, create a new register and return it.
   88|   735k|    unsigned numRegs = registers.size();
   89|   735k|    registers.resize(numRegs + 1, false);
   90|   735k|    Register R = Register(numRegs);
   91|   735k|    assert(isUsed(R) && "Error allocating a new register.");
   92|   735k|    LLVM_DEBUG(dbgs() << "-- Creating the new register " << R << "\n");
  ------------------
  |  |  123|   735k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   735k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 735k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   735k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|   735k|    return R;
   94|   735k|  }
   95|       |
   96|       |  // Search for a free register to use.
   97|  2.50M|  int i = registers.find_first();
   98|  2.50M|  assert(i >= 0 && "Unexpected failure to allocate a register");
   99|  2.50M|  Register R(i);
  100|  2.50M|  LLVM_DEBUG(dbgs() << "-- Assigning the free register " << R << "\n");
  ------------------
  |  |  123|  2.50M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.50M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.50M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.50M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|  2.50M|  assert(isFree(R) && "Error finding a free register");
  102|  2.50M|  registers.reset(i);
  103|  2.50M|  return R;
  104|  2.50M|}
_ZN6hermes12RegisterFile23tailAllocateConsecutiveEj:
  106|   103k|Register RegisterFile::tailAllocateConsecutive(unsigned n) {
  107|   103k|  assert(n > 0 && "Can't request zero registers");
  108|       |
  109|   103k|  int lastUsed = registers.size() - 1;
  110|   103k|  while (lastUsed >= 0) {
  ------------------
  |  Branch (110:10): [True: 0, False: 103k]
  ------------------
  111|      0|    if (!registers.test(lastUsed))
  ------------------
  |  Branch (111:9): [True: 0, False: 0]
  ------------------
  112|      0|      break;
  113|       |
  114|      0|    lastUsed--;
  115|      0|  }
  116|       |
  117|   103k|  int firstClear = lastUsed + 1;
  118|       |
  119|   103k|  LLVM_DEBUG(
  ------------------
  |  |  123|   103k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   103k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 103k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   103k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|   103k|      dbgs() << "-- Found the last set bit at offset " << lastUsed << "\n");
  121|   103k|  registers.resize(std::max(registers.size(), firstClear + n), true);
  122|   103k|  registers.reset(firstClear, firstClear + n);
  123|       |
  124|   103k|  LLVM_DEBUG(
  ------------------
  |  |  123|   103k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   103k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 103k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   103k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|   103k|      dbgs() << "-- Allocated tail consecutive registers of length " << n
  126|   103k|             << ", starting at " << Register(firstClear) << "\n");
  127|   103k|  return Register(firstClear);
  128|   103k|}
_ZN6hermes17RegisterAllocator9lowerPhisEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  159|   103k|void RegisterAllocator::lowerPhis(ArrayRef<BasicBlock *> order) {
  160|   103k|  llvh::SmallVector<PhiInst *, 8> PHIs;
  161|   103k|  IRBuilder builder(F);
  162|       |
  163|       |  // Collect all PHIs.
  164|   740k|  for (auto &BB : order) {
  ------------------
  |  Branch (164:17): [True: 740k, False: 103k]
  ------------------
  165|  5.98M|    for (auto &Inst : *BB) {
  ------------------
  |  Branch (165:21): [True: 5.98M, False: 740k]
  ------------------
  166|  5.98M|      if (auto *P = llvh::dyn_cast<PhiInst>(&Inst)) {
  ------------------
  |  Branch (166:17): [True: 4.39k, False: 5.97M]
  ------------------
  167|  4.39k|        PHIs.push_back(P);
  168|  4.39k|      }
  169|  5.98M|    }
  170|   740k|  }
  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|   103k|  for (PhiInst *P : PHIs) {
  ------------------
  |  Branch (178:19): [True: 4.39k, False: 103k]
  ------------------
  179|  4.39k|    if (!phiReadWrite(P))
  ------------------
  |  Branch (179:9): [True: 4.31k, False: 82]
  ------------------
  180|  4.31k|      continue;
  181|       |
  182|       |    // The MOV sequence may clobber the PHI. Insert a copy.
  183|     82|    builder.setInsertionPoint(P->getParent()->getTerminator());
  184|     82|    auto *mov = builder.createMovInst(P);
  185|       |
  186|     82|    Value::UseListTy users = P->getUsers();
  187|       |    // Update all external users:
  188|    164|    for (auto *U : users) {
  ------------------
  |  Branch (188:18): [True: 164, False: 82]
  ------------------
  189|       |      // Local uses of the PHI are allowed.
  190|    164|      if (!llvh::isa<PhiInst>(U) && !llvh::isa<TerminatorInst>(U) &&
  ------------------
  |  Branch (190:11): [True: 164, False: 0]
  |  Branch (190:37): [True: 164, False: 0]
  ------------------
  191|    164|          U->getParent() == P->getParent())
  ------------------
  |  Branch (191:11): [True: 82, False: 82]
  ------------------
  192|     82|        continue;
  193|       |
  194|     82|      U->replaceFirstOperandWith(P, mov);
  195|     82|    }
  196|     82|  }
  197|       |
  198|       |  /// A list of registers that were copied to prevent clobbering. Maps the
  199|       |  /// original PHI node to the copied value.
  200|   103k|  DenseMap<Value *, MovInst *> copied;
  201|       |
  202|       |  // Lower all PHI nodes into a sequence of MOVs in the predecessor blocks.
  203|   103k|  for (PhiInst *P : PHIs) {
  ------------------
  |  Branch (203:19): [True: 4.39k, False: 103k]
  ------------------
  204|  13.1k|    for (unsigned i = 0, e = P->getNumEntries(); i < e; ++i) {
  ------------------
  |  Branch (204:50): [True: 8.78k, False: 4.39k]
  ------------------
  205|  8.78k|      auto E = P->getEntry(i);
  206|  8.78k|      auto *term = E.second->getTerminator();
  207|  8.78k|      builder.setInsertionPoint(term);
  208|  8.78k|      auto *mov = builder.createMovInst(E.first);
  209|  8.78k|      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|  8.78k|      copied[E.first] = mov;
  216|  8.78k|    }
  217|  4.39k|  }
  218|       |
  219|       |  // The terminator comes after the MOV sequence, so make sure it uses the
  220|       |  // updated registers.
  221|   740k|  for (auto &BB : order) {
  ------------------
  |  Branch (221:17): [True: 740k, False: 103k]
  ------------------
  222|   740k|    auto *term = BB->getTerminator();
  223|       |
  224|  1.70M|    for (int i = 0, e = term->getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (224:49): [True: 965k, False: 740k]
  ------------------
  225|   965k|      auto *op = term->getOperand(i);
  226|   965k|      if (llvh::isa<Literal>(op))
  ------------------
  |  Branch (226:11): [True: 0, False: 965k]
  ------------------
  227|      0|        continue;
  228|   965k|      auto it = copied.find(op);
  229|   965k|      if (it != copied.end()) {
  ------------------
  |  Branch (229:11): [True: 0, False: 965k]
  ------------------
  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|   965k|    }
  236|   740k|  }
  237|   103k|}
_ZN6hermes17RegisterAllocator22calculateLocalLivenessERNS0_17BlockLifetimeInfoEPNS_10BasicBlockE:
  241|  33.0k|    BasicBlock *BB) {
  242|       |  // For each instruction in the block:
  243|  2.89M|  for (auto &it : *BB) {
  ------------------
  |  Branch (243:17): [True: 2.89M, False: 33.0k]
  ------------------
  244|  2.89M|    Instruction *I = &it;
  245|       |
  246|  2.89M|    unsigned idx = getInstructionNumber(I);
  247|  2.89M|    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|  2.89M|    if (auto *P = llvh::dyn_cast<PhiInst>(I)) {
  ------------------
  |  Branch (251:15): [True: 16, False: 2.89M]
  ------------------
  252|     16|      llvh::SmallVector<unsigned, 4> incomingValueNum;
  253|       |
  254|       |      // Collect all incoming value numbers.
  255|     48|      for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (255:47): [True: 32, False: 16]
  ------------------
  256|     32|        auto E = P->getEntry(i);
  257|       |        // Skip unreachable predecessors.
  258|     32|        if (!blockLiveness_.count(E.second))
  ------------------
  |  Branch (258:13): [True: 0, False: 32]
  ------------------
  259|      0|          continue;
  260|     32|        if (auto *II = llvh::dyn_cast<Instruction>(E.first)) {
  ------------------
  |  Branch (260:19): [True: 32, False: 0]
  ------------------
  261|     32|          incomingValueNum.push_back(getInstructionNumber(II));
  262|     32|        }
  263|     32|      }
  264|       |
  265|       |      // Block the incoming values from flowing into the predecessors.
  266|     48|      for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (266:47): [True: 32, False: 16]
  ------------------
  267|     32|        auto E = P->getEntry(i);
  268|       |        // Skip unreachable predecessors.
  269|     32|        if (!blockLiveness_.count(E.second))
  ------------------
  |  Branch (269:13): [True: 0, False: 32]
  ------------------
  270|      0|          continue;
  271|     64|        for (auto num : incomingValueNum) {
  ------------------
  |  Branch (271:23): [True: 64, False: 32]
  ------------------
  272|     64|          blockLiveness_[E.second].maskIn_.set(num);
  273|     64|        }
  274|     32|      }
  275|       |
  276|       |      // Allow the flow of incoming values in specific directions:
  277|     48|      for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (277:47): [True: 32, False: 16]
  ------------------
  278|     32|        auto E = P->getEntry(i);
  279|       |        // Skip unreachable predecessors.
  280|     32|        if (!blockLiveness_.count(E.second))
  ------------------
  |  Branch (280:13): [True: 0, False: 32]
  ------------------
  281|      0|          continue;
  282|     32|        if (auto *II = llvh::dyn_cast<Instruction>(E.first)) {
  ------------------
  |  Branch (282:19): [True: 32, False: 0]
  ------------------
  283|     32|          unsigned idxII = getInstructionNumber(II);
  284|     32|          blockLiveness_[E.second].maskIn_.reset(idxII);
  285|     32|        }
  286|     32|      }
  287|     16|    }
  288|       |
  289|       |    // For each one of the operands that are also instructions:
  290|  9.75M|    for (unsigned opIdx = 0, e = I->getNumOperands(); opIdx != e; ++opIdx) {
  ------------------
  |  Branch (290:55): [True: 6.85M, False: 2.89M]
  ------------------
  291|  6.85M|      auto *opInst = llvh::dyn_cast<Instruction>(I->getOperand(opIdx));
  292|  6.85M|      if (!opInst)
  ------------------
  |  Branch (292:11): [True: 3.83M, False: 3.02M]
  ------------------
  293|  3.83M|        continue;
  294|       |      // Skip instructions from unreachable blocks.
  295|  3.02M|      if (!blockLiveness_.count(opInst->getParent()))
  ------------------
  |  Branch (295:11): [True: 0, False: 3.02M]
  ------------------
  296|      0|        continue;
  297|       |
  298|       |      // Get the index of the operand.
  299|  3.02M|      auto opInstIdx = getInstructionNumber(opInst);
  300|  3.02M|      livenessInfo.gen_.set(opInstIdx);
  301|  3.02M|    }
  302|  2.89M|  }
  303|  33.0k|}
_ZN6hermes17RegisterAllocator23calculateGlobalLivenessEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  318|    350|void RegisterAllocator::calculateGlobalLiveness(ArrayRef<BasicBlock *> order) {
  319|    350|  unsigned iterations = 0;
  320|    350|  bool changed = false;
  321|       |
  322|       |  // Init the live-in vector to be GEN-KILL.
  323|  33.0k|  for (auto &it : blockLiveness_) {
  ------------------
  |  Branch (323:17): [True: 33.0k, False: 350]
  ------------------
  324|  33.0k|    BlockLifetimeInfo &livenessInfo = it.second;
  325|  33.0k|    livenessInfo.liveIn_ |= livenessInfo.gen_;
  326|  33.0k|    livenessInfo.liveIn_.reset(livenessInfo.kill_);
  327|  33.0k|    livenessInfo.liveIn_.reset(livenessInfo.maskIn_);
  328|  33.0k|  }
  329|       |
  330|    657|  do {
  331|    657|    iterations++;
  332|    657|    changed = false;
  333|       |
  334|  66.6k|    for (auto it = order.rbegin(), e = order.rend(); it != e; it++) {
  ------------------
  |  Branch (334:54): [True: 66.0k, False: 657]
  ------------------
  335|  66.0k|      BasicBlock *BB = *it;
  336|  66.0k|      BlockLifetimeInfo &livenessInfo = blockLiveness_[BB];
  337|       |
  338|       |      // Rule:  OUT = SUCC0_in  + SUCC1_in ...
  339|  98.0k|      for (auto *succ : successors(BB)) {
  ------------------
  |  Branch (339:23): [True: 98.0k, False: 66.0k]
  ------------------
  340|  98.0k|        BlockLifetimeInfo &succInfo = blockLiveness_[succ];
  341|       |        // Check if we are about to change bits in the live-out vector.
  342|  98.0k|        if (succInfo.liveIn_.test(livenessInfo.liveOut_)) {
  ------------------
  |  Branch (342:13): [True: 32.7k, False: 65.3k]
  ------------------
  343|  32.7k|          changed = true;
  344|  32.7k|        }
  345|       |
  346|  98.0k|        livenessInfo.liveOut_ |= succInfo.liveIn_;
  347|  98.0k|      }
  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|  66.0k|      livenessInfo.liveIn_ = livenessInfo.liveOut_;
  353|  66.0k|      livenessInfo.liveIn_ |= livenessInfo.gen_;
  354|  66.0k|      livenessInfo.liveIn_.reset(livenessInfo.kill_);
  355|  66.0k|      livenessInfo.liveIn_.reset(livenessInfo.maskIn_);
  356|  66.0k|    }
  357|    657|  } while (changed);
  ------------------
  |  Branch (357:12): [True: 307, False: 350]
  ------------------
  358|       |
  359|    350|#ifndef NDEBUG
  360|  33.0k|  for (auto &it : blockLiveness_) {
  ------------------
  |  Branch (360:17): [True: 33.0k, False: 350]
  ------------------
  361|  33.0k|    BasicBlock *BB = it.first;
  362|  33.0k|    BlockLifetimeInfo &livenessInfo = it.second;
  363|  33.0k|    LLVM_DEBUG(llvh::dbgs() << "Block " << BB << "\n");
  ------------------
  |  |  123|  33.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  364|  33.0k|    LLVM_DEBUG(dumpVector(livenessInfo.gen_, "gen     ", llvh::dbgs()));
  ------------------
  |  |  123|  33.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  365|  33.0k|    LLVM_DEBUG(dumpVector(livenessInfo.kill_, "kill    ", llvh::dbgs()));
  ------------------
  |  |  123|  33.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  366|  33.0k|    LLVM_DEBUG(dumpVector(livenessInfo.liveIn_, "liveIn  ", llvh::dbgs()));
  ------------------
  |  |  123|  33.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  367|  33.0k|    LLVM_DEBUG(dumpVector(livenessInfo.liveOut_, "liveOut ", llvh::dbgs()));
  ------------------
  |  |  123|  33.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  368|  33.0k|    LLVM_DEBUG(dumpVector(livenessInfo.maskIn_, "maskIn  ", llvh::dbgs()));
  ------------------
  |  |  123|  33.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  369|  33.0k|    LLVM_DEBUG(llvh::dbgs() << "------\n");
  ------------------
  |  |  123|  33.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  370|  33.0k|  }
  371|    350|#endif
  372|       |
  373|    350|  LLVM_DEBUG(
  ------------------
  |  |  123|    350|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    350|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 350]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    350|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  374|    350|      dbgs() << "Completed liveness in " << iterations << " iterations\n");
  375|       |  // Suppress -Wunused-but-set-variable warning with new compilers.
  376|    350|  (void)iterations;
  377|    350|}
_ZN6hermes17RegisterAllocator27isManuallyAllocatedIntervalEPNS_11InstructionE:
  406|     40|bool RegisterAllocator::isManuallyAllocatedInterval(Instruction *I) {
  407|     40|  if (hasTargetSpecificLowering(I))
  ------------------
  |  Branch (407:7): [True: 0, False: 40]
  ------------------
  408|      0|    return true;
  409|       |
  410|     40|  for (auto *U : I->getUsers()) {
  ------------------
  |  Branch (410:16): [True: 40, False: 40]
  ------------------
  411|     40|    if (hasTargetSpecificLowering(U))
  ------------------
  |  Branch (411:9): [True: 0, False: 40]
  ------------------
  412|      0|      return true;
  413|     40|  }
  414|       |
  415|     40|  return false;
  416|     40|}
_ZN6hermes17RegisterAllocator8coalesceERN4llvh8DenseMapIPNS_11InstructionES4_NS1_12DenseMapInfoIS4_EENS1_6detail12DenseMapPairIS4_S4_EEEENS1_8ArrayRefIPNS_10BasicBlockEEE:
  420|    350|    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|  33.0k|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (423:23): [True: 33.0k, False: 350]
  ------------------
  424|  2.89M|    for (Instruction &I : *BB) {
  ------------------
  |  Branch (424:25): [True: 2.89M, False: 33.0k]
  ------------------
  425|  2.89M|      auto *P = llvh::dyn_cast<PhiInst>(&I);
  426|  2.89M|      if (!P)
  ------------------
  |  Branch (426:11): [True: 2.89M, False: 16]
  ------------------
  427|  2.89M|        continue;
  428|       |
  429|     16|      unsigned phiNum = getInstructionNumber(P);
  430|     48|      for (unsigned i = 0, e = P->getNumEntries(); i < e; ++i) {
  ------------------
  |  Branch (430:52): [True: 32, False: 16]
  ------------------
  431|     32|        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|     32|        if (map.count(mov))
  ------------------
  |  Branch (435:13): [True: 0, False: 32]
  ------------------
  436|      0|          continue;
  437|       |
  438|     32|        if (!hasInstructionNumber(mov))
  ------------------
  |  Branch (438:13): [True: 0, False: 32]
  ------------------
  439|      0|          continue;
  440|       |
  441|     32|        unsigned idx = getInstructionNumber(mov);
  442|     32|        instructionInterval_[phiNum].add(instructionInterval_[idx]);
  443|       |
  444|       |        // Record the fact that the mov should use the same register as the phi.
  445|     32|        map[mov] = P;
  446|     32|      }
  447|     16|    }
  448|  33.0k|  }
  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|  33.0k|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (455:23): [True: 33.0k, False: 350]
  ------------------
  456|  33.0k|    DenseMap<Value *, MovInst *> lastCopy;
  457|       |
  458|  2.89M|    for (Instruction &I : *BB) {
  ------------------
  |  Branch (458:25): [True: 2.89M, False: 33.0k]
  ------------------
  459|  2.89M|      auto *mov = llvh::dyn_cast<MovInst>(&I);
  460|  2.89M|      if (!mov)
  ------------------
  |  Branch (460:11): [True: 2.89M, False: 40]
  ------------------
  461|  2.89M|        continue;
  462|       |
  463|     40|      Value *op = mov->getSingleOperand();
  464|     40|      if (llvh::isa<Literal>(op))
  ------------------
  |  Branch (464:11): [True: 0, False: 40]
  ------------------
  465|      0|        continue;
  466|       |
  467|       |      // If we've made a copy inside this basic block then use the copy.
  468|     40|      auto it = lastCopy.find(op);
  469|     40|      if (it != lastCopy.end()) {
  ------------------
  |  Branch (469:11): [True: 0, False: 40]
  ------------------
  470|      0|        mov->setOperand(it->second, 0);
  471|      0|      }
  472|       |
  473|     40|      lastCopy[op] = mov;
  474|     40|    }
  475|  33.0k|  }
  476|       |
  477|       |  // Optimize the program by coalescing multiple live intervals into a single
  478|       |  // long interval. This phase is optional.
  479|  33.0k|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (479:23): [True: 33.0k, False: 350]
  ------------------
  480|  2.89M|    for (Instruction &I : *BB) {
  ------------------
  |  Branch (480:25): [True: 2.89M, False: 33.0k]
  ------------------
  481|  2.89M|      auto *mov = llvh::dyn_cast<MovInst>(&I);
  482|  2.89M|      if (!mov)
  ------------------
  |  Branch (482:11): [True: 2.89M, False: 40]
  ------------------
  483|  2.89M|        continue;
  484|       |
  485|     40|      auto *op = llvh::dyn_cast<Instruction>(mov->getSingleOperand());
  486|     40|      if (!op)
  ------------------
  |  Branch (486:11): [True: 0, False: 40]
  ------------------
  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|     40|      if (map.count(op) || isAllocated(op) || isAllocated(mov))
  ------------------
  |  Branch (492:11): [True: 0, False: 40]
  |  Branch (492:28): [True: 0, False: 40]
  |  Branch (492:47): [True: 0, False: 40]
  ------------------
  493|      0|        continue;
  494|       |
  495|       |      // If the MOV is already coalesced into some other interval then merge the
  496|       |      // operand into that interval.
  497|     40|      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|     40|      if (isManuallyAllocatedInterval(op))
  ------------------
  |  Branch (502:11): [True: 0, False: 40]
  ------------------
  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|     72|      while (map.count(dest)) {
  ------------------
  |  Branch (507:14): [True: 32, False: 40]
  ------------------
  508|     32|        dest = map[dest];
  509|     32|      }
  510|       |
  511|     40|      unsigned destIdx = getInstructionNumber(dest);
  512|     40|      unsigned opIdx = getInstructionNumber(op);
  513|     40|      Interval &destIvl = instructionInterval_[destIdx];
  514|     40|      Interval &opIvl = instructionInterval_[opIdx];
  515|       |
  516|     40|      if (destIvl.intersects(opIvl))
  ------------------
  |  Branch (516:11): [True: 16, False: 24]
  ------------------
  517|     16|        continue;
  518|       |
  519|     24|      LLVM_DEBUG(
  ------------------
  |  |  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|     24|          dbgs() << "Coalescing instruction @" << opIdx << "  " << opIvl
  521|     24|                 << " -> @" << destIdx << "  " << destIvl << "\n");
  522|       |
  523|    252|      for (auto &it : map) {
  ------------------
  |  Branch (523:21): [True: 252, False: 24]
  ------------------
  524|    252|        if (it.second == op) {
  ------------------
  |  Branch (524:13): [True: 24, False: 228]
  ------------------
  525|     24|          LLVM_DEBUG(
  ------------------
  |  |  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  526|     24|              dbgs() << "Remapping @" << getInstructionNumber(it.first)
  527|     24|                     << " from @" << opIdx << " to @" << destIdx << "\n");
  528|     24|          it.second = dest;
  529|     24|        }
  530|    252|      }
  531|       |
  532|     24|      instructionInterval_[destIdx].add(opIvl);
  533|     24|      map[op] = dest;
  534|     24|    }
  535|  33.0k|  }
  536|    350|}
_ZN6hermes17RegisterAllocator16allocateFastPassEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  538|   102k|void RegisterAllocator::allocateFastPass(ArrayRef<BasicBlock *> order) {
  539|       |  // Make sure Phis and related Movs get the same register
  540|   707k|  for (auto *bb : order) {
  ------------------
  |  Branch (540:17): [True: 707k, False: 102k]
  ------------------
  541|  3.09M|    for (auto &inst : *bb) {
  ------------------
  |  Branch (541:21): [True: 3.09M, False: 707k]
  ------------------
  542|  3.09M|      handleInstruction(&inst);
  543|  3.09M|      if (auto *phi = llvh::dyn_cast<PhiInst>(&inst)) {
  ------------------
  |  Branch (543:17): [True: 4.37k, False: 3.08M]
  ------------------
  544|  4.37k|        auto reg = file.allocateRegister();
  545|  4.37k|        updateRegister(phi, reg);
  546|  13.1k|        for (int i = 0, e = phi->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (546:51): [True: 8.75k, False: 4.37k]
  ------------------
  547|  8.75k|          updateRegister(phi->getEntry(i).first, reg);
  548|  8.75k|        }
  549|  4.37k|      }
  550|  3.09M|    }
  551|   707k|  }
  552|       |
  553|       |  // Bit vector indicating whether a register with a given index is being used
  554|       |  // as a block local register.
  555|   102k|  llvh::BitVector blockLocals;
  556|       |
  557|       |  // List of free block local registers. We have to maintain this outside the
  558|       |  // file because we cannot determine interference between local and global
  559|       |  // registers. So we have to ensure that the local registers are only reused
  560|       |  // for other block-local instructions.
  561|   102k|  llvh::SmallVector<Register, 8> freeBlockLocals;
  562|       |
  563|       |  // A dummy register used for all instructions that have no users.
  564|   102k|  Register deadReg = file.allocateRegister();
  565|       |
  566|       |  // Iterate in reverse, so we can cheaply determine whether an instruction
  567|       |  // is local, and assign it a register accordingly.
  568|   707k|  for (auto *bb : llvh::reverse(order)) {
  ------------------
  |  Branch (568:17): [True: 707k, False: 102k]
  ------------------
  569|  3.09M|    for (auto &inst : llvh::reverse(*bb)) {
  ------------------
  |  Branch (569:21): [True: 3.09M, False: 707k]
  ------------------
  570|  3.09M|      if (isAllocated(&inst)) {
  ------------------
  |  Branch (570:11): [True: 1.70M, False: 1.38M]
  ------------------
  571|       |        // If this is using a local register, we know the register is free after
  572|       |        // we visit the definition.
  573|  1.70M|        auto reg = getRegister(&inst);
  574|  1.70M|        auto idx = reg.getIndex();
  575|  1.70M|        if (idx < blockLocals.size() && blockLocals.test(idx))
  ------------------
  |  Branch (575:13): [True: 1.63M, False: 74.7k]
  |  Branch (575:41): [True: 1.45M, False: 177k]
  ------------------
  576|  1.45M|          freeBlockLocals.push_back(reg);
  577|  1.70M|      } else {
  578|       |        // Unallocated instruction means the result is dead, because all users
  579|       |        // are visited first. Allocate a temporary register.
  580|       |        // Note that we cannot assert that the instruction has no users, because
  581|       |        // there may be users in dead blocks.
  582|  1.38M|        updateRegister(&inst, deadReg);
  583|  1.38M|      }
  584|       |
  585|       |      // Allocate a register to unallocated operands.
  586|  7.29M|      for (size_t i = 0, e = inst.getNumOperands(); i < e; ++i) {
  ------------------
  |  Branch (586:53): [True: 4.20M, False: 3.09M]
  ------------------
  587|  4.20M|        auto *op = llvh::dyn_cast<Instruction>(inst.getOperand(i));
  588|       |
  589|       |        // Skip if op is not an instruction or already has a register.
  590|  4.20M|        if (!op || isAllocated(op))
  ------------------
  |  Branch (590:13): [True: 1.81M, False: 2.38M]
  |  Branch (590:20): [True: 797k, False: 1.59M]
  ------------------
  591|  2.61M|          continue;
  592|       |
  593|  1.59M|        if (op->getParent() != bb) {
  ------------------
  |  Branch (593:13): [True: 135k, False: 1.45M]
  ------------------
  594|       |          // Live across blocks, allocate a global regigster.
  595|   135k|          updateRegister(op, file.allocateRegister());
  596|   135k|          continue;
  597|   135k|        }
  598|       |
  599|       |        // We know this operand is local because:
  600|       |        // 1. The operand is in the same block as this one.
  601|       |        // 2. All blocks dominated by this block have been visited.
  602|       |        // 3. All users must be dominated by their def, since Phis are
  603|       |        //    allocated beforehand.
  604|  1.45M|        if (!freeBlockLocals.empty()) {
  ------------------
  |  Branch (604:13): [True: 1.35M, False: 104k]
  ------------------
  605|  1.35M|          updateRegister(op, freeBlockLocals.pop_back_val());
  606|  1.35M|          continue;
  607|  1.35M|        }
  608|       |
  609|       |        // No free local register, allocate another one.
  610|   104k|        Register reg = file.allocateRegister();
  611|   104k|        if (blockLocals.size() <= reg.getIndex())
  ------------------
  |  Branch (611:13): [True: 104k, False: 0]
  ------------------
  612|   104k|          blockLocals.resize(reg.getIndex() + 1);
  613|   104k|        blockLocals.set(reg.getIndex());
  614|   104k|        updateRegister(op, reg);
  615|   104k|      }
  616|  3.09M|    }
  617|   707k|  }
  618|   102k|}
_ZN6hermes17RegisterAllocator8allocateEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  620|   103k|void RegisterAllocator::allocate(ArrayRef<BasicBlock *> order) {
  621|   103k|  PerfSection regAlloc("Register Allocation");
  622|       |
  623|       |  // Lower PHI nodes into a sequence of MOVs.
  624|   103k|  lowerPhis(order);
  625|       |
  626|   103k|  {
  627|       |    // We have two forms of register allocation: classic and fast pass.
  628|       |    // Classic allocation calculates and merges liveness intervals, fast pass
  629|       |    // just assigns sequentually. The fast pass can be enabled for small
  630|       |    // functions where runtime memory savings will be small, and for large
  631|       |    // functions where degenerate behavior can inflate compile time memory
  632|       |    // usage.
  633|       |
  634|   103k|    unsigned int instructionCount = 0;
  635|   740k|    for (const auto &BB : order) {
  ------------------
  |  Branch (635:25): [True: 740k, False: 103k]
  ------------------
  636|   740k|      instructionCount += BB->getInstList().size();
  637|   740k|    }
  638|       |    // We allocate five bits per instruction per basicblock in our liveness
  639|       |    // sets.
  640|   103k|    uint64_t estimatedMemoryUsage =
  641|   103k|        (uint64_t)order.size() * instructionCount * 5 / 8;
  642|   103k|    if (instructionCount < fastPassThreshold ||
  ------------------
  |  Branch (642:9): [True: 102k, False: 368]
  ------------------
  643|   103k|        estimatedMemoryUsage > memoryLimit) {
  ------------------
  |  Branch (643:9): [True: 18, False: 350]
  ------------------
  644|   102k|      allocateFastPass(order);
  645|   102k|      return;
  646|   102k|    }
  647|   103k|  }
  648|       |
  649|       |  // Number instructions:
  650|  33.0k|  for (auto *BB : order) {
  ------------------
  |  Branch (650:17): [True: 33.0k, False: 350]
  ------------------
  651|  2.89M|    for (auto &it : *BB) {
  ------------------
  |  Branch (651:19): [True: 2.89M, False: 33.0k]
  ------------------
  652|  2.89M|      Instruction *I = &it;
  653|  2.89M|      auto idx = getInstructionNumber(I);
  654|  2.89M|      (void)idx;
  655|  2.89M|      assert(idx == getInstructionNumber(I) && "Invalid numbering");
  656|  2.89M|    }
  657|  33.0k|  }
  658|       |
  659|       |  // Init the basic block liveness data structure and calculate the local
  660|       |  // liveness for each basic block.
  661|    350|  unsigned maxIdx = getMaxInstrIndex();
  662|  33.0k|  for (auto *BB : order) {
  ------------------
  |  Branch (662:17): [True: 33.0k, False: 350]
  ------------------
  663|  33.0k|    blockLiveness_[BB].init(maxIdx);
  664|  33.0k|  }
  665|  33.0k|  for (auto *BB : order) {
  ------------------
  |  Branch (665:17): [True: 33.0k, False: 350]
  ------------------
  666|  33.0k|    calculateLocalLiveness(blockLiveness_[BB], BB);
  667|  33.0k|  }
  668|       |
  669|       |  // Propagate the local liveness information across the whole function.
  670|    350|  calculateGlobalLiveness(order);
  671|       |
  672|       |  // Calculate the live intervals for each instruction.
  673|    350|  calculateLiveIntervals(order);
  674|       |
  675|       |  // Free the memory used for liveness.
  676|    350|  blockLiveness_.clear();
  677|       |
  678|       |  // Maps coalesced instructions. First uses the register allocated for Second.
  679|    350|  DenseMap<Instruction *, Instruction *> coalesced;
  680|       |
  681|    350|  coalesce(coalesced, order);
  682|       |
  683|       |  // Compare two intervals and return the one that starts first.
  684|    350|  auto startsFirst = [&](unsigned a, unsigned b) {
  685|    350|    Interval &IA = instructionInterval_[a];
  686|    350|    Interval &IB = instructionInterval_[b];
  687|    350|    return IA.start() < IB.start() || (IA.start() == IB.start() && a < b);
  688|    350|  };
  689|       |
  690|       |  // Compare two intervals and return the one that starts first. If two
  691|       |  // intervals end at the same place, schedule the instruction before the
  692|       |  // operands.
  693|       |
  694|    350|  auto endsFirst = [&](unsigned a, unsigned b) {
  695|    350|    auto &aInterval = instructionInterval_[a];
  696|    350|    auto &bInterval = instructionInterval_[b];
  697|    350|    if (bInterval.end() == aInterval.end()) {
  698|    350|      return bInterval.start() > aInterval.start() ||
  699|    350|          (bInterval.start() == aInterval.start() && b > a);
  700|    350|    }
  701|    350|    return bInterval.end() > aInterval.end();
  702|    350|  };
  703|       |
  704|    350|  using InstList = llvh::SmallVector<unsigned, 32>;
  705|       |
  706|    350|  std::priority_queue<unsigned, InstList, decltype(endsFirst)> intervals(
  707|    350|      endsFirst);
  708|       |
  709|  2.89M|  for (int i = 0, e = getMaxInstrIndex(); i < e; i++) {
  ------------------
  |  Branch (709:43): [True: 2.89M, False: 350]
  ------------------
  710|  2.89M|    intervals.push(i);
  711|  2.89M|  }
  712|       |
  713|    350|  std::priority_queue<unsigned, InstList, decltype(startsFirst)>
  714|    350|      liveIntervalsQueue(startsFirst);
  715|       |
  716|       |  // Perform the register allocation:
  717|  2.89M|  while (!intervals.empty()) {
  ------------------
  |  Branch (717:10): [True: 2.89M, False: 350]
  ------------------
  718|  2.89M|    unsigned instIdx = intervals.top();
  719|  2.89M|    intervals.pop();
  720|  2.89M|    Instruction *inst = instructionsByNumbers_[instIdx];
  721|  2.89M|    Interval &instInterval = instructionInterval_[instIdx];
  722|  2.89M|    unsigned currentIndex = instInterval.end();
  723|       |
  724|  2.89M|    LLVM_DEBUG(
  ------------------
  |  |  123|  2.89M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.89M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.89M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.89M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  725|  2.89M|        dbgs() << "Looking at index " << currentIndex << ": " << instInterval
  726|  2.89M|               << " " << inst->getName() << "\n");
  727|       |
  728|       |    // Free all of the intervals that start after the current index.
  729|  5.79M|    while (!liveIntervalsQueue.empty()) {
  ------------------
  |  Branch (729:12): [True: 5.79M, False: 1.68k]
  ------------------
  730|  5.79M|      LLVM_DEBUG(
  ------------------
  |  |  123|  5.79M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  5.79M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 5.79M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  5.79M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  731|  5.79M|          dbgs() << "\t Cleaning up for index " << currentIndex << " PQ("
  732|  5.79M|                 << liveIntervalsQueue.size() << ")\n");
  733|       |
  734|  5.79M|      unsigned topIdx = liveIntervalsQueue.top();
  735|  5.79M|      Interval &range = instructionInterval_[topIdx];
  736|  5.79M|      LLVM_DEBUG(dbgs() << "\t Earliest interval: " << range << "\n");
  ------------------
  |  |  123|  5.79M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  5.79M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 5.79M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  5.79M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  737|       |
  738|       |      // Flush empty intervals and intervals that finished after our index.
  739|  5.79M|      bool nonEmptyInterval = range.size();
  740|  5.79M|      if (range.start() < currentIndex && nonEmptyInterval) {
  ------------------
  |  Branch (740:11): [True: 2.89M, False: 2.89M]
  |  Branch (740:43): [True: 2.89M, False: 0]
  ------------------
  741|  2.89M|        break;
  742|  2.89M|      }
  743|       |
  744|  2.89M|      liveIntervalsQueue.pop();
  745|       |
  746|  2.89M|      Instruction *I = instructionsByNumbers_[topIdx];
  747|  2.89M|      Register R = getRegister(I);
  748|  2.89M|      LLVM_DEBUG(
  ------------------
  |  |  123|  2.89M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.89M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.89M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.89M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  749|  2.89M|          dbgs() << "\t Reached idx #" << currentIndex << " deleting inverval "
  750|  2.89M|                 << range << " that's allocated to register " << R
  751|  2.89M|                 << " used by instruction " << I->getName() << "\n");
  752|  2.89M|      file.killRegister(R);
  753|       |
  754|  2.89M|      handleInstruction(I);
  755|  2.89M|    }
  756|       |
  757|       |    // Don't try to allocate registers that were merged into other live
  758|       |    // intervals.
  759|  2.89M|    if (coalesced.count(inst)) {
  ------------------
  |  Branch (759:9): [True: 56, False: 2.89M]
  ------------------
  760|     56|      continue;
  761|     56|    }
  762|       |
  763|       |    // Allocate a register for the live interval that we are currently handling.
  764|  2.89M|    if (!isAllocated(inst)) {
  ------------------
  |  Branch (764:9): [True: 2.89M, False: 350]
  ------------------
  765|  2.89M|      Register R = file.allocateRegister();
  766|  2.89M|      updateRegister(inst, R);
  767|  2.89M|    }
  768|       |
  769|       |    // Mark the current instruction as live and remember to perform target
  770|       |    // specific calls when we are done with the bundle.
  771|  2.89M|    liveIntervalsQueue.push(instIdx);
  772|  2.89M|  } // For each instruction in the function.
  773|       |
  774|       |  // Free the remaining intervals.
  775|  1.01k|  while (!liveIntervalsQueue.empty()) {
  ------------------
  |  Branch (775:10): [True: 662, False: 350]
  ------------------
  776|    662|    Instruction *I = instructionsByNumbers_[liveIntervalsQueue.top()];
  777|    662|    LLVM_DEBUG(
  ------------------
  |  |  123|    662|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    662|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 662]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    662|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  778|    662|        dbgs() << "Free register used by instruction " << I->getName() << "\n");
  779|    662|    file.killRegister(getRegister(I));
  780|    662|    handleInstruction(I);
  781|    662|    liveIntervalsQueue.pop();
  782|    662|  }
  783|       |
  784|       |  // Allocate registers for the coalesced registers.
  785|    350|  for (auto &RP : coalesced) {
  ------------------
  |  Branch (785:17): [True: 56, False: 350]
  ------------------
  786|     56|    assert(!isAllocated(RP.first) && "Register should not be allocated");
  787|     56|    Instruction *dest = RP.second;
  788|     56|    updateRegister(RP.first, getRegister(dest));
  789|     56|  }
  790|    350|}
_ZN6hermes17RegisterAllocator22calculateLiveIntervalsEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  792|    350|void RegisterAllocator::calculateLiveIntervals(ArrayRef<BasicBlock *> order) {
  793|       |  /// Calculate the live intervals for each instruction. Start with a list of
  794|       |  /// intervals that only contain the instruction itself.
  795|  2.89M|  for (int i = 0, e = instructionsByNumbers_.size(); i < e; ++i) {
  ------------------
  |  Branch (795:54): [True: 2.89M, False: 350]
  ------------------
  796|       |    // The instructions are ordered consecutively. The start offset of the
  797|       |    // instruction is the index in the array plus one because the value starts
  798|       |    // to live on the next instruction.
  799|  2.89M|    instructionInterval_[i] = Interval(i + 1, i + 1);
  800|  2.89M|  }
  801|       |
  802|       |  // For each basic block in the liveness map:
  803|  33.0k|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (803:23): [True: 33.0k, False: 350]
  ------------------
  804|  33.0k|    BlockLifetimeInfo &liveness = blockLiveness_[BB];
  805|       |
  806|  33.0k|    auto startOffset = getInstructionNumber(&*BB->begin());
  807|  33.0k|    auto endOffset = getInstructionNumber(BB->getTerminator());
  808|       |
  809|       |    // Register fly-through basic blocks (basic blocks where the value enters)
  810|       |    // and leavs without doing anything to any of the operands.
  811|  29.5M|    for (int i = 0, e = liveness.liveOut_.size(); i < e; i++) {
  ------------------
  |  Branch (811:51): [True: 29.5M, False: 33.0k]
  ------------------
  812|  29.5M|      bool leavs = liveness.liveOut_.test(i);
  813|  29.5M|      bool enters = liveness.liveIn_.test(i);
  814|  29.5M|      if (leavs && enters) {
  ------------------
  |  Branch (814:11): [True: 919k, False: 28.5M]
  |  Branch (814:20): [True: 902k, False: 16.4k]
  ------------------
  815|   902k|        instructionInterval_[i].add(Segment(startOffset, endOffset + 1));
  816|   902k|      }
  817|  29.5M|    }
  818|       |
  819|       |    // For each instruction in the block:
  820|  2.89M|    for (auto &it : *BB) {
  ------------------
  |  Branch (820:19): [True: 2.89M, False: 33.0k]
  ------------------
  821|  2.89M|      auto instOffset = getInstructionNumber(&it);
  822|       |      // The instruction is defined in this basic block. Check if it is leaving
  823|       |      // the basic block extend the interval until the end of the block.
  824|  2.89M|      if (liveness.liveOut_.test(instOffset)) {
  ------------------
  |  Branch (824:11): [True: 16.4k, False: 2.88M]
  ------------------
  825|  16.4k|        instructionInterval_[instOffset].add(
  826|  16.4k|            Segment(instOffset + 1, endOffset + 1));
  827|  16.4k|        assert(
  828|  16.4k|            !liveness.liveIn_.test(instOffset) &&
  829|  16.4k|            "Livein but also killed in this block?");
  830|  16.4k|      }
  831|       |
  832|       |      // Extend the lifetime of the operands.
  833|  9.75M|      for (int i = 0, e = it.getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (833:48): [True: 6.85M, False: 2.89M]
  ------------------
  834|  6.85M|        auto instOp = llvh::dyn_cast<Instruction>(it.getOperand(i));
  835|  6.85M|        if (!instOp)
  ------------------
  |  Branch (835:13): [True: 3.83M, False: 3.02M]
  ------------------
  836|  3.83M|          continue;
  837|       |
  838|  3.02M|        if (!hasInstructionNumber(instOp)) {
  ------------------
  |  Branch (838:13): [True: 0, False: 3.02M]
  ------------------
  839|      0|          assert(
  840|      0|              llvh::isa<PhiInst>(&it) &&
  841|      0|              "Only PhiInst should reference values from dead code");
  842|      0|          continue;
  843|      0|        }
  844|       |
  845|  3.02M|        auto operandIdx = getInstructionNumber(instOp);
  846|       |        // Extend the lifetime of the interval to reach this instruction.
  847|       |        // Include this instruction in the interval in order to make sure that
  848|       |        // the register is not freed before the use.
  849|       |
  850|  3.02M|        auto start = operandIdx + 1;
  851|  3.02M|        auto end = instOffset + 1;
  852|  3.02M|        if (start < end) {
  ------------------
  |  Branch (852:13): [True: 3.02M, False: 0]
  ------------------
  853|  3.02M|          auto seg = Segment(operandIdx + 1, instOffset + 1);
  854|  3.02M|          instructionInterval_[operandIdx].add(seg);
  855|  3.02M|        }
  856|  3.02M|      }
  857|       |
  858|       |      // Extend the lifetime of the PHI to include the source basic blocks.
  859|  2.89M|      if (auto *P = llvh::dyn_cast<PhiInst>(&it)) {
  ------------------
  |  Branch (859:17): [True: 16, False: 2.89M]
  ------------------
  860|     48|        for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (860:49): [True: 32, False: 16]
  ------------------
  861|     32|          auto E = P->getEntry(i);
  862|       |          // PhiInsts may reference instructions from dead code blocks
  863|       |          // (which will be unnumbered and unallocated). Since the edge
  864|       |          // is necessarily also dead, we can just skip it.
  865|     32|          if (!hasInstructionNumber(E.second->getTerminator()))
  ------------------
  |  Branch (865:15): [True: 0, False: 32]
  ------------------
  866|      0|            continue;
  867|       |
  868|     32|          unsigned termIdx = getInstructionNumber(E.second->getTerminator());
  869|     32|          Segment S(termIdx, termIdx + 1);
  870|     32|          instructionInterval_[instOffset].add(S);
  871|       |
  872|       |          // Extend the lifetime of the predecessor to the end of the BB.
  873|     32|          if (auto *instOp = llvh::dyn_cast<Instruction>(E.first)) {
  ------------------
  |  Branch (873:21): [True: 32, False: 0]
  ------------------
  874|     32|            auto predIdx = getInstructionNumber(instOp);
  875|     32|            auto S2 = Segment(predIdx + 1, termIdx);
  876|     32|            instructionInterval_[predIdx].add(S2);
  877|     32|          }
  878|     32|        } // each pred.
  879|     16|      }
  880|       |
  881|  2.89M|    } // for each instruction in the block.
  882|  33.0k|  } // for each block.
  883|    350|}
_ZN6hermes17RegisterAllocator11getRegisterEPNS_5ValueE:
  926|  37.7M|Register RegisterAllocator::getRegister(Value *I) {
  927|  37.7M|  assert(isAllocated(I) && "Instruction is not allocated!");
  928|  37.7M|  return allocated[I];
  929|  37.7M|}
_ZN6hermes17RegisterAllocator14updateRegisterEPNS_5ValueENS_8RegisterE:
  931|  14.7M|void RegisterAllocator::updateRegister(Value *I, Register R) {
  932|  14.7M|  allocated[I] = R;
  933|  14.7M|}
_ZN6hermes17RegisterAllocator11isAllocatedEPNS_5ValueE:
  935|  63.4M|bool RegisterAllocator::isAllocated(Value *I) {
  936|  63.4M|  return allocated.count(I);
  937|  63.4M|}
_ZN6hermes17RegisterAllocator7reserveEN4llvh8ArrayRefIPNS_5ValueEEE:
  943|   103k|Register RegisterAllocator::reserve(ArrayRef<Value *> values) {
  944|   103k|  assert(!values.empty() && "Can't reserve zero registers");
  945|   103k|  Register first = file.tailAllocateConsecutive(values.size());
  946|       |
  947|   103k|  Register T = first;
  948|   103k|  for (auto *v : values) {
  ------------------
  |  Branch (948:16): [True: 103k, False: 103k]
  ------------------
  949|   103k|    if (v)
  ------------------
  |  Branch (949:9): [True: 103k, False: 0]
  ------------------
  950|   103k|      allocated[v] = T;
  951|   103k|    T = T.getConsecutive();
  952|   103k|  }
  953|       |
  954|   103k|  return first;
  955|   103k|}
_ZN6hermes17RegisterAllocator20hasInstructionNumberEPNS_11InstructionE:
  957|  3.02M|bool RegisterAllocator::hasInstructionNumber(Instruction *I) {
  958|  3.02M|  return instructionNumbers_.count(I);
  959|  3.02M|}
_ZN6hermes17RegisterAllocator20getInstructionNumberEPNS_11InstructionE:
  961|  17.7M|unsigned RegisterAllocator::getInstructionNumber(Instruction *I) {
  962|  17.7M|  auto it = instructionNumbers_.find(I);
  963|  17.7M|  if (it != instructionNumbers_.end()) {
  ------------------
  |  Branch (963:7): [True: 14.8M, False: 2.89M]
  ------------------
  964|  14.8M|    return it->second;
  965|  14.8M|  }
  966|       |
  967|  2.89M|  instructionsByNumbers_.push_back(I);
  968|  2.89M|  instructionInterval_.push_back(Interval());
  969|       |
  970|  2.89M|  unsigned newIdx = instructionsByNumbers_.size() - 1;
  971|  2.89M|  instructionNumbers_[I] = newIdx;
  972|  2.89M|  return newIdx;
  973|  17.7M|}
_ZN6hermes21ScopeRegisterAnalysisC2EPNS_8FunctionERNS_17RegisterAllocatorE:
  990|   103k|    : RA_(RA) {
  991|       |  // Initialize the ScopeDesc -> ScopeCreationInst map; if emitting full debug
  992|       |  // info, scopeCreationInsts will be used to reserve/pre-allocate the
  993|       |  // environment registers for scopes in F.
  994|   103k|  llvh::SmallVector<Value *, 4> scopeCreationInsts;
  995|   843k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (995:23): [True: 843k, False: 103k]
  ------------------
  996|  6.18M|    for (Instruction &I : BB) {
  ------------------
  |  Branch (996:25): [True: 6.18M, False: 843k]
  ------------------
  997|  6.18M|      if (llvh::isa<HBCResolveEnvironment>(I)) {
  ------------------
  |  Branch (997:11): [True: 0, False: 6.18M]
  ------------------
  998|       |        // HBCResolveEnvironment instructions are used to fetch an environment
  999|       |        // outside of F. The debugger doesn't need access to these "resolved"
 1000|       |        // environment.
 1001|      0|        continue;
 1002|  6.18M|      } else if (auto *SCI = llvh::dyn_cast<ScopeCreationInst>(&I)) {
  ------------------
  |  Branch (1002:24): [True: 103k, False: 6.08M]
  ------------------
 1003|   103k|        assert(
 1004|   103k|            SCI->getCreatedScopeDesc()->getFunction() == F &&
 1005|   103k|            "ScopeCreationInst that is creating a scope of another function");
 1006|   103k|        scopeCreationInsts_[SCI->getCreatedScopeDesc()] = SCI;
 1007|   103k|        if (preallocateScopeRegisters(F->getContext())) {
  ------------------
  |  Branch (1007:13): [True: 103k, False: 0]
  ------------------
 1008|   103k|          LLVM_DEBUG(
  ------------------
  |  |  123|   103k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   103k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 103k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   103k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1009|   103k|              llvh::dbgs() << "Reserving register for ScopeCreationInst in "
 1010|   103k|                           << F->getOriginalOrInferredName() << "\n");
 1011|   103k|          scopeCreationInsts.push_back(SCI);
 1012|   103k|        }
 1013|   103k|      }
 1014|  6.18M|    }
 1015|   843k|  }
 1016|       |
 1017|   103k|  if (!scopeCreationInsts.empty()) {
  ------------------
  |  Branch (1017:7): [True: 103k, False: 0]
  ------------------
 1018|   103k|    RA_.reserve(scopeCreationInsts);
 1019|   103k|  }
 1020|   103k|}
_ZN6hermes21ScopeRegisterAnalysis30registerAndScopeForInstructionEPNS_11InstructionE:
 1045|  4.18M|ScopeRegisterAnalysis::registerAndScopeForInstruction(Instruction *Inst) {
 1046|  4.18M|  if (ScopeDesc *originalScope = Inst->getSourceLevelScope()) {
  ------------------
  |  Branch (1046:18): [True: 4.18M, False: 0]
  ------------------
 1047|  4.18M|    auto sciIt = scopeCreationInsts_.find(originalScope);
 1048|  4.18M|    if (sciIt != scopeCreationInsts_.end()) {
  ------------------
  |  Branch (1048:9): [True: 4.18M, False: 0]
  ------------------
 1049|  4.18M|      ScopeCreationInst *originalScopeCreation = sciIt->second;
 1050|  4.18M|      if (!preallocateScopeRegisters(Inst->getContext())) {
  ------------------
  |  Branch (1050:11): [True: 0, False: 4.18M]
  ------------------
 1051|      0|        return registerAndScopeAt(Inst, originalScopeCreation);
 1052|      0|      }
 1053|       |      // Use the pre-allocated registers. This is needed because RA_ could have
 1054|       |      // decided to use fast allocation, in which case instructions won't be
 1055|       |      // numbered (and intervals won't be computed), meaning registerAndScopeAt
 1056|       |      // above will not find the scope register.
 1057|  4.18M|      assert(RA_.isAllocated(originalScopeCreation) && "should be allocated");
 1058|  4.18M|      Register sciReg = RA_.getRegister(originalScopeCreation);
 1059|  4.18M|      assert(sciReg.isValid() && "scope register should be valid.");
 1060|  4.18M|      return std::make_pair(sciReg, originalScope);
 1061|  4.18M|    }
 1062|  4.18M|  }
 1063|       |
 1064|      0|  return std::make_pair(Register{}, nullptr);
 1065|  4.18M|}
RegAlloc.cpp:_ZL12phiReadWritePN6hermes7PhiInstE:
  132|  4.39k|static bool phiReadWrite(PhiInst *P) {
  133|  4.39k|  bool localPhiUse = false;
  134|  4.39k|  bool externalUse = false;
  135|  4.39k|  bool terminatorUse = false;
  136|       |
  137|  4.39k|  BasicBlock *parent = P->getParent();
  138|       |
  139|  4.39k|  for (auto *U : P->getUsers()) {
  ------------------
  |  Branch (139:16): [True: 4.39k, False: 4.39k]
  ------------------
  140|  4.39k|    terminatorUse |= llvh::isa<TerminatorInst>(U);
  141|  4.39k|    localPhiUse |=
  142|  4.39k|        (llvh::isa<PhiInst>(U) && U->getParent() == parent && P != U);
  ------------------
  |  Branch (142:10): [True: 0, False: 4.39k]
  |  Branch (142:35): [True: 0, False: 0]
  |  Branch (142:63): [True: 0, False: 0]
  ------------------
  143|  4.39k|    externalUse |= U->getParent() != parent;
  144|  4.39k|  }
  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|  4.39k|  return terminatorUse || localPhiUse || externalUse;
  ------------------
  |  Branch (156:10): [True: 0, False: 4.39k]
  |  Branch (156:27): [True: 0, False: 4.39k]
  |  Branch (156:42): [True: 82, False: 4.31k]
  ------------------
  157|  4.39k|}
RegAlloc.cpp:_ZN12_GLOBAL__N_125preallocateScopeRegistersERKN6hermes7ContextE:
  984|  4.28M|static bool preallocateScopeRegisters(const Context &c) {
  985|  4.28M|  return c.getDebugInfoSetting() == DebugInfoSetting::ALL;
  986|  4.28M|}
RegAlloc.cpp:_ZZN6hermes17RegisterAllocator8allocateEN4llvh8ArrayRefIPNS_10BasicBlockEEEENK3$_1clEjj:
  694|  78.9M|  auto endsFirst = [&](unsigned a, unsigned b) {
  695|  78.9M|    auto &aInterval = instructionInterval_[a];
  696|  78.9M|    auto &bInterval = instructionInterval_[b];
  697|  78.9M|    if (bInterval.end() == aInterval.end()) {
  ------------------
  |  Branch (697:9): [True: 17.5M, False: 61.3M]
  ------------------
  698|  17.5M|      return bInterval.start() > aInterval.start() ||
  ------------------
  |  Branch (698:14): [True: 14.1M, False: 3.42M]
  ------------------
  699|  17.5M|          (bInterval.start() == aInterval.start() && b > a);
  ------------------
  |  Branch (699:12): [True: 0, False: 3.42M]
  |  Branch (699:54): [True: 0, False: 0]
  ------------------
  700|  17.5M|    }
  701|  61.3M|    return bInterval.end() > aInterval.end();
  702|  78.9M|  };
RegAlloc.cpp:_ZZN6hermes17RegisterAllocator8allocateEN4llvh8ArrayRefIPNS_10BasicBlockEEEENK3$_0clEjj:
  684|  15.8M|  auto startsFirst = [&](unsigned a, unsigned b) {
  685|  15.8M|    Interval &IA = instructionInterval_[a];
  686|  15.8M|    Interval &IB = instructionInterval_[b];
  687|  15.8M|    return IA.start() < IB.start() || (IA.start() == IB.start() && a < b);
  ------------------
  |  Branch (687:12): [True: 9.38M, False: 6.48M]
  |  Branch (687:40): [True: 0, False: 6.48M]
  |  Branch (687:68): [True: 0, False: 0]
  ------------------
  688|  15.8M|  };

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

_ZN6hermes13DominanceInfoC2EPNS_8FunctionE:
   18|     13|DominanceInfo::DominanceInfo(Function *F) : DominatorTreeBase() {
   19|     13|  assert(F->begin() != F->end() && "Function is empty!");
   20|     13|  recalculate(*F);
   21|     13|}
_ZNK6hermes13DominanceInfo17properlyDominatesEPKNS_11InstructionES3_:
   25|    161|    const Instruction *B) const {
   26|    161|  const BasicBlock *ABB = A->getParent();
   27|    161|  const BasicBlock *BBB = B->getParent();
   28|       |
   29|    161|  if (ABB != BBB)
  ------------------
  |  Branch (29:7): [True: 161, False: 0]
  ------------------
   30|    161|    return properlyDominates(ABB, BBB);
   31|       |
   32|       |  // Otherwise, they're in the same block, and we just need to check
   33|       |  // whether B comes after A.
   34|      0|  auto ItA = A->getIterator();
   35|      0|  auto ItB = B->getIterator();
   36|      0|  auto E = ABB->begin();
   37|      0|  while (ItB != E) {
  ------------------
  |  Branch (37:10): [True: 0, False: 0]
  ------------------
   38|      0|    --ItB;
   39|      0|    if (ItA == ItB)
  ------------------
  |  Branch (39:9): [True: 0, False: 0]
  ------------------
   40|      0|      return true;
   41|      0|  }
   42|       |
   43|      0|  return false;
   44|      0|}

_ZN6hermes5Value7destroyEPS0_:
   49|  12.5M|void Value::destroy(Value *V) {
   50|  12.5M|  if (!V)
  ------------------
  |  Branch (50:7): [True: 81, False: 12.5M]
  ------------------
   51|     81|    return;
   52|       |
   53|  12.5M|  switch (V->Kind) {
   54|      0|    default:
  ------------------
  |  Branch (54:5): [True: 0, False: 12.5M]
  ------------------
   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   27|       |
  |  |  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   30|   103k|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   103k|    break;
  |  |  |  |  ------------------
  |  |  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   32|   103k|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   103k|    break;
  |  |  |  |  ------------------
  |  |  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   34|      0|#endif
  |  |  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |  |  |   36|      0|DEF_VALUE(NestedScopeCreationInst, ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   40|      0|#endif
  |  |  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   43|       |
  |  |  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   47|    509|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    509|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 509, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    509|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    509|    break;
  |  |  |  |  ------------------
  |  |  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   50|   128k|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   128k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 128k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   128k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   128k|    break;
  |  |  |  |  ------------------
  |  |  |  |   51|  1.34M|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  1.34M|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 1.34M, False: 11.2M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  1.34M|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  1.34M|    break;
  |  |  |  |  ------------------
  |  |  |  |   52|  2.82k|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  2.82k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2.82k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  2.82k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  2.82k|    break;
  |  |  |  |  ------------------
  |  |  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   54|  25.3k|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  25.3k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 25.3k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  25.3k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  25.3k|    break;
  |  |  |  |  ------------------
  |  |  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   56|  1.75M|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  1.75M|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 1.75M, False: 10.8M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  1.75M|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  1.75M|    break;
  |  |  |  |  ------------------
  |  |  |  |   57|   103k|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   103k|    break;
  |  |  |  |  ------------------
  |  |  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   59|    174|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    174|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 174, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    174|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    174|    break;
  |  |  |  |  ------------------
  |  |  |  |   60|  2.38M|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  2.38M|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2.38M, False: 10.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  2.38M|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  2.38M|    break;
  |  |  |  |  ------------------
  |  |  |  |   61|      0|#endif
  |  |  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   63|       |
  |  |  |  |   64|  4.39k|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  4.39k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 4.39k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  4.39k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  4.39k|    break;
  |  |  |  |  ------------------
  |  |  |  |   65|   157k|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   157k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 157k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   157k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   157k|    break;
  |  |  |  |  ------------------
  |  |  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |   67|  1.32k|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  1.32k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 1.32k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  1.32k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  1.32k|    break;
  |  |  |  |  ------------------
  |  |  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   70|       |
  |  |  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |   72|   826k|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   826k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 826k, False: 11.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   826k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   826k|    break;
  |  |  |  |  ------------------
  |  |  |  |   73|      1|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      1|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 1, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      1|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      1|    break;
  |  |  |  |  ------------------
  |  |  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   75|       |
  |  |  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |   79|  68.4k|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  68.4k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 68.4k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  68.4k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  68.4k|    break;
  |  |  |  |  ------------------
  |  |  |  |   80|   501k|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   501k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 501k, False: 12.0M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   501k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   501k|    break;
  |  |  |  |  ------------------
  |  |  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   82|      4|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      4|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 4, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      4|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      4|    break;
  |  |  |  |  ------------------
  |  |  |  |   83|   576k|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   576k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 576k, False: 11.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   576k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   576k|    break;
  |  |  |  |  ------------------
  |  |  |  |   84|   104k|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   104k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 104k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   104k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   104k|    break;
  |  |  |  |  ------------------
  |  |  |  |   85|   136k|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   136k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 136k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   136k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   136k|    break;
  |  |  |  |  ------------------
  |  |  |  |   86|      2|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      2|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      2|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      2|    break;
  |  |  |  |  ------------------
  |  |  |  |   87|    101|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    101|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 101, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    101|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    101|    break;
  |  |  |  |  ------------------
  |  |  |  |   88|   103k|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   103k|    break;
  |  |  |  |  ------------------
  |  |  |  |   89|  40.6k|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  40.6k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 40.6k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  40.6k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  40.6k|    break;
  |  |  |  |  ------------------
  |  |  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   92|    119|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    119|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 119, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    119|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    119|    break;
  |  |  |  |  ------------------
  |  |  |  |   93|  40.6k|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  40.6k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 40.6k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  40.6k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  40.6k|    break;
  |  |  |  |  ------------------
  |  |  |  |   94|      9|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      9|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 9, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      9|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      9|    break;
  |  |  |  |  ------------------
  |  |  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   96|  22.3k|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  22.3k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 22.3k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  22.3k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  22.3k|    break;
  |  |  |  |  ------------------
  |  |  |  |   97|  20.3k|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  20.3k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 20.3k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  20.3k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  20.3k|    break;
  |  |  |  |  ------------------
  |  |  |  |   98|  42.7k|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  42.7k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 42.7k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  42.7k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  42.7k|    break;
  |  |  |  |  ------------------
  |  |  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  100|   104k|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   104k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 104k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   104k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   104k|    break;
  |  |  |  |  ------------------
  |  |  |  |  101|      4|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      4|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 4, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      4|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      4|    break;
  |  |  |  |  ------------------
  |  |  |  |  102|      0|#endif
  |  |  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  104|       |
  |  |  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  106|   103k|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   103k|    break;
  |  |  |  |  ------------------
  |  |  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  109|   103k|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   103k|    break;
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  111|      0|#endif
  |  |  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  115|       |#endif
  |  |  |  |  116|       |
  |  |  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  119|   484k|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|   484k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|   484k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 484k, False: 12.0M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|   484k|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|   484k|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  120|   206k|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|   206k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|   206k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 206k, False: 12.3M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|   206k|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|   206k|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  121|  20.3k|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  20.3k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|  20.3k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 20.3k, False: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|  20.3k|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|  20.3k|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  122|      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: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  123|  91.9k|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  91.9k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|  91.9k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 91.9k, False: 12.4M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|  91.9k|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|  91.9k|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  124|     15|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|     15|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|     15|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 15, False: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|     15|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|     15|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  125|     15|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|     15|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|     15|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 15, False: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|     15|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|     15|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|      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: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  127|  40.6k|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  40.6k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|  40.6k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 40.6k, False: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|  40.6k|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|  40.6k|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  128|      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: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  129|      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: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  130|      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: 12.5M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  132|       |
  |  |  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  |  |  134|  2.84k|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  2.84k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2.84k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  2.84k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  2.84k|    break;
  |  |  |  |  ------------------
  |  |  |  |  135|  25.0k|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  25.0k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 25.0k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  25.0k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  25.0k|    break;
  |  |  |  |  ------------------
  |  |  |  |  136|  2.82k|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  2.82k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2.82k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  2.82k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  2.82k|    break;
  |  |  |  |  ------------------
  |  |  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  138|  25.0k|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  25.0k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 25.0k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  25.0k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  25.0k|    break;
  |  |  |  |  ------------------
  |  |  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  141|      0|#endif
  |  |  |  |  142|      0|MARK_LAST(CallInst)
  |  |  |  |  143|       |
  |  |  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  147|       |
  |  |  |  |  148|       |// These are target dependent instructions:
  |  |  |  |  149|       |
  |  |  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  151|   503k|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   503k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 503k, False: 12.0M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   503k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   503k|    break;
  |  |  |  |  ------------------
  |  |  |  |  152|      9|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      9|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 9, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      9|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      9|    break;
  |  |  |  |  ------------------
  |  |  |  |  153|  25.0k|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  25.0k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 25.0k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  25.0k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  25.0k|    break;
  |  |  |  |  ------------------
  |  |  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  155|  25.0k|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  25.0k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 25.0k, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  25.0k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  25.0k|    break;
  |  |  |  |  ------------------
  |  |  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  158|      0|#endif
  |  |  |  |  159|       |
  |  |  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  161|       |
  |  |  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  163|       |// these macros are still used after the #include.
  |  |  |  |  164|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  165|       |#undef DEF_VALUE
  |  |  |  |  166|       |#undef MARK_FIRST
  |  |  |  |  167|       |#undef MARK_LAST
  |  |  |  |  168|       |#undef TERMINATOR
  |  |  |  |  169|       |#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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   36|   827k|DEF_VALUE(LiteralNumber, Literal)
  |  |  ------------------
  |  |  |  |   57|   827k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 827k, False: 11.7M]
  |  |  |  |  ------------------
  |  |  |  |   58|   827k|    delete cast<XX>(V);       \
  |  |  |  |   59|   827k|    break;
  |  |  ------------------
  |  |   37|      5|DEF_VALUE(LiteralBigInt, Literal)
  |  |  ------------------
  |  |  |  |   57|      5|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 5, False: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   58|      5|    delete cast<XX>(V);       \
  |  |  |  |   59|      5|    break;
  |  |  ------------------
  |  |   38|  11.4k|DEF_VALUE(LiteralString, Literal)
  |  |  ------------------
  |  |  |  |   57|  11.4k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 11.4k, False: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   58|  11.4k|    delete cast<XX>(V);       \
  |  |  |  |   59|  11.4k|    break;
  |  |  ------------------
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|   103k|DEF_VALUE(ScopeDesc, Value)
  |  |  ------------------
  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  ------------------
  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |   59|   103k|    break;
  |  |  ------------------
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   46|  9.38k|DEF_VALUE(GlobalObjectProperty, Value)
  |  |  ------------------
  |  |  |  |   57|  9.38k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 9.38k, False: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   58|  9.38k|    delete cast<XX>(V);       \
  |  |  |  |   59|  9.38k|    break;
  |  |  ------------------
  |  |   47|   103k|DEF_VALUE(Variable, Value)
  |  |  ------------------
  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  ------------------
  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |   59|   103k|    break;
  |  |  ------------------
  |  |   48|   206k|DEF_VALUE(Parameter, Value)
  |  |  ------------------
  |  |  |  |   57|   206k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 206k, False: 12.3M]
  |  |  |  |  ------------------
  |  |  |  |   58|   206k|    delete cast<XX>(V);       \
  |  |  |  |   59|   206k|    break;
  |  |  ------------------
  |  |   49|   845k|DEF_VALUE(BasicBlock, Value)
  |  |  ------------------
  |  |  |  |   57|   845k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 845k, False: 11.7M]
  |  |  |  |  ------------------
  |  |  |  |   58|   845k|    delete cast<XX>(V);       \
  |  |  |  |   59|   845k|    break;
  |  |  ------------------
  |  |   50|      0|MARK_FIRST(Function)
  |  |   51|   103k|DEF_VALUE(Function, Value)
  |  |  ------------------
  |  |  |  |   57|   103k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 103k, False: 12.4M]
  |  |  |  |  ------------------
  |  |  |  |   58|   103k|    delete cast<XX>(V);       \
  |  |  |  |   59|   103k|    break;
  |  |  ------------------
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |   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|  12.5M|  }
   62|  12.5M|}
_ZNK6hermes5Value8getUsersEv:
   75|  4.56k|const Value::UseListTy &Value::getUsers() const {
   76|  4.56k|  return Users;
   77|  4.56k|}
_ZNK6hermes5Value8hasUsersEv:
   83|   210k|bool Value::hasUsers() const {
   84|   210k|  return Users.size();
   85|   210k|}
_ZN6hermes5Value9removeUseENSt3__14pairIPS0_jEE:
   91|  11.0M|void Value::removeUse(Use U) {
   92|  11.0M|  assert(Users.size() && "Removing a user from an empty list");
   93|  11.0M|  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|  11.0M|  Users[U.second] = Users.back();
  100|  11.0M|  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|  11.0M|  if (U.second != Users.size()) {
  ------------------
  |  Branch (104:7): [True: 6.96M, False: 4.07M]
  ------------------
  105|  6.96M|    Use oldUse = {this, static_cast<unsigned>(Users.size())};
  106|  6.96M|    auto &operands = Users[U.second]->Operands;
  107|  7.75M|    for (int i = 0, e = operands.size(); i < e; i++) {
  ------------------
  |  Branch (107:42): [True: 7.75M, False: 0]
  ------------------
  108|  7.75M|      if (operands[i] == oldUse) {
  ------------------
  |  Branch (108:11): [True: 6.96M, False: 792k]
  ------------------
  109|  6.96M|        operands[i] = {this, U.second};
  110|  6.96M|        return;
  111|  6.96M|      }
  112|  7.75M|    }
  113|      0|    llvm_unreachable("Can't find user in operand list");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  114|  6.96M|  }
  115|  11.0M|}
_ZN6hermes5Value7addUserEPNS_11InstructionE:
  117|  24.8M|Value::Use Value::addUser(Instruction *Inst) {
  118|  24.8M|  Users.push_back(Inst);
  119|  24.8M|  return {this, static_cast<unsigned>(Users.size() - 1)};
  120|  24.8M|}
_ZN6hermes5Value18replaceAllUsesWithEPS0_:
  122|  2.53M|void Value::replaceAllUsesWith(Value *Other) {
  123|  2.53M|  if (this == Other) {
  ------------------
  |  Branch (123:7): [True: 0, False: 2.53M]
  ------------------
  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|  6.21M|  while (Users.size()) {
  ------------------
  |  Branch (129:10): [True: 3.68M, False: 2.53M]
  ------------------
  130|  3.68M|    Users[Users.size() - 1]->replaceFirstOperandWith(this, Other);
  131|  3.68M|  }
  132|  2.53M|}
_ZN6hermes9ScopeDescD2Ev:
  146|   103k|ScopeDesc::~ScopeDesc() {
  147|   103k|  for (ScopeDesc *inner : innerScopes_) {
  ------------------
  |  Branch (147:25): [True: 103k, False: 103k]
  ------------------
  148|   103k|    Value::destroy(inner);
  149|   103k|  }
  150|       |
  151|       |  // Free all variables.
  152|   103k|  for (auto *v : variables_) {
  ------------------
  |  Branch (152:16): [True: 103k, False: 103k]
  ------------------
  153|   103k|    Value::destroy(v);
  154|   103k|  }
  155|   103k|}
_ZN6hermes8FunctionC2ENS_9ValueKindEPNS_6ModuleEPNS_9ScopeDescENS_10IdentifierENS0_14DefinitionKindEbNS_16SourceVisibilityEbN4llvh7SMRangeEPS0_:
  173|   103k|    : Value(kind),
  174|   103k|      parent_(parent),
  175|   103k|      isGlobal_(isGlobal),
  176|   103k|      scopeDesc_(scopeDesc),
  177|   103k|      originalOrInferredName_(originalName),
  178|   103k|      definitionKind_(definitionKind),
  179|   103k|      strictMode_(strictMode),
  180|   103k|      SourceRange(sourceRange),
  181|   103k|      sourceVisibility_(sourceVisibility),
  182|   103k|      internalName_(parent->deriveUniqueInternalName(originalName)) {
  183|   103k|  scopeDesc_->setFunction(this);
  184|   103k|  if (insertBefore) {
  ------------------
  |  Branch (184:7): [True: 0, False: 103k]
  ------------------
  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|   103k|  } else {
  191|   103k|    parent->push_back(this);
  192|   103k|  }
  193|       |
  194|       |  // Derive internalName from originalName.
  195|   103k|  assert(originalName.isValid() && "Function originalName must be valid");
  196|   103k|}
_ZN6hermes8FunctionD2Ev:
  198|   103k|Function::~Function() {
  199|       |  // Free all parameters.
  200|   103k|  for (auto *p : Parameters) {
  ------------------
  |  Branch (200:16): [True: 103k, False: 103k]
  ------------------
  201|   103k|    Value::destroy(p);
  202|   103k|  }
  203|   103k|  Value::destroy(thisParameter);
  204|   103k|}
_ZNK6hermes8Function26getSourceRepresentationStrEv:
  225|   206k|llvh::Optional<llvh::StringRef> Function::getSourceRepresentationStr() const {
  226|   206k|  switch (getSourceVisibility()) {
  227|      0|    case SourceVisibility::ShowSource: {
  ------------------
  |  Branch (227:5): [True: 0, False: 206k]
  ------------------
  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: 206k]
  ------------------
  238|      0|    case SourceVisibility::Sensitive: {
  ------------------
  |  Branch (238:5): [True: 0, False: 206k]
  ------------------
  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|   206k|    case SourceVisibility::Default:
  ------------------
  |  Branch (250:5): [True: 206k, False: 0]
  ------------------
  251|   206k|    default: {
  ------------------
  |  Branch (251:5): [True: 0, False: 206k]
  ------------------
  252|       |      // No need of special source representation for these cases, their
  253|       |      // 'toString' will return `{ [ bytecode ] }` as the default.
  254|   206k|      return llvh::None;
  255|   206k|    }
  256|   206k|  }
  257|   206k|}
_ZN6hermes10BasicBlockC2EPNS_8FunctionE:
  260|   845k|    : Value(ValueKind::BasicBlockKind), Parent(parent) {
  261|   845k|  assert(Parent && "Invalid parent function");
  262|   845k|  Parent->addBlock(this);
  263|   845k|}
_ZN6hermes11Instruction11pushOperandEPNS_5ValueE:
  297|  15.8M|void Instruction::pushOperand(Value *Val) {
  298|  15.8M|  Operands.push_back({nullptr, 0});
  299|  15.8M|  setOperand(Val, getNumOperands() - 1);
  300|  15.8M|}
_ZN6hermes11Instruction10setOperandEPNS_5ValueEj:
  302|  26.8M|void Instruction::setOperand(Value *Val, unsigned Index) {
  303|  26.8M|  assert(Index < Operands.size() && "Not all operands have been pushed!");
  304|       |
  305|  26.8M|  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|  26.8M|  if (CurrentValue == Val) {
  ------------------
  |  Branch (309:7): [True: 9.51k, False: 26.8M]
  ------------------
  310|  9.51k|    return;
  311|  9.51k|  }
  312|       |
  313|       |  // Remove the current instruction from the old value that we are removing.
  314|  26.8M|  if (CurrentValue) {
  ------------------
  |  Branch (314:7): [True: 11.0M, False: 15.8M]
  ------------------
  315|  11.0M|    CurrentValue->removeUse(Operands[Index]);
  316|  11.0M|  }
  317|       |
  318|       |  // Register this instruction as a user of the new value and set the operand.
  319|  26.8M|  if (Val) {
  ------------------
  |  Branch (319:7): [True: 24.8M, False: 1.98M]
  ------------------
  320|  24.8M|    Operands[Index] = Val->addUser(this);
  321|  24.8M|  } else {
  322|  1.98M|    Operands[Index] = {nullptr, 0};
  323|  1.98M|  }
  324|  26.8M|}
_ZNK6hermes11Instruction10getOperandEj:
  326|  76.5M|Value *Instruction::getOperand(unsigned Index) const {
  327|  76.5M|  return Operands[Index].first;
  328|  76.5M|}
_ZNK6hermes11Instruction14getNumOperandsEv:
  330|  47.4M|unsigned Instruction::getNumOperands() const {
  331|  47.4M|  return Operands.size();
  332|  47.4M|}
_ZN6hermes11Instruction13removeOperandEj:
  334|   128k|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|   128k|  setOperand(nullptr, index);
  338|   128k|  Operands.erase(Operands.begin() + index);
  339|   128k|}
_ZN6hermes11Instruction23replaceFirstOperandWithEPNS_5ValueES2_:
  341|  3.68M|void Instruction::replaceFirstOperandWith(Value *OldValue, Value *NewValue) {
  342|  4.22M|  for (int i = 0, e = getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (342:41): [True: 4.22M, False: 0]
  ------------------
  343|  4.22M|    if (OldValue == getOperand(i)) {
  ------------------
  |  Branch (343:9): [True: 3.68M, False: 540k]
  ------------------
  344|  3.68M|      setOperand(NewValue, i);
  345|  3.68M|      return;
  346|  3.68M|    }
  347|  4.22M|  }
  348|      0|  llvm_unreachable("Can't find operand. Invalid use-def chain.");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  349|  3.68M|}
_ZN6hermes10BasicBlock5eraseEPNS_11InstructionE:
  388|  1.01M|void BasicBlock::erase(Instruction *I) {
  389|  1.01M|  InstList.erase(I);
  390|  1.01M|}
_ZN6hermes11Instruction15eraseFromParentEv:
  395|  1.01M|void Instruction::eraseFromParent() {
  396|       |  // Release this instruction from the use-list of other instructions.
  397|  2.87M|  for (unsigned i = 0; i < getNumOperands(); i++)
  ------------------
  |  Branch (397:24): [True: 1.85M, False: 1.01M]
  ------------------
  398|  1.85M|    setOperand(nullptr, i);
  399|       |
  400|  1.01M|  getParent()->erase(this);
  401|  1.01M|}
_ZN6hermes11Instruction18getChangedOperandsEv:
  435|   723k|WordBitSet<> Instruction::getChangedOperands() {
  436|   723k|  switch (getKind()) {
  437|      0|    default:
  ------------------
  |  Branch (437:5): [True: 0, False: 723k]
  ------------------
  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|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   27|       |
  |  |   28|      0|MARK_FIRST(ScopeCreationInst)
  |  |   29|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   30|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   31|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   32|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   33|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   34|      0|#endif
  |  |   35|      0|MARK_FIRST(NestedScopeCreationInst)
  |  |   36|      0|DEF_VALUE(NestedScopeCreationInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   37|      0|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   38|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   39|      0|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   40|      0|#endif
  |  |   41|      0|MARK_LAST(NestedScopeCreationInst)
  |  |   42|      0|MARK_LAST(ScopeCreationInst)
  |  |   43|       |
  |  |   44|      0|MARK_FIRST(SingleOperandInst)
  |  |   45|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   46|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   47|    492|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|    492|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 492, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|    492|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   48|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   49|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   50|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   52|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   53|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   54|  3.53k|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|  3.53k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 3.53k, False: 720k]
  |  |  |  |  ------------------
  |  |  |  |  442|  3.53k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   55|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   56|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   57|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   58|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   59|     13|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|     13|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 13, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|     13|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   60|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   61|      0|#endif
  |  |   62|      0|MARK_LAST(SingleOperandInst)
  |  |   63|       |
  |  |   64|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   65|   200k|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|   200k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 200k, False: 523k]
  |  |  |  |  ------------------
  |  |  |  |  442|   200k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   66|      0|MARK_FIRST(StorePropertyInst)
  |  |   67|    277|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|    277|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 277, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|    277|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   68|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   69|      0|MARK_LAST(StorePropertyInst)
  |  |   70|       |
  |  |   71|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |   72|     24|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|     24|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 24, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|     24|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   73|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   74|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |   75|       |
  |  |   76|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   77|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   78|      0|MARK_FIRST(LoadPropertyInst)
  |  |   79|  39.7k|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|  39.7k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 39.7k, False: 683k]
  |  |  |  |  ------------------
  |  |  |  |  442|  39.7k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   80|   277k|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  ------------------
  |  |  |  |  441|   277k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 277k, False: 445k]
  |  |  |  |  ------------------
  |  |  |  |  442|   277k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   81|      0|MARK_LAST(LoadPropertyInst)
  |  |   82|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   83|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   84|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   85|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   86|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   87|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   88|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   89|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   90|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   91|      0|DEF_VALUE(DirectEvalInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   92|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   93|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   94|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   95|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   96|  22.3k|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|  22.3k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 22.3k, False: 701k]
  |  |  |  |  ------------------
  |  |  |  |  442|  22.3k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   97|  40.5k|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|  40.5k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 40.5k, False: 683k]
  |  |  |  |  ------------------
  |  |  |  |  442|  40.5k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   98|  42.6k|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|  42.6k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 42.6k, False: 680k]
  |  |  |  |  ------------------
  |  |  |  |  442|  42.6k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   99|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  100|      2|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      2|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 2, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      2|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  101|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  102|      0|#endif
  |  |  103|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  104|       |
  |  |  105|      0|MARK_FIRST(CreateFunctionInst)
  |  |  106|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  107|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  108|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  109|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  110|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  111|      0|#endif
  |  |  112|      0|MARK_LAST(CreateFunctionInst)
  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  115|       |#endif
  |  |  116|       |
  |  |  117|      0|MARK_FIRST(TerminatorInst)
  |  |  118|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  119|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|     12|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|     12|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 12, False: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|     12|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|  19.5k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|  19.5k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 19.5k, False: 704k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|  19.5k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  122|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|  73.5k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|  73.5k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 73.5k, False: 650k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|  73.5k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  124|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  125|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  127|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  128|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  130|      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: 723k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  132|       |
  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  134|  2.62k|DEF_VALUE(CallInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|  2.62k|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 2.62k, False: 720k]
  |  |  |  |  ------------------
  |  |  |  |  442|  2.62k|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  141|      0|#endif
  |  |  142|      0|MARK_LAST(CallInst)
  |  |  143|       |
  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  147|       |
  |  |  148|       |// These are target dependent instructions:
  |  |  149|       |
  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 723k]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  158|      0|#endif
  |  |  159|       |
  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  161|       |
  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  163|       |// these macros are still used after the #include.
  |  |  164|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  165|      0|#undef DEF_VALUE
  |  |  166|      0|#undef MARK_FIRST
  |  |  167|      0|#undef MARK_LAST
  |  |  168|      0|#undef TERMINATOR
  |  |  169|      0|#endif
  ------------------
  445|   723k|  }
  446|   723k|}
_ZN6hermes9ParameterC2EPNS_8FunctionENS_10IdentifierEb:
  449|   206k|    : Value(ValueKind::ParameterKind), Parent(parent), Name(name) {
  450|   206k|  assert(Parent && "Invalid parent");
  451|   206k|  if (isThisParameter) {
  ------------------
  |  Branch (451:7): [True: 103k, False: 103k]
  ------------------
  452|   103k|    Parent->setThisParameter(this);
  453|   103k|  } else {
  454|   103k|    Parent->addParameter(this);
  455|   103k|  }
  456|   206k|}
_ZN6hermes8VariableC2ENS_9ValueKindEPNS_9ScopeDescENS_18JavaScriptDeclKindENS_10IdentifierE:
  463|   103k|    : Value(k),
  464|   103k|      declKind(declKind),
  465|   103k|      text(txt),
  466|   103k|      parent(scope),
  467|   103k|      strictImmutableBinding_(declKind == DeclKind::Const) {
  468|   103k|  scope->addVariable(this);
  469|   103k|}
_ZN6hermes8VariableD2Ev:
  471|   103k|Variable::~Variable() {}
_ZNK6hermes8Variable22getIndexInVariableListEv:
  473|   104k|int Variable::getIndexInVariableList() const {
  474|   104k|  int index = 0;
  475|   104k|  for (auto V : parent->getVariables()) {
  ------------------
  |  Branch (475:15): [True: 104k, False: 0]
  ------------------
  476|   104k|    if (V == this)
  ------------------
  |  Branch (476:9): [True: 104k, False: 9]
  ------------------
  477|   104k|      return index;
  478|      9|    index++;
  479|      9|  }
  480|      0|  llvm_unreachable("Cannot find variable in the variable list");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  481|   104k|}
_ZN6hermes10BasicBlock13getTerminatorEv:
  498|  9.20M|TerminatorInst *BasicBlock::getTerminator() {
  499|  9.20M|  if (InstList.empty())
  ------------------
  |  Branch (499:7): [True: 0, False: 9.20M]
  ------------------
  500|      0|    return nullptr;
  501|  9.20M|  return llvh::dyn_cast<TerminatorInst>(&InstList.back());
  502|  9.20M|}
_ZNK6hermes10BasicBlock13getTerminatorEv:
  504|  1.48M|const TerminatorInst *BasicBlock::getTerminator() const {
  505|  1.48M|  if (InstList.empty())
  ------------------
  |  Branch (505:7): [True: 0, False: 1.48M]
  ------------------
  506|      0|    return nullptr;
  507|  1.48M|  return llvh::dyn_cast<TerminatorInst>(&InstList.back());
  508|  1.48M|}
_ZN6hermes10BasicBlock15eraseFromParentEv:
  514|  2.09k|void BasicBlock::eraseFromParent() {
  515|       |  // Erase all of the instructions in the block before deleting the block.
  516|       |  // We are starting to delete from the start of the block. Naturally we will
  517|       |  // have forward dependencies between instructions. To allow safe deletion
  518|       |  // we replace all uses with the invalid null value. setOperand knows how
  519|       |  // to deal with null values.
  520|  2.09k|  while (begin() != end()) {
  ------------------
  |  Branch (520:10): [True: 0, False: 2.09k]
  ------------------
  521|      0|    begin()->replaceAllUsesWith(nullptr);
  522|      0|    begin()->eraseFromParent();
  523|      0|  }
  524|       |
  525|  2.09k|  assert(!hasUsers() && "Use list is not empty");
  526|       |  // Erase the block itself:
  527|  2.09k|  getParent()->getBasicBlockList().erase(getIterator());
  528|  2.09k|}
_ZNK6hermes8Function10getContextEv:
  530|  19.9M|Context &Function::getContext() const {
  531|  19.9M|  return parent_->getContext();
  532|  19.9M|}
_ZN6hermes8Function8addBlockEPNS_10BasicBlockE:
  534|   845k|void Function::addBlock(BasicBlock *BB) {
  535|   845k|  BasicBlockList.push_back(BB);
  536|   845k|}
_ZN6hermes8Function12addParameterEPNS_9ParameterE:
  537|   103k|void Function::addParameter(Parameter *A) {
  538|   103k|  Parameters.push_back(A);
  539|   103k|}
_ZN6hermes6ModuleD2Ev:
  541|    196|Module::~Module() {
  542|    196|  FunctionList.clear();
  543|       |
  544|       |  // Free global properties.
  545|    196|  globalPropertyMap_.clear();
  546|  9.38k|  for (auto *prop : globalPropertyList_) {
  ------------------
  |  Branch (546:19): [True: 9.38k, False: 196]
  ------------------
  547|  9.38k|    Value::destroy(prop);
  548|  9.38k|  }
  549|       |
  550|    196|  llvh::SmallVector<Literal *, 32> toDelete;
  551|       |
  552|       |  // Collect all literals.
  553|       |  // Note that we cannot delete while iterating due to the implementation
  554|       |  // of FoldingSet.
  555|   827k|  for (auto &L : literalNumbers) {
  ------------------
  |  Branch (555:16): [True: 827k, False: 196]
  ------------------
  556|   827k|    toDelete.push_back(&L);
  557|   827k|  }
  558|    196|  for (auto &L : literalBigInts) {
  ------------------
  |  Branch (558:16): [True: 5, False: 196]
  ------------------
  559|      5|    toDelete.push_back(&L);
  560|      5|  }
  561|  11.4k|  for (auto &L : literalStrings) {
  ------------------
  |  Branch (561:16): [True: 11.4k, False: 196]
  ------------------
  562|  11.4k|    toDelete.push_back(&L);
  563|  11.4k|  }
  564|       |  // Free the literals.
  565|   839k|  for (auto *L : toDelete) {
  ------------------
  |  Branch (565:16): [True: 839k, False: 196]
  ------------------
  566|   839k|    Value::destroy(L);
  567|   839k|  }
  568|    196|}
_ZN6hermes6Module9push_backEPNS_8FunctionE:
  570|   103k|void Module::push_back(Function *F) {
  571|   103k|  FunctionList.push_back(F);
  572|   103k|}
_ZN6hermes6Module17addGlobalPropertyENS_10IdentifierEb:
  585|  9.38k|    bool declared) {
  586|  9.38k|  auto &ref = globalPropertyMap_[name];
  587|       |
  588|  9.38k|  if (!ref) {
  ------------------
  |  Branch (588:7): [True: 9.38k, False: 0]
  ------------------
  589|  9.38k|    ref = new GlobalObjectProperty(this, getLiteralString(name), declared);
  590|  9.38k|    globalPropertyList_.push_back(ref);
  591|  9.38k|  } else {
  592|      0|    ref->orDeclared(declared);
  593|      0|  }
  594|       |
  595|  9.38k|  return ref;
  596|  9.38k|}
_ZN6hermes6Module19getTemplateObjectIDEONSt3__16vectorIPNS_13LiteralStringENS1_9allocatorIS4_EEEE:
  654|  2.82k|uint32_t Module::getTemplateObjectID(RawStringList &&rawStrings) {
  655|       |  // Try inserting into the map with a dummy value.
  656|  2.82k|  auto res = templateObjectIDMap_.emplace(std::move(rawStrings), 0);
  657|  2.82k|  if (res.second) {
  ------------------
  |  Branch (657:7): [True: 197, False: 2.62k]
  ------------------
  658|       |    // Insertion succeeded. Overwrite the value with the correct id.
  659|    197|    res.first->second = templateObjectIDMap_.size() - 1;
  660|    197|  }
  661|  2.82k|  return res.first->second;
  662|  2.82k|}
_ZNK6hermes11Instruction10getContextEv:
  664|  4.18M|Context &Instruction::getContext() const {
  665|  4.18M|  return Parent->getContext();
  666|  4.18M|}
_ZNK6hermes10BasicBlock10getContextEv:
  667|  4.18M|Context &BasicBlock::getContext() const {
  668|  4.18M|  return Parent->getContext();
  669|  4.18M|}
_ZN6hermes6Module24deriveUniqueInternalNameENS_10IdentifierE:
  723|   103k|Identifier Module::deriveUniqueInternalName(Identifier originalName) {
  724|   103k|  assert(originalName.isValid() && "originalName must be valid");
  725|       |
  726|       |  // Check whether the original name already is in the form "... number#" and
  727|       |  // if so, strip the suffix.
  728|   103k|  originalName = stripInternalNameSuffix(getContext(), originalName);
  729|       |
  730|   103k|  auto insertResult = internalNamesMap_.try_emplace(originalName, 0);
  731|       |
  732|       |  // If inserted for the first time, there is no need for a suffix.
  733|   103k|  if (insertResult.second)
  ------------------
  |  Branch (733:7): [True: 290, False: 103k]
  ------------------
  734|    290|    return originalName;
  735|       |
  736|       |  // Construct a suffix using the number of internal names derived from this
  737|       |  // identifier.
  738|   103k|  ++insertResult.first->second;
  739|   103k|  char itoaBuf[16];
  740|   103k|  snprintf(itoaBuf, sizeof(itoaBuf), "%u", insertResult.first->second);
  741|       |
  742|   103k|  llvh::SmallString<32> buf;
  743|   103k|  buf.append(originalName.str());
  744|   103k|  buf.append(" ");
  745|   103k|  buf.append(itoaBuf);
  746|   103k|  buf.append("#");
  747|       |
  748|   103k|  return getContext().getIdentifier(buf);
  749|   103k|}
_ZN6hermes6Module16getLiteralNumberEd:
  762|  2.52M|LiteralNumber *Module::getLiteralNumber(double value) {
  763|       |  // Check to see if we've already seen this tuple before.
  764|  2.52M|  llvh::FoldingSetNodeID ID;
  765|       |
  766|  2.52M|  LiteralNumber::Profile(ID, value);
  767|       |
  768|       |  // If this is not the first time we see this tuple then return the old copy.
  769|  2.52M|  void *InsertPos = nullptr;
  770|  2.52M|  if (LiteralNumber *LN = literalNumbers.FindNodeOrInsertPos(ID, InsertPos))
  ------------------
  |  Branch (770:22): [True: 1.70M, False: 827k]
  ------------------
  771|  1.70M|    return LN;
  772|       |
  773|   827k|  auto New = new LiteralNumber(value);
  774|   827k|  literalNumbers.InsertNode(New, InsertPos);
  775|   827k|  return New;
  776|  2.52M|}
_ZN6hermes6Module16getLiteralBigIntEPNS_12UniqueStringE:
  778|      5|LiteralBigInt *Module::getLiteralBigInt(UniqueString *value) {
  779|       |  // Check to see if we've already seen this tuple before.
  780|      5|  llvh::FoldingSetNodeID ID;
  781|       |
  782|      5|  LiteralBigInt::Profile(ID, value);
  783|       |
  784|       |  // If this is not the first time we see this tuple then return the old copy.
  785|      5|  void *InsertPos = nullptr;
  786|      5|  if (LiteralBigInt *LN = literalBigInts.FindNodeOrInsertPos(ID, InsertPos))
  ------------------
  |  Branch (786:22): [True: 0, False: 5]
  ------------------
  787|      0|    return LN;
  788|       |
  789|      5|  auto New = new LiteralBigInt(value);
  790|      5|  literalBigInts.InsertNode(New, InsertPos);
  791|      5|  return New;
  792|      5|}
_ZN6hermes6Module16getLiteralStringENS_10IdentifierE:
  794|   905k|LiteralString *Module::getLiteralString(Identifier value) {
  795|       |  // Check to see if we've already seen this tuple before.
  796|   905k|  llvh::FoldingSetNodeID ID;
  797|       |
  798|   905k|  LiteralString::Profile(ID, value);
  799|       |
  800|       |  // If this is not the first time we see this tuple then return the old copy.
  801|   905k|  void *InsertPos = nullptr;
  802|   905k|  if (LiteralString *LS = literalStrings.FindNodeOrInsertPos(ID, InsertPos))
  ------------------
  |  Branch (802:22): [True: 893k, False: 11.4k]
  ------------------
  803|   893k|    return LS;
  804|       |
  805|  11.4k|  auto New = new LiteralString(value);
  806|  11.4k|  literalStrings.InsertNode(New, InsertPos);
  807|  11.4k|  return New;
  808|   905k|}
_ZN6hermes6Module14getLiteralBoolEb:
  810|   875k|LiteralBool *Module::getLiteralBool(bool value) {
  811|   875k|  if (value)
  ------------------
  |  Branch (811:7): [True: 852k, False: 22.5k]
  ------------------
  812|   852k|    return &literalTrue;
  813|  22.5k|  return &literalFalse;
  814|   875k|}
IR.cpp:_ZL23stripInternalNameSuffixRN6hermes7ContextENS_10IdentifierE:
  702|   103k|    Identifier originalName) {
  703|   103k|  auto originalStr = originalName.str();
  704|   103k|  auto e = originalStr.end();
  705|       |
  706|   103k|  if (!(e - originalStr.begin() >= 3 && e[-1] == '#' && e[-2] >= '0' &&
  ------------------
  |  Branch (706:9): [True: 196, False: 103k]
  |  Branch (706:41): [True: 0, False: 196]
  |  Branch (706:57): [True: 0, False: 0]
  ------------------
  707|   103k|        e[-2] <= '9')) {
  ------------------
  |  Branch (707:9): [True: 0, False: 0]
  ------------------
  708|   103k|    return originalName;
  709|   103k|  }
  710|       |
  711|      0|  e -= 2;
  712|      0|  while (e != originalStr.begin() && e[-1] >= '0' && e[-1] <= '9') {
  ------------------
  |  Branch (712:10): [True: 0, False: 0]
  |  Branch (712:38): [True: 0, False: 0]
  |  Branch (712:54): [True: 0, False: 0]
  ------------------
  713|      0|    --e;
  714|      0|  }
  715|       |
  716|      0|  if (!(e != originalStr.begin() && e[-1] == ' '))
  ------------------
  |  Branch (716:9): [True: 0, False: 0]
  |  Branch (716:37): [True: 0, False: 0]
  ------------------
  717|      0|    return originalName;
  718|       |
  719|      0|  --e;
  720|      0|  return context.getIdentifier(originalStr.slice(0, e - originalStr.begin()));
  721|      0|}

_ZN6hermes9IRBuilder16createBasicBlockEPNS_8FunctionE:
   17|   845k|BasicBlock *IRBuilder::createBasicBlock(Function *Parent) {
   18|   845k|  assert(Parent && "Invalid insertion point");
   19|   845k|  return new BasicBlock(Parent);
   20|   845k|}
_ZN6hermes9IRBuilder14createFunctionEPNS_9ScopeDescENS_10IdentifierENS_8Function14DefinitionKindEbNS_16SourceVisibilityEN4llvh7SMRangeEbPS4_:
   30|   103k|    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|   103k|  if (!OriginalName.isValid()) {
  ------------------
  |  Branch (34:7): [True: 100k, False: 2.52k]
  ------------------
   35|   100k|    OriginalName = createIdentifier("");
   36|   100k|  }
   37|   103k|  return new Function(
   38|   103k|      M,
   39|   103k|      scopeDesc,
   40|   103k|      OriginalName,
   41|   103k|      definitionKind,
   42|   103k|      strictMode,
   43|   103k|      sourceVisibility,
   44|   103k|      isGlobal,
   45|   103k|      sourceRange,
   46|   103k|      insertBefore);
   47|   103k|}
_ZN6hermes9IRBuilder22createTopLevelFunctionEPNS_9ScopeDescEbNS_16SourceVisibilityEN4llvh7SMRangeE:
  101|    196|    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|    196|  return createFunction(
  105|    196|      scopeDesc,
  106|    196|      "global",
  107|    196|      Function::DefinitionKind::ES5Function,
  108|    196|      strictMode,
  109|    196|      sourceVisibility,
  110|    196|      sourceRange,
  111|    196|      true);
  112|    196|}
_ZN6hermes9IRBuilder14createFunctionEPNS_9ScopeDescEN4llvh9StringRefENS_8Function14DefinitionKindEbNS_16SourceVisibilityENS3_7SMRangeEbPS5_:
  122|    196|    Function *insertBefore) {
  123|    196|  Identifier OrigIden =
  124|    196|      OriginalName.empty() ? Identifier{} : createIdentifier(OriginalName);
  ------------------
  |  Branch (124:7): [True: 0, False: 196]
  ------------------
  125|    196|  return createFunction(
  126|    196|      scopeDesc,
  127|    196|      OrigIden,
  128|    196|      definitionKind,
  129|    196|      strictMode,
  130|    196|      sourceVisibility,
  131|    196|      sourceRange,
  132|    196|      isGlobal,
  133|    196|      insertBefore);
  134|    196|}
_ZN6hermes9IRBuilder26createGlobalObjectPropertyENS_10IdentifierEb:
  163|  9.38k|    bool declared) {
  164|  9.38k|  return M->addGlobalProperty(name, declared);
  165|  9.38k|}
_ZN6hermes9IRBuilder15createParameterEPNS_8FunctionENS_10IdentifierE:
  173|   103k|Parameter *IRBuilder::createParameter(Function *Parent, Identifier Name) {
  174|   103k|  return new Parameter(Parent, Name, false);
  175|   103k|}
_ZN6hermes9IRBuilder19createThisParameterEPNS_8FunctionE:
  181|   103k|Parameter *IRBuilder::createThisParameter(Function *Parent) {
  182|   103k|  return new Parameter(Parent, createIdentifier("this"), true);
  183|   103k|}
_ZN6hermes9IRBuilder14createVariableEPNS_9ScopeDescENS_18JavaScriptDeclKindENS_10IdentifierE:
  188|   103k|    Identifier Name) {
  189|   103k|  return new Variable(Parent, declKind, Name);
  190|   103k|}
_ZN6hermes9IRBuilder16getLiteralNumberEd:
  199|  2.52M|LiteralNumber *IRBuilder::getLiteralNumber(double value) {
  200|  2.52M|  return M->getLiteralNumber(value);
  201|  2.52M|}
_ZN6hermes9IRBuilder16getLiteralBigIntEPNS_12UniqueStringE:
  216|      5|LiteralBigInt *IRBuilder::getLiteralBigInt(UniqueString *value) {
  217|      5|  return M->getLiteralBigInt(value);
  218|      5|}
_ZN6hermes9IRBuilder16getLiteralStringEN4llvh9StringRefE:
  220|   852k|LiteralString *IRBuilder::getLiteralString(llvh::StringRef value) {
  221|   852k|  Identifier Iden = createIdentifier(value);
  222|   852k|  return getLiteralString(Iden);
  223|   852k|}
_ZN6hermes9IRBuilder16getLiteralStringENS_10IdentifierE:
  225|   895k|LiteralString *IRBuilder::getLiteralString(Identifier value) {
  226|   895k|  return M->getLiteralString(value);
  227|   895k|}
_ZN6hermes9IRBuilder14getLiteralBoolEb:
  229|   875k|LiteralBool *IRBuilder::getLiteralBool(bool value) {
  230|   875k|  return M->getLiteralBool(value);
  231|   875k|}
_ZN6hermes9IRBuilder15getLiteralEmptyEv:
  233|   103k|LiteralEmpty *IRBuilder::getLiteralEmpty() {
  234|   103k|  return M->getLiteralEmpty();
  235|   103k|}
_ZN6hermes9IRBuilder19getLiteralUndefinedEv:
  237|   304k|LiteralUndefined *IRBuilder::getLiteralUndefined() {
  238|   304k|  return M->getLiteralUndefined();
  239|   304k|}
_ZN6hermes9IRBuilder14getLiteralNullEv:
  241|    949|LiteralNull *IRBuilder::getLiteralNull() {
  242|    949|  return M->getLiteralNull();
  243|    949|}
_ZN6hermes9IRBuilder15getGlobalObjectEv:
  245|   503k|GlobalObject *IRBuilder::getGlobalObject() {
  246|   503k|  return M->getGlobalObject();
  247|   503k|}
_ZN6hermes9IRBuilder16getEmptySentinelEv:
  249|      2|EmptySentinel *IRBuilder::getEmptySentinel() {
  250|      2|  return M->getEmptySentinel();
  251|      2|}
_ZN6hermes9IRBuilder16createIdentifierEN4llvh9StringRefE:
  253|  1.05M|Identifier IRBuilder::createIdentifier(llvh::StringRef str) {
  254|  1.05M|  return M->getContext().getIdentifier(str);
  255|  1.05M|}
_ZN6hermes9IRBuilder16createBranchInstEPNS_10BasicBlockE:
  257|   484k|BranchInst *IRBuilder::createBranchInst(BasicBlock *Destination) {
  258|   484k|  auto *BI = new BranchInst(getInsertionBlock(), Destination);
  259|   484k|  insert(BI);
  260|   484k|  return BI;
  261|   484k|}
_ZN6hermes9IRBuilder20createCondBranchInstEPNS_5ValueEPNS_10BasicBlockES4_:
  264|  91.9k|IRBuilder::createCondBranchInst(Value *Cond, BasicBlock *T, BasicBlock *F) {
  265|  91.9k|  auto *CBI = new CondBranchInst(getInsertionBlock(), Cond, T, F);
  266|  91.9k|  insert(CBI);
  267|  91.9k|  return CBI;
  268|  91.9k|}
_ZN6hermes9IRBuilder16createReturnInstEPNS_5ValueE:
  270|   206k|ReturnInst *IRBuilder::createReturnInst(Value *Val) {
  271|   206k|  auto *RI = new ReturnInst(Val);
  272|   206k|  insert(RI);
  273|   206k|  return RI;
  274|   206k|}
_ZN6hermes9IRBuilder15createCatchInstEv:
  276|  40.6k|CatchInst *IRBuilder::createCatchInst() {
  277|  40.6k|  auto *CI = new CatchInst();
  278|  40.6k|  insert(CI);
  279|  40.6k|  return CI;
  280|  40.6k|}
_ZN6hermes9IRBuilder15createThrowInstEPNS_5ValueE:
  282|  20.3k|ThrowInst *IRBuilder::createThrowInst(Value *thrownValue) {
  283|  20.3k|  auto *TI = new ThrowInst(thrownValue);
  284|  20.3k|  insert(TI);
  285|  20.3k|  return TI;
  286|  20.3k|}
_ZN6hermes9IRBuilder18createTryStartInstEPNS_10BasicBlockES2_:
  301|  40.6k|    BasicBlock *catchTargetBlock) {
  302|  40.6k|  auto *I = new TryStartInst(tryBodyBlock, catchTargetBlock);
  303|  40.6k|  insert(I);
  304|  40.6k|  return I;
  305|  40.6k|}
_ZN6hermes9IRBuilder16createTryEndInstEv:
  307|  40.6k|TryEndInst *IRBuilder::createTryEndInst() {
  308|  40.6k|  auto *I = new TryEndInst();
  309|  40.6k|  insert(I);
  310|  40.6k|  return I;
  311|  40.6k|}
_ZN6hermes9IRBuilder20createAllocStackInstEN4llvh9StringRefE:
  313|     13|AllocStackInst *IRBuilder::createAllocStackInst(llvh::StringRef varName) {
  314|     13|  Identifier Iden = createIdentifier(varName);
  315|     13|  return createAllocStackInst(Iden);
  316|     13|}
_ZN6hermes9IRBuilder20createAllocStackInstENS_10IdentifierE:
  318|   136k|AllocStackInst *IRBuilder::createAllocStackInst(Identifier varName) {
  319|   136k|  auto *AHI = new AllocStackInst(varName);
  320|   136k|  insert(AHI);
  321|   136k|  return AHI;
  322|   136k|}
_ZN6hermes9IRBuilder18createAsNumberInstEPNS_5ValueE:
  324|    509|AsNumberInst *IRBuilder::createAsNumberInst(Value *val) {
  325|    509|  auto *ANI = new AsNumberInst(val);
  326|    509|  insert(ANI);
  327|    509|  return ANI;
  328|    509|}
_ZN6hermes9IRBuilder21createCreateScopeInstEPNS_9ScopeDescE:
  357|   103k|CreateScopeInst *IRBuilder::createCreateScopeInst(ScopeDesc *scopeDesc) {
  358|   103k|  auto CII = new CreateScopeInst(scopeDesc);
  359|   103k|  insert(CII);
  360|   103k|  return CII;
  361|   103k|}
_ZN6hermes9IRBuilder24createCreateFunctionInstEPNS_8FunctionEPNS_17ScopeCreationInstE:
  373|   103k|    ScopeCreationInst *environment) {
  374|   103k|  auto CFI = new CreateFunctionInst(code, environment);
  375|   103k|  insert(CFI);
  376|   103k|  return CFI;
  377|   103k|}
_ZN6hermes9IRBuilder19createLoadFrameInstEPNS_8VariableEPNS_17ScopeCreationInstE:
  381|      4|    ScopeCreationInst *scope) {
  382|      4|  auto LI = new LoadFrameInst(ptr, scope);
  383|      4|  insert(LI);
  384|      4|  return LI;
  385|      4|}
_ZN6hermes9IRBuilder19createLoadStackInstEPNS_14AllocStackInstE:
  387|   128k|LoadStackInst *IRBuilder::createLoadStackInst(AllocStackInst *ptr) {
  388|   128k|  auto LI = new LoadStackInst(ptr);
  389|   128k|  insert(LI);
  390|   128k|  return LI;
  391|   128k|}
_ZN6hermes9IRBuilder20createStoreFrameInstEPNS_5ValueEPNS_8VariableEPNS_17ScopeCreationInstE:
  396|   104k|    ScopeCreationInst *scope) {
  397|   104k|  auto SI = new StoreFrameInst(storedValue, ptr, scope);
  398|   104k|  insert(SI);
  399|   104k|  return SI;
  400|   104k|}
_ZN6hermes9IRBuilder20createStoreStackInstEPNS_5ValueEPNS_14AllocStackInstE:
  404|   576k|    AllocStackInst *ptr) {
  405|   576k|  auto SI = new StoreStackInst(storedValue, ptr);
  406|   576k|  insert(SI);
  407|   576k|  return SI;
  408|   576k|}
_ZN6hermes9IRBuilder14createCallInstEPNS_13LiteralStringEPNS_5ValueES4_N4llvh8ArrayRefIS4_EE:
  414|  2.84k|    ArrayRef<Value *> args) {
  415|  2.84k|  LiteralUndefined *newTarget = getLiteralUndefined();
  416|  2.84k|  auto CI = new CallInst(textifiedCallee, callee, newTarget, thisValue, args);
  417|  2.84k|  insert(CI);
  418|  2.84k|  return CI;
  419|  2.84k|}
_ZN6hermes9IRBuilder19createConstructInstEPNS_5ValueES2_N4llvh8ArrayRefIS2_EE:
  436|  25.0k|    ArrayRef<Value *> args) {
  437|  25.0k|  LiteralUndefined *thisValue = getLiteralUndefined();
  438|  25.0k|  auto *inst = new ConstructInst(constructor, newTarget, thisValue, args);
  439|  25.0k|  insert(inst);
  440|  25.0k|  return inst;
  441|  25.0k|}
_ZN6hermes9IRBuilder22createLoadPropertyInstEPNS_5ValueES2_:
  445|  68.4k|    Value *property) {
  446|  68.4k|  auto LPI = new LoadPropertyInst(object, property);
  447|  68.4k|  insert(LPI);
  448|  68.4k|  return LPI;
  449|  68.4k|}
_ZN6hermes9IRBuilder31createTryLoadGlobalPropertyInstEPNS_13LiteralStringE:
  452|   501k|    LiteralString *property) {
  453|   501k|  auto *inst = new TryLoadGlobalPropertyInst(getGlobalObject(), property);
  454|   501k|  insert(inst);
  455|   501k|  return inst;
  456|   501k|}
_ZN6hermes9IRBuilder31createTryLoadGlobalPropertyInstEPNS_20GlobalObjectPropertyE:
  459|   501k|    GlobalObjectProperty *property) {
  460|   501k|  return createTryLoadGlobalPropertyInst(property->getName());
  461|   501k|}
_ZN6hermes9IRBuilder23createStorePropertyInstEPNS_5ValueES2_S2_:
  474|  1.32k|    Value *property) {
  475|  1.32k|  auto SPI = new StorePropertyInst(storedValue, object, property);
  476|  1.32k|  insert(SPI);
  477|  1.32k|  return SPI;
  478|  1.32k|}
_ZN6hermes9IRBuilder26createStoreOwnPropertyInstEPNS_5ValueES2_S2_NS0_14PropEnumerableE:
  497|   826k|    PropEnumerable isEnumerable) {
  498|   826k|  auto SPI = new StoreOwnPropertyInst(
  499|   826k|      storedValue,
  500|   826k|      object,
  501|   826k|      property,
  502|   826k|      getLiteralBool(isEnumerable == PropEnumerable::Yes));
  503|   826k|  insert(SPI);
  504|   826k|  return SPI;
  505|   826k|}
_ZN6hermes9IRBuilder29createStoreNewOwnPropertyInstEPNS_5ValueES2_PNS_7LiteralENS0_14PropEnumerableE:
  510|      1|    PropEnumerable isEnumerable) {
  511|      1|  auto *inst = new StoreNewOwnPropertyInst(
  512|      1|      storedValue,
  513|      1|      object,
  514|      1|      property,
  515|      1|      getLiteralBool(isEnumerable == PropEnumerable::Yes));
  516|      1|  insert(inst);
  517|      1|  return inst;
  518|      1|}
_ZN6hermes9IRBuilder23createStorePropertyInstEPNS_5ValueES2_N4llvh9StringRefE:
  558|      1|    llvh::StringRef property) {
  559|      1|  Identifier Iden = createIdentifier(property);
  560|      1|  return createStorePropertyInst(storedValue, object, Iden);
  561|      1|}
_ZN6hermes9IRBuilder23createStorePropertyInstEPNS_5ValueES2_NS_10IdentifierE:
  588|      1|    Identifier property) {
  589|      1|  auto L = getLiteralString(property);
  590|      1|  return createStorePropertyInst(storedValue, object, L);
  591|      1|}
_ZN6hermes9IRBuilder21createAllocObjectInstEjPNS_5ValueE:
  604|      2|    Value *parent) {
  605|      2|  auto AOI = new AllocObjectInst(
  606|      2|      M->getLiteralNumber(size), parent ? parent : getEmptySentinel());
  ------------------
  |  Branch (606:34): [True: 0, False: 2]
  ------------------
  607|      2|  insert(AOI);
  608|      2|  return AOI;
  609|      2|}
_ZN6hermes9IRBuilder20createAllocArrayInstEPNS_13LiteralNumberEN4llvh11SmallVectorIPNS_5ValueELj4EEE:
  613|    101|    AllocArrayInst::ArrayValueList val_list) {
  614|    101|  auto AAI = new AllocArrayInst(val_list, sizeHint);
  615|    101|  insert(AAI);
  616|    101|  return AAI;
  617|    101|}
_ZN6hermes9IRBuilder20createAllocArrayInstEN4llvh11SmallVectorIPNS_5ValueELj4EEEj:
  621|    101|    unsigned sizeHint) {
  622|    101|  return createAllocArrayInst(this->getLiteralNumber(sizeHint), val_list);
  623|    101|}
_ZN6hermes9IRBuilder25createCreateArgumentsInstEv:
  625|   103k|CreateArgumentsInst *IRBuilder::createCreateArgumentsInst() {
  626|   103k|  auto CAI = new CreateArgumentsInst();
  627|   103k|  insert(CAI);
  628|   103k|  return CAI;
  629|   103k|}
_ZN6hermes9IRBuilder22createGetNewTargetInstEv:
  631|      9|GetNewTargetInst *IRBuilder::createGetNewTargetInst() {
  632|      9|  auto *inst = new GetNewTargetInst();
  633|      9|  insert(inst);
  634|      9|  return inst;
  635|      9|}
_ZN6hermes9IRBuilder28createHBCGetGlobalObjectInstEv:
  643|   503k|HBCGetGlobalObjectInst *IRBuilder::createHBCGetGlobalObjectInst() {
  644|   503k|  auto inst = new HBCGetGlobalObjectInst();
  645|   503k|  insert(inst);
  646|   503k|  return inst;
  647|   503k|}
_ZN6hermes9IRBuilder16createRegExpInstENS_10IdentifierES1_:
  651|    119|    Identifier flags) {
  652|    119|  auto res =
  653|    119|      new CreateRegExpInst(getLiteralString(pattern), getLiteralString(flags));
  654|    119|  insert(res);
  655|    119|  return res;
  656|    119|}
_ZN6hermes9IRBuilder23createUnaryOperatorInstEPNS_5ValueENS_17UnaryOperatorInst6OpKindE:
  660|  25.3k|    UnaryOperatorInst::OpKind opKind) {
  661|  25.3k|  auto UOI = new UnaryOperatorInst(value, opKind);
  662|  25.3k|  insert(UOI);
  663|  25.3k|  return UOI;
  664|  25.3k|}
_ZN6hermes9IRBuilder24createBinaryOperatorInstEPNS_5ValueES2_NS_18BinaryOperatorInst6OpKindE:
  669|   157k|    BinaryOperatorInst::OpKind opKind) {
  670|   157k|  auto BOI = new BinaryOperatorInst(left, right, opKind);
  671|   157k|  insert(BOI);
  672|   157k|  return BOI;
  673|   157k|}
_ZN6hermes9IRBuilder13createPhiInstERKN4llvh11SmallVectorIPNS_5ValueELj8EEERKNS2_IPNS_10BasicBlockELj8EEE:
  694|  4.39k|    const PhiInst::BasicBlockListType &blocks) {
  695|  4.39k|  auto PI = new PhiInst(values, blocks);
  696|  4.39k|  insert(PI);
  697|  4.39k|  return PI;
  698|  4.39k|}
_ZN6hermes9IRBuilder19createGetPNamesInstEPNS_5ValueES2_S2_S2_PNS_10BasicBlockES4_:
  706|     15|    BasicBlock *onSome) {
  707|     15|  auto GP = new GetPNamesInst(
  708|     15|      getInsertionBlock(),
  709|     15|      iteratorAddr,
  710|     15|      baseAddr,
  711|     15|      indexAddr,
  712|     15|      sizeAddr,
  713|     15|      onEmpty,
  714|     15|      onSome);
  715|     15|  insert(GP);
  716|     15|  return GP;
  717|     15|}
_ZN6hermes9IRBuilder22createGetNextPNameInstEPNS_5ValueES2_S2_S2_S2_PNS_10BasicBlockES4_:
  726|     15|    BasicBlock *onSome) {
  727|     15|  auto GNP = new GetNextPNameInst(
  728|     15|      getInsertionBlock(),
  729|     15|      propertyAddr,
  730|     15|      baseAddr,
  731|     15|      indexAddr,
  732|     15|      sizeAddr,
  733|     15|      iteratorAddr,
  734|     15|      onLast,
  735|     15|      onSome);
  736|     15|  insert(GNP);
  737|     15|  return GNP;
  738|     15|}
_ZN6hermes9IRBuilder13createMovInstEPNS_5ValueE:
  740|  1.34M|MovInst *IRBuilder::createMovInst(Value *input) {
  741|  1.34M|  auto MI = new MovInst(input);
  742|  1.34M|  insert(MI);
  743|  1.34M|  return MI;
  744|  1.34M|}
_ZN6hermes9IRBuilder21createImplicitMovInstEPNS_5ValueE:
  746|  2.82k|ImplicitMovInst *IRBuilder::createImplicitMovInst(Value *input) {
  747|  2.82k|  auto IMI = new ImplicitMovInst(input);
  748|  2.82k|  insert(IMI);
  749|  2.82k|  return IMI;
  750|  2.82k|}
_ZN6hermes9IRBuilder31createHBCStoreToEnvironmentInstEPNS_5ValueES2_PNS_8VariableE:
  803|   104k|    Variable *var) {
  804|   104k|  auto PSI = new HBCStoreToEnvironmentInst(env, toPut, var);
  805|   104k|  insert(PSI);
  806|   104k|  return PSI;
  807|   104k|}
_ZN6hermes9IRBuilder32createHBCLoadFromEnvironmentInstEPNS_5ValueEPNS_8VariableE:
  811|      4|    Variable *var) {
  812|      4|  auto GSI = new HBCLoadFromEnvironmentInst(env, var);
  813|      4|  insert(GSI);
  814|      4|  return GSI;
  815|      4|}
_ZN6hermes9IRBuilder22createHBCLoadConstInstEPNS_7LiteralE:
  838|  1.75M|HBCLoadConstInst *IRBuilder::createHBCLoadConstInst(Literal *value) {
  839|  1.75M|  auto inst = new HBCLoadConstInst(value);
  840|  1.75M|  insert(inst);
  841|  1.75M|  return inst;
  842|  1.75M|}
_ZN6hermes9IRBuilder22createHBCLoadParamInstEPNS_13LiteralNumberE:
  844|   103k|HBCLoadParamInst *IRBuilder::createHBCLoadParamInst(LiteralNumber *value) {
  845|   103k|  auto inst = new HBCLoadParamInst(value);
  846|   103k|  insert(inst);
  847|   103k|  return inst;
  848|   103k|}
_ZN6hermes9IRBuilder30createHBCCreateEnvironmentInstEPNS_9ScopeDescE:
  851|   103k|    ScopeDesc *scopeDesc) {
  852|   103k|  auto inst = new HBCCreateEnvironmentInst(scopeDesc);
  853|   103k|  insert(inst);
  854|   103k|  return inst;
  855|   103k|}
_ZN6hermes9IRBuilder22createHBCGetThisNSInstEv:
  865|      9|HBCGetThisNSInst *IRBuilder::createHBCGetThisNSInst() {
  866|      9|  auto inst = new HBCGetThisNSInst();
  867|      9|  insert(inst);
  868|      9|  return inst;
  869|      9|}
_ZN6hermes9IRBuilder27createHBCReifyArgumentsInstEPNS_14AllocStackInstE:
  884|    174|    AllocStackInst *lazyReg) {
  885|    174|  auto inst = new HBCReifyArgumentsInst(lazyReg);
  886|    174|  insert(inst);
  887|    174|  return inst;
  888|    174|}
_ZN6hermes9IRBuilder23createHBCCreateThisInstEPNS_5ValueES2_:
  891|  25.0k|    Value *closure) {
  892|  25.0k|  auto inst = new HBCCreateThisInst(prototype, closure);
  893|  25.0k|  insert(inst);
  894|  25.0k|  return inst;
  895|  25.0k|}
_ZN6hermes9IRBuilder22createHBCConstructInstEPNS_5ValueES2_S2_N4llvh8ArrayRefIS2_EE:
  900|  25.0k|    ArrayRef<Value *> arguments) {
  901|  25.0k|  auto inst = new HBCConstructInst(closure, newTarget, thisValue, arguments);
  902|  25.0k|  insert(inst);
  903|  25.0k|  return inst;
  904|  25.0k|}
_ZN6hermes9IRBuilder33createHBCGetConstructedObjectInstEPNS_17HBCCreateThisInstEPNS_16HBCConstructInstE:
  907|  25.0k|    HBCConstructInst *constructorReturnValue) {
  908|  25.0k|  auto inst =
  909|  25.0k|      new HBCGetConstructedObjectInst(thisValue, constructorReturnValue);
  910|  25.0k|  insert(inst);
  911|  25.0k|  return inst;
  912|  25.0k|}
_ZN6hermes9IRBuilder21createCallBuiltinInstENS_13BuiltinMethod4EnumEN4llvh8ArrayRefIPNS_5ValueEEE:
  922|  2.82k|    ArrayRef<Value *> arguments) {
  923|  2.82k|  LiteralUndefined *undefined = getLiteralUndefined();
  924|  2.82k|  LiteralUndefined *newTarget = undefined;
  925|  2.82k|  LiteralUndefined *thisValue = undefined;
  926|  2.82k|  auto *inst = new CallBuiltinInst(
  927|  2.82k|      getLiteralNumber(builtinIndex), newTarget, thisValue, arguments);
  928|  2.82k|  insert(inst);
  929|  2.82k|  return inst;
  930|  2.82k|}
_ZN6hermes9IRBuilder27createHBCCreateFunctionInstEPNS_8FunctionEPNS_5ValueE:
  964|   103k|    Value *env) {
  965|   103k|  auto inst = new HBCCreateFunctionInst(function, env);
  966|   103k|  insert(inst);
  967|   103k|  return inst;
  968|   103k|}
_ZN6hermes9IRBuilder21createHBCSpillMovInstEPNS_11InstructionE:
  970|  2.38M|HBCSpillMovInst *IRBuilder::createHBCSpillMovInst(Instruction *value) {
  971|  2.38M|  auto *inst = new HBCSpillMovInst(value);
  972|  2.38M|  insert(inst);
  973|  2.38M|  return inst;
  974|  2.38M|}
_ZN6hermes9IRBuilder23createIteratorBeginInstEPNS_14AllocStackInstE:
 1006|  22.3k|    AllocStackInst *sourceOrNext) {
 1007|  22.3k|  auto *I = new IteratorBeginInst(sourceOrNext);
 1008|  22.3k|  insert(I);
 1009|  22.3k|  return I;
 1010|  22.3k|}
_ZN6hermes9IRBuilder22createIteratorNextInstEPNS_14AllocStackInstES2_:
 1014|  20.3k|    AllocStackInst *sourceOrNext) {
 1015|  20.3k|  auto *I = new IteratorNextInst(iterator, sourceOrNext);
 1016|  20.3k|  insert(I);
 1017|  20.3k|  return I;
 1018|  20.3k|}
_ZN6hermes9IRBuilder23createIteratorCloseInstEPNS_14AllocStackInstEb:
 1022|  42.7k|    bool ignoreInnerException) {
 1023|  42.7k|  auto *I =
 1024|  42.7k|      new IteratorCloseInst(iterator, getLiteralBool(ignoreInnerException));
 1025|  42.7k|  insert(I);
 1026|  42.7k|  return I;
 1027|  42.7k|}
_ZN6hermes9IRBuilder6insertEPNS_11InstructionE:
 1041|  10.3M|void IRBuilder::insert(Instruction *Inst) {
 1042|       |  // Set the statement of the new instruction based on the current function's
 1043|       |  // statement counter.
 1044|  10.3M|  OptValue<uint32_t> statementOpt = getFunction()->getStatementCount();
 1045|  10.3M|  uint32_t statement;
 1046|  10.3M|  if (LLVM_LIKELY(statementOpt.hasValue())) {
  ------------------
  |  |  188|  10.3M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.72M, False: 6.63M]
  |  |  ------------------
  ------------------
 1047|  3.72M|    statement = *statementOpt;
 1048|  6.63M|  } else {
 1049|       |    // If we've cleared the statement count,
 1050|       |    // then just set the new instruction's statement to the statement of the
 1051|       |    // instruction we're inserting at (0 if it doesn't exist).
 1052|  6.63M|    statement = InsertionPoint != Block->getInstList().end()
  ------------------
  |  Branch (1052:17): [True: 6.63M, False: 0]
  ------------------
 1053|  6.63M|        ? InsertionPoint->getStatementIndex()
 1054|  6.63M|        : 0;
 1055|  6.63M|  }
 1056|  10.3M|  Inst->setStatementIndex(statement);
 1057|       |
 1058|  10.3M|  Inst->setLocation(Location);
 1059|  10.3M|  Inst->setSourceLevelScope(CurrentSourceLevelScope);
 1060|       |
 1061|  10.3M|  return justInsert(Inst);
 1062|  10.3M|}
_ZN6hermes9IRBuilder17setInsertionBlockEPNS_10BasicBlockE:
 1064|  1.07M|void IRBuilder::setInsertionBlock(BasicBlock *BB) {
 1065|  1.07M|  if (BB) {
  ------------------
  |  Branch (1065:7): [True: 1.07M, False: 196]
  ------------------
 1066|  1.07M|    InsertionPoint = BB->end();
 1067|  1.07M|    Block = BB;
 1068|  1.07M|  } else {
 1069|    196|    InsertionPoint = BasicBlock::iterator(nullptr);
 1070|    196|    Block = nullptr;
 1071|    196|  }
 1072|  1.07M|}
_ZN6hermes9IRBuilder17getInsertionBlockEv:
 1074|   839k|BasicBlock *IRBuilder::getInsertionBlock() {
 1075|   839k|  return Block;
 1076|   839k|}
_ZN6hermes9IRBuilder22setInsertionPointAfterEPNS_11InstructionE:
 1078|     14|void IRBuilder::setInsertionPointAfter(Instruction *IP) {
 1079|     14|  InsertionPoint = IP->getIterator();
 1080|     14|  InsertionPoint++;
 1081|     14|  Block = IP->getParent();
 1082|     14|}
_ZN6hermes9IRBuilder17setInsertionPointEPNS_11InstructionE:
 1084|  5.75M|void IRBuilder::setInsertionPoint(Instruction *IP) {
 1085|  5.75M|  InsertionPoint = IP->getIterator();
 1086|  5.75M|  Block = IP->getParent();
 1087|  5.75M|}
_ZN6hermes9IRBuilder10justInsertEPNS_11InstructionE:
 1035|  10.3M|inline void IRBuilder::justInsert(Instruction *Inst) {
 1036|  10.3M|  assert(!Inst->getParent() && "Instr that's already inserted elsewhere");
 1037|  10.3M|  Inst->setParent(Block);
 1038|  10.3M|  Block->getInstList().insert(InsertionPoint, Inst);
 1039|  10.3M|}

_ZNK6hermes14TerminatorInst16getNumSuccessorsEv:
   22|  9.11M|unsigned TerminatorInst::getNumSuccessors() const {
   23|  9.11M|#undef TERMINATOR
   24|  9.11M|#define TERMINATOR(CLASS, PARENT)           \
   25|  9.11M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
   26|  9.11M|    return I->getNumSuccessors();
   27|  9.11M|#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|  9.11M|#ifndef DEF_VALUE
  |  |    9|  9.11M|#define DEF_VALUE(NAME, PARENT)
  |  |   10|  9.11M|#endif
  |  |   11|  9.11M|#ifndef MARK_FIRST
  |  |   12|  9.11M|#define MARK_FIRST(NAME)
  |  |   13|  9.11M|#endif
  |  |   14|  9.11M|#ifndef MARK_LAST
  |  |   15|  9.11M|#define MARK_LAST(NAME)
  |  |   16|  9.11M|#endif
  |  |   17|       |
  |  |   18|       |#ifndef TERMINATOR
  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |   20|       |#endif
  |  |   21|       |
  |  |   22|  9.11M|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |   23|  9.11M|#define INCLUDE_HBC_BACKEND
  |  |   24|  9.11M|#endif
  |  |   25|       |
  |  |   26|  9.11M|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |   27|       |
  |  |   28|  9.11M|MARK_FIRST(ScopeCreationInst)
  |  |   29|  9.11M|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |   30|  9.11M|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |   31|  9.11M|#ifdef INCLUDE_HBC_BACKEND
  |  |   32|  9.11M|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |   33|  9.11M|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |   34|  9.11M|#endif
  |  |   35|  9.11M|MARK_FIRST(NestedScopeCreationInst)
  |  |   36|  9.11M|DEF_VALUE(NestedScopeCreationInst, ScopeCreationInst)
  |  |   37|  9.11M|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |   38|  9.11M|#ifdef INCLUDE_HBC_BACKEND
  |  |   39|  9.11M|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |   40|  9.11M|#endif
  |  |   41|  9.11M|MARK_LAST(NestedScopeCreationInst)
  |  |   42|  9.11M|MARK_LAST(ScopeCreationInst)
  |  |   43|       |
  |  |   44|  9.11M|MARK_FIRST(SingleOperandInst)
  |  |   45|  9.11M|DEF_VALUE(SingleOperandInst, Instruction)
  |  |   46|  9.11M|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |   47|  9.11M|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |   48|  9.11M|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |   49|  9.11M|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |   50|  9.11M|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |   51|  9.11M|DEF_VALUE(MovInst, SingleOperandInst)
  |  |   52|  9.11M|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |   53|  9.11M|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |   54|  9.11M|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |   55|  9.11M|#ifdef INCLUDE_HBC_BACKEND
  |  |   56|  9.11M|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |   57|  9.11M|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |   58|  9.11M|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |   59|  9.11M|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |   60|  9.11M|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |   61|  9.11M|#endif
  |  |   62|  9.11M|MARK_LAST(SingleOperandInst)
  |  |   63|       |
  |  |   64|  9.11M|DEF_VALUE(PhiInst, Instruction)
  |  |   65|  9.11M|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |   66|  9.11M|MARK_FIRST(StorePropertyInst)
  |  |   67|  9.11M|DEF_VALUE(StorePropertyInst, Instruction)
  |  |   68|  9.11M|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |   69|  9.11M|MARK_LAST(StorePropertyInst)
  |  |   70|       |
  |  |   71|  9.11M|MARK_FIRST(StoreOwnPropertyInst)
  |  |   72|  9.11M|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |   73|  9.11M|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |   74|  9.11M|MARK_LAST(StoreOwnPropertyInst)
  |  |   75|       |
  |  |   76|  9.11M|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |   77|  9.11M|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |   78|  9.11M|MARK_FIRST(LoadPropertyInst)
  |  |   79|  9.11M|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |   80|  9.11M|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |   81|  9.11M|MARK_LAST(LoadPropertyInst)
  |  |   82|  9.11M|DEF_VALUE(LoadFrameInst, Instruction)
  |  |   83|  9.11M|DEF_VALUE(StoreStackInst, Instruction)
  |  |   84|  9.11M|DEF_VALUE(StoreFrameInst, Instruction)
  |  |   85|  9.11M|DEF_VALUE(AllocStackInst, Instruction)
  |  |   86|  9.11M|DEF_VALUE(AllocObjectInst, Instruction)
  |  |   87|  9.11M|DEF_VALUE(AllocArrayInst, Instruction)
  |  |   88|  9.11M|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |   89|  9.11M|DEF_VALUE(CatchInst, Instruction)
  |  |   90|  9.11M|DEF_VALUE(DebuggerInst, Instruction)
  |  |   91|  9.11M|DEF_VALUE(DirectEvalInst, Instruction)
  |  |   92|  9.11M|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |   93|  9.11M|DEF_VALUE(TryEndInst, Instruction)
  |  |   94|  9.11M|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |   95|  9.11M|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |   96|  9.11M|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |   97|  9.11M|DEF_VALUE(IteratorNextInst, Instruction)
  |  |   98|  9.11M|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |   99|  9.11M|#ifdef INCLUDE_HBC_BACKEND
  |  |  100|  9.11M|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  101|  9.11M|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  102|  9.11M|#endif
  |  |  103|  9.11M|DEF_VALUE(UnreachableInst, Instruction)
  |  |  104|       |
  |  |  105|  9.11M|MARK_FIRST(CreateFunctionInst)
  |  |  106|  9.11M|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  107|  9.11M|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  108|  9.11M|#ifdef INCLUDE_HBC_BACKEND
  |  |  109|  9.11M|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  110|  9.11M|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  111|  9.11M|#endif
  |  |  112|  9.11M|MARK_LAST(CreateFunctionInst)
  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  115|       |#endif
  |  |  116|       |
  |  |  117|  9.11M|MARK_FIRST(TerminatorInst)
  |  |  118|  9.11M|DEF_VALUE(TerminatorInst, Instruction)
  |  |  119|  9.11M|TERMINATOR(BranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  9.11M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 5.94M, False: 3.16M]
  |  |  |  |  ------------------
  |  |  |  |   26|  9.11M|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  120|  3.16M|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  3.16M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 414k, False: 2.75M]
  |  |  |  |  ------------------
  |  |  |  |   26|  3.16M|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  121|  2.75M|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  2.75M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 142k, False: 2.61M]
  |  |  |  |  ------------------
  |  |  |  |   26|  2.75M|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  122|  2.61M|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  2.61M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 2.61M]
  |  |  |  |  ------------------
  |  |  |  |   26|  2.61M|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  123|  2.61M|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  2.61M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 1.88M, False: 731k]
  |  |  |  |  ------------------
  |  |  |  |   26|  2.61M|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  124|   731k|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|   731k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 189, False: 731k]
  |  |  |  |  ------------------
  |  |  |  |   26|   731k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  125|   731k|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|   731k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 189, False: 730k]
  |  |  |  |  ------------------
  |  |  |  |   26|   731k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  126|   730k|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|   730k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 730k]
  |  |  |  |  ------------------
  |  |  |  |   26|   730k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  127|   730k|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|   730k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 730k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   26|   730k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  128|      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();
  |  |  ------------------
  |  |  129|      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();
  |  |  ------------------
  |  |  130|      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();
  |  |  ------------------
  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  132|       |
  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  141|      0|#endif
  |  |  142|      0|MARK_LAST(CallInst)
  |  |  143|       |
  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  147|       |
  |  |  148|       |// These are target dependent instructions:
  |  |  149|       |
  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  158|      0|#endif
  |  |  159|       |
  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  161|       |
  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  163|       |// these macros are still used after the #include.
  |  |  164|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  165|      0|#undef DEF_VALUE
  |  |  166|      0|#undef MARK_FIRST
  |  |  167|      0|#undef MARK_LAST
  |  |  168|      0|#undef TERMINATOR
  |  |  169|      0|#endif
  ------------------
   28|       |
   29|      0|  llvm_unreachable("not a terminator?!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   30|  14.0M|}
_ZNK6hermes14TerminatorInst12getSuccessorEj:
   32|  4.89M|BasicBlock *TerminatorInst::getSuccessor(unsigned idx) const {
   33|  4.89M|#undef TERMINATOR
   34|  4.89M|#define TERMINATOR(CLASS, PARENT)           \
   35|  4.89M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
   36|  4.89M|    return I->getSuccessor(idx);
   37|  4.89M|#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|  4.89M|#ifndef DEF_VALUE
  |  |    9|  4.89M|#define DEF_VALUE(NAME, PARENT)
  |  |   10|  4.89M|#endif
  |  |   11|  4.89M|#ifndef MARK_FIRST
  |  |   12|  4.89M|#define MARK_FIRST(NAME)
  |  |   13|  4.89M|#endif
  |  |   14|  4.89M|#ifndef MARK_LAST
  |  |   15|  4.89M|#define MARK_LAST(NAME)
  |  |   16|  4.89M|#endif
  |  |   17|       |
  |  |   18|       |#ifndef TERMINATOR
  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |   20|       |#endif
  |  |   21|       |
  |  |   22|  4.89M|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |   23|  4.89M|#define INCLUDE_HBC_BACKEND
  |  |   24|  4.89M|#endif
  |  |   25|       |
  |  |   26|  4.89M|DEF_VALUE(ThrowIfHasRestrictedGlobalPropertyInst, Instruction)
  |  |   27|       |
  |  |   28|  4.89M|MARK_FIRST(ScopeCreationInst)
  |  |   29|  4.89M|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |   30|  4.89M|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |   31|  4.89M|#ifdef INCLUDE_HBC_BACKEND
  |  |   32|  4.89M|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |   33|  4.89M|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |   34|  4.89M|#endif
  |  |   35|  4.89M|MARK_FIRST(NestedScopeCreationInst)
  |  |   36|  4.89M|DEF_VALUE(NestedScopeCreationInst, ScopeCreationInst)
  |  |   37|  4.89M|DEF_VALUE(CreateInnerScopeInst, NestedScopeCreationInst)
  |  |   38|  4.89M|#ifdef INCLUDE_HBC_BACKEND
  |  |   39|  4.89M|DEF_VALUE(HBCCreateInnerEnvironmentInst, NestedScopeCreationInst)
  |  |   40|  4.89M|#endif
  |  |   41|  4.89M|MARK_LAST(NestedScopeCreationInst)
  |  |   42|  4.89M|MARK_LAST(ScopeCreationInst)
  |  |   43|       |
  |  |   44|  4.89M|MARK_FIRST(SingleOperandInst)
  |  |   45|  4.89M|DEF_VALUE(SingleOperandInst, Instruction)
  |  |   46|  4.89M|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |   47|  4.89M|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |   48|  4.89M|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |   49|  4.89M|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |   50|  4.89M|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |   51|  4.89M|DEF_VALUE(MovInst, SingleOperandInst)
  |  |   52|  4.89M|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |   53|  4.89M|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |   54|  4.89M|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |   55|  4.89M|#ifdef INCLUDE_HBC_BACKEND
  |  |   56|  4.89M|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |   57|  4.89M|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |   58|  4.89M|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |   59|  4.89M|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |   60|  4.89M|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |   61|  4.89M|#endif
  |  |   62|  4.89M|MARK_LAST(SingleOperandInst)
  |  |   63|       |
  |  |   64|  4.89M|DEF_VALUE(PhiInst, Instruction)
  |  |   65|  4.89M|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |   66|  4.89M|MARK_FIRST(StorePropertyInst)
  |  |   67|  4.89M|DEF_VALUE(StorePropertyInst, Instruction)
  |  |   68|  4.89M|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |   69|  4.89M|MARK_LAST(StorePropertyInst)
  |  |   70|       |
  |  |   71|  4.89M|MARK_FIRST(StoreOwnPropertyInst)
  |  |   72|  4.89M|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |   73|  4.89M|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |   74|  4.89M|MARK_LAST(StoreOwnPropertyInst)
  |  |   75|       |
  |  |   76|  4.89M|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |   77|  4.89M|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |   78|  4.89M|MARK_FIRST(LoadPropertyInst)
  |  |   79|  4.89M|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |   80|  4.89M|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |   81|  4.89M|MARK_LAST(LoadPropertyInst)
  |  |   82|  4.89M|DEF_VALUE(LoadFrameInst, Instruction)
  |  |   83|  4.89M|DEF_VALUE(StoreStackInst, Instruction)
  |  |   84|  4.89M|DEF_VALUE(StoreFrameInst, Instruction)
  |  |   85|  4.89M|DEF_VALUE(AllocStackInst, Instruction)
  |  |   86|  4.89M|DEF_VALUE(AllocObjectInst, Instruction)
  |  |   87|  4.89M|DEF_VALUE(AllocArrayInst, Instruction)
  |  |   88|  4.89M|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |   89|  4.89M|DEF_VALUE(CatchInst, Instruction)
  |  |   90|  4.89M|DEF_VALUE(DebuggerInst, Instruction)
  |  |   91|  4.89M|DEF_VALUE(DirectEvalInst, Instruction)
  |  |   92|  4.89M|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |   93|  4.89M|DEF_VALUE(TryEndInst, Instruction)
  |  |   94|  4.89M|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |   95|  4.89M|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |   96|  4.89M|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |   97|  4.89M|DEF_VALUE(IteratorNextInst, Instruction)
  |  |   98|  4.89M|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |   99|  4.89M|#ifdef INCLUDE_HBC_BACKEND
  |  |  100|  4.89M|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  101|  4.89M|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  102|  4.89M|#endif
  |  |  103|  4.89M|DEF_VALUE(UnreachableInst, Instruction)
  |  |  104|       |
  |  |  105|  4.89M|MARK_FIRST(CreateFunctionInst)
  |  |  106|  4.89M|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  107|  4.89M|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  108|  4.89M|#ifdef INCLUDE_HBC_BACKEND
  |  |  109|  4.89M|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  110|  4.89M|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  111|  4.89M|#endif
  |  |  112|  4.89M|MARK_LAST(CreateFunctionInst)
  |  |  113|       |#ifdef HERMES_RUN_WASM
  |  |  114|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  115|       |#endif
  |  |  116|       |
  |  |  117|  4.89M|MARK_FIRST(TerminatorInst)
  |  |  118|  4.89M|DEF_VALUE(TerminatorInst, Instruction)
  |  |  119|  4.89M|TERMINATOR(BranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|  4.89M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 3.15M, False: 1.74M]
  |  |  |  |  ------------------
  |  |  |  |   36|  4.89M|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  120|  1.74M|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|  1.74M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 0, False: 1.74M]
  |  |  |  |  ------------------
  |  |  |  |   36|  1.74M|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  121|  1.74M|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|  1.74M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 0, False: 1.74M]
  |  |  |  |  ------------------
  |  |  |  |   36|  1.74M|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  122|  1.74M|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|  1.74M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 0, False: 1.74M]
  |  |  |  |  ------------------
  |  |  |  |   36|  1.74M|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  123|  1.74M|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|  1.74M|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 1.25M, False: 487k]
  |  |  |  |  ------------------
  |  |  |  |   36|  1.74M|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  124|   487k|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|   487k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 126, False: 487k]
  |  |  |  |  ------------------
  |  |  |  |   36|   487k|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  125|   487k|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|   487k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 126, False: 487k]
  |  |  |  |  ------------------
  |  |  |  |   36|   487k|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  126|   487k|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|   487k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 0, False: 487k]
  |  |  |  |  ------------------
  |  |  |  |   36|   487k|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  127|   487k|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|   487k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 487k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   36|   487k|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  128|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   36|      0|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  129|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   36|      0|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  130|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   35|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (35:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   36|      0|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  131|      0|MARK_LAST(TerminatorInst)
  |  |  132|       |
  |  |  133|      0|MARK_FIRST(CallInst)
  |  |  134|      0|DEF_VALUE(CallInst, Instruction)
  |  |  135|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  136|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  137|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  138|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  139|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  140|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  141|      0|#endif
  |  |  142|      0|MARK_LAST(CallInst)
  |  |  143|       |
  |  |  144|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  145|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  146|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  147|       |
  |  |  148|       |// These are target dependent instructions:
  |  |  149|       |
  |  |  150|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  151|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  152|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  153|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  154|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  155|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  156|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  157|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  158|      0|#endif
  |  |  159|       |
  |  |  160|      0|#undef INCLUDE_HBC_BACKEND
  |  |  161|       |
  |  |  162|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  163|       |// these macros are still used after the #include.
  |  |  164|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  165|      0|#undef DEF_VALUE
  |  |  166|      0|#undef MARK_FIRST
  |  |  167|      0|#undef MARK_LAST
  |  |  168|      0|#undef TERMINATOR
  |  |  169|      0|#endif
  ------------------
   38|       |
   39|      0|  llvm_unreachable("not a terminator?!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   40|  8.91M|}
_ZN6hermes17UnaryOperatorInst13parseOperatorEN4llvh9StringRefE:
   69|  29.4k|UnaryOperatorInst::OpKind UnaryOperatorInst::parseOperator(llvh::StringRef op) {
   70|   153k|  for (int i = 0; i < static_cast<int>(BinaryOperatorInst::OpKind::LAST_OPCODE);
  ------------------
  |  Branch (70:19): [True: 153k, False: 0]
  ------------------
   71|   153k|       i++) {
   72|   153k|    if (op == UnaryOperatorInst::opStringRepr[i]) {
  ------------------
  |  Branch (72:9): [True: 29.4k, False: 124k]
  ------------------
   73|  29.4k|      return static_cast<UnaryOperatorInst::OpKind>(i);
   74|  29.4k|    }
   75|   153k|  }
   76|       |
   77|      0|  llvm_unreachable("invalid operator string");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   78|  29.4k|}
_ZN6hermes18BinaryOperatorInst13parseOperatorEN4llvh9StringRefE:
  115|   135k|    llvh::StringRef op) {
  116|   135k|  return parseOperator_impl(op, opStringRepr);
  117|   135k|}
_ZN6hermes7PhiInstC2ERKN4llvh11SmallVectorIPNS_5ValueELj8EEERKNS2_IPNS_10BasicBlockELj8EEE:
  293|  4.39k|    : Instruction(ValueKind::PhiInstKind) {
  294|  4.39k|  assert(values.size() == blocks.size() && "Block-value pairs mismatch");
  295|       |  // Push the incoming values.
  296|  13.1k|  for (int i = 0, e = values.size(); i < e; ++i) {
  ------------------
  |  Branch (296:38): [True: 8.78k, False: 4.39k]
  ------------------
  297|  8.78k|    pushOperand(values[i]);
  298|  8.78k|    pushOperand(blocks[i]);
  299|  8.78k|  }
  300|  4.39k|}
_ZNK6hermes7PhiInst13getNumEntriesEv:
  302|  13.2k|unsigned PhiInst::getNumEntries() const {
  303|       |  // The PHI operands are just pairs of values and basic blocks.
  304|  13.2k|  return getNumOperands() / 2;
  305|  13.2k|}
_ZNK6hermes7PhiInst8getEntryEj:
  312|  26.4k|std::pair<Value *, BasicBlock *> PhiInst::getEntry(unsigned i) const {
  313|  26.4k|  return std::make_pair(
  314|  26.4k|      getOperand(indexOfPhiEntry(i)),
  315|  26.4k|      cast<BasicBlock>(getOperand(indexOfPhiEntry(i) + 1)));
  316|  26.4k|}
_ZN6hermes7PhiInst11updateEntryEjPNS_5ValueEPNS_10BasicBlockE:
  318|  9.51k|void PhiInst::updateEntry(unsigned i, Value *val, BasicBlock *BB) {
  319|  9.51k|  setOperand(val, indexOfPhiEntry(i));
  320|  9.51k|  setOperand(BB, indexOfPhiEntry(i) + 1);
  321|  9.51k|}
_ZN6hermes13GetPNamesInstC2EPNS_10BasicBlockEPNS_5ValueES4_S4_S4_S2_S2_:
  361|     15|    : TerminatorInst(ValueKind::GetPNamesInstKind) {
  362|     15|  pushOperand(iteratorAddr);
  363|     15|  pushOperand(baseAddr);
  364|     15|  pushOperand(indexAddr);
  365|     15|  pushOperand(sizeAddr);
  366|     15|  pushOperand(onEmpty);
  367|     15|  pushOperand(onSome);
  368|     15|}
_ZN6hermes16GetNextPNameInstC2EPNS_10BasicBlockEPNS_5ValueES4_S4_S4_S4_S2_S2_:
  379|     15|    : TerminatorInst(ValueKind::GetNextPNameInstKind) {
  380|     15|  pushOperand(propertyAddr);
  381|     15|  pushOperand(baseAddr);
  382|     15|  pushOperand(indexAddr);
  383|     15|  pushOperand(sizeAddr);
  384|     15|  pushOperand(iteratorAddr);
  385|     15|  pushOperand(onLast);
  386|     15|  pushOperand(onSome);
  387|     15|}
Instrs.cpp:_ZL18parseOperator_implN4llvh9StringRefEPPKc:
  103|   135k|    const char **lookup_table) {
  104|  2.25M|  for (int i = 0; i < static_cast<int>(BinaryOperatorInst::OpKind::LAST_OPCODE);
  ------------------
  |  Branch (104:19): [True: 2.25M, False: 0]
  ------------------
  105|  2.25M|       i++) {
  106|  2.25M|    if (op == lookup_table[i]) {
  ------------------
  |  Branch (106:9): [True: 135k, False: 2.11M]
  ------------------
  107|   135k|      return static_cast<BinaryOperatorInst::OpKind>(i);
  108|   135k|    }
  109|  2.25M|  }
  110|       |
  111|      0|  llvm_unreachable("invalid operator string");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  112|   135k|}
Instrs.cpp:_ZL15indexOfPhiEntryj:
  308|  72.0k|static unsigned indexOfPhiEntry(unsigned index) {
  309|  72.0k|  return index * 2;
  310|  72.0k|}

_ZN6hermes5irgen11ESTreeIRGen29genFinallyBeforeControlChangeEPNS0_14SurroundingTryES3_NS0_17ControlFlowChangeEPNS_10BasicBlockE:
  174|   103k|    BasicBlock *continueTarget) {
  175|   103k|  assert(
  176|   103k|      (cfc == ControlFlowChange::Break || continueTarget != nullptr) &&
  177|   103k|      "Continue ControlFlowChange must have a target");
  178|       |  // We walk the nested try statements starting from the source, until we reach
  179|       |  // the target, generating the finally statements on the way.
  180|   103k|  for (; sourceTry != targetTry; sourceTry = sourceTry->outer) {
  ------------------
  |  Branch (180:10): [True: 0, False: 103k]
  ------------------
  181|      0|    assert(sourceTry && "invalid try chain");
  182|       |
  183|       |    // Emit an end of the try statement.
  184|      0|    auto *tryEndBlock = Builder.createBasicBlock(curFunction()->function);
  185|      0|    Builder.createBranchInst(tryEndBlock);
  186|      0|    Builder.setInsertionBlock(tryEndBlock);
  187|       |
  188|       |    // Make sure we use the correct debug location for tryEndInst.
  189|      0|    if (sourceTry->tryEndLoc.isValid()) {
  ------------------
  |  Branch (189:9): [True: 0, False: 0]
  ------------------
  190|      0|      hermes::IRBuilder::ScopedLocationChange slc(
  191|      0|          Builder, sourceTry->tryEndLoc);
  192|      0|      Builder.createTryEndInst();
  193|      0|    } else {
  194|      0|      Builder.createTryEndInst();
  195|      0|    }
  196|       |
  197|      0|    if (sourceTry->genFinalizer) {
  ------------------
  |  Branch (197:9): [True: 0, False: 0]
  ------------------
  198|       |      // Recreate the state of the try stack on entrance to the finally block.
  199|      0|      llvh::SaveAndRestore<SurroundingTry *> sr{
  200|      0|          curFunction()->surroundingTry, sourceTry->outer};
  201|      0|      sourceTry->genFinalizer(sourceTry->node, cfc, continueTarget);
  202|      0|    }
  203|      0|  }
  204|   103k|}

_ZN6hermes5irgen11ESTreeIRGen13genExpressionEPNS_6ESTree4NodeENS_10IdentifierE:
   17|  2.42M|Value *ESTreeIRGen::genExpression(ESTree::Node *expr, Identifier nameHint) {
   18|  2.42M|  LLVM_DEBUG(
  ------------------
  |  |  123|  2.42M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.42M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.42M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.42M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   19|  2.42M|      llvh::dbgs() << "IRGen expression of type " << expr->getNodeName()
   20|  2.42M|                   << "\n");
   21|  2.42M|  IRBuilder::ScopedLocationChange slc(Builder, expr->getDebugLoc());
   22|       |
   23|       |  // Handle identifiers.
   24|  2.42M|  if (auto *Iden = llvh::dyn_cast<ESTree::IdentifierNode>(expr)) {
  ------------------
  |  Branch (24:13): [True: 502k, False: 1.92M]
  ------------------
   25|   502k|    return genIdentifierExpression(Iden, false);
   26|   502k|  }
   27|       |
   28|       |  // Handle Null Literals.
   29|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-null-literals
   30|  1.92M|  if (llvh::isa<ESTree::NullLiteralNode>(expr)) {
  ------------------
  |  Branch (30:7): [True: 0, False: 1.92M]
  ------------------
   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|  1.92M|  if (auto *Lit = llvh::dyn_cast<ESTree::StringLiteralNode>(expr)) {
  ------------------
  |  Branch (36:13): [True: 20, False: 1.92M]
  ------------------
   37|     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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   38|     20|        llvh::dbgs() << "Loading String Literal \"" << Lit->_value << "\"\n");
   39|     20|    return Builder.getLiteralString(Lit->_value->str());
   40|     20|  }
   41|       |
   42|       |  // Handle Regexp Literals.
   43|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-regular-expression-literals
   44|  1.92M|  if (auto *Lit = llvh::dyn_cast<ESTree::RegExpLiteralNode>(expr)) {
  ------------------
  |  Branch (44:13): [True: 119, False: 1.92M]
  ------------------
   45|    119|    return genRegExpLiteral(Lit);
   46|    119|  }
   47|       |
   48|       |  // Handle Boolean Literals.
   49|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-boolean-literals
   50|  1.92M|  if (auto *Lit = llvh::dyn_cast<ESTree::BooleanLiteralNode>(expr)) {
  ------------------
  |  Branch (50:13): [True: 0, False: 1.92M]
  ------------------
   51|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|      0|        llvh::dbgs() << "Loading String Literal \"" << Lit->_value << "\"\n");
   53|      0|    return Builder.getLiteralBool(Lit->_value);
   54|      0|  }
   55|       |
   56|       |  // Handle Number Literals.
   57|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-numeric-literals
   58|  1.92M|  if (auto *Lit = llvh::dyn_cast<ESTree::NumericLiteralNode>(expr)) {
  ------------------
  |  Branch (58:13): [True: 1.59M, False: 332k]
  ------------------
   59|  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   60|  1.59M|        llvh::dbgs() << "Loading Numeric Literal \"" << Lit->_value << "\"\n");
   61|  1.59M|    return Builder.getLiteralNumber(Lit->_value);
   62|  1.59M|  }
   63|       |
   64|       |  // Handle BigInt Literals.
   65|       |  // https://262.ecma-international.org/#sec-ecmascript-language-types-bigint-type
   66|   332k|  if (auto *Lit = llvh::dyn_cast<ESTree::BigIntLiteralNode>(expr)) {
  ------------------
  |  Branch (66:13): [True: 5, False: 332k]
  ------------------
   67|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   68|      5|        llvh::dbgs() << "Loading BitInt Literal \"" << Lit->_bigint->str()
   69|      5|                     << "\"\n");
   70|      5|    return Builder.getLiteralBigInt(Lit->_bigint);
   71|      5|  }
   72|       |
   73|       |  // Handle the assignment expression.
   74|   332k|  if (auto Assign = llvh::dyn_cast<ESTree::AssignmentExpressionNode>(expr)) {
  ------------------
  |  Branch (74:12): [True: 4.55k, False: 327k]
  ------------------
   75|  4.55k|    return genAssignmentExpr(Assign);
   76|  4.55k|  }
   77|       |
   78|       |  // Handle Call expressions.
   79|   327k|  if (auto *call = llvh::dyn_cast<ESTree::CallExpressionNode>(expr)) {
  ------------------
  |  Branch (79:13): [True: 3, False: 327k]
  ------------------
   80|      3|    return genCallExpr(call);
   81|      3|  }
   82|       |
   83|       |  // Handle Call expressions.
   84|   327k|  if (auto *call = llvh::dyn_cast<ESTree::OptionalCallExpressionNode>(expr)) {
  ------------------
  |  Branch (84:13): [True: 0, False: 327k]
  ------------------
   85|      0|    return genOptionalCallExpr(call, nullptr);
   86|      0|  }
   87|       |
   88|       |  // Handle the 'new' expressions.
   89|   327k|  if (auto *newExp = llvh::dyn_cast<ESTree::NewExpressionNode>(expr)) {
  ------------------
  |  Branch (89:13): [True: 25.0k, False: 302k]
  ------------------
   90|  25.0k|    return genNewExpr(newExp);
   91|  25.0k|  }
   92|       |
   93|       |  // Handle MemberExpression expressions for access property.
   94|   302k|  if (auto *Mem = llvh::dyn_cast<ESTree::MemberExpressionNode>(expr)) {
  ------------------
  |  Branch (94:13): [True: 17.5k, False: 285k]
  ------------------
   95|  17.5k|    return genMemberExpression(Mem, MemberExpressionOperation::Load).result;
   96|  17.5k|  }
   97|       |
   98|       |  // Handle MemberExpression expressions for access property.
   99|   285k|  if (auto *mem = llvh::dyn_cast<ESTree::OptionalMemberExpressionNode>(expr)) {
  ------------------
  |  Branch (99:13): [True: 725, False: 284k]
  ------------------
  100|    725|    return genOptionalMemberExpression(
  101|    725|               mem, nullptr, MemberExpressionOperation::Load)
  102|    725|        .result;
  103|    725|  }
  104|       |
  105|       |  // Handle Array expressions (syntax: [1,2,3]).
  106|   284k|  if (auto *Arr = llvh::dyn_cast<ESTree::ArrayExpressionNode>(expr)) {
  ------------------
  |  Branch (106:13): [True: 101, False: 284k]
  ------------------
  107|    101|    return genArrayExpr(Arr);
  108|    101|  }
  109|       |
  110|       |  // Handle object expressions (syntax: {"1" : "2"}).
  111|   284k|  if (auto *Obj = llvh::dyn_cast<ESTree::ObjectExpressionNode>(expr)) {
  ------------------
  |  Branch (111:13): [True: 2, False: 284k]
  ------------------
  112|      2|    return genObjectExpr(Obj);
  113|      2|  }
  114|       |
  115|       |  // Handle logical expressions (short circuiting).
  116|   284k|  if (auto *L = llvh::dyn_cast<ESTree::LogicalExpressionNode>(expr)) {
  ------------------
  |  Branch (116:13): [True: 24.3k, False: 260k]
  ------------------
  117|  24.3k|    return genLogicalExpression(L);
  118|  24.3k|  }
  119|       |
  120|       |  // Handle Binary Expressions.
  121|   260k|  if (auto *Bin = llvh::dyn_cast<ESTree::BinaryExpressionNode>(expr)) {
  ------------------
  |  Branch (121:13): [True: 103k, False: 156k]
  ------------------
  122|   103k|    return genBinaryExpression(Bin);
  123|   103k|  }
  124|       |
  125|       |  // Handle Unary operator Expressions.
  126|   156k|  if (auto *U = llvh::dyn_cast<ESTree::UnaryExpressionNode>(expr)) {
  ------------------
  |  Branch (126:13): [True: 25.9k, False: 130k]
  ------------------
  127|  25.9k|    return genUnaryExpression(U);
  128|  25.9k|  }
  129|       |
  130|       |  // Handle the 'this' keyword.
  131|   130k|  if (llvh::isa<ESTree::ThisExpressionNode>(expr)) {
  ------------------
  |  Branch (131:7): [True: 0, False: 130k]
  ------------------
  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|   130k|  if (auto *MP = llvh::dyn_cast<ESTree::MetaPropertyNode>(expr)) {
  ------------------
  |  Branch (143:13): [True: 0, False: 130k]
  ------------------
  144|      0|    return genMetaProperty(MP);
  145|      0|  }
  146|       |
  147|       |  // Handle function expressions.
  148|   130k|  if (auto *FE = llvh::dyn_cast<ESTree::FunctionExpressionNode>(expr)) {
  ------------------
  |  Branch (148:13): [True: 82, False: 130k]
  ------------------
  149|     82|    return genFunctionExpression(FE, nameHint);
  150|     82|  }
  151|       |
  152|   130k|  if (auto *AF = llvh::dyn_cast<ESTree::ArrowFunctionExpressionNode>(expr)) {
  ------------------
  |  Branch (152:13): [True: 103k, False: 27.0k]
  ------------------
  153|   103k|    return genArrowFunctionExpression(AF, nameHint);
  154|   103k|  }
  155|       |
  156|  27.0k|  if (auto *U = llvh::dyn_cast<ESTree::UpdateExpressionNode>(expr)) {
  ------------------
  |  Branch (156:13): [True: 1, False: 27.0k]
  ------------------
  157|      1|    return genUpdateExpr(U);
  158|      1|  }
  159|       |
  160|  27.0k|  if (auto *C = llvh::dyn_cast<ESTree::ConditionalExpressionNode>(expr)) {
  ------------------
  |  Branch (160:13): [True: 3.66k, False: 23.3k]
  ------------------
  161|  3.66k|    return genConditionalExpr(C);
  162|  3.66k|  }
  163|       |
  164|  23.3k|  if (auto *Sq = llvh::dyn_cast<ESTree::SequenceExpressionNode>(expr)) {
  ------------------
  |  Branch (164:13): [True: 98, False: 23.2k]
  ------------------
  165|     98|    return genSequenceExpr(Sq);
  166|     98|  }
  167|       |
  168|  23.2k|  if (auto *Tl = llvh::dyn_cast<ESTree::TemplateLiteralNode>(expr)) {
  ------------------
  |  Branch (168:13): [True: 20.4k, False: 2.82k]
  ------------------
  169|  20.4k|    return genTemplateLiteralExpr(Tl);
  170|  20.4k|  }
  171|       |
  172|  2.82k|  if (auto *Tt = llvh::dyn_cast<ESTree::TaggedTemplateExpressionNode>(expr)) {
  ------------------
  |  Branch (172:13): [True: 2.82k, False: 0]
  ------------------
  173|  2.82k|    return genTaggedTemplateExpr(Tt);
  174|  2.82k|  }
  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|  3.66k|    BasicBlock *onNullish) {
  194|  3.66k|  switch (expr->getKind()) {
  195|      0|    case ESTree::NodeKind::LogicalExpression:
  ------------------
  |  Branch (195:5): [True: 0, False: 3.66k]
  ------------------
  196|      0|      return genLogicalExpressionBranch(
  197|      0|          cast<ESTree::LogicalExpressionNode>(expr),
  198|      0|          onTrue,
  199|      0|          onFalse,
  200|      0|          onNullish);
  201|       |
  202|  3.51k|    case ESTree::NodeKind::UnaryExpression: {
  ------------------
  |  Branch (202:5): [True: 3.51k, False: 158]
  ------------------
  203|  3.51k|      auto *e = cast<ESTree::UnaryExpressionNode>(expr);
  204|  3.51k|      switch (UnaryOperatorInst::parseOperator(e->_operator->str())) {
  205|      0|        case UnaryOperatorInst::OpKind::BangKind:
  ------------------
  |  Branch (205:9): [True: 0, False: 3.51k]
  ------------------
  206|       |          // Do not propagate onNullish here because !expr cannot be nullish.
  207|      0|          return genExpressionBranch(e->_argument, onFalse, onTrue, nullptr);
  208|  3.51k|        default:
  ------------------
  |  Branch (208:9): [True: 3.51k, False: 0]
  ------------------
  209|  3.51k|          break;
  210|  3.51k|      }
  211|       |
  212|  3.51k|      break;
  213|  3.51k|    }
  214|       |
  215|  3.51k|    case ESTree::NodeKind::SequenceExpression: {
  ------------------
  |  Branch (215:5): [True: 0, False: 3.66k]
  ------------------
  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|  3.51k|    }
  228|       |
  229|    158|    default:
  ------------------
  |  Branch (229:5): [True: 158, False: 3.51k]
  ------------------
  230|    158|      break;
  231|  3.66k|  }
  232|       |
  233|  3.66k|  Value *condVal = genExpression(expr);
  234|  3.66k|  if (onNullish) {
  ------------------
  |  Branch (234:7): [True: 0, False: 3.66k]
  ------------------
  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|  3.66k|  Builder.createCondBranchInst(condVal, onTrue, onFalse);
  244|  3.66k|}
_ZN6hermes5irgen11ESTreeIRGen20genArrayFromElementsERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
  246|    101|Value *ESTreeIRGen::genArrayFromElements(ESTree::NodeList &list) {
  247|    101|  LLVM_DEBUG(llvh::dbgs() << "Initializing a new array\n");
  ------------------
  |  |  123|    101|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    101|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 101]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    101|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|    101|  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|    101|  unsigned minElements = 0;
  254|    101|  bool variableLength = false;
  255|  1.23M|  for (auto &E : list) {
  ------------------
  |  Branch (255:16): [True: 1.23M, False: 101]
  ------------------
  256|  1.23M|    if (llvh::isa<ESTree::SpreadElementNode>(&E)) {
  ------------------
  |  Branch (256:9): [True: 0, False: 1.23M]
  ------------------
  257|      0|      variableLength = true;
  258|      0|      continue;
  259|      0|    }
  260|  1.23M|    ++minElements;
  261|  1.23M|  }
  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|    101|  unsigned count = 0;
  271|    101|  AllocStackInst *nextIndex = nullptr;
  272|    101|  if (variableLength) {
  ------------------
  |  Branch (272:7): [True: 0, False: 101]
  ------------------
  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|    101|  bool consecutive = true;
  280|    101|  auto codeGenOpts = Mod->getContext().getCodeGenerationSettings();
  281|    101|  AllocArrayInst *allocArrayInst = nullptr;
  282|  1.23M|  for (auto &E : list) {
  ------------------
  |  Branch (282:16): [True: 1.23M, False: 101]
  ------------------
  283|  1.23M|    Value *value{nullptr};
  284|  1.23M|    bool isSpread = false;
  285|  1.23M|    if (!llvh::isa<ESTree::EmptyNode>(&E)) {
  ------------------
  |  Branch (285:9): [True: 1.23M, False: 41]
  ------------------
  286|  1.23M|      if (auto *spread = llvh::dyn_cast<ESTree::SpreadElementNode>(&E)) {
  ------------------
  |  Branch (286:17): [True: 0, False: 1.23M]
  ------------------
  287|      0|        isSpread = true;
  288|      0|        value = genExpression(spread->_argument);
  289|  1.23M|      } else {
  290|  1.23M|        value = genExpression(&E);
  291|  1.23M|      }
  292|  1.23M|    }
  293|  1.23M|    if (!value ||
  ------------------
  |  Branch (293:9): [True: 41, False: 1.23M]
  ------------------
  294|  1.23M|        (!llvh::isa<Literal>(value) && !codeGenOpts.unlimitedRegisters) ||
  ------------------
  |  Branch (294:10): [True: 21, False: 1.23M]
  |  Branch (294:40): [True: 21, False: 0]
  ------------------
  295|  1.23M|        isSpread) {
  ------------------
  |  Branch (295:9): [True: 0, False: 1.23M]
  ------------------
  296|       |      // This is either an elision,
  297|       |      // or a non-literal in limited-register mode,
  298|       |      // or a spread element.
  299|     62|      if (consecutive) {
  ------------------
  |  Branch (299:11): [True: 27, False: 35]
  ------------------
  300|       |        // So far we have been storing elements consecutively,
  301|       |        // but not anymore, time to create the array.
  302|     27|        allocArrayInst = Builder.createAllocArrayInst(elements, minElements);
  303|     27|        consecutive = false;
  304|     27|      }
  305|     62|    }
  306|  1.23M|    if (isSpread) {
  ------------------
  |  Branch (306:9): [True: 0, False: 1.23M]
  ------------------
  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|  1.23M|    if (value) {
  ------------------
  |  Branch (317:9): [True: 1.23M, False: 41]
  ------------------
  318|  1.23M|      if (consecutive) {
  ------------------
  |  Branch (318:11): [True: 540k, False: 698k]
  ------------------
  319|   540k|        elements.push_back(value);
  320|   698k|      } else {
  321|   698k|        Builder.createStoreOwnPropertyInst(
  322|   698k|            value,
  323|   698k|            allocArrayInst,
  324|   698k|            variableLength ? cast<Value>(Builder.createLoadStackInst(nextIndex))
  ------------------
  |  Branch (324:13): [True: 0, False: 698k]
  ------------------
  325|   698k|                           : cast<Value>(Builder.getLiteralNumber(count)),
  326|   698k|            IRBuilder::PropEnumerable::Yes);
  327|   698k|      }
  328|  1.23M|    }
  329|       |    // Update the next index or the count depending on if it's a variable length
  330|       |    // array.
  331|  1.23M|    if (variableLength) {
  ------------------
  |  Branch (331:9): [True: 0, False: 1.23M]
  ------------------
  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|  1.23M|    } else {
  342|  1.23M|      count++;
  343|  1.23M|    }
  344|  1.23M|  }
  345|       |
  346|    101|  if (!allocArrayInst) {
  ------------------
  |  Branch (346:7): [True: 74, False: 27]
  ------------------
  347|     74|    assert(
  348|     74|        !variableLength &&
  349|     74|        "variable length arrays must allocate their own arrays");
  350|     74|    allocArrayInst = Builder.createAllocArrayInst(elements, list.size());
  351|     74|  }
  352|    101|  if (!list.empty() && llvh::isa<ESTree::EmptyNode>(&list.back())) {
  ------------------
  |  Branch (352:7): [True: 27, False: 74]
  |  Branch (352:7): [True: 1, False: 100]
  |  Branch (352:24): [True: 1, False: 26]
  ------------------
  353|       |    // Last element is an elision, VM cannot derive the length properly.
  354|       |    // We have to explicitly set it.
  355|      1|    Value *newLength;
  356|      1|    if (variableLength)
  ------------------
  |  Branch (356:9): [True: 0, False: 1]
  ------------------
  357|      0|      newLength = Builder.createLoadStackInst(nextIndex);
  358|      1|    else
  359|      1|      newLength = Builder.getLiteralNumber(count);
  360|      1|    Builder.createStorePropertyInst(
  361|      1|        newLength, allocArrayInst, llvh::StringRef("length"));
  362|      1|  }
  363|    101|  return allocArrayInst;
  364|    101|}
_ZN6hermes5irgen11ESTreeIRGen12genArrayExprEPNS_6ESTree19ArrayExpressionNodeE:
  366|    101|Value *ESTreeIRGen::genArrayExpr(ESTree::ArrayExpressionNode *Expr) {
  367|    101|  return genArrayFromElements(Expr->_elements);
  368|    101|}
_ZN6hermes5irgen11ESTreeIRGen11genCallExprEPNS_6ESTree18CallExpressionNodeE:
  370|      3|Value *ESTreeIRGen::genCallExpr(ESTree::CallExpressionNode *call) {
  371|      3|  LLVM_DEBUG(llvh::dbgs() << "IRGen 'call' statement/expression.\n");
  ------------------
  |  |  123|      3|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      3|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 3]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      3|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  372|       |
  373|       |  // Check for a direct call to eval().
  374|      3|  if (auto *identNode = llvh::dyn_cast<ESTree::IdentifierNode>(call->_callee)) {
  ------------------
  |  Branch (374:13): [True: 0, False: 3]
  ------------------
  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|      3|  Value *thisVal;
  383|      3|  Value *callee;
  384|       |
  385|       |  // Handle MemberExpression expression calls that sets the 'this' property.
  386|      3|  if (auto *Mem = llvh::dyn_cast<ESTree::MemberExpressionNode>(call->_callee)) {
  ------------------
  |  Branch (386:13): [True: 2, False: 1]
  ------------------
  387|      2|    MemberExpressionResult memResult =
  388|      2|        genMemberExpression(Mem, MemberExpressionOperation::Load);
  389|       |
  390|       |    // Call the callee with obj as the 'this' pointer.
  391|      2|    thisVal = memResult.base;
  392|      2|    callee = memResult.result;
  393|      2|  } else if (
  394|      1|      auto *Mem =
  ------------------
  |  Branch (394:13): [True: 0, False: 1]
  ------------------
  395|      1|          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|      1|  } else {
  403|      1|    thisVal = Builder.getLiteralUndefined();
  404|      1|    callee = genExpression(call->_callee);
  405|      1|  }
  406|       |
  407|      3|  return emitCall(call, callee, thisVal);
  408|      3|}
_ZN6hermes5irgen11ESTreeIRGen19genOptionalCallExprEPNS_6ESTree26OptionalCallExpressionNodeEPNS_10BasicBlockE:
  412|     16|    BasicBlock *shortCircuitBB) {
  413|     16|  PhiInst::ValueListType values;
  414|     16|  PhiInst::BasicBlockListType blocks;
  415|       |
  416|       |  // true when this is the genOptionalCallExpr call containing
  417|       |  // the logic for shortCircuitBB.
  418|     16|  bool isFirstOptional = shortCircuitBB == nullptr;
  419|       |
  420|       |  // If isFirstOptional, the final result will be computed in continueBB and
  421|       |  // returned.
  422|     16|  BasicBlock *continueBB = nullptr;
  423|       |
  424|     16|  if (!shortCircuitBB) {
  ------------------
  |  Branch (424:7): [True: 0, False: 16]
  ------------------
  425|       |    // If shortCircuitBB is null, then this is the outermost in the optional
  426|       |    // chain, so we must create it here and pass it through to every other
  427|       |    // OptionalCallExpression and OptionalMemberExpression in the chain.
  428|      0|    continueBB = Builder.createBasicBlock(Builder.getFunction());
  429|      0|    auto *insertionBB = Builder.getInsertionBlock();
  430|      0|    shortCircuitBB = Builder.createBasicBlock(Builder.getFunction());
  431|      0|    Builder.setInsertionBlock(shortCircuitBB);
  432|      0|    values.push_back(Builder.getLiteralUndefined());
  433|      0|    blocks.push_back(shortCircuitBB);
  434|      0|    Builder.createBranchInst(continueBB);
  435|      0|    Builder.setInsertionBlock(insertionBB);
  436|      0|  }
  437|       |
  438|     16|  Value *thisVal;
  439|     16|  Value *callee;
  440|       |
  441|       |  // Handle MemberExpression expression calls that sets the 'this' property.
  442|     16|  if (auto *me = llvh::dyn_cast<ESTree::MemberExpressionNode>(call->_callee)) {
  ------------------
  |  Branch (442:13): [True: 0, False: 16]
  ------------------
  443|      0|    MemberExpressionResult memResult =
  444|      0|        genMemberExpression(me, MemberExpressionOperation::Load);
  445|       |
  446|       |    // Call the callee with obj as the 'this' pointer.
  447|      0|    thisVal = memResult.base;
  448|      0|    callee = memResult.result;
  449|     16|  } else if (
  450|     16|      auto *ome =
  ------------------
  |  Branch (450:13): [True: 16, False: 0]
  ------------------
  451|     16|          llvh::dyn_cast<ESTree::OptionalMemberExpressionNode>(call->_callee)) {
  452|     16|    MemberExpressionResult memResult = genOptionalMemberExpression(
  453|     16|        ome, shortCircuitBB, MemberExpressionOperation::Load);
  454|       |
  455|       |    // Call the callee with obj as the 'this' pointer.
  456|     16|    thisVal = memResult.base;
  457|     16|    callee = memResult.result;
  458|     16|  } else if (
  459|      0|      auto *oce =
  ------------------
  |  Branch (459:13): [True: 0, False: 0]
  ------------------
  460|      0|          llvh::dyn_cast<ESTree::OptionalCallExpressionNode>(call->_callee)) {
  461|      0|    thisVal = Builder.getLiteralUndefined();
  462|      0|    callee = genOptionalCallExpr(oce, shortCircuitBB);
  463|      0|  } else {
  464|      0|    thisVal = Builder.getLiteralUndefined();
  465|      0|    callee = genExpression(getCallee(call));
  466|      0|  }
  467|       |
  468|     16|  if (call->_optional) {
  ------------------
  |  Branch (468:7): [True: 0, False: 16]
  ------------------
  469|      0|    BasicBlock *evalRHSBB = Builder.createBasicBlock(Builder.getFunction());
  470|       |
  471|       |    // If callee is undefined or null, then return undefined.
  472|       |    // NOTE: We use `obj == null` to account for both null and undefined.
  473|      0|    Builder.createCondBranchInst(
  474|      0|        Builder.createBinaryOperatorInst(
  475|      0|            callee,
  476|      0|            Builder.getLiteralNull(),
  477|      0|            BinaryOperatorInst::OpKind::EqualKind),
  478|      0|        shortCircuitBB,
  479|      0|        evalRHSBB);
  480|       |
  481|       |    // baseValue is not undefined or null.
  482|      0|    Builder.setInsertionBlock(evalRHSBB);
  483|      0|  }
  484|       |
  485|     16|  Value *callResult = emitCall(call, callee, thisVal);
  486|       |
  487|     16|  if (isFirstOptional) {
  ------------------
  |  Branch (487:7): [True: 0, False: 16]
  ------------------
  488|      0|    values.push_back(callResult);
  489|      0|    blocks.push_back(Builder.getInsertionBlock());
  490|      0|    Builder.createBranchInst(continueBB);
  491|       |
  492|      0|    Builder.setInsertionBlock(continueBB);
  493|      0|    return Builder.createPhiInst(values, blocks);
  494|      0|  }
  495|       |
  496|       |  // If this isn't the first optional, no Phi needed, just return the
  497|       |  // callResult.
  498|     16|  return callResult;
  499|     16|}
_ZN6hermes5irgen11ESTreeIRGen8emitCallEPNS_6ESTree22CallExpressionLikeNodeEPNS_5ValueES6_:
  631|     19|    Value *thisVal) {
  632|     19|  bool hasSpread = false;
  633|     19|  for (auto &arg : getArguments(call)) {
  ------------------
  |  Branch (633:18): [True: 2, False: 19]
  ------------------
  634|      2|    if (llvh::isa<ESTree::SpreadElementNode>(&arg)) {
  ------------------
  |  Branch (634:9): [True: 0, False: 2]
  ------------------
  635|      0|      hasSpread = true;
  636|      0|    }
  637|      2|  }
  638|       |
  639|     19|  if (!hasSpread) {
  ------------------
  |  Branch (639:7): [True: 19, False: 0]
  ------------------
  640|     19|    CallInst::ArgumentList args;
  641|     19|    for (auto &arg : getArguments(call)) {
  ------------------
  |  Branch (641:20): [True: 2, False: 19]
  ------------------
  642|      2|      args.push_back(genExpression(&arg));
  643|      2|    }
  644|       |
  645|     19|    return Builder.createCallInst(
  646|     19|        getTextifiedCallExpr(Builder, getCallee(call)), callee, thisVal, args);
  647|     19|  }
  648|       |
  649|       |  // Otherwise, there exists a spread argument, so the number of arguments
  650|       |  // is variable.
  651|       |  // Generate IR for this by creating an array and populating it with the
  652|       |  // arguments, then calling HermesInternal.apply.
  653|      0|  auto *args = genArrayFromElements(getArguments(call));
  654|      0|  return genBuiltinCall(
  655|      0|      BuiltinMethod::HermesBuiltin_apply, {callee, args, thisVal});
  656|     19|}
_ZN6hermes5irgen11ESTreeIRGen19genMemberExpressionEPNS_6ESTree20MemberExpressionNodeENS1_25MemberExpressionOperationE:
  660|  17.5k|    MemberExpressionOperation op) {
  661|  17.5k|  Value *baseValue = genExpression(mem->_object);
  662|  17.5k|  Value *prop = genMemberExpressionProperty(mem);
  663|  17.5k|  switch (op) {
  ------------------
  |  Branch (663:11): [True: 0, False: 17.5k]
  ------------------
  664|  17.5k|    case MemberExpressionOperation::Load:
  ------------------
  |  Branch (664:5): [True: 17.5k, False: 0]
  ------------------
  665|  17.5k|      return MemberExpressionResult{
  666|  17.5k|          Builder.createLoadPropertyInst(baseValue, prop), baseValue};
  667|      0|    case MemberExpressionOperation::Delete:
  ------------------
  |  Branch (667:5): [True: 0, False: 17.5k]
  ------------------
  668|      0|      return MemberExpressionResult{
  669|      0|          Builder.createDeletePropertyInst(baseValue, prop), baseValue};
  670|  17.5k|  }
  671|      0|  llvm_unreachable("No other kind of member expression");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  672|  17.5k|}
_ZN6hermes5irgen11ESTreeIRGen27genOptionalMemberExpressionEPNS_6ESTree28OptionalMemberExpressionNodeEPNS_10BasicBlockENS1_25MemberExpressionOperationE:
  677|  25.9k|    MemberExpressionOperation op) {
  678|  25.9k|  PhiInst::ValueListType values;
  679|  25.9k|  PhiInst::BasicBlockListType blocks;
  680|       |
  681|       |  // true when this is the genOptionalMemberExpression call containing
  682|       |  // the logic for shortCircuitBB.
  683|  25.9k|  bool isFirstOptional = shortCircuitBB == nullptr;
  684|       |
  685|       |  // If isFirstOptional, the final result will be computed in continueBB and
  686|       |  // returned.
  687|  25.9k|  BasicBlock *continueBB = nullptr;
  688|       |
  689|  25.9k|  if (isFirstOptional) {
  ------------------
  |  Branch (689:7): [True: 725, False: 25.1k]
  ------------------
  690|       |    // If shortCircuitBB is null, then this is the outermost in the optional
  691|       |    // chain, so we must create it here and pass it through to every other
  692|       |    // OptionalCallExpression and OptionalMemberExpression in the chain.
  693|    725|    continueBB = Builder.createBasicBlock(Builder.getFunction());
  694|    725|    auto *insertionBB = Builder.getInsertionBlock();
  695|    725|    shortCircuitBB = Builder.createBasicBlock(Builder.getFunction());
  696|    725|    Builder.setInsertionBlock(shortCircuitBB);
  697|    725|    values.push_back(Builder.getLiteralUndefined());
  698|    725|    blocks.push_back(shortCircuitBB);
  699|    725|    Builder.createBranchInst(continueBB);
  700|    725|    Builder.setInsertionBlock(insertionBB);
  701|    725|  }
  702|       |
  703|  25.9k|  Value *baseValue = nullptr;
  704|  25.9k|  if (ESTree::OptionalMemberExpressionNode *ome =
  ------------------
  |  Branch (704:45): [True: 25.1k, False: 741]
  ------------------
  705|  25.9k|          llvh::dyn_cast<ESTree::OptionalMemberExpressionNode>(mem->_object)) {
  706|  25.1k|    baseValue = genOptionalMemberExpression(
  707|  25.1k|                    ome, shortCircuitBB, MemberExpressionOperation::Load)
  708|  25.1k|                    .result;
  709|  25.1k|  } else if (
  710|    741|      ESTree::OptionalCallExpressionNode *oce =
  ------------------
  |  Branch (710:43): [True: 16, False: 725]
  ------------------
  711|    741|          llvh::dyn_cast<ESTree::OptionalCallExpressionNode>(mem->_object)) {
  712|     16|    baseValue = genOptionalCallExpr(oce, shortCircuitBB);
  713|    725|  } else {
  714|    725|    baseValue = genExpression(mem->_object);
  715|    725|  }
  716|       |
  717|  25.9k|  if (mem->_optional) {
  ------------------
  |  Branch (717:7): [True: 949, False: 24.9k]
  ------------------
  718|    949|    BasicBlock *evalRHSBB = Builder.createBasicBlock(Builder.getFunction());
  719|       |
  720|       |    // If baseValue is undefined or null, then return undefined.
  721|       |    // NOTE: We use `obj == null` to account for both null and undefined.
  722|    949|    Builder.createCondBranchInst(
  723|    949|        Builder.createBinaryOperatorInst(
  724|    949|            baseValue,
  725|    949|            Builder.getLiteralNull(),
  726|    949|            BinaryOperatorInst::OpKind::EqualKind),
  727|    949|        shortCircuitBB,
  728|    949|        evalRHSBB);
  729|       |
  730|       |    // baseValue is not undefined, look up the property properly.
  731|    949|    Builder.setInsertionBlock(evalRHSBB);
  732|    949|  }
  733|       |
  734|  25.9k|  Value *prop = genMemberExpressionProperty(mem);
  735|  25.9k|  Value *result = nullptr;
  736|  25.9k|  switch (op) {
  ------------------
  |  Branch (736:11): [True: 0, False: 25.9k]
  ------------------
  737|  25.9k|    case MemberExpressionOperation::Load:
  ------------------
  |  Branch (737:5): [True: 25.9k, False: 0]
  ------------------
  738|  25.9k|      result = Builder.createLoadPropertyInst(baseValue, prop);
  739|  25.9k|      break;
  740|      0|    case MemberExpressionOperation::Delete:
  ------------------
  |  Branch (740:5): [True: 0, False: 25.9k]
  ------------------
  741|      0|      result = Builder.createDeletePropertyInst(baseValue, prop);
  742|      0|      break;
  743|  25.9k|  }
  744|  25.9k|  assert(result && "result must be set");
  745|       |
  746|  25.9k|  if (isFirstOptional) {
  ------------------
  |  Branch (746:7): [True: 725, False: 25.1k]
  ------------------
  747|    725|    values.push_back(result);
  748|    725|    blocks.push_back(Builder.getInsertionBlock());
  749|    725|    Builder.createBranchInst(continueBB);
  750|       |
  751|    725|    Builder.setInsertionBlock(continueBB);
  752|    725|    return {Builder.createPhiInst(values, blocks), baseValue};
  753|    725|  }
  754|       |
  755|       |  // If this isn't the first optional, no Phi needed, just return the result.
  756|  25.1k|  return {result, baseValue};
  757|  25.9k|}
_ZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS_6ESTree20ObjectExpressionNodeE:
  819|      2|Value *ESTreeIRGen::genObjectExpr(ESTree::ObjectExpressionNode *Expr) {
  820|      2|  LLVM_DEBUG(llvh::dbgs() << "Initializing a new object\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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  821|       |
  822|       |  /// Store information about a property. Is it an accessor (getter/setter) or
  823|       |  /// a value, and the actual value.
  824|      2|  class PropertyValue {
  825|      2|   public:
  826|       |    /// Is this a getter/setter value.
  827|      2|    bool isAccessor = false;
  828|       |    /// Tracks the state of generating IR for this value.
  829|      2|    enum { None, Placeholder, IRGenerated } state{None};
  830|       |    /// The value, if this is a regular property
  831|      2|    ESTree::Node *valueNode{};
  832|       |    /// Getter accessor, if this is an accessor property.
  833|      2|    ESTree::FunctionExpressionNode *getterNode{};
  834|       |    /// Setter accessor, if this is an accessor property.
  835|      2|    ESTree::FunctionExpressionNode *setterNode{};
  836|       |
  837|      2|    SMRange getSourceRange() {
  838|      2|      if (valueNode) {
  839|      2|        return valueNode->getSourceRange();
  840|      2|      }
  841|       |
  842|      2|      if (getterNode) {
  843|      2|        return getterNode->getSourceRange();
  844|      2|      }
  845|       |
  846|      2|      if (setterNode) {
  847|      2|        return setterNode->getSourceRange();
  848|      2|      }
  849|       |
  850|      2|      llvm_unreachable("Unset node has no location info");
  851|      2|    }
  852|       |
  853|      2|    void setValue(ESTree::Node *val) {
  854|      2|      isAccessor = false;
  855|      2|      valueNode = val;
  856|      2|      getterNode = setterNode = nullptr;
  857|      2|    }
  858|      2|    void setGetter(ESTree::FunctionExpressionNode *get) {
  859|      2|      if (!isAccessor) {
  860|      2|        valueNode = nullptr;
  861|      2|        setterNode = nullptr;
  862|      2|        isAccessor = true;
  863|      2|      }
  864|      2|      getterNode = get;
  865|      2|    }
  866|      2|    void setSetter(ESTree::FunctionExpressionNode *set) {
  867|      2|      if (!isAccessor) {
  868|      2|        valueNode = nullptr;
  869|      2|        getterNode = nullptr;
  870|      2|        isAccessor = true;
  871|      2|      }
  872|      2|      setterNode = set;
  873|      2|    }
  874|      2|  };
  875|       |
  876|       |  // First accumulate all getters and setters. We walk all properties, convert
  877|       |  // them to string and store the value into propMap, possibly overwriting the
  878|       |  // previous value.
  879|       |  // Note that computed properties are not stored in the propMap as we do not
  880|       |  // know the keys at compilation time.
  881|      2|  llvh::StringMap<PropertyValue> propMap;
  882|       |  // The first location where a given property name is encountered.
  883|      2|  llvh::StringMap<SMRange> firstLocMap;
  884|      2|  llvh::SmallVector<char, 32> stringStorage;
  885|       |  /// The optional __proto__ property.
  886|      2|  ESTree::PropertyNode *protoProperty = nullptr;
  887|       |
  888|      2|  uint32_t numComputed = 0;
  889|       |
  890|      2|  for (auto &P : Expr->_properties) {
  ------------------
  |  Branch (890:16): [True: 1, False: 2]
  ------------------
  891|      1|    if (llvh::isa<ESTree::SpreadElementNode>(&P)) {
  ------------------
  |  Branch (891:9): [True: 0, False: 1]
  ------------------
  892|      0|      continue;
  893|      0|    }
  894|       |
  895|       |    // We are reusing the storage, so make sure it is cleared at every
  896|       |    // iteration.
  897|      1|    stringStorage.clear();
  898|       |
  899|      1|    auto *prop = cast<ESTree::PropertyNode>(&P);
  900|      1|    if (prop->_computed) {
  ------------------
  |  Branch (900:9): [True: 0, False: 1]
  ------------------
  901|       |      // Can't store any useful information if the name is computed.
  902|       |      // Just generate the code in the next loop.
  903|      0|      ++numComputed;
  904|      0|      continue;
  905|      0|    }
  906|       |
  907|      1|    auto propName = propertyKeyAsString(stringStorage, prop->_key);
  908|       |
  909|       |    // protoProperty should only be recorded if the property is not a method
  910|       |    // nor a shorthand value.
  911|      1|    if (prop->_kind->str() == "init" && propName == "__proto__" &&
  ------------------
  |  Branch (911:9): [True: 1, False: 0]
  |  Branch (911:41): [True: 0, False: 1]
  ------------------
  912|      1|        !prop->_method && !prop->_shorthand) {
  ------------------
  |  Branch (912:9): [True: 0, False: 0]
  |  Branch (912:27): [True: 0, False: 0]
  ------------------
  913|      0|      if (!protoProperty) {
  ------------------
  |  Branch (913:11): [True: 0, False: 0]
  ------------------
  914|      0|        protoProperty = prop;
  915|      0|      } else {
  916|      0|        Builder.getModule()->getContext().getSourceErrorManager().error(
  917|      0|            prop->getSourceRange(),
  918|      0|            "__proto__ was set multiple times in the object definition.");
  919|      0|        Builder.getModule()->getContext().getSourceErrorManager().note(
  920|      0|            protoProperty->getSourceRange(), "The first definition was here.");
  921|      0|      }
  922|      0|      continue;
  923|      0|    }
  924|       |
  925|      1|    PropertyValue *propValue = &propMap[propName];
  926|      1|    if (prop->_kind->str() == "get") {
  ------------------
  |  Branch (926:9): [True: 0, False: 1]
  ------------------
  927|      0|      propValue->setGetter(cast<ESTree::FunctionExpressionNode>(prop->_value));
  928|      1|    } else if (prop->_kind->str() == "set") {
  ------------------
  |  Branch (928:16): [True: 0, False: 1]
  ------------------
  929|      0|      propValue->setSetter(cast<ESTree::FunctionExpressionNode>(prop->_value));
  930|      1|    } else {
  931|      1|      assert(prop->_kind->str() == "init" && "invalid PropertyNode kind");
  932|       |      // We record the propValue if this is a regular property
  933|      1|      propValue->setValue(prop->_value);
  934|      1|    }
  935|       |
  936|      1|    std::string key = (prop->_kind->str() + propName).str();
  937|      1|    auto iterAndSuccess = firstLocMap.try_emplace(key, prop->getSourceRange());
  938|      1|    if (!iterAndSuccess.second) {
  ------------------
  |  Branch (938:9): [True: 0, False: 1]
  ------------------
  939|      0|      Builder.getModule()->getContext().getSourceErrorManager().warning(
  940|      0|          prop->getSourceRange(),
  941|      0|          Twine("the property \"") + propName +
  942|      0|              "\" was set multiple times in the object definition.");
  943|       |
  944|      0|      Builder.getModule()->getContext().getSourceErrorManager().note(
  945|      0|          iterAndSuccess.first->second, "The first definition was here.");
  946|      0|    }
  947|      1|  }
  948|       |
  949|       |  /// Attempt to determine whether we can directly use the value of the
  950|       |  /// __proto__ property as a parent when creating the object for an object
  951|       |  /// initializer, instead of setting it later with
  952|       |  /// HermesInternal.silentSetPrototypeOf(). That is not possible to determine
  953|       |  /// statically in the general case, but we can check for the simple cases:
  954|       |  /// - __proto__ property is first.
  955|       |  /// - the value of __proto__ is constant.
  956|      2|  Value *objectParent = nullptr;
  957|      2|  if (protoProperty &&
  ------------------
  |  Branch (957:7): [True: 0, False: 2]
  ------------------
  958|      2|      (&Expr->_properties.front() == protoProperty ||
  ------------------
  |  Branch (958:8): [True: 0, False: 0]
  ------------------
  959|      0|       isConstantExpr(protoProperty->_value))) {
  ------------------
  |  Branch (959:8): [True: 0, False: 0]
  ------------------
  960|      0|    objectParent = genExpression(protoProperty->_value);
  961|      0|  }
  962|       |
  963|       |  // Allocate a new javascript object on the heap.
  964|      2|  auto Obj =
  965|      2|      Builder.createAllocObjectInst(propMap.size() + numComputed, objectParent);
  966|       |
  967|       |  // haveSeenComputedProp tracks whether we have processed a computed property.
  968|       |  // Once we do, for all future properties, we can no longer generate
  969|       |  // StoreNewOwnPropertyInst because the computed property could have already
  970|       |  // defined any property.
  971|      2|  bool haveSeenComputedProp = false;
  972|       |
  973|       |  // Initialize all properties. We check whether the value of each property
  974|       |  // will be overwritten (by comparing against what we have saved in propMap).
  975|       |  // In that case we still compute the value (it could have side effects), but
  976|       |  // we don't store it. The exception to this are accessor functions - there
  977|       |  // is no need to create them if we don't use them because creating a function
  978|       |  // has no side effects.
  979|      2|  for (auto &P : Expr->_properties) {
  ------------------
  |  Branch (979:16): [True: 1, False: 2]
  ------------------
  980|      1|    if (auto *spread = llvh::dyn_cast<ESTree::SpreadElementNode>(&P)) {
  ------------------
  |  Branch (980:15): [True: 0, False: 1]
  ------------------
  981|      0|      genBuiltinCall(
  982|      0|          BuiltinMethod::HermesBuiltin_copyDataProperties,
  983|      0|          {Obj, genExpression(spread->_argument)});
  984|      0|      haveSeenComputedProp = true;
  985|      0|      continue;
  986|      0|    }
  987|       |
  988|       |    // We are reusing the storage, so make sure it is cleared at every
  989|       |    // iteration.
  990|      1|    stringStorage.clear();
  991|       |
  992|      1|    auto *prop = cast<ESTree::PropertyNode>(&P);
  993|       |
  994|      1|    if (prop->_computed) {
  ------------------
  |  Branch (994:9): [True: 0, False: 1]
  ------------------
  995|       |      // TODO (T46136220): Set the .name property for anonymous functions that
  996|       |      // are values for computed property keys.
  997|      0|      auto *key = genExpression(prop->_key);
  998|      0|      auto *value = genExpression(prop->_value);
  999|      0|      if (prop->_kind->str() == "get") {
  ------------------
  |  Branch (999:11): [True: 0, False: 0]
  ------------------
 1000|      0|        Builder.createStoreGetterSetterInst(
 1001|      0|            value,
 1002|      0|            Builder.getLiteralUndefined(),
 1003|      0|            Obj,
 1004|      0|            key,
 1005|      0|            IRBuilder::PropEnumerable::Yes);
 1006|      0|      } else if (prop->_kind->str() == "set") {
  ------------------
  |  Branch (1006:18): [True: 0, False: 0]
  ------------------
 1007|      0|        Builder.createStoreGetterSetterInst(
 1008|      0|            Builder.getLiteralUndefined(),
 1009|      0|            value,
 1010|      0|            Obj,
 1011|      0|            key,
 1012|      0|            IRBuilder::PropEnumerable::Yes);
 1013|      0|      } else {
 1014|      0|        Builder.createStoreOwnPropertyInst(
 1015|      0|            value, Obj, key, IRBuilder::PropEnumerable::Yes);
 1016|      0|      }
 1017|      0|      haveSeenComputedProp = true;
 1018|      0|      continue;
 1019|      0|    }
 1020|       |
 1021|      1|    llvh::StringRef keyStr = propertyKeyAsString(stringStorage, prop->_key);
 1022|       |
 1023|      1|    if (prop == protoProperty) {
  ------------------
  |  Branch (1023:9): [True: 0, False: 1]
  ------------------
 1024|       |      // This is the first definition of __proto__. If we already used it
 1025|       |      // as an object parent we just skip it, but otherwise we must
 1026|       |      // explicitly set the parent now by calling \c
 1027|       |      // HermesInternal.silentSetPrototypeOf().
 1028|      0|      if (!objectParent) {
  ------------------
  |  Branch (1028:11): [True: 0, False: 0]
  ------------------
 1029|      0|        auto *parent = genExpression(prop->_value);
 1030|       |
 1031|      0|        IRBuilder::SaveRestore saveState{Builder};
 1032|      0|        Builder.setLocation(prop->_key->getDebugLoc());
 1033|       |
 1034|      0|        genBuiltinCall(
 1035|      0|            BuiltinMethod::HermesBuiltin_silentSetPrototypeOf, {Obj, parent});
 1036|      0|      }
 1037|       |
 1038|      0|      continue;
 1039|      0|    }
 1040|       |
 1041|      1|    PropertyValue *propValue = &propMap[keyStr];
 1042|       |
 1043|       |    // For any node that has a corresponding propValue, we need to ensure that
 1044|       |    // the we insert either a placeholder or the final IR before the end of this
 1045|       |    // iteration.
 1046|      1|    auto checkState = llvh::make_scope_exit(
 1047|      1|        [&] { assert(propValue->state != PropertyValue::None); });
 1048|       |
 1049|      1|    auto *Key = Builder.getLiteralString(keyStr);
 1050|       |
 1051|      1|    auto maybeInsertPlaceholder = [&] {
 1052|      1|      if (propValue->state == PropertyValue::None) {
 1053|       |        // This value is going to be overwritten, but insert a placeholder in
 1054|       |        // order to maintain insertion order.
 1055|      1|        if (haveSeenComputedProp) {
 1056|      1|          Builder.createStoreOwnPropertyInst(
 1057|      1|              Builder.getLiteralNull(),
 1058|      1|              Obj,
 1059|      1|              Key,
 1060|      1|              IRBuilder::PropEnumerable::Yes);
 1061|      1|        } else {
 1062|      1|          Builder.createStoreNewOwnPropertyInst(
 1063|      1|              Builder.getLiteralNull(),
 1064|      1|              Obj,
 1065|      1|              Key,
 1066|      1|              IRBuilder::PropEnumerable::Yes);
 1067|      1|        }
 1068|      1|        propValue->state = PropertyValue::Placeholder;
 1069|      1|      }
 1070|      1|    };
 1071|       |
 1072|      1|    if (prop->_kind->str() == "get" || prop->_kind->str() == "set") {
  ------------------
  |  Branch (1072:9): [True: 0, False: 1]
  |  Branch (1072:40): [True: 0, False: 1]
  ------------------
 1073|       |      // If  we already generated it, skip.
 1074|      0|      if (propValue->state == PropertyValue::IRGenerated)
  ------------------
  |  Branch (1074:11): [True: 0, False: 0]
  ------------------
 1075|      0|        continue;
 1076|       |
 1077|      0|      if (!propValue->isAccessor) {
  ------------------
  |  Branch (1077:11): [True: 0, False: 0]
  ------------------
 1078|      0|        maybeInsertPlaceholder();
 1079|      0|        continue;
 1080|      0|      }
 1081|       |
 1082|      0|      Value *getter = Builder.getLiteralUndefined();
 1083|      0|      Value *setter = Builder.getLiteralUndefined();
 1084|       |
 1085|      0|      if (propValue->getterNode) {
  ------------------
  |  Branch (1085:11): [True: 0, False: 0]
  ------------------
 1086|      0|        getter = genExpression(
 1087|      0|            propValue->getterNode,
 1088|      0|            Builder.createIdentifier("get " + keyStr.str()));
 1089|      0|      }
 1090|       |
 1091|      0|      if (propValue->setterNode) {
  ------------------
  |  Branch (1091:11): [True: 0, False: 0]
  ------------------
 1092|      0|        setter = genExpression(
 1093|      0|            propValue->setterNode,
 1094|      0|            Builder.createIdentifier("set " + keyStr.str()));
 1095|      0|      }
 1096|       |
 1097|      0|      Builder.createStoreGetterSetterInst(
 1098|      0|          getter, setter, Obj, Key, IRBuilder::PropEnumerable::Yes);
 1099|       |
 1100|      0|      propValue->state = PropertyValue::IRGenerated;
 1101|       |
 1102|      0|      continue;
 1103|      0|    }
 1104|       |
 1105|       |    // Always generate the values, even if we don't need it, for the side
 1106|       |    // effects.
 1107|      1|    auto value = genExpression(prop->_value, Builder.createIdentifier(keyStr));
 1108|       |
 1109|       |    // Only store the value if it won't be overwritten.
 1110|      1|    if (propMap[keyStr].valueNode == prop->_value) {
  ------------------
  |  Branch (1110:9): [True: 1, False: 0]
  ------------------
 1111|      1|      assert(
 1112|      1|          propValue->state != PropertyValue::IRGenerated &&
 1113|      1|          "IR can only be generated once");
 1114|      1|      if (haveSeenComputedProp ||
  ------------------
  |  Branch (1114:11): [True: 0, False: 1]
  ------------------
 1115|      1|          propValue->state == PropertyValue::Placeholder) {
  ------------------
  |  Branch (1115:11): [True: 0, False: 1]
  ------------------
 1116|      0|        Builder.createStoreOwnPropertyInst(
 1117|      0|            value, Obj, Key, IRBuilder::PropEnumerable::Yes);
 1118|      1|      } else {
 1119|      1|        Builder.createStoreNewOwnPropertyInst(
 1120|      1|            value, Obj, Key, IRBuilder::PropEnumerable::Yes);
 1121|      1|      }
 1122|      1|      propValue->state = PropertyValue::IRGenerated;
 1123|      1|    } else {
 1124|      0|      maybeInsertPlaceholder();
 1125|      0|    }
 1126|      1|  }
 1127|       |
 1128|       |  // Return the newly allocated object (because this is an expression, not a
 1129|       |  // statement).
 1130|      2|  return Obj;
 1131|      2|}
_ZN6hermes5irgen11ESTreeIRGen15genSequenceExprEPNS_6ESTree22SequenceExpressionNodeE:
 1133|     98|Value *ESTreeIRGen::genSequenceExpr(ESTree::SequenceExpressionNode *Sq) {
 1134|     98|  Value *result = Builder.getLiteralUndefined();
 1135|       |
 1136|       |  // Generate all expressions in the sequence, but take only the last one.
 1137|    196|  for (auto &Ex : Sq->_expressions) {
  ------------------
  |  Branch (1137:17): [True: 196, False: 98]
  ------------------
 1138|    196|    result = genExpression(&Ex);
 1139|    196|  }
 1140|       |
 1141|     98|  return result;
 1142|     98|}
_ZN6hermes5irgen11ESTreeIRGen19genBinaryExpressionEPNS_6ESTree20BinaryExpressionNodeE:
 1456|   103k|Value *ESTreeIRGen::genBinaryExpression(ESTree::BinaryExpressionNode *bin) {
 1457|       |  // Handle long chains of +/- non-recursively.
 1458|   103k|  if (bin->_operator->str() == "+" || bin->_operator->str() == "-") {
  ------------------
  |  Branch (1458:7): [True: 2.38k, False: 101k]
  |  Branch (1458:39): [True: 523, False: 101k]
  ------------------
 1459|  2.91k|    auto list = linearizeLeft(bin, {"+", "-"});
 1460|       |
 1461|  2.91k|    Value *LHS = genExpression(list[0]->_left);
 1462|  34.8k|    for (auto *e : list) {
  ------------------
  |  Branch (1462:18): [True: 34.8k, False: 2.91k]
  ------------------
 1463|  34.8k|      Value *RHS = genExpression(e->_right);
 1464|  34.8k|      Builder.setLocation(e->getDebugLoc());
 1465|  34.8k|      auto cookie = instrumentIR_.preBinaryExpression(e, LHS, RHS);
 1466|  34.8k|      auto Kind = BinaryOperatorInst::parseOperator(e->_operator->str());
 1467|  34.8k|      BinaryOperatorInst *result =
 1468|  34.8k|          Builder.createBinaryOperatorInst(LHS, RHS, Kind);
 1469|  34.8k|      LHS = instrumentIR_.postBinaryExpression(e, cookie, result, LHS, RHS);
 1470|  34.8k|    }
 1471|       |
 1472|  2.91k|    return LHS;
 1473|  2.91k|  }
 1474|       |
 1475|   101k|  Value *LHS = genExpression(bin->_left);
 1476|   101k|  Value *RHS = genExpression(bin->_right);
 1477|   101k|  auto cookie = instrumentIR_.preBinaryExpression(bin, LHS, RHS);
 1478|       |
 1479|   101k|  auto Kind = BinaryOperatorInst::parseOperator(bin->_operator->str());
 1480|       |
 1481|   101k|  BinaryOperatorInst *result = Builder.createBinaryOperatorInst(LHS, RHS, Kind);
 1482|   101k|  return instrumentIR_.postBinaryExpression(bin, cookie, result, LHS, RHS);
 1483|   103k|}
_ZN6hermes5irgen11ESTreeIRGen18genUnaryExpressionEPNS_6ESTree19UnaryExpressionNodeE:
 1485|  25.9k|Value *ESTreeIRGen::genUnaryExpression(ESTree::UnaryExpressionNode *U) {
 1486|  25.9k|  auto kind = UnaryOperatorInst::parseOperator(U->_operator->str());
 1487|       |
 1488|       |  // Handle the delete unary expression. https://es5.github.io/#x11.4.1
 1489|  25.9k|  if (kind == UnaryOperatorInst::OpKind::DeleteKind) {
  ------------------
  |  Branch (1489:7): [True: 0, False: 25.9k]
  ------------------
 1490|      0|    if (auto *memberExpr =
  ------------------
  |  Branch (1490:15): [True: 0, False: 0]
  ------------------
 1491|      0|            llvh::dyn_cast<ESTree::MemberExpressionNode>(U->_argument)) {
 1492|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1493|       |
 1494|      0|      return genMemberExpression(memberExpr, MemberExpressionOperation::Delete)
 1495|      0|          .result;
 1496|      0|    }
 1497|       |
 1498|      0|    if (auto *memberExpr = llvh::dyn_cast<ESTree::OptionalMemberExpressionNode>(
  ------------------
  |  Branch (1498:15): [True: 0, False: 0]
  ------------------
 1499|      0|            U->_argument)) {
 1500|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1501|       |
 1502|      0|      return genOptionalMemberExpression(
 1503|      0|                 memberExpr, nullptr, MemberExpressionOperation::Delete)
 1504|      0|          .result;
 1505|      0|    }
 1506|       |
 1507|       |    // Check for "delete identifier". Note that deleting unqualified identifiers
 1508|       |    // is prohibited in strict mode, so that case is handled earlier in the
 1509|       |    // semantic validator. Here we are left to handle the non-strict mode case.
 1510|      0|    if (auto *iden = llvh::dyn_cast<ESTree::IdentifierNode>(U->_argument)) {
  ------------------
  |  Branch (1510:15): [True: 0, False: 0]
  ------------------
 1511|      0|      assert(
 1512|      0|          !curFunction()->function->isStrictMode() &&
 1513|      0|          "delete identifier encountered in strict mode");
 1514|       |      // Check if this is a known variable.
 1515|      0|      Identifier name = getNameFieldFromID(iden);
 1516|      0|      auto *var = nameTable_.lookup(name);
 1517|       |
 1518|      0|      if (!var || llvh::isa<GlobalObjectProperty>(var)) {
  ------------------
  |  Branch (1518:11): [True: 0, False: 0]
  |  Branch (1518:19): [True: 0, False: 0]
  ------------------
 1519|       |        // If the variable doesn't exist or if it is global, we must generate
 1520|       |        // a delete global property instruction.
 1521|      0|        return Builder.createDeletePropertyInst(
 1522|      0|            Builder.getGlobalObject(), Builder.getLiteralString(name));
 1523|      0|      } else {
 1524|       |        // Otherwise it is a local variable which can't be deleted and we just
 1525|       |        // return false.
 1526|      0|        return Builder.getLiteralBool(false);
 1527|      0|      }
 1528|      0|    }
 1529|       |
 1530|       |    // Generate the code for the delete operand.
 1531|      0|    genExpression(U->_argument);
 1532|       |
 1533|       |    // Deleting any value or a result of an expression returns True.
 1534|      0|    return Builder.getLiteralBool(true);
 1535|      0|  }
 1536|       |
 1537|       |  // Need to handle the special case of "typeof <undefined variable>".
 1538|  25.9k|  if (kind == UnaryOperatorInst::OpKind::TypeofKind) {
  ------------------
  |  Branch (1538:7): [True: 10, False: 25.8k]
  ------------------
 1539|     10|    if (auto *id = llvh::dyn_cast<ESTree::IdentifierNode>(U->_argument)) {
  ------------------
  |  Branch (1539:15): [True: 0, False: 10]
  ------------------
 1540|      0|      Value *argument = genIdentifierExpression(id, true);
 1541|      0|      return Builder.createUnaryOperatorInst(argument, kind);
 1542|      0|    }
 1543|     10|  }
 1544|       |
 1545|       |  // Generate the unary operand:
 1546|  25.9k|  Value *argument = genExpression(U->_argument);
 1547|  25.9k|  auto *cookie = instrumentIR_.preUnaryExpression(U, argument);
 1548|       |
 1549|  25.9k|  Value *result;
 1550|  25.9k|  if (kind == UnaryOperatorInst::OpKind::PlusKind)
  ------------------
  |  Branch (1550:7): [True: 509, False: 25.3k]
  ------------------
 1551|    509|    result = Builder.createAsNumberInst(argument);
 1552|  25.3k|  else
 1553|  25.3k|    result = Builder.createUnaryOperatorInst(argument, kind);
 1554|  25.9k|  return instrumentIR_.postUnaryExpression(U, cookie, result, argument);
 1555|  25.9k|}
_ZN6hermes5irgen11ESTreeIRGen13genUpdateExprEPNS_6ESTree20UpdateExpressionNodeE:
 1557|      1|Value *ESTreeIRGen::genUpdateExpr(ESTree::UpdateExpressionNode *updateExpr) {
 1558|      1|  LLVM_DEBUG(llvh::dbgs() << "IRGen update expression.\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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1559|      1|  bool isPrefix = updateExpr->_prefix;
 1560|       |
 1561|      1|  UnaryOperatorInst::OpKind opKind;
 1562|      1|  if (updateExpr->_operator->str() == "++") {
  ------------------
  |  Branch (1562:7): [True: 1, False: 0]
  ------------------
 1563|      1|    opKind = UnaryOperatorInst::OpKind::IncKind;
 1564|      1|  } else if (updateExpr->_operator->str() == "--") {
  ------------------
  |  Branch (1564:14): [True: 0, False: 0]
  ------------------
 1565|      0|    opKind = UnaryOperatorInst::OpKind::DecKind;
 1566|      0|  } else {
 1567|      0|    llvm_unreachable("Invalid update operator");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1568|      0|  }
 1569|       |
 1570|      1|  LReference lref = createLRef(updateExpr->_argument, false);
 1571|       |
 1572|       |  // Load the original value. Postfix updates need to convert it toNumeric
 1573|       |  // before Inc/Dec to ensure the updateExpr has the proper result value.
 1574|      1|  Value *original =
 1575|      1|      isPrefix ? lref.emitLoad() : Builder.createAsNumericInst(lref.emitLoad());
  ------------------
  |  Branch (1575:7): [True: 1, False: 0]
  ------------------
 1576|       |
 1577|       |  // Create the inc or dec.
 1578|      1|  Value *result = Builder.createUnaryOperatorInst(original, opKind);
 1579|       |
 1580|       |  // Store the result.
 1581|      1|  lref.emitStore(result);
 1582|       |
 1583|       |  // Depending on the prefixness return the previous value or the modified
 1584|       |  // value.
 1585|      1|  return (isPrefix ? result : original);
  ------------------
  |  Branch (1585:11): [True: 1, False: 0]
  ------------------
 1586|      1|}
_ZN6hermes5irgen11ESTreeIRGen17genAssignmentExprEPNS_6ESTree24AssignmentExpressionNodeE:
 1599|  4.55k|Value *ESTreeIRGen::genAssignmentExpr(ESTree::AssignmentExpressionNode *AE) {
 1600|  4.55k|  LLVM_DEBUG(llvh::dbgs() << "IRGen assignment operator.\n");
  ------------------
  |  |  123|  4.55k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  4.55k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 4.55k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  4.55k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1601|       |
 1602|  4.55k|  auto opStr = AE->_operator->str();
 1603|       |
 1604|       |  // Handle nested normal assignments non-recursively.
 1605|  4.55k|  if (opStr == "=") {
  ------------------
  |  Branch (1605:7): [True: 4.55k, False: 0]
  ------------------
 1606|  4.55k|    auto list = ESTree::linearizeRight(AE, {"="});
 1607|       |
 1608|       |    // Create an LReference for every assignment left side.
 1609|  4.55k|    llvh::SmallVector<LReference, 1> lrefs;
 1610|  4.55k|    lrefs.reserve(list.size());
 1611|  4.56k|    for (auto *e : list) {
  ------------------
  |  Branch (1611:18): [True: 4.56k, False: 4.55k]
  ------------------
 1612|  4.56k|      lrefs.push_back(createLRef(e->_left, false));
 1613|  4.56k|    }
 1614|       |
 1615|  4.55k|    Value *RHS = nullptr;
 1616|  4.55k|    auto lrefIterator = lrefs.end();
 1617|  4.56k|    for (auto *e : llvh::make_range(list.rbegin(), list.rend())) {
  ------------------
  |  Branch (1617:18): [True: 4.56k, False: 4.55k]
  ------------------
 1618|  4.56k|      --lrefIterator;
 1619|  4.56k|      if (!RHS)
  ------------------
  |  Branch (1619:11): [True: 4.55k, False: 8]
  ------------------
 1620|  4.55k|        RHS = genExpression(e->_right, extractNameHint(*lrefIterator));
 1621|  4.56k|      Builder.setLocation(e->getDebugLoc());
 1622|  4.56k|      auto *cookie = instrumentIR_.preAssignment(e, nullptr, RHS);
 1623|  4.56k|      RHS = instrumentIR_.postAssignment(e, cookie, RHS, nullptr, RHS);
 1624|  4.56k|      lrefIterator->emitStore(RHS);
 1625|  4.56k|    }
 1626|       |
 1627|  4.55k|    return RHS;
 1628|  4.55k|  }
 1629|       |
 1630|      0|  auto AssignmentKind = BinaryOperatorInst::parseAssignmentOperator(opStr);
 1631|       |
 1632|      0|  LReference lref = createLRef(AE->_left, false);
 1633|      0|  Identifier nameHint = extractNameHint(lref);
 1634|       |
 1635|      0|  Value *result;
 1636|      0|  if (AssignmentKind == BinaryOperatorInst::OpKind::AssignShortCircuitOrKind ||
  ------------------
  |  Branch (1636:7): [True: 0, False: 0]
  ------------------
 1637|      0|      AssignmentKind == BinaryOperatorInst::OpKind::AssignShortCircuitAndKind ||
  ------------------
  |  Branch (1637:7): [True: 0, False: 0]
  ------------------
 1638|      0|      AssignmentKind == BinaryOperatorInst::OpKind::AssignNullishCoalesceKind) {
  ------------------
  |  Branch (1638:7): [True: 0, False: 0]
  ------------------
 1639|      0|    return genLogicalAssignmentExpr(AE, AssignmentKind, lref, nameHint);
 1640|      0|  }
 1641|       |
 1642|      0|  assert(AssignmentKind != BinaryOperatorInst::OpKind::IdentityKind);
 1643|       |  // Section 11.13.1 specifies that we should first load the
 1644|       |  // LHS before materializing the RHS. Unlike in C, this
 1645|       |  // code is well defined: "x+= x++".
 1646|       |  // https://es5.github.io/#x11.13.1
 1647|      0|  auto V = lref.emitLoad();
 1648|      0|  auto *RHS = genExpression(AE->_right, nameHint);
 1649|      0|  auto *cookie = instrumentIR_.preAssignment(AE, V, RHS);
 1650|      0|  result = Builder.createBinaryOperatorInst(V, RHS, AssignmentKind);
 1651|      0|  result = instrumentIR_.postAssignment(AE, cookie, result, V, RHS);
 1652|       |
 1653|      0|  lref.emitStore(result);
 1654|       |
 1655|       |  // Return the value that we stored as the result of the expression.
 1656|      0|  return result;
 1657|      0|}
_ZN6hermes5irgen11ESTreeIRGen16genRegExpLiteralEPNS_6ESTree17RegExpLiteralNodeE:
 1659|    119|Value *ESTreeIRGen::genRegExpLiteral(ESTree::RegExpLiteralNode *RE) {
 1660|    119|  LLVM_DEBUG(llvh::dbgs() << "IRGen reg exp literal.\n");
  ------------------
  |  |  123|    119|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    119|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 119]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    119|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1661|    119|  LLVM_DEBUG(
  ------------------
  |  |  123|    119|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    119|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 119]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    119|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1662|    119|      llvh::dbgs() << "Loading regexp Literal \"" << RE->_pattern->str()
 1663|    119|                   << " / " << RE->_flags->str() << "\"\n");
 1664|    119|  auto exp = Builder.createRegExpInst(
 1665|    119|      Identifier::getFromPointer(RE->_pattern),
 1666|    119|      Identifier::getFromPointer(RE->_flags));
 1667|       |
 1668|    119|  auto &regexp = Builder.getModule()->getContext().getCompiledRegExp(
 1669|    119|      RE->_pattern, RE->_flags);
 1670|       |
 1671|    119|  if (regexp.getMapping().size()) {
  ------------------
  |  Branch (1671:7): [True: 0, False: 119]
  ------------------
 1672|      0|    auto &mapping = regexp.getMapping();
 1673|      0|    HBCAllocObjectFromBufferInst::ObjectPropertyMap propMap;
 1674|      0|    for (auto &identifier : regexp.getOrderedGroupNames()) {
  ------------------
  |  Branch (1674:27): [True: 0, False: 0]
  ------------------
 1675|      0|      std::string converted;
 1676|      0|      convertUTF16ToUTF8WithSingleSurrogates(converted, identifier);
 1677|      0|      auto *key = Builder.getLiteralString(converted);
 1678|      0|      auto groupIdxRes = mapping.find(identifier);
 1679|      0|      assert(
 1680|      0|          groupIdxRes != mapping.end() &&
 1681|      0|          "identifier not found in named groups");
 1682|      0|      auto groupIdx = groupIdxRes->second;
 1683|      0|      auto *val = Builder.getLiteralNumber(groupIdx);
 1684|      0|      propMap.emplace_back(key, val);
 1685|      0|    }
 1686|      0|    auto sz = mapping.size();
 1687|       |
 1688|      0|    auto literalObj = Builder.createHBCAllocObjectFromBufferInst(propMap, sz);
 1689|       |
 1690|      0|    Value *params[] = {exp, literalObj};
 1691|      0|    Builder.createCallBuiltinInst(
 1692|      0|        BuiltinMethod::HermesBuiltin_initRegexNamedGroups, params);
 1693|      0|  }
 1694|       |
 1695|    119|  return exp;
 1696|    119|}
_ZN6hermes5irgen11ESTreeIRGen18genConditionalExprEPNS_6ESTree25ConditionalExpressionNodeE:
 1751|  3.66k|Value *ESTreeIRGen::genConditionalExpr(ESTree::ConditionalExpressionNode *C) {
 1752|  3.66k|  auto parentFunc = Builder.getInsertionBlock()->getParent();
 1753|       |
 1754|  3.66k|  PhiInst::ValueListType values;
 1755|  3.66k|  PhiInst::BasicBlockListType blocks;
 1756|       |
 1757|  3.66k|  auto alternateBlock = Builder.createBasicBlock(parentFunc);
 1758|  3.66k|  auto consequentBlock = Builder.createBasicBlock(parentFunc);
 1759|  3.66k|  auto continueBlock = Builder.createBasicBlock(parentFunc);
 1760|       |
 1761|       |  // Implement the ternary operator using control flow. We must use control
 1762|       |  // flow because the expressions may have side effects.
 1763|  3.66k|  genExpressionBranch(C->_test, consequentBlock, alternateBlock, nullptr);
 1764|       |
 1765|       |  // The 'then' side:
 1766|  3.66k|  Builder.setInsertionBlock(consequentBlock);
 1767|       |
 1768|  3.66k|  values.push_back(genExpression(C->_consequent));
 1769|  3.66k|  blocks.push_back(Builder.getInsertionBlock());
 1770|  3.66k|  Builder.createBranchInst(continueBlock);
 1771|       |
 1772|       |  // The 'else' side:
 1773|  3.66k|  Builder.setInsertionBlock(alternateBlock);
 1774|  3.66k|  values.push_back(genExpression(C->_alternate));
 1775|  3.66k|  blocks.push_back(Builder.getInsertionBlock());
 1776|  3.66k|  Builder.createBranchInst(continueBlock);
 1777|       |
 1778|       |  // Continue:
 1779|  3.66k|  Builder.setInsertionBlock(continueBlock);
 1780|  3.66k|  return Builder.createPhiInst(values, blocks);
 1781|  3.66k|}
_ZN6hermes5irgen11ESTreeIRGen23genIdentifierExpressionEPNS_6ESTree14IdentifierNodeEb:
 1785|   502k|    bool afterTypeOf) {
 1786|   502k|  LLVM_DEBUG(
  ------------------
  |  |  123|   502k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   502k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 502k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   502k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1787|   502k|      llvh::dbgs() << "Looking for identifier \"" << Iden->_name << "\"\n");
 1788|       |
 1789|       |  // 'arguments' is an array-like object holding all function arguments.
 1790|       |  // If one of the parameters is called "arguments" then it shadows the
 1791|       |  // arguments keyword.
 1792|   502k|  if (Iden->_name->str() == "arguments" &&
  ------------------
  |  Branch (1792:7): [True: 174, False: 501k]
  |  Branch (1792:7): [True: 174, False: 501k]
  ------------------
 1793|   502k|      !nameTable_.count(getNameFieldFromID(Iden))) {
  ------------------
  |  Branch (1793:7): [True: 174, False: 0]
  ------------------
 1794|       |    // If it is captured, we must use the captured value.
 1795|    174|    if (curFunction()->capturedArguments) {
  ------------------
  |  Branch (1795:9): [True: 0, False: 174]
  ------------------
 1796|      0|      return Builder.createLoadFrameInst(
 1797|      0|          curFunction()->capturedArguments, currentIRScope_);
 1798|      0|    }
 1799|       |
 1800|    174|    return curFunction()->createArgumentsInst;
 1801|    174|  }
 1802|       |
 1803|       |  // Lookup variable name.
 1804|   501k|  auto StrName = getNameFieldFromID(Iden);
 1805|       |
 1806|   501k|  auto *Var = ensureVariableExists(Iden);
 1807|       |
 1808|       |  // For uses of undefined as the global property, we make an optimization
 1809|       |  // to always return undefined constant.
 1810|   501k|  if (llvh::isa<GlobalObjectProperty>(Var) && StrName.str() == "undefined") {
  ------------------
  |  Branch (1810:7): [True: 501k, False: 4]
  |  Branch (1810:47): [True: 0, False: 501k]
  ------------------
 1811|      0|    return Builder.getLiteralUndefined();
 1812|      0|  }
 1813|       |
 1814|   501k|  LLVM_DEBUG(
  ------------------
  |  |  123|   501k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   501k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 501k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:69): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   501k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1815|   501k|      llvh::dbgs() << "Found variable " << StrName << " in function \""
 1816|   501k|                   << (llvh::isa<GlobalObjectProperty>(Var)
 1817|   501k|                           ? llvh::StringRef("global")
 1818|   501k|                           : cast<Variable>(Var)
 1819|   501k|                                 ->getParent()
 1820|   501k|                                 ->getFunction()
 1821|   501k|                                 ->getInternalNameStr())
 1822|   501k|                   << "\"\n");
 1823|       |
 1824|       |  // Typeof <variable> does not throw.
 1825|   501k|  return emitLoad(Var, afterTypeOf);
 1826|   501k|}
_ZN6hermes5irgen11ESTreeIRGen10genNewExprEPNS_6ESTree17NewExpressionNodeE:
 1854|  25.0k|Value *ESTreeIRGen::genNewExpr(ESTree::NewExpressionNode *N) {
 1855|  25.0k|  LLVM_DEBUG(llvh::dbgs() << "IRGen 'new' statement/expression.\n");
  ------------------
  |  |  123|  25.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  25.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 25.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  25.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1856|       |
 1857|  25.0k|  Value *callee = genExpression(N->_callee);
 1858|       |
 1859|  25.0k|  bool hasSpread = false;
 1860|  25.0k|  for (auto &arg : N->_arguments) {
  ------------------
  |  Branch (1860:18): [True: 0, False: 25.0k]
  ------------------
 1861|      0|    if (llvh::isa<ESTree::SpreadElementNode>(&arg)) {
  ------------------
  |  Branch (1861:9): [True: 0, False: 0]
  ------------------
 1862|      0|      hasSpread = true;
 1863|      0|    }
 1864|      0|  }
 1865|       |
 1866|  25.0k|  if (!hasSpread) {
  ------------------
  |  Branch (1866:7): [True: 25.0k, False: 0]
  ------------------
 1867|  25.0k|    ConstructInst::ArgumentList args;
 1868|  25.0k|    for (auto &arg : N->_arguments) {
  ------------------
  |  Branch (1868:20): [True: 0, False: 25.0k]
  ------------------
 1869|      0|      args.push_back(genExpression(&arg));
 1870|      0|    }
 1871|       |
 1872|  25.0k|    return Builder.createConstructInst(callee, callee, args);
 1873|  25.0k|  }
 1874|       |
 1875|       |  // Otherwise, there exists a spread argument, so the number of arguments
 1876|       |  // is variable.
 1877|       |  // Generate IR for this by creating an array and populating it with the
 1878|       |  // arguments, then calling HermesInternal.apply.
 1879|      0|  auto *args = genArrayFromElements(N->_arguments);
 1880|       |
 1881|      0|  return genBuiltinCall(BuiltinMethod::HermesBuiltin_apply, {callee, args});
 1882|  25.0k|}
_ZN6hermes5irgen11ESTreeIRGen20genLogicalExpressionEPNS_6ESTree21LogicalExpressionNodeE:
 1885|  24.3k|    ESTree::LogicalExpressionNode *logical) {
 1886|  24.3k|  auto opStr = logical->_operator->str();
 1887|  24.3k|  LLVM_DEBUG(llvh::dbgs() << "IRGen of short circuiting: " << opStr << ".\n");
  ------------------
  |  |  123|  24.3k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  24.3k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 24.3k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  24.3k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1888|       |
 1889|  24.3k|  enum class Kind {
 1890|  24.3k|    And, // &&
 1891|  24.3k|    Or, // ||
 1892|  24.3k|    Coalesce, // ??
 1893|  24.3k|  };
 1894|       |
 1895|  24.3k|  Kind kind;
 1896|       |
 1897|  24.3k|  if (opStr == "&&") {
  ------------------
  |  Branch (1897:7): [True: 16.3k, False: 8.02k]
  ------------------
 1898|  16.3k|    kind = Kind::And;
 1899|  16.3k|  } else if (opStr == "||") {
  ------------------
  |  Branch (1899:14): [True: 8.02k, False: 0]
  ------------------
 1900|  8.02k|    kind = Kind::Or;
 1901|  8.02k|  } else if (opStr == "??") {
  ------------------
  |  Branch (1901:14): [True: 0, False: 0]
  ------------------
 1902|      0|    kind = Kind::Coalesce;
 1903|      0|  } else {
 1904|      0|    llvm_unreachable("Invalid update operator");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1905|      0|  }
 1906|       |
 1907|       |  // Generate a new temporary stack allocation.
 1908|  24.3k|  auto tempVarName = genAnonymousLabelName("logical");
 1909|  24.3k|  auto parentFunc = Builder.getInsertionBlock()->getParent();
 1910|  24.3k|  auto tempVar = Builder.createAllocStackInst(tempVarName);
 1911|       |
 1912|  24.3k|  auto evalRHSBlock = Builder.createBasicBlock(parentFunc);
 1913|  24.3k|  auto continueBlock = Builder.createBasicBlock(parentFunc);
 1914|       |
 1915|  24.3k|  auto LHS = genExpression(logical->_left);
 1916|       |
 1917|       |  // Store the LHS value of the expression in preparation for the case where we
 1918|       |  // won't need to evaluate the RHS side of the expression. In that case, we
 1919|       |  // jump to continueBlock, which returns tempVar.
 1920|  24.3k|  Builder.createStoreStackInst(LHS, tempVar);
 1921|       |
 1922|       |  // Notice that instead of negating the condition we swap the operands of the
 1923|       |  // branch.
 1924|  24.3k|  switch (kind) {
  ------------------
  |  Branch (1924:11): [True: 0, False: 24.3k]
  ------------------
 1925|  16.3k|    case Kind::And:
  ------------------
  |  Branch (1925:5): [True: 16.3k, False: 8.02k]
  ------------------
 1926|       |      // Evaluate RHS only when the LHS is true.
 1927|  16.3k|      Builder.createCondBranchInst(LHS, evalRHSBlock, continueBlock);
 1928|  16.3k|      break;
 1929|  8.02k|    case Kind::Or:
  ------------------
  |  Branch (1929:5): [True: 8.02k, False: 16.3k]
  ------------------
 1930|       |      // Evaluate RHS only when the LHS is false.
 1931|  8.02k|      Builder.createCondBranchInst(LHS, continueBlock, evalRHSBlock);
 1932|  8.02k|      break;
 1933|      0|    case Kind::Coalesce:
  ------------------
  |  Branch (1933:5): [True: 0, False: 24.3k]
  ------------------
 1934|       |      // Evaluate RHS only if the value is undefined or null.
 1935|       |      // Use == instead of === to account for both values at once.
 1936|      0|      Builder.createCondBranchInst(
 1937|      0|          Builder.createBinaryOperatorInst(
 1938|      0|              LHS,
 1939|      0|              Builder.getLiteralNull(),
 1940|      0|              BinaryOperatorInst::OpKind::EqualKind),
 1941|      0|          evalRHSBlock,
 1942|      0|          continueBlock);
 1943|       |
 1944|      0|      break;
 1945|  24.3k|  }
 1946|       |
 1947|       |  // Continue the evaluation of the right-hand-side of the expression.
 1948|  24.3k|  Builder.setInsertionBlock(evalRHSBlock);
 1949|  24.3k|  auto RHS = genExpression(logical->_right);
 1950|       |
 1951|       |  // Evaluate the RHS and store the result into the temporary variable.
 1952|  24.3k|  Builder.createStoreStackInst(RHS, tempVar);
 1953|       |
 1954|       |  // Finally, jump to the continuation block.
 1955|  24.3k|  Builder.createBranchInst(continueBlock);
 1956|       |
 1957|       |  // Load the content of the temp variable that was set in one of the branches.
 1958|  24.3k|  Builder.setInsertionBlock(continueBlock);
 1959|  24.3k|  return Builder.createLoadStackInst(tempVar);
 1960|  24.3k|}
_ZN6hermes5irgen11ESTreeIRGen22genTemplateLiteralExprEPNS_6ESTree19TemplateLiteralNodeE:
 1987|  20.4k|Value *ESTreeIRGen::genTemplateLiteralExpr(ESTree::TemplateLiteralNode *Expr) {
 1988|  20.4k|  LLVM_DEBUG(llvh::dbgs() << "IRGen 'TemplateLiteral' expression.\n");
  ------------------
  |  |  123|  20.4k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  20.4k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 20.4k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  20.4k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1989|       |
 1990|  20.4k|  assert(
 1991|  20.4k|      Expr->_quasis.size() == Expr->_expressions.size() + 1 &&
 1992|  20.4k|      "The string count should always be one more than substitution count.");
 1993|       |
 1994|       |  // Construct an argument list for calling HermesInternal.concat():
 1995|       |  // cookedStr0, substitution0, cookedStr1, ..., substitutionN, cookedStrN + 1,
 1996|       |  // skipping any empty string, except for the first cooked string, which is
 1997|       |  // going to be the `this` to the concat call.
 1998|       |
 1999|       |  // Get the first cooked string.
 2000|  20.4k|  auto strItr = Expr->_quasis.begin();
 2001|  20.4k|  auto *tempEltNode = cast<ESTree::TemplateElementNode>(&*strItr);
 2002|  20.4k|  auto *firstCookedStr = Builder.getLiteralString(tempEltNode->_cooked->str());
 2003|  20.4k|  ++strItr;
 2004|       |  // If the template literal is effectively only one string, directly return it.
 2005|  20.4k|  if (strItr == Expr->_quasis.end()) {
  ------------------
  |  Branch (2005:7): [True: 20.4k, False: 0]
  ------------------
 2006|  20.4k|    return firstCookedStr;
 2007|  20.4k|  }
 2008|      0|  CallInst::ArgumentList argList;
 2009|      0|  auto exprItr = Expr->_expressions.begin();
 2010|      0|  while (strItr != Expr->_quasis.end()) {
  ------------------
  |  Branch (2010:10): [True: 0, False: 0]
  ------------------
 2011|      0|    auto *sub = genExpression(&*exprItr);
 2012|      0|    argList.push_back(sub);
 2013|      0|    tempEltNode = cast<ESTree::TemplateElementNode>(&*strItr);
 2014|      0|    auto cookedStr = tempEltNode->_cooked->str();
 2015|      0|    if (!cookedStr.empty()) {
  ------------------
  |  Branch (2015:9): [True: 0, False: 0]
  ------------------
 2016|      0|      argList.push_back(Builder.getLiteralString(cookedStr));
 2017|      0|    }
 2018|      0|    ++strItr;
 2019|      0|    ++exprItr;
 2020|      0|  }
 2021|      0|  assert(
 2022|      0|      exprItr == Expr->_expressions.end() &&
 2023|      0|      "All the substitutions must have been collected.");
 2024|       |
 2025|       |  // Generate a function call to HermesInternal.concat() with these arguments.
 2026|      0|  return genHermesInternalCall("concat", firstCookedStr, argList);
 2027|      0|}
_ZN6hermes5irgen11ESTreeIRGen21genTaggedTemplateExprEPNS_6ESTree28TaggedTemplateExpressionNodeE:
 2030|  2.82k|    ESTree::TaggedTemplateExpressionNode *Expr) {
 2031|  2.82k|  LLVM_DEBUG(llvh::dbgs() << "IRGen 'TaggedTemplateExpression' expression.\n");
  ------------------
  |  |  123|  2.82k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.82k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.82k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.82k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2032|       |  // Step 1: get the template object.
 2033|  2.82k|  auto *templateLit = cast<ESTree::TemplateLiteralNode>(Expr->_quasi);
 2034|       |
 2035|       |  // Construct an argument list for calling HermesInternal.getTemplateObject():
 2036|       |  // [template object ID, dup, raw strings, (optional) cooked strings].
 2037|  2.82k|  CallInst::ArgumentList argList;
 2038|       |  // Retrieve template object ID.
 2039|  2.82k|  Module::RawStringList rawStrings;
 2040|   354k|  for (auto &n : templateLit->_quasis) {
  ------------------
  |  Branch (2040:16): [True: 354k, False: 2.82k]
  ------------------
 2041|   354k|    auto element = cast<ESTree::TemplateElementNode>(&n);
 2042|   354k|    rawStrings.push_back(Builder.getLiteralString(element->_raw->str()));
 2043|   354k|  }
 2044|  2.82k|  uint32_t templateObjID = Mod->getTemplateObjectID(std::move(rawStrings));
 2045|  2.82k|  argList.push_back(Builder.getLiteralNumber(templateObjID));
 2046|       |
 2047|       |  // dup is true if the cooked strings and raw strings are duplicated.
 2048|  2.82k|  bool dup = true;
 2049|       |  // Add the argument dup first as a placeholder which we overwrite with
 2050|       |  // the correct value later.
 2051|  2.82k|  argList.push_back(Builder.getLiteralBool(dup));
 2052|   354k|  for (auto &node : templateLit->_quasis) {
  ------------------
  |  Branch (2052:19): [True: 354k, False: 2.82k]
  ------------------
 2053|   354k|    auto *templateElt = cast<ESTree::TemplateElementNode>(&node);
 2054|   354k|    if (templateElt->_cooked != templateElt->_raw) {
  ------------------
  |  Branch (2054:9): [True: 130, False: 354k]
  ------------------
 2055|    130|      dup = false;
 2056|    130|    }
 2057|   354k|    argList.push_back(Builder.getLiteralString(templateElt->_raw->str()));
 2058|   354k|  }
 2059|  2.82k|  argList[1] = Builder.getLiteralBool(dup);
 2060|       |  // If the cooked strings are not the same as raw strings, append them to
 2061|       |  // argument list.
 2062|  2.82k|  if (!dup) {
  ------------------
  |  Branch (2062:7): [True: 128, False: 2.69k]
  ------------------
 2063|  19.4k|    for (auto &node : templateLit->_quasis) {
  ------------------
  |  Branch (2063:21): [True: 19.4k, False: 128]
  ------------------
 2064|  19.4k|      auto *templateElt = cast<ESTree::TemplateElementNode>(&node);
 2065|  19.4k|      if (templateElt->_cooked) {
  ------------------
  |  Branch (2065:11): [True: 19.4k, False: 59]
  ------------------
 2066|  19.4k|        argList.push_back(
 2067|  19.4k|            Builder.getLiteralString(templateElt->_cooked->str()));
 2068|  19.4k|      } else {
 2069|     59|        argList.push_back(Builder.getLiteralUndefined());
 2070|     59|      }
 2071|  19.4k|    }
 2072|    128|  }
 2073|       |
 2074|       |  // Generate a function call to HermesInternal.getTemplateObject() with these
 2075|       |  // arguments.
 2076|  2.82k|  auto *templateObj =
 2077|  2.82k|      genBuiltinCall(BuiltinMethod::HermesBuiltin_getTemplateObject, argList);
 2078|       |
 2079|       |  // Step 2: call the tag function, passing the template object followed by a
 2080|       |  // list of substitutions as arguments.
 2081|  2.82k|  CallInst::ArgumentList tagFuncArgList;
 2082|  2.82k|  tagFuncArgList.push_back(templateObj);
 2083|   351k|  for (auto &sub : templateLit->_expressions) {
  ------------------
  |  Branch (2083:18): [True: 351k, False: 2.82k]
  ------------------
 2084|   351k|    tagFuncArgList.push_back(genExpression(&sub));
 2085|   351k|  }
 2086|       |
 2087|  2.82k|  Value *callee;
 2088|  2.82k|  Value *thisVal;
 2089|       |  // Tag function is a member expression.
 2090|  2.82k|  if (auto *Mem = llvh::dyn_cast<ESTree::MemberExpressionNode>(Expr->_tag)) {
  ------------------
  |  Branch (2090:13): [True: 0, False: 2.82k]
  ------------------
 2091|      0|    Value *obj = genExpression(Mem->_object);
 2092|      0|    Value *prop = genMemberExpressionProperty(Mem);
 2093|       |    // Call the callee with obj as the 'this'.
 2094|      0|    thisVal = obj;
 2095|      0|    callee = Builder.createLoadPropertyInst(obj, prop);
 2096|  2.82k|  } else {
 2097|  2.82k|    thisVal = Builder.getLiteralUndefined();
 2098|  2.82k|    callee = genExpression(Expr->_tag);
 2099|  2.82k|  }
 2100|       |
 2101|  2.82k|  return Builder.createCallInst(
 2102|  2.82k|      CallInst::kNoTextifiedCallee, callee, thisVal, tagFuncArgList);
 2103|  2.82k|}
ESTreeIRGen-expr.cpp:_ZN6hermes5irgenL20getTextifiedCallExprERNS_9IRBuilderEPNS_6ESTree4NodeE:
  515|     19|    ESTree::Node *callee) {
  516|     19|  constexpr uint32_t kMaxTextifiedCalleeSizeUTF8Chars = 64;
  517|       |  // Pessimizing the maximum buffer size for the textified callee as if all
  518|       |  // characters were 4 bytes.
  519|     19|  llvh::SmallVector<char, kMaxTextifiedCalleeSizeUTF8Chars * 4> textifiedCallee;
  520|     19|  llvh::raw_svector_ostream OS(textifiedCallee);
  521|       |
  522|       |  // Count of how many UTF8 character are on the textified callee string.
  523|     19|  uint32_t numUTF8Chars = 0;
  524|     19|  const char *begin = callee->getSourceRange().Start.getPointer();
  525|     19|  const char *end = callee->getSourceRange().End.getPointer();
  526|       |
  527|     19|  const char *pos = begin;
  528|       |
  529|       |  /// Helper function that scans the input source code searching for the next
  530|       |  /// UTF8 char starting at \p iter. \return a StringRef with the chars that
  531|       |  /// form the next UTF8 char on the input, or None if the input has been
  532|       |  /// exhausted. Upon return, \p iter will be modified 1-past the last char
  533|       |  /// consumed from the input.
  534|     19|  auto nextUTF8Char = [end](const char *&iter) -> OptValue<llvh::StringRef> {
  535|     19|    assert(iter < end && "iter is past end");
  536|     19|    const char *start;
  537|     19|    bool skipSpace = false;
  538|     19|    bool newLine;
  539|     19|    bool unprintableChar;
  540|       |    // The function may need to decode several UTF8 charaters to skip new lines,
  541|       |    // spaces following new lines, and unprintable characters.
  542|     19|    do {
  543|     19|      if (iter == end) {
  544|     19|        return llvh::None;
  545|     19|      }
  546|       |
  547|       |      // From start, where does the current UTF8 character ends?
  548|     19|      start = iter;
  549|     19|      for (++iter; iter < end && isUTF8ContinuationByte(*iter); ++iter) {
  550|       |        // nothing
  551|     19|      }
  552|       |
  553|     19|      newLine = *start == '\n';
  554|     19|      skipSpace |= newLine;
  555|     19|      unprintableChar = static_cast<uint8_t>(*start) < 32;
  556|     19|    } while (unprintableChar || newLine || (skipSpace && *start == ' '));
  557|       |
  558|     19|    const size_t utf8CharLength = static_cast<size_t>(iter - start);
  559|     19|    return llvh::StringRef{start, utf8CharLength};
  560|     19|  };
  561|       |
  562|       |  // The algorithm is split in three separate steps:
  563|       |  // 1. Find the range in the input source that contains the first half of the
  564|       |  //    UTF8 characters that should be present on the output.
  565|       |  // 2. Find the window into the input source starting at the end of the range
  566|       |  //    computed in 1. and containing another half of the maximum output length.
  567|       |  //    This window is [mark, pos).
  568|       |  // 3. Slide the [mark, pos) window found in 2 until pos equals end.
  569|       |  //
  570|       |  // If the input is exhausted in 1. or 2., then the output string will contain
  571|       |  // a "copy" of the input source (minus the characters listed above); it will
  572|       |  // otherwise be prefix"(...)"suffix, with prefix being the first
  573|       |  // kMaxTextifiedCalleeSizeUTF8Chars / 2 UTF8 chars in the input source, and
  574|       |  // suffix, the last kMaxTextifiedCalleeSizeUTF8Chars / 2 UTF8 chars.
  575|       |
  576|       |  // Scan the input string starting from the first position until half of the
  577|       |  // maximum of allowed character have been scanned.
  578|    539|  while (pos < end && numUTF8Chars < kMaxTextifiedCalleeSizeUTF8Chars / 2) {
  ------------------
  |  Branch (578:10): [True: 531, False: 8]
  |  Branch (578:23): [True: 520, False: 11]
  ------------------
  579|    520|    if (auto ch = nextUTF8Char(pos)) {
  ------------------
  |  Branch (579:14): [True: 520, False: 0]
  ------------------
  580|    520|      ++numUTF8Chars;
  581|    520|      OS << *ch;
  582|    520|    }
  583|    520|  }
  584|       |
  585|     19|  assert(
  586|     19|      (pos == end || numUTF8Chars == kMaxTextifiedCalleeSizeUTF8Chars / 2) &&
  587|     19|      "Invalid source range");
  588|       |
  589|       |  // Now save the current position, and advance it until the end of the buffer,
  590|       |  // or until enough UTF8 characters are found.
  591|     19|  const char *mark = pos;
  592|    243|  while (pos < end && numUTF8Chars < kMaxTextifiedCalleeSizeUTF8Chars) {
  ------------------
  |  Branch (592:10): [True: 227, False: 16]
  |  Branch (592:23): [True: 224, False: 3]
  ------------------
  593|    224|    if (nextUTF8Char(pos)) {
  ------------------
  |  Branch (593:9): [True: 224, False: 0]
  ------------------
  594|    224|      ++numUTF8Chars;
  595|    224|    }
  596|    224|  }
  597|       |
  598|     19|  assert(
  599|     19|      (pos == end || numUTF8Chars == kMaxTextifiedCalleeSizeUTF8Chars) &&
  600|     19|      "Invalid source range");
  601|       |
  602|     19|  if (pos < end) {
  ------------------
  |  Branch (602:7): [True: 3, False: 16]
  ------------------
  603|       |    // Slide the suffix window if pos is not at the end of the input.
  604|      3|    OS << "(...)";
  605|       |
  606|  1.44M|    while (pos < end) {
  ------------------
  |  Branch (606:12): [True: 1.44M, False: 3]
  ------------------
  607|  1.44M|      auto ch = nextUTF8Char(mark);
  608|  1.44M|      assert(ch && "should have a character");
  609|  1.44M|      (void)ch;
  610|  1.44M|      nextUTF8Char(pos);
  611|  1.44M|    }
  612|      3|  }
  613|       |
  614|       |  // The input should be exhausted by now, and pos should be equal to end --
  615|       |  // meaning all characters have been decoded.
  616|     19|  assert(pos == end && "Invalid source range");
  617|       |
  618|       |  // Now add all characters between mark and end to the textified callable.
  619|    243|  while (mark < end) {
  ------------------
  |  Branch (619:10): [True: 224, False: 19]
  ------------------
  620|    224|    auto ch = nextUTF8Char(mark);
  621|    224|    assert(ch && "should have a character");
  622|    224|    OS << *ch;
  623|    224|  }
  624|       |
  625|     19|  return builder.getLiteralString(OS.str());
  626|     19|}
ESTreeIRGen-expr.cpp:_ZZN6hermes5irgenL20getTextifiedCallExprERNS_9IRBuilderEPNS_6ESTree4NodeEENK3$_0clERPKc:
  534|  2.89M|  auto nextUTF8Char = [end](const char *&iter) -> OptValue<llvh::StringRef> {
  535|  2.89M|    assert(iter < end && "iter is past end");
  536|  2.89M|    const char *start;
  537|  2.89M|    bool skipSpace = false;
  538|  2.89M|    bool newLine;
  539|  2.89M|    bool unprintableChar;
  540|       |    // The function may need to decode several UTF8 charaters to skip new lines,
  541|       |    // spaces following new lines, and unprintable characters.
  542|  2.89M|    do {
  543|  2.89M|      if (iter == end) {
  ------------------
  |  Branch (543:11): [True: 0, False: 2.89M]
  ------------------
  544|      0|        return llvh::None;
  545|      0|      }
  546|       |
  547|       |      // From start, where does the current UTF8 character ends?
  548|  2.89M|      start = iter;
  549|  2.89M|      for (++iter; iter < end && isUTF8ContinuationByte(*iter); ++iter) {
  ------------------
  |  Branch (549:20): [True: 2.89M, False: 30]
  |  Branch (549:34): [True: 15, False: 2.89M]
  ------------------
  550|       |        // nothing
  551|     15|      }
  552|       |
  553|  2.89M|      newLine = *start == '\n';
  554|  2.89M|      skipSpace |= newLine;
  555|  2.89M|      unprintableChar = static_cast<uint8_t>(*start) < 32;
  556|  2.89M|    } while (unprintableChar || newLine || (skipSpace && *start == ' '));
  ------------------
  |  Branch (556:14): [True: 101, False: 2.89M]
  |  Branch (556:33): [True: 0, False: 2.89M]
  |  Branch (556:45): [True: 0, False: 2.89M]
  |  Branch (556:58): [True: 0, False: 0]
  ------------------
  557|       |
  558|  2.89M|    const size_t utf8CharLength = static_cast<size_t>(iter - start);
  559|  2.89M|    return llvh::StringRef{start, utf8CharLength};
  560|  2.89M|  };
ESTreeIRGen-expr.cpp:_ZN6hermes5irgenL19propertyKeyAsStringERN4llvh15SmallVectorImplIcEEPNS_6ESTree4NodeE:
  789|      2|    ESTree::Node *Key) {
  790|       |  // Handle String Literals.
  791|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-string-literals
  792|      2|  if (auto *Lit = llvh::dyn_cast<ESTree::StringLiteralNode>(Key)) {
  ------------------
  |  Branch (792:13): [True: 0, False: 2]
  ------------------
  793|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  794|      0|        llvh::dbgs() << "Loading String Literal \"" << Lit->_value << "\"\n");
  795|      0|    return Lit->_value->str();
  796|      0|  }
  797|       |
  798|       |  // Handle identifiers as if they are String Literals.
  799|      2|  if (auto *Iden = llvh::dyn_cast<ESTree::IdentifierNode>(Key)) {
  ------------------
  |  Branch (799:13): [True: 2, False: 0]
  ------------------
  800|      2|    LLVM_DEBUG(
  ------------------
  |  |  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  801|      2|        llvh::dbgs() << "Loading String Literal \"" << Iden->_name << "\"\n");
  802|      2|    return Iden->_name->str();
  803|      2|  }
  804|       |
  805|       |  // Handle Number Literals.
  806|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-numeric-literals
  807|      0|  if (auto *Lit = llvh::dyn_cast<ESTree::NumericLiteralNode>(Key)) {
  ------------------
  |  Branch (807:13): [True: 0, False: 0]
  ------------------
  808|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  809|      0|        llvh::dbgs() << "Loading Numeric Literal \"" << Lit->_value << "\"\n");
  810|      0|    storage.resize(NUMBER_TO_STRING_BUF_SIZE);
  811|      0|    auto len = numberToString(Lit->_value, storage.data(), storage.size());
  812|      0|    return llvh::StringRef(storage.begin(), len);
  813|      0|  }
  814|       |
  815|      0|  llvm_unreachable("Don't know this kind of property key");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  816|      0|  return llvh::StringRef();
  817|      0|}
ESTreeIRGen-expr.cpp:_ZZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS_6ESTree20ObjectExpressionNodeEEN13PropertyValue8setValueEPNS2_4NodeE:
  853|      1|    void setValue(ESTree::Node *val) {
  854|      1|      isAccessor = false;
  855|      1|      valueNode = val;
  856|      1|      getterNode = setterNode = nullptr;
  857|      1|    }
ESTreeIRGen-expr.cpp:_ZN6hermes5irgenL15extractNameHintERKNS0_10LReferenceE:
 1589|  4.55k|static Identifier extractNameHint(const LReference &lref) {
 1590|  4.55k|  Identifier nameHint{};
 1591|  4.55k|  if (auto *var = lref.castAsVariable()) {
  ------------------
  |  Branch (1591:13): [True: 1.16k, False: 3.39k]
  ------------------
 1592|  1.16k|    nameHint = var->getName();
 1593|  3.39k|  } else if (auto *globProp = lref.castAsGlobalObjectProperty()) {
  ------------------
  |  Branch (1593:20): [True: 1.23k, False: 2.15k]
  ------------------
 1594|  1.23k|    nameHint = globProp->getName()->getValue();
 1595|  1.23k|  }
 1596|  4.55k|  return nameHint;
 1597|  4.55k|}
ESTreeIRGen-expr.cpp:_ZZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS_6ESTree20ObjectExpressionNodeEENK3$_0clEv:
 1047|      1|        [&] { assert(propValue->state != PropertyValue::None); });

_ZN6hermes5irgen15FunctionContextC2EPNS0_11ESTreeIRGenEPNS_8FunctionEPNS_3sem12FunctionInfoE:
   24|   103k|    : irGen_(irGen),
   25|   103k|      semInfo_(semInfo),
   26|   103k|      oldContext_(irGen->functionContext_),
   27|   103k|      builderSaveState_(irGen->Builder),
   28|   103k|      function(function),
   29|   103k|      anonymousIDs_(function->getContext().getStringTable()),
   30|   103k|      enterFunctionScope(this) {
   31|   103k|  setupFunctionScope(&enterFunctionScope);
   32|   103k|  irGen->functionContext_ = this;
   33|   103k|  irGen->currentIRScopeDesc_ = function->getFunctionScopeDesc();
   34|       |
   35|       |  // Temporarily set the current IR scope to nullptr. IRGen should materialize
   36|       |  // currentIRScopeDesc_ before trying to access it.
   37|   103k|  irGen->currentIRScope_ = nullptr;
   38|       |
   39|       |  // Initialize it to LiteralUndefined by default to avoid corner cases.
   40|   103k|  this->capturedNewTarget = irGen->Builder.getLiteralUndefined();
   41|       |
   42|   103k|  if (semInfo_) {
  ------------------
  |  Branch (42:7): [True: 103k, False: 0]
  ------------------
   43|       |    // Allocate the label table. Each label definition will be encountered in
   44|       |    // the AST before it is referenced (because of the nature of JavaScript), at
   45|       |    // which point we will initialize the GotoLabel structure with basic blocks
   46|       |    // targets.
   47|   103k|    labels_.resize(semInfo_->labelCount);
   48|   103k|  }
   49|   103k|}
_ZN6hermes5irgen15FunctionContext18setupFunctionScopeEPNS0_15EnterBlockScopeE:
   51|   103k|void FunctionContext::setupFunctionScope(EnterBlockScope *scope) {
   52|   103k|  functionScope = &scope->blockScope_;
   53|   103k|  blockScope = functionScope;
   54|   103k|}
_ZN6hermes5irgen15FunctionContextD2Ev:
   56|   103k|FunctionContext::~FunctionContext() {
   57|   103k|  irGen_->functionContext_ = oldContext_;
   58|   103k|  irGen_->Builder.setCurrentSourceLevelScope(irGen_->currentIRScopeDesc_);
   59|   103k|}
_ZN6hermes5irgen15FunctionContext21genAnonymousLabelNameEN4llvh9StringRefE:
   61|   136k|Identifier FunctionContext::genAnonymousLabelName(llvh::StringRef hint) {
   62|   136k|  return anonymousIDs_.next(hint);
   63|   136k|}
_ZN6hermes5irgen15EnterBlockScopeC2EPNS0_15FunctionContextE:
   68|   103k|    : currentContext_(currentContext),
   69|   103k|      oldIRScopeDesc_(currentContext->irGen_->currentIRScopeDesc_),
   70|   103k|      oldIRScope_(currentContext->irGen_->currentIRScope_),
   71|   103k|      oldBlockScope_(currentContext->blockScope),
   72|   103k|      blockScope_(currentContext->irGen_->nameTable_) {
   73|   103k|  currentContext->blockScope = &blockScope_;
   74|   103k|}
_ZN6hermes5irgen15EnterBlockScopeD2Ev:
   76|   103k|EnterBlockScope::~EnterBlockScope() {
   77|   103k|  ESTreeIRGen *irgen = currentContext_->irGen_;
   78|   103k|  currentContext_->blockScope = oldBlockScope_;
   79|   103k|  irgen->currentIRScope_ = oldIRScope_;
   80|   103k|  irgen->currentIRScopeDesc_ = oldIRScopeDesc_;
   81|   103k|  irgen->Builder.setCurrentSourceLevelScope(irgen->currentIRScopeDesc_);
   82|   103k|}
_ZN6hermes5irgen11ESTreeIRGen20hoistCreateFunctionsEPNS_6ESTree4NodeE:
  124|   103k|void ESTreeIRGen::hoistCreateFunctions(ESTree::Node *containingNode) {
  125|   103k|  const auto &closures = curFunction()->getSemInfo()->closures;
  126|   103k|  auto it = closures.find(containingNode);
  127|   103k|  if (it == closures.end()) {
  ------------------
  |  Branch (127:7): [True: 0, False: 103k]
  ------------------
  128|      0|    return;
  129|      0|  }
  130|       |
  131|   103k|  for (ESTree::FunctionDeclarationNode *funcDecl : *it->second) {
  ------------------
  |  Branch (131:50): [True: 0, False: 103k]
  ------------------
  132|      0|    emitCreateFunction(funcDecl);
  133|      0|  }
  134|   103k|}
_ZN6hermes5irgen11ESTreeIRGen21genFunctionExpressionEPNS_6ESTree22FunctionExpressionNodeENS_10IdentifierE:
  138|     82|    Identifier nameHint) {
  139|     82|  LLVM_DEBUG(
  ------------------
  |  |  123|     82|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     82|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 82]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     82|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  140|     82|      llvh::dbgs()
  141|     82|      << "Creating anonymous closure. "
  142|     82|      << Builder.getInsertionBlock()->getParent()->getInternalName() << ".\n");
  143|       |
  144|     82|  std::variant<std::monostate, NameTableScopeTy, EnterBlockScope> newScope;
  145|       |
  146|     82|  if (!Mod->getContext().getCodeGenerationSettings().enableBlockScoping) {
  ------------------
  |  Branch (146:7): [True: 82, False: 0]
  ------------------
  147|     82|    newScope.emplace<NameTableScopeTy>(nameTable_);
  148|     82|  } else {
  149|      0|    newScope.emplace<EnterBlockScope>(curFunction());
  150|      0|    newDeclarativeEnvironment();
  151|      0|  }
  152|     82|  Variable *tempClosureVar = nullptr;
  153|       |
  154|     82|  Identifier originalNameIden = nameHint;
  155|     82|  if (FE->_id) {
  ------------------
  |  Branch (155:7): [True: 0, False: 82]
  ------------------
  156|      0|    if (!Mod->getContext().getCodeGenerationSettings().enableBlockScoping) {
  ------------------
  |  Branch (156:9): [True: 0, False: 0]
  ------------------
  157|      0|      auto closureName = genAnonymousLabelName("closure");
  158|      0|      tempClosureVar = Builder.createVariable(
  159|      0|          curFunction()->function->getFunctionScopeDesc(),
  160|      0|          Variable::DeclKind::Var,
  161|      0|          closureName);
  162|       |
  163|       |      // Insert the synthesized variable into the name table, so it can be
  164|       |      // looked up internally as well.
  165|      0|      nameTable_.insertIntoScope(
  166|      0|          curFunction()->functionScope,
  167|      0|          tempClosureVar->getName(),
  168|      0|          tempClosureVar);
  169|       |
  170|       |      // Alias the lexical name to the synthesized variable.
  171|      0|      originalNameIden = getNameFieldFromID(FE->_id);
  172|      0|      nameTable_.insert(originalNameIden, tempClosureVar);
  173|      0|    } else {
  174|       |      // Use the expression's ID for its closure name, as well as its variable
  175|       |      // name -- which is OK because we're in a new scope.
  176|      0|      originalNameIden = getNameFieldFromID(FE->_id);
  177|       |
  178|      0|      auto closureName = genAnonymousLabelName(originalNameIden.str());
  179|      0|      tempClosureVar = Builder.createVariable(
  180|      0|          currentIRScopeDesc_, Variable::DeclKind::Const, closureName);
  181|       |
  182|       |      // ES2023 dictates that function expression's ID are non-strict immutable
  183|       |      // bindings.
  184|      0|      tempClosureVar->setStrictImmutableBinding(false);
  185|       |
  186|      0|      nameTable_.insertIntoScope(
  187|      0|          curFunction()->blockScope, originalNameIden, tempClosureVar);
  188|      0|    }
  189|      0|  }
  190|       |
  191|     82|  Function *newFunc = FE->_async
  ------------------
  |  Branch (191:23): [True: 0, False: 82]
  ------------------
  192|     82|      ? genAsyncFunction(originalNameIden, tempClosureVar, FE)
  193|     82|      : FE->_generator
  ------------------
  |  Branch (193:9): [True: 0, False: 82]
  ------------------
  194|     82|      ? genGeneratorFunction(originalNameIden, tempClosureVar, FE)
  195|     82|      : genES5Function(originalNameIden, tempClosureVar, FE);
  196|       |
  197|     82|  Value *closure = Builder.createCreateFunctionInst(newFunc, currentIRScope_);
  198|       |
  199|     82|  if (tempClosureVar)
  ------------------
  |  Branch (199:7): [True: 0, False: 82]
  ------------------
  200|      0|    emitStore(closure, tempClosureVar, true);
  201|       |
  202|     82|  return closure;
  203|     82|}
_ZN6hermes5irgen11ESTreeIRGen26genArrowFunctionExpressionEPNS_6ESTree27ArrowFunctionExpressionNodeENS_10IdentifierE:
  207|   103k|    Identifier nameHint) {
  208|   103k|  LLVM_DEBUG(
  ------------------
  |  |  123|   103k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   103k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 103k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   103k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|   103k|      llvh::dbgs()
  210|   103k|      << "Creating arrow function. "
  211|   103k|      << Builder.getInsertionBlock()->getParent()->getInternalName() << ".\n");
  212|       |
  213|   103k|  if (AF->_async) {
  ------------------
  |  Branch (213:7): [True: 0, False: 103k]
  ------------------
  214|      0|    Builder.getModule()->getContext().getSourceErrorManager().error(
  215|      0|        AF->getSourceRange(), Twine("async functions are unsupported"));
  216|      0|    return Builder.getLiteralUndefined();
  217|      0|  }
  218|       |
  219|   103k|  auto *newFunc = Builder.createFunction(
  220|   103k|      newScopeDesc(),
  221|   103k|      genAnonymousFunctionNameIfNeeded(nameHint),
  222|   103k|      Function::DefinitionKind::ES6Arrow,
  223|   103k|      ESTree::isStrict(AF->strictness),
  224|   103k|      AF->sourceVisibility,
  225|   103k|      AF->getSourceRange());
  226|       |
  227|   103k|  {
  228|   103k|    FunctionContext newFunctionContext{this, newFunc, AF->getSemInfo()};
  229|       |
  230|       |    // Propagate captured "this", "new.target" and "arguments" from parents.
  231|   103k|    auto *prev = curFunction()->getPreviousContext();
  232|   103k|    curFunction()->capturedThis = prev->capturedThis;
  233|   103k|    curFunction()->capturedNewTarget = prev->capturedNewTarget;
  234|   103k|    curFunction()->capturedArguments = prev->capturedArguments;
  235|       |
  236|   103k|    emitFunctionPreamble(Builder.createBasicBlock(newFunc));
  237|   103k|    emitTopLevelDeclarations(AF, AF->_body, DoEmitParameters::YesMultiScopes);
  238|       |
  239|   103k|    genFunctionBody(AF->_body);
  240|   103k|    emitFunctionEpilogue(Builder.getLiteralUndefined());
  241|   103k|  }
  242|       |
  243|       |  // Emit CreateFunctionInst after we have restored the builder state.
  244|   103k|  return Builder.createCreateFunctionInst(newFunc, currentIRScope_);
  245|   103k|}
_ZN6hermes5irgen11ESTreeIRGen14genES5FunctionENS_10IdentifierEPNS_8VariableEPNS_6ESTree16FunctionLikeNodeEb:
  262|     82|    bool isGeneratorInnerFunction) {
  263|     82|  assert(functionNode && "Function AST cannot be null");
  264|       |
  265|     82|  auto *body = ESTree::getBlockStatement(functionNode);
  266|     82|  assert(body && "body of ES5 function cannot be null");
  267|       |
  268|     82|  Function *newFunction = isGeneratorInnerFunction
  ------------------
  |  Branch (268:27): [True: 0, False: 82]
  ------------------
  269|     82|      ? Builder.createGeneratorInnerFunction(
  270|      0|            newScopeDesc(),
  271|      0|            genAnonymousFunctionNameIfNeeded(originalName),
  272|      0|            Function::DefinitionKind::ES5Function,
  273|      0|            ESTree::isStrict(functionNode->strictness),
  274|      0|            functionNode->getSourceRange(),
  275|      0|            /* insertBefore */ nullptr)
  276|     82|      : Builder.createFunction(
  277|     82|            newScopeDesc(),
  278|     82|            genAnonymousFunctionNameIfNeeded(originalName),
  279|     82|            Function::DefinitionKind::ES5Function,
  280|     82|            ESTree::isStrict(functionNode->strictness),
  281|     82|            functionNode->sourceVisibility,
  282|     82|            functionNode->getSourceRange(),
  283|     82|            /* isGlobal */ false,
  284|     82|            /* insertBefore */ nullptr);
  285|       |
  286|     82|  newFunction->setLazyClosureAlias(lazyClosureAlias);
  287|       |
  288|     82|  if (auto *bodyBlock = llvh::dyn_cast<ESTree::BlockStatementNode>(body)) {
  ------------------
  |  Branch (288:13): [True: 82, False: 0]
  ------------------
  289|     82|    if (bodyBlock->isLazyFunctionBody) {
  ------------------
  |  Branch (289:9): [True: 81, False: 1]
  ------------------
  290|     81|      assert(
  291|     81|          !isGeneratorInnerFunction &&
  292|     81|          "generator inner function should be included with outer function");
  293|     81|      setupLazyScope(functionNode, newFunction, body);
  294|     81|      return newFunction;
  295|     81|    }
  296|     82|  }
  297|       |
  298|      1|  FunctionContext newFunctionContext{
  299|      1|      this, newFunction, functionNode->getSemInfo()};
  300|       |
  301|      1|  if (isGeneratorInnerFunction) {
  ------------------
  |  Branch (301:7): [True: 0, False: 1]
  ------------------
  302|       |    // StartGeneratorInst
  303|       |    // ResumeGeneratorInst
  304|       |    // at the beginning of the function, to allow for the first .next() call.
  305|      0|    auto *initGenBB = Builder.createBasicBlock(newFunction);
  306|      0|    Builder.setInsertionBlock(initGenBB);
  307|      0|    Builder.createStartGeneratorInst();
  308|      0|    auto *prologueBB = Builder.createBasicBlock(newFunction);
  309|      0|    auto *prologueResumeIsReturn = Builder.createAllocStackInst(
  310|      0|        genAnonymousLabelName("isReturn_prologue"));
  311|      0|    genResumeGenerator(GenFinally::No, prologueResumeIsReturn, prologueBB);
  312|       |
  313|      0|    if (hasSimpleParams(functionNode)) {
  ------------------
  |  Branch (313:9): [True: 0, False: 0]
  ------------------
  314|       |      // If there are simple params, then we don't need an extra yield/resume.
  315|       |      // They can simply be initialized on the first call to `.next`.
  316|      0|      Builder.setInsertionBlock(prologueBB);
  317|      0|      emitFunctionPreamble(prologueBB);
  318|      0|      initCaptureStateInES5Function();
  319|      0|      emitTopLevelDeclarations(
  320|      0|          functionNode, body, DoEmitParameters::YesMultiScopes);
  321|      0|    } else {
  322|       |      // If there are non-simple params, then we must add a new yield/resume.
  323|       |      // The `.next()` call will occur once in the outer function, before
  324|       |      // the iterator is returned to the caller of the `function*`.
  325|      0|      auto *entryPointBB = Builder.createBasicBlock(newFunction);
  326|      0|      auto *entryPointResumeIsReturn =
  327|      0|          Builder.createAllocStackInst(genAnonymousLabelName("isReturn_entry"));
  328|       |
  329|       |      // Initialize parameters.
  330|      0|      Builder.setInsertionBlock(prologueBB);
  331|      0|      emitFunctionPreamble(prologueBB);
  332|      0|      initCaptureStateInES5Function();
  333|      0|      emitTopLevelDeclarations(
  334|      0|          functionNode, body, DoEmitParameters::YesMultiScopes);
  335|      0|      Builder.createSaveAndYieldInst(
  336|      0|          Builder.getLiteralUndefined(), entryPointBB);
  337|       |
  338|       |      // Actual entry point of function from the caller's perspective.
  339|      0|      Builder.setInsertionBlock(entryPointBB);
  340|      0|      genResumeGenerator(
  341|      0|          GenFinally::No,
  342|      0|          entryPointResumeIsReturn,
  343|      0|          Builder.createBasicBlock(newFunction));
  344|      0|    }
  345|      1|  } else {
  346|      1|    emitFunctionPreamble(Builder.createBasicBlock(newFunction));
  347|      1|    initCaptureStateInES5Function();
  348|      1|    emitTopLevelDeclarations(
  349|      1|        functionNode, body, DoEmitParameters::YesMultiScopes);
  350|      1|  }
  351|       |
  352|      1|  genFunctionBody(body);
  353|      1|  emitFunctionEpilogue(Builder.getLiteralUndefined());
  354|       |
  355|      1|  return curFunction()->function;
  356|     82|}
_ZN6hermes5irgen11ESTreeIRGen14setupLazyScopeEPNS_6ESTree16FunctionLikeNodeEPNS_8FunctionEPNS2_18BlockStatementNodeE:
  426|     81|    ESTree::BlockStatementNode *bodyBlock) {
  427|     81|  assert(
  428|     81|      bodyBlock->isLazyFunctionBody &&
  429|     81|      "setupLazyScope can only be used with lazy function bodies");
  430|       |  // Set the AST position and variable context so we can continue later.
  431|       |  // Save the scope chain starting from function's parent (i.e., the last
  432|       |  // materialized scope).
  433|     81|  function->setLazyScope(
  434|     81|      saveScopeChain(function->getFunctionScopeDesc()->getParent()));
  435|     81|  auto &lazySource = function->getLazySource();
  436|     81|  lazySource.bufferId = bodyBlock->bufferId;
  437|     81|  lazySource.nodeKind = getLazyFunctionKind(functionNode);
  438|     81|  lazySource.functionRange = functionNode->getSourceRange();
  439|     81|  lazySource.paramYield = bodyBlock->paramYield;
  440|     81|  lazySource.paramAwait = bodyBlock->paramAwait;
  441|       |
  442|       |  // Set the function's .length.
  443|     81|  function->setExpectedParamCountIncludingThis(
  444|     81|      countExpectedArgumentsIncludingThis(functionNode));
  445|     81|}
_ZN6hermes5irgen11ESTreeIRGen29initCaptureStateInES5FunctionEv:
  517|    197|void ESTreeIRGen::initCaptureStateInES5Function() {
  518|       |  // Capture "this", "new.target" and "arguments" if there are inner arrows.
  519|    197|  if (!curFunction()->getSemInfo()->containsArrowFunctions)
  ------------------
  |  Branch (519:7): [True: 188, False: 9]
  ------------------
  520|    188|    return;
  521|       |
  522|       |  // "this".
  523|      9|  curFunction()->capturedThis = Builder.createVariable(
  524|      9|      currentIRScopeDesc_,
  525|      9|      Variable::DeclKind::Var,
  526|      9|      genAnonymousLabelName("this"));
  527|      9|  emitStore(
  528|      9|      Builder.getFunction()->getThisParameter(),
  529|      9|      curFunction()->capturedThis,
  530|      9|      true);
  531|       |
  532|       |  // "new.target".
  533|      9|  curFunction()->capturedNewTarget = Builder.createVariable(
  534|      9|      currentIRScopeDesc_,
  535|      9|      Variable::DeclKind::Var,
  536|      9|      genAnonymousLabelName("new.target"));
  537|      9|  emitStore(
  538|      9|      Builder.createGetNewTargetInst(), curFunction()->capturedNewTarget, true);
  539|       |
  540|       |  // "arguments".
  541|      9|  if (curFunction()->getSemInfo()->containsArrowFunctionsUsingArguments) {
  ------------------
  |  Branch (541:7): [True: 0, False: 9]
  ------------------
  542|      0|    curFunction()->capturedArguments = Builder.createVariable(
  543|      0|        currentIRScopeDesc_,
  544|      0|        Variable::DeclKind::Var,
  545|      0|        genAnonymousLabelName("arguments"));
  546|      0|    emitStore(
  547|      0|        curFunction()->createArgumentsInst,
  548|      0|        curFunction()->capturedArguments,
  549|      0|        true);
  550|      0|  }
  551|      9|}
_ZN6hermes5irgen11ESTreeIRGen20emitFunctionPreambleEPNS_10BasicBlockE:
  553|   103k|void ESTreeIRGen::emitFunctionPreamble(BasicBlock *entry) {
  554|   103k|  auto *newFunc = curFunction()->function;
  555|       |
  556|   103k|  Builder.setLocation(newFunc->getSourceRange().Start);
  557|   103k|  Builder.setCurrentSourceLevelScope(nullptr);
  558|       |
  559|   103k|  BasicBlock *realEntry = &newFunc->front();
  560|   103k|  if (realEntry->empty()) {
  ------------------
  |  Branch (560:7): [True: 103k, False: 0]
  ------------------
  561|   103k|    Builder.setInsertionBlock(realEntry);
  562|   103k|  } else {
  563|      0|    Builder.setInsertionPoint(&realEntry->front());
  564|      0|  }
  565|       |  // Create the function scope.
  566|   103k|  currentIRScope_ =
  567|   103k|      Builder.createCreateScopeInst(newFunc->getFunctionScopeDesc());
  568|       |
  569|       |  // Start pumping instructions into the entry basic block.
  570|   103k|  Builder.setInsertionBlock(entry);
  571|   103k|  Builder.setCurrentSourceLevelScope(newFunc->getFunctionScopeDesc());
  572|       |
  573|       |  // Always insert a CreateArgumentsInst. We will delete it later if it is
  574|       |  // unused.
  575|   103k|  curFunction()->createArgumentsInst = Builder.createCreateArgumentsInst();
  576|       |
  577|       |  // Always create the "this" parameter. It needs to be created before we
  578|       |  // initialized the ES5 capture state.
  579|   103k|  Builder.createThisParameter(newFunc);
  580|   103k|}
_ZN6hermes5irgen11ESTreeIRGen24emitTopLevelDeclarationsEPNS_6ESTree16FunctionLikeNodeEPNS2_4NodeENS1_16DoEmitParametersE:
  585|   103k|    DoEmitParameters doEmitParameters) {
  586|       |  // There is a lot happening in this function w.r.t. function scopes, but that
  587|       |  // can be summarizes as follows:
  588|       |  //
  589|       |  //    topLevelScope = Scope();                                #1
  590|       |  //    currentScope = topLevelScope
  591|       |  //
  592|       |  //    if !isStrict and hasParamExpressions:
  593|       |  //        paramExpressionScope = InnerScope(currentScope)
  594|       |  //        currentScope = paramExpressionScope                 #2
  595|       |  //
  596|       |  //    << emit parameter expressions >>
  597|       |  //
  598|       |  //    if hasParamExpressions:
  599|       |  //       varScope = InnerScope(currentScope)
  600|       |  //       currentScope = varScope                              #3
  601|       |  //
  602|       |  //    << emit var declarations >>
  603|       |  //
  604|       |  //    if !isStrict:
  605|       |  //       lexicalScope = InnerScope(currentScope)              #4
  606|       |  //       currentScope = lexicalScope
  607|       |  //
  608|       |  //    << emit lexical declarations >>
  609|       |  //
  610|       |  // Thus at the end of this method, currentIRScopeDesc_ (i.e., currentScope
  611|       |  // above) should be
  612|       |  //
  613|       |  // 1. !isStrict and !hasParamExpressions:
  614|       |  //        currentIRScopeDesc_ == lexicalScope
  615|       |  //        lexicalScope.parent == topLevelScope
  616|       |  //        paramExpressionScope == null
  617|       |  //        varScope == null
  618|       |  // 2. !isStrict and hasParamExpressions:
  619|       |  //        currentIRScopeDesc_ == lexicalScope
  620|       |  //        lexicalScope.parent == varScope
  621|       |  //        varScope.parent == paramExpressionScope
  622|       |  //        paramExpressionScope.parent == topLevelScope
  623|       |  // 3. isStrict and !hasParamExpressions:
  624|       |  //        currentIRScopeDesc_ == topLevelScope
  625|       |  //        paramExpressionScope == null
  626|       |  //        varScope == null
  627|       |  //        lexicalScope == null
  628|       |  // 4. isStrict and hasParamExpressions:
  629|       |  //        currentIRScopeDesc_ == varScope
  630|       |  //        varScope.parent == topLevelScope
  631|       |  //        paramExpressionScope == null
  632|       |  //        lexicalScope == null
  633|       |  //
  634|       |  // The following variables are used to assert those conditions.
  635|   103k|  ScopeDesc *topLevelScope = currentIRScopeDesc_;
  636|   103k|  ScopeDesc *paramExpressionScope{};
  637|   103k|  ScopeDesc *varScope{};
  638|   103k|  ScopeDesc *lexicalScope{};
  639|       |
  640|   103k|  if (!Mod->getContext().getCodeGenerationSettings().enableBlockScoping) {
  ------------------
  |  Branch (640:7): [True: 103k, False: 0]
  ------------------
  641|   103k|    if (doEmitParameters == DoEmitParameters::YesMultiScopes) {
  ------------------
  |  Branch (641:9): [True: 103k, False: 196]
  ------------------
  642|       |      // Block scoping is disabled, so there's no point in emitting separate
  643|       |      // scopes.
  644|   103k|      doEmitParameters = DoEmitParameters::Yes;
  645|   103k|    }
  646|   103k|  }
  647|       |
  648|   103k|  const bool hasParamExpressions = ESTree::hasParamExpressions(funcNode);
  649|   103k|  if (doEmitParameters == DoEmitParameters::YesMultiScopes) {
  ------------------
  |  Branch (649:7): [True: 0, False: 103k]
  ------------------
  650|      0|    if (!ESTree::isStrict(funcNode->strictness) && hasParamExpressions) {
  ------------------
  |  Branch (650:9): [True: 0, False: 0]
  |  Branch (650:52): [True: 0, False: 0]
  ------------------
  651|      0|      curFunction()->enterOptionalFunctionScope(
  652|      0|          &FunctionContext::enterParamScope);
  653|      0|      newDeclarativeEnvironment();
  654|      0|      paramExpressionScope = currentIRScopeDesc_;
  655|      0|    }
  656|      0|  }
  657|       |
  658|   103k|  if (doEmitParameters != DoEmitParameters::No) {
  ------------------
  |  Branch (658:7): [True: 103k, False: 0]
  ------------------
  659|       |    // Create function parameters, register them in the scope, and initialize
  660|       |    // them with their income values.
  661|   103k|    emitParameters(funcNode, hasParamExpressions);
  662|   103k|  } else {
  663|      0|    curFunction()->function->setExpectedParamCountIncludingThis(
  664|      0|        countExpectedArgumentsIncludingThis(funcNode));
  665|      0|  }
  666|       |
  667|   103k|  auto *semInfo = curFunction()->getSemInfo();
  668|   103k|  if (doEmitParameters != DoEmitParameters::YesMultiScopes ||
  ------------------
  |  Branch (668:7): [True: 103k, False: 0]
  ------------------
  669|   103k|      !hasParamExpressions) {
  ------------------
  |  Branch (669:7): [True: 0, False: 0]
  ------------------
  670|       |    // Create variable declarations for each of the hoisted variables and
  671|       |    // functions. Initialize them to undefined.
  672|   103k|    for (const sem::FunctionInfo::VarDecl &decl : semInfo->varScoped) {
  ------------------
  |  Branch (672:49): [True: 0, False: 103k]
  ------------------
  673|      0|      createNewBinding(
  674|      0|          currentIRScopeDesc_,
  675|      0|          decl.kind,
  676|      0|          decl.identifier,
  677|      0|          decl.needsInitializer);
  678|      0|    }
  679|       |
  680|   103k|  } else {
  681|      0|    curFunction()->enterOptionalFunctionScope(&FunctionContext::enterVarScope);
  682|      0|    newDeclarativeEnvironment();
  683|      0|    varScope = currentIRScopeDesc_;
  684|       |
  685|      0|    for (const sem::FunctionInfo::VarDecl &decl : semInfo->varScoped) {
  ------------------
  |  Branch (685:49): [True: 0, False: 0]
  ------------------
  686|      0|      Value *init = nameTable_.lookup(getNameFieldFromID(decl.identifier));
  687|      0|      if (init) {
  ------------------
  |  Branch (687:11): [True: 0, False: 0]
  ------------------
  688|      0|        init = emitLoad(init);
  689|      0|      }
  690|      0|      createNewBinding(
  691|      0|          currentIRScopeDesc_,
  692|      0|          decl.kind,
  693|      0|          decl.identifier,
  694|      0|          decl.needsInitializer,
  695|      0|          init);
  696|      0|    }
  697|      0|  }
  698|       |
  699|   103k|  if (doEmitParameters == DoEmitParameters::YesMultiScopes) {
  ------------------
  |  Branch (699:7): [True: 0, False: 103k]
  ------------------
  700|      0|    if (!ESTree::isStrict(funcNode->strictness)) {
  ------------------
  |  Branch (700:9): [True: 0, False: 0]
  ------------------
  701|      0|      curFunction()->enterOptionalFunctionScope(
  702|      0|          &FunctionContext::enterTopLevelLexicalDeclarationsScope);
  703|      0|      newDeclarativeEnvironment();
  704|      0|      lexicalScope = currentIRScopeDesc_;
  705|      0|    }
  706|      0|  }
  707|       |
  708|       |  // Now that scope creation is completed, ensure that the expectations hold:
  709|   103k|  if (doEmitParameters == DoEmitParameters::YesMultiScopes) {
  ------------------
  |  Branch (709:7): [True: 0, False: 103k]
  ------------------
  710|      0|    (void)topLevelScope;
  711|      0|    (void)paramExpressionScope;
  712|      0|    (void)varScope;
  713|      0|    (void)lexicalScope;
  714|      0|    if (!ESTree::isStrict(funcNode->strictness)) {
  ------------------
  |  Branch (714:9): [True: 0, False: 0]
  ------------------
  715|      0|      if (!hasParamExpressions) {
  ------------------
  |  Branch (715:11): [True: 0, False: 0]
  ------------------
  716|       |        // 1. !isStrict and !hasParamExpressions:
  717|      0|        assert(currentIRScopeDesc_ == lexicalScope);
  718|      0|        assert(lexicalScope->getParent() == topLevelScope);
  719|      0|        assert(paramExpressionScope == nullptr);
  720|      0|        assert(varScope == nullptr);
  721|      0|      } else {
  722|       |        // 2. !isStrict and hasParamExpressions:
  723|      0|        assert(currentIRScopeDesc_ == lexicalScope);
  724|      0|        assert(lexicalScope->getParent() == varScope);
  725|      0|        assert(varScope->getParent() == paramExpressionScope);
  726|      0|        assert(paramExpressionScope->getParent() == topLevelScope);
  727|      0|      }
  728|      0|    } else {
  729|      0|      if (!hasParamExpressions) {
  ------------------
  |  Branch (729:11): [True: 0, False: 0]
  ------------------
  730|       |        // 3. isStrict and !hasParamExpressions:
  731|      0|        assert(currentIRScopeDesc_ == topLevelScope);
  732|      0|        assert(paramExpressionScope == nullptr);
  733|      0|        assert(varScope == nullptr);
  734|      0|        assert(lexicalScope == nullptr);
  735|      0|      } else {
  736|       |        // 4. isStrict and hasParamExpressions:
  737|      0|        assert(currentIRScopeDesc_ == varScope);
  738|      0|        assert(varScope->getParent() == topLevelScope);
  739|      0|        assert(paramExpressionScope == nullptr);
  740|      0|        assert(lexicalScope == nullptr);
  741|      0|      }
  742|      0|    }
  743|      0|  }
  744|       |
  745|       |  // Now create variable declarations for each scoped variable/function in body.
  746|       |  // let/const bindings are initialized to empty, and functions to undefined.
  747|   103k|  createScopeBindings(currentIRScopeDesc_, body);
  748|       |
  749|       |  // Generate the code for import declarations before generating the rest of the
  750|       |  // body.
  751|   103k|  for (ESTree::ImportDeclarationNode *importDecl : semInfo->imports) {
  ------------------
  |  Branch (751:50): [True: 0, False: 103k]
  ------------------
  752|      0|    genImportDeclaration(importDecl);
  753|      0|  }
  754|       |
  755|       |  // Generate all closures declared in body. Any hoisted
  756|       |  // functions from inner scopes have already been declared.
  757|   103k|  genFunctionDeclarations(body);
  758|       |
  759|       |  // Pre-hoists all functions that are defined within body (but not in
  760|       |  // BlockStatments in it).
  761|   103k|  hoistCreateFunctions(body);
  762|   103k|}
_ZN6hermes5irgen11ESTreeIRGen23genFunctionDeclarationsEPNS_6ESTree4NodeE:
  764|   103k|void ESTreeIRGen::genFunctionDeclarations(ESTree::Node *containingNode) {
  765|   103k|  auto *semInfo = curFunction()->getSemInfo();
  766|       |
  767|   103k|  auto it = semInfo->closures.find(containingNode);
  768|   103k|  if (it != semInfo->closures.end()) {
  ------------------
  |  Branch (768:7): [True: 103k, False: 0]
  ------------------
  769|   103k|    for (ESTree::FunctionDeclarationNode *fd : *it->second) {
  ------------------
  |  Branch (769:46): [True: 0, False: 103k]
  ------------------
  770|      0|      genFunctionDeclaration(fd);
  771|      0|    }
  772|   103k|  }
  773|   103k|}
_ZN6hermes5irgen11ESTreeIRGen19createScopeBindingsEPNS_9ScopeDescEPNS_6ESTree4NodeE:
  777|   103k|    ESTree::Node *containingNode) {
  778|   103k|  auto *semInfo = curFunction()->getSemInfo();
  779|       |
  780|   103k|  auto it = semInfo->lexicallyScoped.find(containingNode);
  781|   103k|  if (it != semInfo->lexicallyScoped.end()) {
  ------------------
  |  Branch (781:7): [True: 103k, False: 0]
  ------------------
  782|   103k|    for (const sem::FunctionInfo::VarDecl &decl : *it->second) {
  ------------------
  |  Branch (782:49): [True: 0, False: 103k]
  ------------------
  783|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  784|      0|          llvh::dbgs() << "creating binding " << decl.identifier->_name
  785|      0|                       << " in scope " << scopeDesc << "\n");
  786|      0|      createNewBinding(
  787|      0|          scopeDesc, decl.kind, decl.identifier, decl.needsInitializer);
  788|      0|      if (Mod->getContext().getCodeGenerationSettings().enableBlockScoping) {
  ------------------
  |  Branch (788:11): [True: 0, False: 0]
  ------------------
  789|      0|        if (decl.kind != VarDecl::Kind::Var && scopeDesc->isGlobalScope() &&
  ------------------
  |  Branch (789:13): [True: 0, False: 0]
  |  Branch (789:48): [True: 0, False: 0]
  ------------------
  790|      0|            llvh::isa<ESTree::ProgramNode>(containingNode)) {
  ------------------
  |  Branch (790:13): [True: 0, False: 0]
  ------------------
  791|       |          // The newly created Variable is a const/let declaration, so the
  792|       |          // running program must check whether it is a valid name. For example,
  793|       |          //
  794|       |          // let undefined;
  795|       |          //
  796|       |          // is an invalid global let declaration because undefined is a
  797|       |          // restricted global name.
  798|      0|          IRBuilder::ScopedLocationChange slc(
  799|      0|              Builder, decl.identifier->getSourceRange().Start);
  800|      0|          Builder.createThrowIfHasRestrictedGlobalPropertyInst(
  801|      0|              decl.identifier->_name->str());
  802|      0|        }
  803|      0|      }
  804|      0|    }
  805|   103k|  }
  806|   103k|}
_ZN6hermes5irgen11ESTreeIRGen14emitParametersEPNS_6ESTree16FunctionLikeNodeEb:
  832|   103k|    bool hasParamExpressions) {
  833|   103k|  auto *newFunc = curFunction()->function;
  834|       |
  835|   103k|  LLVM_DEBUG(llvh::dbgs() << "IRGen function parameters.\n");
  ------------------
  |  |  123|   103k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   103k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 103k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   103k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  836|       |
  837|   103k|  if (!Mod->getContext().getCodeGenerationSettings().enableBlockScoping) {
  ------------------
  |  Branch (837:7): [True: 103k, False: 0]
  ------------------
  838|       |    // Disable parameter TDZ if block scoping support is disabled.
  839|   103k|    hasParamExpressions = false;
  840|   103k|  }
  841|       |
  842|   103k|  llvh::SmallVector<Variable *, 4> tdzParams;
  843|       |
  844|       |  // Create a variable for every parameter.
  845|   103k|  Value *empty = Builder.getLiteralEmpty();
  846|   103k|  Variable::DeclKind paramKind =
  847|   103k|      hasParamExpressions ? Variable::DeclKind::Let : Variable::DeclKind::Var;
  ------------------
  |  Branch (847:7): [True: 0, False: 103k]
  ------------------
  848|   103k|  for (auto paramDecl : funcNode->getSemInfo()->paramNames) {
  ------------------
  |  Branch (848:23): [True: 103k, False: 103k]
  ------------------
  849|   103k|    Identifier paramName = getNameFieldFromID(paramDecl.identifier);
  850|   103k|    LLVM_DEBUG(llvh::dbgs() << "Adding parameter: " << paramName << "\n");
  ------------------
  |  |  123|   103k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   103k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 103k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   103k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  851|   103k|    auto *paramStorage = Builder.createVariable(
  852|   103k|        newFunc->getFunctionScopeDesc(), paramKind, paramName);
  853|   103k|    if (hasParamExpressions) {
  ------------------
  |  Branch (853:9): [True: 0, False: 103k]
  ------------------
  854|       |      // funcNode has parameter expressions, thus the parameters are first
  855|       |      // copied to tdz variables which need to be initialized to empty.
  856|      0|      Builder.createStoreFrameInst(empty, paramStorage, currentIRScope_);
  857|       |
  858|       |      // Also keep track of all created Variables to copy them into regular Var
  859|       |      // declarations.
  860|      0|      tdzParams.push_back(paramStorage);
  861|      0|    }
  862|       |    // Register the storage for the parameter.
  863|   103k|    nameTable_.insert(paramName, paramStorage);
  864|   103k|  }
  865|       |
  866|   103k|  uint32_t paramIndex = uint32_t{0} - 1;
  867|   103k|  for (auto &elem : ESTree::getParams(funcNode)) {
  ------------------
  |  Branch (867:19): [True: 103k, False: 103k]
  ------------------
  868|   103k|    ESTree::Node *param = &elem;
  869|   103k|    ESTree::Node *init = nullptr;
  870|   103k|    ++paramIndex;
  871|       |
  872|   103k|    if (auto *rest = llvh::dyn_cast<ESTree::RestElementNode>(param)) {
  ------------------
  |  Branch (872:15): [True: 0, False: 103k]
  ------------------
  873|      0|      createLRef(rest->_argument, true)
  874|      0|          .emitStore(genBuiltinCall(
  875|      0|              BuiltinMethod::HermesBuiltin_copyRestArgs,
  876|      0|              Builder.getLiteralNumber(paramIndex)));
  877|      0|      break;
  878|      0|    }
  879|       |
  880|       |    // Unpack the optional initialization.
  881|   103k|    if (auto *assign = llvh::dyn_cast<ESTree::AssignmentPatternNode>(param)) {
  ------------------
  |  Branch (881:15): [True: 0, False: 103k]
  ------------------
  882|      0|      param = assign->_left;
  883|      0|      init = assign->_right;
  884|      0|    }
  885|       |
  886|   103k|    Identifier formalParamName = llvh::isa<ESTree::IdentifierNode>(param)
  ------------------
  |  Branch (886:34): [True: 103k, False: 0]
  ------------------
  887|   103k|        ? getNameFieldFromID(param)
  888|   103k|        : genAnonymousLabelName("param");
  889|       |
  890|   103k|    auto *formalParam = Builder.createParameter(newFunc, formalParamName);
  891|   103k|    createLRef(param, true)
  892|   103k|        .emitStore(
  893|   103k|            emitOptionalInitialization(formalParam, init, formalParamName));
  894|   103k|  }
  895|       |
  896|       |  // Now copy the TDZ parameters to Var declarations. This improves codegen by
  897|       |  // removing tdz checks when accessing the parameters.
  898|   103k|  assert(
  899|   103k|      (tdzParams.empty() || hasParamExpressions) &&
  900|   103k|      "funcNode does not have param expressions, so it doesn't"
  901|   103k|      " need tdz params.");
  902|   103k|  for (Variable *oldParamStorage : tdzParams) {
  ------------------
  |  Branch (902:34): [True: 0, False: 103k]
  ------------------
  903|      0|    auto *paramStorage = Builder.createVariable(
  904|      0|        newFunc->getFunctionScopeDesc(),
  905|      0|        Variable::DeclKind::Let,
  906|      0|        oldParamStorage->getName());
  907|      0|    constexpr bool declInit = true;
  908|      0|    emitStore(emitLoad(oldParamStorage), paramStorage, declInit);
  909|      0|    nameTable_.setInCurrentScope(oldParamStorage->getName(), paramStorage);
  910|      0|  }
  911|       |
  912|   103k|  newFunc->setExpectedParamCountIncludingThis(
  913|   103k|      countExpectedArgumentsIncludingThis(funcNode));
  914|   103k|}
_ZN6hermes5irgen11ESTreeIRGen35countExpectedArgumentsIncludingThisEPNS_6ESTree16FunctionLikeNodeE:
  917|   103k|    ESTree::FunctionLikeNode *funcNode) {
  918|       |  // Start at 1 to account for "this".
  919|   103k|  uint32_t count = 1;
  920|   103k|  for (auto &param : ESTree::getParams(funcNode)) {
  ------------------
  |  Branch (920:20): [True: 103k, False: 103k]
  ------------------
  921|   103k|    if (llvh::isa<ESTree::AssignmentPatternNode>(param)) {
  ------------------
  |  Branch (921:9): [True: 0, False: 103k]
  ------------------
  922|       |      // Found an initializer, stop counting expected arguments.
  923|      0|      break;
  924|      0|    }
  925|   103k|    ++count;
  926|   103k|  }
  927|   103k|  return count;
  928|   103k|}
_ZN6hermes5irgen11ESTreeIRGen20emitFunctionEpilogueEPNS_5ValueE:
  930|   103k|void ESTreeIRGen::emitFunctionEpilogue(Value *returnValue) {
  931|   103k|  if (returnValue) {
  ------------------
  |  Branch (931:7): [True: 103k, False: 0]
  ------------------
  932|   103k|    Builder.setLocation(SourceErrorManager::convertEndToLocation(
  933|   103k|        Builder.getFunction()->getSourceRange()));
  934|   103k|    Builder.createReturnInst(returnValue);
  935|   103k|  }
  936|       |
  937|       |  // Delete CreateArgumentsInst if it is unused.
  938|   103k|  if (!curFunction()->createArgumentsInst->hasUsers())
  ------------------
  |  Branch (938:7): [True: 103k, False: 13]
  ------------------
  939|   103k|    curFunction()->createArgumentsInst->eraseFromParent();
  940|       |
  941|   103k|  curFunction()->function->clearStatementCount();
  942|   103k|}
ESTreeIRGen-func.cpp:_ZN6hermes5irgen12_GLOBAL__N_119getLazyFunctionKindEPNS_6ESTree16FunctionLikeNodeE:
  248|     81|ESTree::NodeKind getLazyFunctionKind(ESTree::FunctionLikeNode *node) {
  249|     81|  if (node->isMethodDefinition) {
  ------------------
  |  Branch (249:7): [True: 0, False: 81]
  ------------------
  250|       |    // This is not a regular function expression but getter/setter.
  251|       |    // If we want to reparse it later, we have to start from an
  252|       |    // identifier and not from a 'function' keyword.
  253|      0|    return ESTree::NodeKind::Property;
  254|      0|  }
  255|     81|  return node->getKind();
  256|     81|}

_ZN6hermes5irgen11ESTreeIRGen7genBodyERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
   15|    196|void ESTreeIRGen::genBody(ESTree::NodeList &Body) {
   16|    196|  LLVM_DEBUG(llvh::dbgs() << "Compiling body.\n");
  ------------------
  |  |  123|    196|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    196|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 196]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    196|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   17|       |
   18|       |  // Generate code for the declarations statements.
   19|   364k|  for (auto &Node : Body) {
  ------------------
  |  Branch (19:19): [True: 364k, False: 196]
  ------------------
   20|   364k|    LLVM_DEBUG(
  ------------------
  |  |  123|   364k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   364k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 364k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   364k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   21|   364k|        llvh::dbgs() << "IRGen node of type " << Node.getNodeName() << ".\n");
   22|   364k|    genStatement(&Node, IsLoopBody::No);
   23|   364k|  }
   24|    196|}
_ZN6hermes5irgen11ESTreeIRGen28genScopelessBlockOrStatementEPNS_6ESTree4NodeE:
   26|   103k|void ESTreeIRGen::genScopelessBlockOrStatement(ESTree::Node *stmt) {
   27|       |  // IRGen the content of the block.
   28|   103k|  if (auto *BS = llvh::dyn_cast<ESTree::BlockStatementNode>(stmt)) {
  ------------------
  |  Branch (28:13): [True: 103k, False: 0]
  ------------------
   29|   103k|    for (auto &Node : BS->_body) {
  ------------------
  |  Branch (29:21): [True: 103k, False: 103k]
  ------------------
   30|   103k|      genStatement(&Node, IsLoopBody::No);
   31|   103k|    }
   32|       |
   33|   103k|    return;
   34|   103k|  }
   35|       |
   36|      0|  genStatement(stmt, IsLoopBody::No);
   37|      0|}
_ZN6hermes5irgen11ESTreeIRGen15genFunctionBodyEPNS_6ESTree4NodeE:
   39|   103k|void ESTreeIRGen::genFunctionBody(ESTree::Node *stmt) {
   40|   103k|  genScopelessBlockOrStatement(stmt);
   41|   103k|}
_ZN6hermes5irgen11ESTreeIRGen12genStatementEPNS_6ESTree4NodeENS1_10IsLoopBodyE:
   67|   713k|void ESTreeIRGen::genStatement(ESTree::Node *stmt, IsLoopBody isLoopBody) {
   68|   713k|  LLVM_DEBUG(
  ------------------
  |  |  123|   713k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   713k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 713k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   713k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|   713k|      llvh::dbgs() << "IRGen statement of type " << stmt->getNodeName()
   70|   713k|                   << "\n");
   71|   713k|  IRBuilder::ScopedLocationChange slc(Builder, stmt->getDebugLoc());
   72|       |
   73|   713k|  Builder.getFunction()->incrementStatementCount();
   74|       |
   75|   713k|  if (auto *FD = llvh::dyn_cast<ESTree::FunctionDeclarationNode>(stmt)) {
  ------------------
  |  Branch (75:13): [True: 0, False: 713k]
  ------------------
   76|       |    // In the general case the function declaration has already been hoisted,
   77|       |    // but if the function was defined outside of a BlockStatement (and outside
   78|       |    // of the global scope), then its CreateFunctionInst should be emitted now.
   79|      0|    emitCreateFunction(FD);
   80|      0|    return;
   81|      0|  }
   82|       |
   83|   713k|  if (/* auto *IS = */ llvh::dyn_cast<ESTree::ImportDeclarationNode>(stmt)) {
  ------------------
  |  Branch (83:24): [True: 0, False: 713k]
  ------------------
   84|       |    // Import has already been hoisted. Do nothing. But, keep this to
   85|       |    // match the AST structure, and we may want to do something in the
   86|       |    // future.
   87|      0|    return;
   88|      0|  }
   89|       |
   90|   713k|  if (auto *IF = llvh::dyn_cast<ESTree::IfStatementNode>(stmt)) {
  ------------------
  |  Branch (90:13): [True: 0, False: 713k]
  ------------------
   91|      0|    return genIfStatement(IF);
   92|      0|  }
   93|       |
   94|   713k|  if (auto *FIS = llvh::dyn_cast<ESTree::ForInStatementNode>(stmt)) {
  ------------------
  |  Branch (94:13): [True: 15, False: 713k]
  ------------------
   95|     15|    return genForInStatement(FIS);
   96|     15|  }
   97|       |
   98|   713k|  if (auto *FOS = llvh::dyn_cast<ESTree::ForOfStatementNode>(stmt)) {
  ------------------
  |  Branch (98:13): [True: 0, False: 713k]
  ------------------
   99|      0|    return genForOfStatement(FOS);
  100|      0|  }
  101|       |
  102|   713k|  if (auto *Ret = llvh::dyn_cast<ESTree::ReturnStatementNode>(stmt)) {
  ------------------
  |  Branch (102:13): [True: 103k, False: 610k]
  ------------------
  103|   103k|    return genReturnStatement(Ret);
  104|   103k|  }
  105|       |
  106|   610k|  if (auto *exprStmt = llvh::dyn_cast<ESTree::ExpressionStatementNode>(stmt)) {
  ------------------
  |  Branch (106:13): [True: 358k, False: 251k]
  ------------------
  107|   358k|    return genExpressionWrapper(exprStmt->_expression);
  108|   358k|  }
  109|       |
  110|   251k|  if (auto *SW = llvh::dyn_cast<ESTree::SwitchStatementNode>(stmt)) {
  ------------------
  |  Branch (110:13): [True: 0, False: 251k]
  ------------------
  111|      0|    return genSwitchStatement(SW);
  112|      0|  }
  113|       |
  114|   251k|  if (auto *VDN = llvh::dyn_cast<ESTree::VariableDeclarationNode>(stmt)) {
  ------------------
  |  Branch (114:13): [True: 0, False: 251k]
  ------------------
  115|      0|    return genVariableDeclaration(VDN);
  116|      0|  }
  117|       |
  118|       |  // IRGen the content of the block.
  119|   251k|  if (auto *BS = llvh::dyn_cast<ESTree::BlockStatementNode>(stmt)) {
  ------------------
  |  Branch (119:13): [True: 0, False: 251k]
  ------------------
  120|      0|    genBlockStatement(BS, isLoopBody);
  121|      0|    return;
  122|      0|  }
  123|       |
  124|   251k|  if (auto *Label = llvh::dyn_cast<ESTree::LabeledStatementNode>(stmt)) {
  ------------------
  |  Branch (124:13): [True: 245k, False: 5.34k]
  ------------------
  125|       |    // Create a new basic block which is the continuation of the current block
  126|       |    // and the jump target of the label.
  127|   245k|    BasicBlock *next = Builder.createBasicBlock(curFunction()->function);
  128|       |
  129|       |    // Set the jump point for the label to the new block.
  130|   245k|    curFunction()->initLabel(Label, next, nullptr);
  131|       |
  132|       |    // Now, generate the IR for the statement that the label is annotating.
  133|   245k|    genStatement(Label->_body, isLoopBody);
  134|       |
  135|       |    // End the current basic block with a jump to the new basic block.
  136|   245k|    Builder.createBranchInst(next);
  137|   245k|    Builder.setInsertionBlock(next);
  138|       |
  139|   245k|    return;
  140|   245k|  }
  141|       |
  142|       |  // Handle the call expression that could appear in the context of statement
  143|       |  // expr without the ExpressionStatementNode wrapper.
  144|  5.34k|  if (auto *call = llvh::dyn_cast<ESTree::CallExpressionNode>(stmt)) {
  ------------------
  |  Branch (144:13): [True: 0, False: 5.34k]
  ------------------
  145|      0|    return genExpressionWrapper(call);
  146|      0|  }
  147|       |
  148|  5.34k|  if (auto *W = llvh::dyn_cast<ESTree::WhileStatementNode>(stmt)) {
  ------------------
  |  Branch (148:13): [True: 0, False: 5.34k]
  ------------------
  149|      0|    LLVM_DEBUG(llvh::dbgs() << "IRGen '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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  150|      0|    genForWhileLoops(W, nullptr, W->_test, W->_test, nullptr, W->_body);
  151|      0|    return;
  152|      0|  }
  153|       |
  154|  5.34k|  if (auto *F = llvh::dyn_cast<ESTree::ForStatementNode>(stmt)) {
  ------------------
  |  Branch (154:13): [True: 0, False: 5.34k]
  ------------------
  155|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  156|      0|    genForWhileLoops(F, F->_init, F->_test, F->_test, F->_update, F->_body);
  157|      0|    return;
  158|      0|  }
  159|       |
  160|  5.34k|  if (auto *D = llvh::dyn_cast<ESTree::DoWhileStatementNode>(stmt)) {
  ------------------
  |  Branch (160:13): [True: 0, False: 5.34k]
  ------------------
  161|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  162|      0|    genForWhileLoops(D, nullptr, nullptr, D->_test, nullptr, D->_body);
  163|      0|    return;
  164|      0|  }
  165|       |
  166|  5.34k|  if (auto *breakStmt = llvh::dyn_cast<ESTree::BreakStatementNode>(stmt)) {
  ------------------
  |  Branch (166:13): [True: 0, False: 5.34k]
  ------------------
  167|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|       |
  169|      0|    auto &label = curFunction()->label(breakStmt);
  170|      0|    assert(label.breakTarget && "breakTarget not set");
  171|       |
  172|      0|    genFinallyBeforeControlChange(
  173|      0|        curFunction()->surroundingTry,
  174|      0|        label.surroundingTry,
  175|      0|        ControlFlowChange::Break);
  176|      0|    Builder.createBranchInst(label.breakTarget);
  177|       |
  178|       |    // Continue code generation for stuff that comes after the break statement
  179|       |    // in a new dead block.
  180|      0|    auto newBlock = Builder.createBasicBlock(curFunction()->function);
  181|      0|    Builder.setInsertionBlock(newBlock);
  182|      0|    return;
  183|      0|  }
  184|       |
  185|  5.34k|  if (auto *continueStmt =
  ------------------
  |  Branch (185:13): [True: 0, False: 5.34k]
  ------------------
  186|  5.34k|          llvh::dyn_cast<ESTree::ContinueStatementNode>(stmt)) {
  187|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  188|       |
  189|      0|    auto &label = curFunction()->label(continueStmt);
  190|      0|    assert(label.continueTarget && "continueTarget not set");
  191|       |
  192|      0|    genFinallyBeforeControlChange(
  193|      0|        curFunction()->surroundingTry,
  194|      0|        label.surroundingTry,
  195|      0|        ControlFlowChange::Continue,
  196|      0|        label.continueTarget);
  197|      0|    Builder.createBranchInst(label.continueTarget);
  198|       |
  199|       |    // Continue code generation for stuff that comes after the break statement
  200|       |    // in a new dead block.
  201|      0|    auto newBlock = Builder.createBasicBlock(curFunction()->function);
  202|      0|    Builder.setInsertionBlock(newBlock);
  203|      0|    return;
  204|      0|  }
  205|       |
  206|  5.34k|  if (auto *T = llvh::dyn_cast<ESTree::TryStatementNode>(stmt)) {
  ------------------
  |  Branch (206:13): [True: 0, False: 5.34k]
  ------------------
  207|      0|    genTryStatement(T);
  208|      0|    return;
  209|      0|  }
  210|       |
  211|  5.34k|  if (auto *T = llvh::dyn_cast<ESTree::ThrowStatementNode>(stmt)) {
  ------------------
  |  Branch (211:13): [True: 0, False: 5.34k]
  ------------------
  212|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|      0|    Value *rightHandVal = genExpression(T->_argument);
  214|      0|    Builder.createThrowInst(rightHandVal);
  215|       |
  216|       |    // Throw interferes with control flow, hence we need a new block.
  217|      0|    auto newBlock =
  218|      0|        Builder.createBasicBlock(Builder.getInsertionBlock()->getParent());
  219|      0|    Builder.setInsertionBlock(newBlock);
  220|      0|    return;
  221|      0|  }
  222|       |
  223|       |  // Handle empty statements.
  224|  5.34k|  if (llvh::isa<ESTree::EmptyStatementNode>(stmt)) {
  ------------------
  |  Branch (224:7): [True: 5.34k, False: 0]
  ------------------
  225|  5.34k|    return;
  226|  5.34k|  }
  227|       |
  228|       |  // Handle debugger statements.
  229|      0|  if (llvh::isa<ESTree::DebuggerStatementNode>(stmt)) {
  ------------------
  |  Branch (229:7): [True: 0, False: 0]
  ------------------
  230|      0|    Builder.createDebuggerInst();
  231|      0|    return;
  232|      0|  }
  233|       |
  234|      0|  if (auto *importDecl = llvh::dyn_cast<ESTree::ImportDeclarationNode>(stmt)) {
  ------------------
  |  Branch (234:13): [True: 0, False: 0]
  ------------------
  235|      0|    return genImportDeclaration(importDecl);
  236|      0|  }
  237|       |
  238|      0|  if (auto *exportDecl =
  ------------------
  |  Branch (238:13): [True: 0, False: 0]
  ------------------
  239|      0|          llvh::dyn_cast<ESTree::ExportNamedDeclarationNode>(stmt)) {
  240|      0|    return genExportNamedDeclaration(exportDecl);
  241|      0|  }
  242|       |
  243|      0|  if (auto *exportDecl =
  ------------------
  |  Branch (243:13): [True: 0, False: 0]
  ------------------
  244|      0|          llvh::dyn_cast<ESTree::ExportDefaultDeclarationNode>(stmt)) {
  245|      0|    return genExportDefaultDeclaration(exportDecl);
  246|      0|  }
  247|       |
  248|      0|  if (auto *exportDecl =
  ------------------
  |  Branch (248:13): [True: 0, False: 0]
  ------------------
  249|      0|          llvh::dyn_cast<ESTree::ExportAllDeclarationNode>(stmt)) {
  250|      0|    return genExportAllDeclaration(exportDecl);
  251|      0|  }
  252|       |
  253|      0|  Builder.getModule()->getContext().getSourceErrorManager().error(
  254|      0|      stmt->getSourceRange(), Twine("invalid statement encountered."));
  255|      0|}
_ZN6hermes5irgen11ESTreeIRGen20genExpressionWrapperEPNS_6ESTree4NodeE:
  257|   358k|void ESTreeIRGen::genExpressionWrapper(ESTree::Node *expr) {
  258|   358k|  Value *val = genExpression(expr);
  259|   358k|  if (curFunction()->globalReturnRegister) {
  ------------------
  |  Branch (259:7): [True: 358k, False: 1]
  ------------------
  260|   358k|    Builder.createStoreStackInst(val, curFunction()->globalReturnRegister);
  261|   358k|  }
  262|   358k|}
_ZN6hermes5irgen11ESTreeIRGen17genForInStatementEPNS_6ESTree18ForInStatementNodeE:
  398|     15|void ESTreeIRGen::genForInStatement(ESTree::ForInStatementNode *ForInStmt) {
  399|       |  // The state of the enumerator. Notice that the instruction writes to the
  400|       |  // storage
  401|       |  // variables just like Load/Store instructions write to stack allocations.
  402|     15|  auto *iteratorStorage =
  403|     15|      Builder.createAllocStackInst(genAnonymousLabelName("iter"));
  404|     15|  auto *baseStorage =
  405|     15|      Builder.createAllocStackInst(genAnonymousLabelName("base"));
  406|     15|  auto *indexStorage =
  407|     15|      Builder.createAllocStackInst(genAnonymousLabelName("idx"));
  408|     15|  auto *sizeStorage =
  409|     15|      Builder.createAllocStackInst(genAnonymousLabelName("size"));
  410|       |
  411|       |  // Check for the obscure case "for(var i = init in ....)". We need to
  412|       |  // initialize the loop variable with the initializer.
  413|     15|  if (auto *VD =
  ------------------
  |  Branch (413:13): [True: 0, False: 15]
  ------------------
  414|     15|          llvh::dyn_cast<ESTree::VariableDeclarationNode>(ForInStmt->_left)) {
  415|      0|    assert(
  416|      0|        VD->_declarations.size() == 1 && "for-in must have a single binding");
  417|      0|    auto *declarator =
  418|      0|        cast<ESTree::VariableDeclaratorNode>(&VD->_declarations.front());
  419|      0|    if (declarator->_init) {
  ------------------
  |  Branch (419:9): [True: 0, False: 0]
  ------------------
  420|       |      // Note that we need to create a separate LReference for the
  421|       |      // initialization because the loop one must execute inside the loop for
  422|       |      // cases like "for(a[i++] in ...)".
  423|      0|      LReference initRef = createLRef(VD, true);
  424|      0|      initRef.emitStore(genExpression(declarator->_init));
  425|      0|    }
  426|      0|  }
  427|       |
  428|       |  // Generate the right hand side of the for-in loop. The result of this
  429|       |  // expression is the object we iterate on. We use this object as the 'base'
  430|       |  // of the enumerator.
  431|     15|  Value *object = genExpression(ForInStmt->_right);
  432|     15|  Builder.createStoreStackInst(object, baseStorage);
  433|       |
  434|       |  // The storage for the property name that the enumerator loads:
  435|     15|  auto *propertyStorage =
  436|     15|      Builder.createAllocStackInst(genAnonymousLabelName("prop"));
  437|       |
  438|       |  /*
  439|       |    We generate the following loop structure for the for-in loops:
  440|       |
  441|       |        [ current block ]
  442|       |        [   get_pname   ]
  443|       |               |         \
  444|       |               |          \
  445|       |               v           \ (on empty object)
  446|       |    /----> [get_next]       \
  447|       |    |          |     \       \
  448|       |    |          |      \       \
  449|       |    |          |       \       \ ->[ exit block ]
  450|       |    |          |        \      /
  451|       |    |    [ body block ]  \____/
  452|       |    |          |          (on last iteration)
  453|       |    \__________/
  454|       |  */
  455|       |
  456|     15|  auto parent = Builder.getInsertionBlock()->getParent();
  457|     15|  auto *exitBlock = Builder.createBasicBlock(parent);
  458|     15|  auto *getNextBlock = Builder.createBasicBlock(parent);
  459|     15|  auto *bodyBlock = Builder.createBasicBlock(parent);
  460|       |
  461|       |  // Initialize the goto labels.
  462|     15|  curFunction()->initLabel(ForInStmt, exitBlock, getNextBlock);
  463|       |
  464|       |  // Create the enumerator:
  465|     15|  Builder.createGetPNamesInst(
  466|     15|      iteratorStorage,
  467|     15|      baseStorage,
  468|     15|      indexStorage,
  469|     15|      sizeStorage,
  470|     15|      exitBlock,
  471|     15|      getNextBlock);
  472|       |
  473|       |  // Generate the get_next part of the loop:
  474|     15|  Builder.setInsertionBlock(getNextBlock);
  475|     15|  Builder.createGetNextPNameInst(
  476|     15|      propertyStorage,
  477|     15|      baseStorage,
  478|     15|      indexStorage,
  479|     15|      sizeStorage,
  480|     15|      iteratorStorage,
  481|     15|      exitBlock,
  482|     15|      bodyBlock);
  483|       |
  484|       |  // Emit the loop body and setup the property variable. When done jump into the
  485|       |  // 'get_next' block and try to do another iteration.
  486|     15|  Builder.setInsertionBlock(bodyBlock);
  487|       |
  488|       |  // The string property value of the current iteration is saved into this
  489|       |  // variable.
  490|     15|  auto propertyStringRepr = Builder.createLoadStackInst(propertyStorage);
  491|       |
  492|       |  // The left hand side of For-In statements can be any lhs expression
  493|       |  // ("PutValue"). Example:
  494|       |  //  1. for (x.y in [1,2,3])
  495|       |  //  2. for (x in [1,2,3])
  496|       |  //  3. for (var x in [1,2,3])
  497|       |  // See ES5 $12.6.4 "The for-in Statement"
  498|     15|  LReference lref = createLRef(ForInStmt->_left, false);
  499|     15|  lref.emitStore(propertyStringRepr);
  500|       |
  501|     15|  genStatement(ForInStmt->_body, IsLoopBody::Yes);
  502|       |
  503|     15|  Builder.createBranchInst(getNextBlock);
  504|       |
  505|     15|  Builder.setInsertionBlock(exitBlock);
  506|     15|}
_ZN6hermes5irgen11ESTreeIRGen18genReturnStatementEPNS_6ESTree19ReturnStatementNodeE:
  574|   103k|void ESTreeIRGen::genReturnStatement(ESTree::ReturnStatementNode *RetStmt) {
  575|   103k|  LLVM_DEBUG(llvh::dbgs() << "IRGen Return-stmt.\n");
  ------------------
  |  |  123|   103k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   103k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 103k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   103k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  576|       |
  577|   103k|  Value *Value;
  578|       |  // Generate IR for the return value, or undefined if this is an empty return
  579|       |  // statement.
  580|   103k|  if (auto *A = RetStmt->_argument) {
  ------------------
  |  Branch (580:13): [True: 103k, False: 0]
  ------------------
  581|   103k|    Value = genExpression(A);
  582|   103k|  } else {
  583|      0|    Value = Builder.getLiteralUndefined();
  584|      0|  }
  585|       |
  586|   103k|  genFinallyBeforeControlChange(
  587|   103k|      curFunction()->surroundingTry, nullptr, ControlFlowChange::Break);
  588|   103k|  Builder.createReturnInst(Value);
  589|       |
  590|       |  // Code that comes after 'return' is dead code. Let's create a new un-linked
  591|       |  // basic block and keep IRGen in that block. The optimizer will clean things
  592|       |  // up.
  593|   103k|  auto Parent = Builder.getInsertionBlock()->getParent();
  594|   103k|  Builder.setInsertionBlock(Builder.createBasicBlock(Parent));
  595|   103k|}

_ZN6hermes5irgen24loadGlobalObjectPropertyERNS_9IRBuilderEPNS_20GlobalObjectPropertyEb:
   25|   501k|    bool inhibitThrow) {
   26|   501k|  if (from->isDeclared() || inhibitThrow) {
  ------------------
  |  Branch (26:7): [True: 0, False: 501k]
  |  Branch (26:29): [True: 0, False: 501k]
  ------------------
   27|      0|    return builder.createLoadPropertyInst(
   28|      0|        builder.getGlobalObject(), from->getName());
   29|      0|  }
   30|   501k|  return builder.createTryLoadGlobalPropertyInst(from);
   31|   501k|}
_ZN6hermes5irgen10LReference10getBuilderEv:
  183|   128k|IRBuilder &LReference::getBuilder() {
  184|   128k|  return irgen_->Builder;
  185|   128k|}
_ZN6hermes5irgen10LReference8emitLoadEv:
  187|      1|Value *LReference::emitLoad() {
  188|      1|  auto &builder = getBuilder();
  189|      1|  IRBuilder::ScopedLocationChange slc(builder, loadLoc_);
  190|       |
  191|      1|  switch (kind_) {
  ------------------
  |  Branch (191:11): [True: 0, False: 1]
  ------------------
  192|      0|    case Kind::Empty:
  ------------------
  |  Branch (192:5): [True: 0, False: 1]
  ------------------
  193|      0|      assert(false && "empty cannot be loaded");
  194|      0|      return builder.getLiteralUndefined();
  195|      1|    case Kind::Member:
  ------------------
  |  Branch (195:5): [True: 1, False: 0]
  ------------------
  196|      1|      return builder.createLoadPropertyInst(base_, property_);
  197|      0|    case Kind::VarOrGlobal:
  ------------------
  |  Branch (197:5): [True: 0, False: 1]
  ------------------
  198|      0|      return irgen_->emitLoad(base_);
  199|      0|    case Kind::Destructuring:
  ------------------
  |  Branch (199:5): [True: 0, False: 1]
  ------------------
  200|      0|      assert(false && "destructuring cannot be loaded");
  201|      0|      return builder.getLiteralUndefined();
  202|      0|    case Kind::Error:
  ------------------
  |  Branch (202:5): [True: 0, False: 1]
  ------------------
  203|      0|      return builder.getLiteralUndefined();
  204|      1|  }
  205|       |
  206|      0|  llvm_unreachable("invalid LReference kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  207|      1|}
_ZN6hermes5irgen10LReference9emitStoreEPNS_5ValueE:
  209|   128k|void LReference::emitStore(Value *value) {
  210|   128k|  auto &builder = getBuilder();
  211|       |
  212|   128k|  switch (kind_) {
  ------------------
  |  Branch (212:11): [True: 0, False: 128k]
  ------------------
  213|      0|    case Kind::Empty:
  ------------------
  |  Branch (213:5): [True: 0, False: 128k]
  ------------------
  214|      0|      return;
  215|     67|    case Kind::Member:
  ------------------
  |  Branch (215:5): [True: 67, False: 127k]
  ------------------
  216|     67|      builder.createStorePropertyInst(value, base_, property_);
  217|     67|      return;
  218|   105k|    case Kind::VarOrGlobal:
  ------------------
  |  Branch (218:5): [True: 105k, False: 22.4k]
  ------------------
  219|   105k|      irgen_->emitStore(value, base_, declInit_);
  220|   105k|      return;
  221|      0|    case Kind::Error:
  ------------------
  |  Branch (221:5): [True: 0, False: 128k]
  ------------------
  222|      0|      return;
  223|  22.3k|    case Kind::Destructuring:
  ------------------
  |  Branch (223:5): [True: 22.3k, False: 105k]
  ------------------
  224|  22.3k|      return irgen_->emitDestructuringAssignment(
  225|  22.3k|          declInit_, destructuringTarget_, value);
  226|   128k|  }
  227|       |
  228|      0|  llvm_unreachable("invalid LReference kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  229|   128k|}
_ZNK6hermes5irgen10LReference26canStoreWithoutSideEffectsEv:
  231|  20.3k|bool LReference::canStoreWithoutSideEffects() const {
  232|  20.3k|  return kind_ == Kind::VarOrGlobal && llvh::isa<Variable>(base_);
  ------------------
  |  Branch (232:10): [True: 0, False: 20.3k]
  |  Branch (232:40): [True: 0, False: 0]
  ------------------
  233|  20.3k|}
_ZNK6hermes5irgen10LReference14castAsVariableEv:
  235|  4.55k|Variable *LReference::castAsVariable() const {
  236|  4.55k|  return kind_ == Kind::VarOrGlobal ? dyn_cast_or_null<Variable>(base_)
  ------------------
  |  Branch (236:10): [True: 2.39k, False: 2.15k]
  ------------------
  237|  4.55k|                                    : nullptr;
  238|  4.55k|}
_ZNK6hermes5irgen10LReference26castAsGlobalObjectPropertyEv:
  239|  3.39k|GlobalObjectProperty *LReference::castAsGlobalObjectProperty() const {
  240|  3.39k|  return kind_ == Kind::VarOrGlobal
  ------------------
  |  Branch (240:10): [True: 1.23k, False: 2.15k]
  ------------------
  241|  3.39k|      ? dyn_cast_or_null<GlobalObjectProperty>(base_)
  242|  3.39k|      : nullptr;
  243|  3.39k|}
_ZN6hermes5irgen11ESTreeIRGenC2EPNS_6ESTree4NodeERKNSt3__16vectorIPNS2_11ProgramNodeENS5_9allocatorIS8_EEEEPNS_6ModuleERKNS_10ScopeChainE:
  253|    196|    : Mod(M),
  254|    196|      Builder(Mod),
  255|    196|      instrumentIR_(M, Builder),
  256|    196|      Root(root),
  257|    196|      DeclarationFileList(declFileList),
  258|    196|      lexicalScopeChain(resolveScopeIdentifiers(scopeChain)),
  259|    196|      identEval_(Builder.createIdentifier("eval")),
  260|    196|      identLet_(Builder.createIdentifier("let")),
  261|    196|      identDefaultExport_(Builder.createIdentifier("?default")) {}
_ZN6hermes5irgen11ESTreeIRGen4doItEv:
  263|    196|void ESTreeIRGen::doIt() {
  264|    196|  LLVM_DEBUG(llvh::dbgs() << "Processing top level program.\n");
  ------------------
  |  |  123|    196|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    196|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 196]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    196|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|       |
  266|    196|  ESTree::ProgramNode *Program;
  267|       |
  268|    196|  Program = llvh::dyn_cast<ESTree::ProgramNode>(Root);
  269|       |
  270|    196|  if (!Program) {
  ------------------
  |  Branch (270:7): [True: 0, False: 196]
  ------------------
  271|      0|    Builder.getModule()->getContext().getSourceErrorManager().error(
  272|      0|        SMLoc{}, "missing 'Program' AST node");
  273|      0|    return;
  274|      0|  }
  275|       |
  276|    196|  LLVM_DEBUG(llvh::dbgs() << "Found Program decl.\n");
  ------------------
  |  |  123|    196|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    196|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 196]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    196|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  277|       |
  278|       |  // The function which will "execute" the module.
  279|    196|  Function *topLevelFunction;
  280|       |
  281|       |  // Function context used only when compiling in an existing lexical scope
  282|       |  // chain. It is only initialized if we have a lexical scope chain.
  283|    196|  llvh::Optional<FunctionContext> wrapperFunctionContext{};
  284|       |
  285|    196|  if (!lexicalScopeChain) {
  ------------------
  |  Branch (285:7): [True: 196, False: 0]
  ------------------
  286|    196|    topLevelFunction = Builder.createTopLevelFunction(
  287|    196|        Mod->getInitialScope()->createInnerScope(),
  288|    196|        ESTree::isStrict(Program->strictness),
  289|    196|        Program->sourceVisibility,
  290|    196|        Program->getSourceRange());
  291|       |
  292|    196|  } else {
  293|       |    // If compiling in an existing lexical context, we need to install the
  294|       |    // scopes in a wrapper function, which represents the "global" code.
  295|      0|    auto [wrapperFunction, parentScope] =
  296|      0|        materializeScopeChainForEval(Builder, Program, lexicalScopeChain);
  297|       |
  298|       |    // Initialize the wrapper context.
  299|      0|    wrapperFunctionContext.emplace(this, wrapperFunction, nullptr);
  300|      0|    currentIRScopeDesc_ = parentScope;
  301|       |
  302|       |    // Restore the previously saved parent scopes.
  303|      0|    populateNameTable(nameTable_, parentScope);
  304|       |
  305|       |    // Finally create the function which will actually be executed.
  306|      0|    topLevelFunction = Builder.createFunction(
  307|      0|        parentScope->createInnerScope(),
  308|      0|        "eval",
  309|      0|        Function::DefinitionKind::ES5Function,
  310|      0|        ESTree::isStrict(Program->strictness),
  311|      0|        Program->sourceVisibility,
  312|      0|        Program->getSourceRange(),
  313|      0|        false);
  314|       |
  315|      0|    buildDummyLexicalParent(
  316|      0|        Builder, parentScope->getFunction(), topLevelFunction);
  317|      0|  }
  318|       |
  319|    196|  Mod->setTopLevelFunction(topLevelFunction);
  320|       |
  321|       |  // Function context for topLevelFunction.
  322|    196|  FunctionContext topLevelFunctionContext{
  323|    196|      this, topLevelFunction, Program->getSemInfo()};
  324|       |
  325|       |  // IRGen needs a pointer to the outer-most context, which is either
  326|       |  // topLevelContext or wrapperFunctionContext, depending on whether the latter
  327|       |  // was created.
  328|       |  // We want to set the pointer to that outer-most context, but ensure that it
  329|       |  // doesn't outlive the context it is pointing to.
  330|    196|  llvh::SaveAndRestore<FunctionContext *> saveTopLevelContext(
  331|    196|      topLevelContext,
  332|    196|      !wrapperFunctionContext.hasValue() ? &topLevelFunctionContext
  ------------------
  |  Branch (332:7): [True: 196, False: 0]
  ------------------
  333|    196|                                         : &wrapperFunctionContext.getValue());
  334|       |
  335|       |  // Now declare all externally supplied global properties, but only if we don't
  336|       |  // have a lexical scope chain.
  337|    196|  if (!lexicalScopeChain) {
  ------------------
  |  Branch (337:7): [True: 196, False: 0]
  ------------------
  338|    196|    for (auto declFile : DeclarationFileList) {
  ------------------
  |  Branch (338:24): [True: 114, False: 196]
  ------------------
  339|    114|      processDeclarationFile(declFile);
  340|    114|    }
  341|    196|  }
  342|       |
  343|    196|  emitFunctionPreamble(Builder.createBasicBlock(topLevelFunction));
  344|    196|  initCaptureStateInES5Function();
  345|    196|  emitTopLevelDeclarations(Program, Program, DoEmitParameters::Yes);
  346|       |
  347|    196|  Value *retVal;
  348|    196|  {
  349|       |    // Allocate the return register, initialize it to undefined.
  350|    196|    curFunction()->globalReturnRegister =
  351|    196|        Builder.createAllocStackInst(genAnonymousLabelName("ret"));
  352|    196|    Builder.createStoreStackInst(
  353|    196|        Builder.getLiteralUndefined(), curFunction()->globalReturnRegister);
  354|       |
  355|       |    // Emit all CreateFunctionInsts for all global functions.
  356|    196|    hoistCreateFunctions(Program);
  357|       |
  358|    196|    genBody(Program->_body);
  359|       |
  360|       |    // Terminate the top-level scope with a return statement.
  361|    196|    retVal = Builder.createLoadStackInst(curFunction()->globalReturnRegister);
  362|    196|  }
  363|       |
  364|    196|  emitFunctionEpilogue(retVal);
  365|    196|}
_ZN6hermes5irgen11ESTreeIRGen28declareAmbientGlobalPropertyENS_10IdentifierE:
  520|  9.49k|    Identifier name) {
  521|       |  // Avoid redefining global properties.
  522|  9.49k|  auto *prop = dyn_cast_or_null<GlobalObjectProperty>(nameTable_.lookup(name));
  523|  9.49k|  if (prop)
  ------------------
  |  Branch (523:7): [True: 114, False: 9.38k]
  ------------------
  524|    114|    return prop;
  525|       |
  526|  9.38k|  LLVM_DEBUG(
  ------------------
  |  |  123|  9.38k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  9.38k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 9.38k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  9.38k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  527|  9.38k|      llvh::dbgs() << "declaring ambient global property " << name << " "
  528|  9.38k|                   << name.getUnderlyingPointer() << "\n");
  529|       |
  530|  9.38k|  prop = Builder.createGlobalObjectProperty(name, false);
  531|  9.38k|  nameTable_.insertIntoScope(topLevelContext->functionScope, name, prop);
  532|  9.38k|  return prop;
  533|  9.49k|}
_ZN6hermes5irgen11ESTreeIRGen22processDeclarationFileEPNS_6ESTree11ProgramNodeE:
  581|    114|void ESTreeIRGen::processDeclarationFile(ESTree::ProgramNode *programNode) {
  582|    114|  auto Program = dyn_cast_or_null<ESTree::ProgramNode>(programNode);
  583|    114|  if (!Program)
  ------------------
  |  Branch (583:7): [True: 0, False: 114]
  ------------------
  584|      0|    return;
  585|       |
  586|    114|  DeclHoisting DH;
  587|    114|  Program->visit(DH);
  588|       |
  589|       |  // Create variable declarations for each of the hoisted variables.
  590|    114|  for (auto vd : DH.decls)
  ------------------
  |  Branch (590:16): [True: 2.73k, False: 114]
  ------------------
  591|  2.73k|    declareAmbientGlobalProperty(getNameFieldFromID(vd->_id));
  592|    114|  for (auto fd : DH.closures)
  ------------------
  |  Branch (592:16): [True: 3.87k, False: 114]
  ------------------
  593|  3.87k|    declareAmbientGlobalProperty(getNameFieldFromID(fd->_id));
  594|    114|}
_ZN6hermes5irgen11ESTreeIRGen20ensureVariableExistsEPNS_6ESTree14IdentifierNodeE:
  596|   607k|Value *ESTreeIRGen::ensureVariableExists(ESTree::IdentifierNode *id) {
  597|   607k|  assert(id && "id must be a valid Identifier node");
  598|   607k|  Identifier name = getNameFieldFromID(id);
  599|       |
  600|       |  // Check if this is a known variable.
  601|   607k|  if (auto *var = nameTable_.lookup(name))
  ------------------
  |  Branch (601:13): [True: 604k, False: 2.88k]
  ------------------
  602|   604k|    return var;
  603|       |
  604|  2.88k|  if (curFunction()->function->isStrictMode()) {
  ------------------
  |  Branch (604:7): [True: 0, False: 2.88k]
  ------------------
  605|       |    // Report a warning in strict mode.
  606|      0|    auto currentFunc = Builder.getInsertionBlock()->getParent();
  607|       |
  608|      0|    Builder.getModule()->getContext().getSourceErrorManager().warning(
  609|      0|        Warning::UndefinedVariable,
  610|      0|        id->getSourceRange(),
  611|      0|        Twine("the variable \"") + name.str() + "\" was not declared in " +
  612|      0|            currentFunc->getDescriptiveDefinitionKindStr() + " \"" +
  613|      0|            currentFunc->getInternalNameStr() + "\"");
  614|      0|  }
  615|       |
  616|       |  // Undeclared variable is an ambient global property.
  617|  2.88k|  return declareAmbientGlobalProperty(name);
  618|   607k|}
_ZN6hermes5irgen11ESTreeIRGen27genMemberExpressionPropertyEPNS_6ESTree24MemberExpressionLikeNodeE:
  621|  43.5k|    ESTree::MemberExpressionLikeNode *Mem) {
  622|       |  // If computed is true, the node corresponds to a computed (a[b]) member
  623|       |  // lookup and '_property' is an Expression. Otherwise, the node
  624|       |  // corresponds to a static (a.b) member lookup and '_property' is an
  625|       |  // Identifier.
  626|       |  // Details of the computed field are available here:
  627|       |  // https://github.com/estree/estree/blob/master/spec.md#memberexpression
  628|       |
  629|  43.5k|  if (getComputed(Mem)) {
  ------------------
  |  Branch (629:7): [True: 71, False: 43.4k]
  ------------------
  630|     71|    return genExpression(getProperty(Mem));
  631|     71|  }
  632|       |
  633|       |  // Arrays and objects may be accessed with integer indices.
  634|  43.4k|  if (auto N = llvh::dyn_cast<ESTree::NumericLiteralNode>(getProperty(Mem))) {
  ------------------
  |  Branch (634:12): [True: 0, False: 43.4k]
  ------------------
  635|      0|    return Builder.getLiteralNumber(N->_value);
  636|      0|  }
  637|       |
  638|       |  // ESTree encodes property access as MemberExpression -> Identifier.
  639|  43.4k|  auto Id = cast<ESTree::IdentifierNode>(getProperty(Mem));
  640|       |
  641|  43.4k|  Identifier fieldName = getNameFieldFromID(Id);
  642|  43.4k|  LLVM_DEBUG(
  ------------------
  |  |  123|  43.4k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  43.4k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 43.4k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  43.4k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  643|  43.4k|      llvh::dbgs() << "Emitting direct label access to field '" << fieldName
  644|  43.4k|                   << "'\n");
  645|  43.4k|  return Builder.getLiteralString(fieldName);
  646|  43.4k|}
_ZN6hermes5irgen11ESTreeIRGen31canCreateLRefWithoutSideEffectsEPNS_6ESTree4NodeE:
  649|  20.3k|    hermes::ESTree::Node *target) {
  650|       |  // Check for an identifier bound to an existing local variable.
  651|  20.3k|  if (auto *iden = llvh::dyn_cast<ESTree::IdentifierNode>(target)) {
  ------------------
  |  Branch (651:13): [True: 0, False: 20.3k]
  ------------------
  652|      0|    return dyn_cast_or_null<Variable>(
  653|      0|        nameTable_.lookup(getNameFieldFromID(iden)));
  654|      0|  }
  655|       |
  656|  20.3k|  return false;
  657|  20.3k|}
_ZN6hermes5irgen11ESTreeIRGen10createLRefEPNS_6ESTree4NodeEb:
  659|   128k|LReference ESTreeIRGen::createLRef(ESTree::Node *node, bool declInit) {
  660|   128k|  SMLoc sourceLoc = node->getDebugLoc();
  661|   128k|  IRBuilder::ScopedLocationChange slc(Builder, sourceLoc);
  662|       |
  663|   128k|  if (llvh::isa<ESTree::EmptyNode>(node)) {
  ------------------
  |  Branch (663:7): [True: 0, False: 128k]
  ------------------
  664|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  665|      0|    return LReference(
  666|      0|        LReference::Kind::Empty, this, false, nullptr, nullptr, sourceLoc);
  667|      0|  }
  668|       |
  669|       |  /// Create lref for member expression (ex: o.f).
  670|   128k|  if (auto *ME = llvh::dyn_cast<ESTree::MemberExpressionNode>(node)) {
  ------------------
  |  Branch (670:13): [True: 67, False: 127k]
  ------------------
  671|     67|    LLVM_DEBUG(llvh::dbgs() << "Creating an LRef for member expression.\n");
  ------------------
  |  |  123|     67|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     67|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 67]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     67|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  672|     67|    Value *obj = genExpression(ME->_object);
  673|     67|    Value *prop = genMemberExpressionProperty(ME);
  674|     67|    return LReference(
  675|     67|        LReference::Kind::Member, this, false, obj, prop, sourceLoc);
  676|     67|  }
  677|       |
  678|       |  /// Create lref for identifiers  (ex: a).
  679|   127k|  if (auto *iden = llvh::dyn_cast<ESTree::IdentifierNode>(node)) {
  ------------------
  |  Branch (679:13): [True: 105k, False: 22.3k]
  ------------------
  680|   105k|    LLVM_DEBUG(llvh::dbgs() << "Creating an LRef for identifier.\n");
  ------------------
  |  |  123|   105k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   105k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 105k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   105k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  681|   105k|    LLVM_DEBUG(
  ------------------
  |  |  123|   105k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   105k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 105k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   105k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  682|   105k|        llvh::dbgs() << "Looking for identifier \"" << getNameFieldFromID(iden)
  683|   105k|                     << "\"\n");
  684|   105k|    auto *var = ensureVariableExists(iden);
  685|   105k|    return LReference(
  686|   105k|        LReference::Kind::VarOrGlobal, this, declInit, var, nullptr, sourceLoc);
  687|   105k|  }
  688|       |
  689|       |  /// Create lref for variable decls (ex: var a).
  690|  22.3k|  if (auto *V = llvh::dyn_cast<ESTree::VariableDeclarationNode>(node)) {
  ------------------
  |  Branch (690:13): [True: 0, False: 22.3k]
  ------------------
  691|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|       |
  693|      0|    assert(V->_declarations.size() == 1 && "Malformed variable declaration");
  694|      0|    auto *decl =
  695|      0|        cast<ESTree::VariableDeclaratorNode>(&V->_declarations.front());
  696|       |
  697|      0|    return createLRef(decl->_id, true);
  698|      0|  }
  699|       |
  700|       |  // Destructuring assignment.
  701|  22.3k|  if (auto *pat = llvh::dyn_cast<ESTree::PatternNode>(node)) {
  ------------------
  |  Branch (701:13): [True: 22.3k, False: 0]
  ------------------
  702|  22.3k|    return LReference(this, declInit, pat);
  703|  22.3k|  }
  704|       |
  705|      0|  Builder.getModule()->getContext().getSourceErrorManager().error(
  706|      0|      node->getSourceRange(), "unsupported assignment target");
  707|       |
  708|      0|  return LReference(
  709|      0|      LReference::Kind::Error, this, false, nullptr, nullptr, sourceLoc);
  710|  22.3k|}
_ZN6hermes5irgen11ESTreeIRGen14genBuiltinCallENS_13BuiltinMethod4EnumEN4llvh8ArrayRefIPNS_5ValueEEE:
  726|  2.82k|    ArrayRef<Value *> args) {
  727|  2.82k|  return Builder.createCallBuiltinInst(builtinIndex, args);
  728|  2.82k|}
_ZN6hermes5irgen11ESTreeIRGen15emitGetIteratorEPNS_5ValueE:
  822|  22.3k|ESTreeIRGen::IteratorRecord ESTreeIRGen::emitGetIterator(Value *obj) {
  823|       |  // Each of these will be modified by "next", so we use a stack storage.
  824|  22.3k|  auto *iterStorage =
  825|  22.3k|      Builder.createAllocStackInst(genAnonymousLabelName("iter"));
  826|  22.3k|  auto *sourceOrNext =
  827|  22.3k|      Builder.createAllocStackInst(genAnonymousLabelName("sourceOrNext"));
  828|  22.3k|  Builder.createStoreStackInst(obj, sourceOrNext);
  829|  22.3k|  auto *iter = Builder.createIteratorBeginInst(sourceOrNext);
  830|  22.3k|  Builder.createStoreStackInst(iter, iterStorage);
  831|  22.3k|  return IteratorRecord{iterStorage, sourceOrNext};
  832|  22.3k|}
_ZN6hermes5irgen11ESTreeIRGen27emitDestructuringAssignmentEbPNS_6ESTree11PatternNodeEPNS_5ValueE:
  837|  22.3k|    Value *source) {
  838|  22.3k|  if (auto *APN = llvh::dyn_cast<ESTree::ArrayPatternNode>(target))
  ------------------
  |  Branch (838:13): [True: 22.3k, False: 0]
  ------------------
  839|  22.3k|    return emitDestructuringArray(declInit, APN, source);
  840|      0|  else if (auto *OPN = llvh::dyn_cast<ESTree::ObjectPatternNode>(target))
  ------------------
  |  Branch (840:18): [True: 0, False: 0]
  ------------------
  841|      0|    return emitDestructuringObject(declInit, OPN, source);
  842|      0|  else {
  843|      0|    Mod->getContext().getSourceErrorManager().error(
  844|      0|        target->getSourceRange(), "unsupported destructuring target");
  845|      0|  }
  846|  22.3k|}
_ZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueE:
  851|  22.3k|    Value *source) {
  852|  22.3k|  const IteratorRecord iteratorRecord = emitGetIterator(source);
  853|       |
  854|       |  /// iteratorDone = undefined.
  855|  22.3k|  auto *iteratorDone =
  856|  22.3k|      Builder.createAllocStackInst(genAnonymousLabelName("iterDone"));
  857|  22.3k|  Builder.createStoreStackInst(Builder.getLiteralUndefined(), iteratorDone);
  858|       |
  859|  22.3k|  auto *value =
  860|  22.3k|      Builder.createAllocStackInst(genAnonymousLabelName("iterValue"));
  861|       |
  862|  22.3k|  SharedExceptionHandler handler{};
  863|  22.3k|  handler.exc = Builder.createAllocStackInst(genAnonymousLabelName("exc"));
  864|       |  // All exception handlers branch to this block.
  865|  22.3k|  handler.exceptionBlock = Builder.createBasicBlock(Builder.getFunction());
  866|       |
  867|  22.3k|  bool first = true;
  868|  22.3k|  bool emittedRest = false;
  869|       |  // The LReference created in the previous iteration of the destructuring
  870|       |  // loop. We need it because we want to put the previous store and the creation
  871|       |  // of the next LReference under one try block.
  872|  22.3k|  llvh::Optional<LReference> lref;
  873|       |
  874|       |  /// If the previous LReference is valid and non-empty, store "value" into
  875|       |  /// it and reset the LReference.
  876|  22.3k|  auto storePreviousValue = [&lref, &handler, this, value]() {
  877|  22.3k|    if (lref && !lref->isEmpty()) {
  878|  22.3k|      if (lref->canStoreWithoutSideEffects()) {
  879|  22.3k|        lref->emitStore(Builder.createLoadStackInst(value));
  880|  22.3k|      } else {
  881|       |        // If we can't store without side effects, wrap the store in try/catch.
  882|  22.3k|        emitTryWithSharedHandler(&handler, [this, &lref, value]() {
  883|  22.3k|          lref->emitStore(Builder.createLoadStackInst(value));
  884|  22.3k|        });
  885|  22.3k|      }
  886|  22.3k|      lref.reset();
  887|  22.3k|    }
  888|  22.3k|  };
  889|       |
  890|  22.3k|  for (auto &elem : targetPat->_elements) {
  ------------------
  |  Branch (890:19): [True: 20.3k, False: 22.3k]
  ------------------
  891|  20.3k|    ESTree::Node *target = &elem;
  892|  20.3k|    ESTree::Node *init = nullptr;
  893|       |
  894|  20.3k|    if (auto *rest = llvh::dyn_cast<ESTree::RestElementNode>(target)) {
  ------------------
  |  Branch (894:15): [True: 0, False: 20.3k]
  ------------------
  895|      0|      storePreviousValue();
  896|      0|      emitRestElement(declInit, rest, iteratorRecord, iteratorDone, &handler);
  897|      0|      emittedRest = true;
  898|      0|      break;
  899|      0|    }
  900|       |
  901|       |    // If we have an initializer, unwrap it.
  902|  20.3k|    if (auto *assign = llvh::dyn_cast<ESTree::AssignmentPatternNode>(target)) {
  ------------------
  |  Branch (902:15): [True: 0, False: 20.3k]
  ------------------
  903|      0|      target = assign->_left;
  904|      0|      init = assign->_right;
  905|      0|    }
  906|       |
  907|       |    // Can we create the new LReference without side effects and avoid a
  908|       |    // try/catch. The complexity comes from having to check whether the last
  909|       |    // LReference also can avoid a try/catch or not.
  910|  20.3k|    if (canCreateLRefWithoutSideEffects(target)) {
  ------------------
  |  Branch (910:9): [True: 0, False: 20.3k]
  ------------------
  911|       |      // We don't need a try/catch, but last lref might. Just let the routine
  912|       |      // do the right thing.
  913|      0|      storePreviousValue();
  914|      0|      lref = createLRef(target, declInit);
  915|  20.3k|    } else {
  916|       |      // We need a try/catch, but last lref might not. If it doesn't, emit it
  917|       |      // directly and clear it, so we won't do anything inside our try/catch.
  918|  20.3k|      if (lref && lref->canStoreWithoutSideEffects()) {
  ------------------
  |  Branch (918:11): [True: 0, False: 20.3k]
  |  Branch (918:19): [True: 0, False: 0]
  ------------------
  919|      0|        lref->emitStore(Builder.createLoadStackInst(value));
  920|      0|        lref.reset();
  921|      0|      }
  922|  20.3k|      emitTryWithSharedHandler(
  923|  20.3k|          &handler, [this, &lref, value, target, declInit]() {
  924|       |            // Store the previous value, if we have one.
  925|  20.3k|            if (lref && !lref->isEmpty())
  926|  20.3k|              lref->emitStore(Builder.createLoadStackInst(value));
  927|  20.3k|            lref = createLRef(target, declInit);
  928|  20.3k|          });
  929|  20.3k|    }
  930|       |
  931|       |    // Pseudocode of the algorithm for a step:
  932|       |    //
  933|       |    //   value = undefined;
  934|       |    //   if (iteratorDone) goto nextBlock
  935|       |    // notDoneBlock:
  936|       |    //   stepResult = IteratorNext(iteratorRecord)
  937|       |    //   stepDone = IteratorComplete(stepResult)
  938|       |    //   iteratorDone = stepDone
  939|       |    //   if (stepDone) goto nextBlock
  940|       |    // newValueBlock:
  941|       |    //   value = IteratorValue(stepResult)
  942|       |    // nextBlock:
  943|       |    //   if (value !== undefined) goto storeBlock    [if initializer present]
  944|       |    //   value = initializer                         [if initializer present]
  945|       |    // storeBlock:
  946|       |    //   lref.emitStore(value)
  947|       |
  948|  20.3k|    auto *notDoneBlock = Builder.createBasicBlock(Builder.getFunction());
  949|  20.3k|    auto *newValueBlock = Builder.createBasicBlock(Builder.getFunction());
  950|  20.3k|    auto *nextBlock = Builder.createBasicBlock(Builder.getFunction());
  951|  20.3k|    auto *getDefaultBlock =
  952|  20.3k|        init ? Builder.createBasicBlock(Builder.getFunction()) : nullptr;
  ------------------
  |  Branch (952:9): [True: 0, False: 20.3k]
  ------------------
  953|  20.3k|    auto *storeBlock =
  954|  20.3k|        init ? Builder.createBasicBlock(Builder.getFunction()) : nullptr;
  ------------------
  |  Branch (954:9): [True: 0, False: 20.3k]
  ------------------
  955|       |
  956|  20.3k|    Builder.createStoreStackInst(Builder.getLiteralUndefined(), value);
  957|       |
  958|       |    // In the first iteration we know that "done" is false.
  959|  20.3k|    if (first) {
  ------------------
  |  Branch (959:9): [True: 20.3k, False: 0]
  ------------------
  960|  20.3k|      first = false;
  961|  20.3k|      Builder.createBranchInst(notDoneBlock);
  962|  20.3k|    } else {
  963|      0|      Builder.createCondBranchInst(
  964|      0|          Builder.createLoadStackInst(iteratorDone), nextBlock, notDoneBlock);
  965|      0|    }
  966|       |
  967|       |    // notDoneBlock:
  968|  20.3k|    Builder.setInsertionBlock(notDoneBlock);
  969|  20.3k|    auto *stepValue = emitIteratorNext(iteratorRecord);
  970|  20.3k|    auto *stepDone = emitIteratorComplete(iteratorRecord);
  971|  20.3k|    Builder.createStoreStackInst(stepDone, iteratorDone);
  972|  20.3k|    Builder.createCondBranchInst(
  973|  20.3k|        stepDone, init ? getDefaultBlock : nextBlock, newValueBlock);
  ------------------
  |  Branch (973:19): [True: 0, False: 20.3k]
  ------------------
  974|       |
  975|       |    // newValueBlock:
  976|  20.3k|    Builder.setInsertionBlock(newValueBlock);
  977|  20.3k|    Builder.createStoreStackInst(stepValue, value);
  978|  20.3k|    Builder.createBranchInst(nextBlock);
  979|       |
  980|       |    // nextBlock:
  981|  20.3k|    Builder.setInsertionBlock(nextBlock);
  982|       |
  983|       |    // NOTE: we can't use emitOptionalInitializationHere() because we want to
  984|       |    // be able to jump directly to getDefaultBlock.
  985|  20.3k|    if (init) {
  ------------------
  |  Branch (985:9): [True: 0, False: 20.3k]
  ------------------
  986|       |      //    if (value !== undefined) goto storeBlock    [if initializer present]
  987|       |      //    value = initializer                         [if initializer present]
  988|       |      //  storeBlock:
  989|      0|      Builder.createCondBranchInst(
  990|      0|          Builder.createBinaryOperatorInst(
  991|      0|              Builder.createLoadStackInst(value),
  992|      0|              Builder.getLiteralUndefined(),
  993|      0|              BinaryOperatorInst::OpKind::StrictlyNotEqualKind),
  994|      0|          storeBlock,
  995|      0|          getDefaultBlock);
  996|       |
  997|      0|      Identifier nameHint = llvh::isa<ESTree::IdentifierNode>(target)
  ------------------
  |  Branch (997:29): [True: 0, False: 0]
  ------------------
  998|      0|          ? getNameFieldFromID(target)
  999|      0|          : Identifier{};
 1000|       |
 1001|       |      // getDefaultBlock:
 1002|      0|      Builder.setInsertionBlock(getDefaultBlock);
 1003|      0|      Builder.createStoreStackInst(genExpression(init, nameHint), value);
 1004|      0|      Builder.createBranchInst(storeBlock);
 1005|       |
 1006|       |      // storeBlock:
 1007|      0|      Builder.setInsertionBlock(storeBlock);
 1008|      0|    }
 1009|  20.3k|  }
 1010|       |
 1011|  22.3k|  storePreviousValue();
 1012|       |
 1013|       |  // If in the end the iterator is not done, close it. We only need to do
 1014|       |  // that if we didn't end with a rest element because it would have exhausted
 1015|       |  // the iterator.
 1016|  22.3k|  if (!emittedRest) {
  ------------------
  |  Branch (1016:7): [True: 22.3k, False: 0]
  ------------------
 1017|  22.3k|    auto *notDoneBlock = Builder.createBasicBlock(Builder.getFunction());
 1018|  22.3k|    auto *doneBlock = Builder.createBasicBlock(Builder.getFunction());
 1019|  22.3k|    Builder.createCondBranchInst(
 1020|  22.3k|        Builder.createLoadStackInst(iteratorDone), doneBlock, notDoneBlock);
 1021|       |
 1022|  22.3k|    Builder.setInsertionBlock(notDoneBlock);
 1023|  22.3k|    emitIteratorClose(iteratorRecord, false);
 1024|  22.3k|    Builder.createBranchInst(doneBlock);
 1025|       |
 1026|  22.3k|    Builder.setInsertionBlock(doneBlock);
 1027|  22.3k|  }
 1028|       |
 1029|       |  // If we emitted at least one try block, generate the exception handler.
 1030|  22.3k|  if (handler.emittedTry) {
  ------------------
  |  Branch (1030:7): [True: 20.3k, False: 2.09k]
  ------------------
 1031|  20.3k|    IRBuilder::SaveRestore saveRestore{Builder};
 1032|  20.3k|    Builder.setInsertionBlock(handler.exceptionBlock);
 1033|       |
 1034|  20.3k|    auto *notDoneBlock = Builder.createBasicBlock(Builder.getFunction());
 1035|  20.3k|    auto *doneBlock = Builder.createBasicBlock(Builder.getFunction());
 1036|       |
 1037|  20.3k|    Builder.createCondBranchInst(
 1038|  20.3k|        Builder.createLoadStackInst(iteratorDone), doneBlock, notDoneBlock);
 1039|       |
 1040|  20.3k|    Builder.setInsertionBlock(notDoneBlock);
 1041|  20.3k|    emitIteratorClose(iteratorRecord, true);
 1042|  20.3k|    Builder.createBranchInst(doneBlock);
 1043|       |
 1044|  20.3k|    Builder.setInsertionBlock(doneBlock);
 1045|  20.3k|    Builder.createThrowInst(Builder.createLoadStackInst(handler.exc));
 1046|  20.3k|  } else {
 1047|       |    // If we didn't use the exception block, we need to delete it, otherwise
 1048|       |    // it fails IR validation even though it will be never executed.
 1049|  2.09k|    handler.exceptionBlock->eraseFromParent();
 1050|       |
 1051|       |    // Delete the not needed exception stack allocation. It would be optimized
 1052|       |    // out later, but it is nice to produce cleaner non-optimized IR, if it is
 1053|       |    // easy to do so.
 1054|  2.09k|    assert(
 1055|  2.09k|        !handler.exc->hasUsers() &&
 1056|  2.09k|        "should not have any users if no try/catch was emitted");
 1057|  2.09k|    handler.exc->eraseFromParent();
 1058|  2.09k|  }
 1059|  22.3k|}
_ZN6hermes5irgen11ESTreeIRGen26emitOptionalInitializationEPNS_5ValueEPNS_6ESTree4NodeENS_10IdentifierE:
 1268|   103k|    Identifier nameHint) {
 1269|   103k|  if (!init)
  ------------------
  |  Branch (1269:7): [True: 103k, False: 0]
  ------------------
 1270|   103k|    return value;
 1271|       |
 1272|      0|  auto *currentBlock = Builder.getInsertionBlock();
 1273|      0|  auto *getDefaultBlock = Builder.createBasicBlock(Builder.getFunction());
 1274|      0|  auto *storeBlock = Builder.createBasicBlock(Builder.getFunction());
 1275|       |
 1276|       |  //    if (value !== undefined) goto storeBlock    [if initializer present]
 1277|       |  //    value = initializer                         [if initializer present]
 1278|       |  //  storeBlock:
 1279|      0|  Builder.createCondBranchInst(
 1280|      0|      Builder.createBinaryOperatorInst(
 1281|      0|          value,
 1282|      0|          Builder.getLiteralUndefined(),
 1283|      0|          BinaryOperatorInst::OpKind::StrictlyNotEqualKind),
 1284|      0|      storeBlock,
 1285|      0|      getDefaultBlock);
 1286|       |
 1287|       |  // getDefaultBlock:
 1288|      0|  Builder.setInsertionBlock(getDefaultBlock);
 1289|      0|  auto *defaultValue = genExpression(init, nameHint);
 1290|      0|  auto *defaultResultBlock = Builder.getInsertionBlock();
 1291|      0|  Builder.createBranchInst(storeBlock);
 1292|       |
 1293|       |  // storeBlock:
 1294|      0|  Builder.setInsertionBlock(storeBlock);
 1295|      0|  return Builder.createPhiInst(
 1296|      0|      {value, defaultValue}, {currentBlock, defaultResultBlock});
 1297|   103k|}
_ZN6hermes5irgen11ESTreeIRGen23resolveScopeIdentifiersERKNS_10ScopeChainE:
 1300|    196|    const ScopeChain &chain) {
 1301|    196|  SerializedScopePtr current{};
 1302|    196|  for (auto it = chain.scopes.rbegin(), end = chain.scopes.rend(); it < end;
  ------------------
  |  Branch (1302:68): [True: 0, False: 196]
  ------------------
 1303|    196|       it++) {
 1304|      0|    auto next = std::make_shared<SerializedScope>();
 1305|      0|    next->variables.reserve(it->variables.size());
 1306|      0|    for (auto var : it->variables) {
  ------------------
  |  Branch (1306:19): [True: 0, False: 0]
  ------------------
 1307|      0|      constexpr bool immutableBinding = false;
 1308|      0|      next->variables.push_back(SerializedScope::Declaration{
 1309|      0|          Builder.createIdentifier(var),
 1310|      0|          Variable::DeclKind::Var,
 1311|      0|          immutableBinding});
 1312|      0|    }
 1313|      0|    next->parentScope = current;
 1314|      0|    current = next;
 1315|      0|  }
 1316|    196|  return current;
 1317|    196|}
_ZN6hermes5irgen11ESTreeIRGen14serializeScopeEPNS_9ScopeDescEb:
 1321|    162|    bool includeGlobal) {
 1322|       |  // Serialize the global scope if and only if it's the only scope.
 1323|       |  // We serialize the global scope to avoid re-declaring variables,
 1324|       |  // and only do it once to avoid creating spurious scopes.
 1325|    162|  if (!S->getParent() || S->getSerializedScope()) {
  ------------------
  |  Branch (1325:7): [True: 81, False: 81]
  |  Branch (1325:7): [True: 81, False: 81]
  |  Branch (1325:26): [True: 0, False: 81]
  ------------------
 1326|     81|    return S->getSerializedScope();
 1327|     81|  }
 1328|       |
 1329|     81|  auto scope = std::make_shared<SerializedScope>();
 1330|     81|  auto *func = S->getFunction();
 1331|       |
 1332|     81|  if (S == func->getFunctionScopeDesc()) {
  ------------------
  |  Branch (1332:7): [True: 81, False: 0]
  ------------------
 1333|     81|    scope->originalName = func->getOriginalOrInferredName();
 1334|     81|    if (auto *closure = func->getLazyClosureAlias()) {
  ------------------
  |  Branch (1334:15): [True: 0, False: 81]
  ------------------
 1335|      0|      scope->closureAlias = closure->getName();
 1336|      0|    }
 1337|     81|  }
 1338|     81|  for (auto *var : S->getVariables()) {
  ------------------
  |  Branch (1338:18): [True: 0, False: 81]
  ------------------
 1339|      0|    scope->variables.push_back(SerializedScope::Declaration{
 1340|      0|        var->getName(), var->getDeclKind(), var->getStrictImmutableBinding()});
 1341|      0|  }
 1342|     81|  scope->parentScope = serializeScope(S->getParent(), false);
 1343|     81|  return scope;
 1344|    162|}
_ZN6hermes5irgen11ESTreeIRGen8emitLoadEPNS_5ValueEb:
 1346|   501k|Instruction *ESTreeIRGen::emitLoad(Value *from, bool inhibitThrow) {
 1347|   501k|  if (auto *var = llvh::dyn_cast<Variable>(from)) {
  ------------------
  |  Branch (1347:13): [True: 4, False: 501k]
  ------------------
 1348|      4|    Instruction *res = Builder.createLoadFrameInst(var, currentIRScope_);
 1349|      4|    if (var->getObeysTDZ())
  ------------------
  |  Branch (1349:9): [True: 0, False: 4]
  ------------------
 1350|      0|      res = Builder.createThrowIfEmptyInst(res);
 1351|      4|    return res;
 1352|   501k|  } else if (auto *globalProp = llvh::dyn_cast<GlobalObjectProperty>(from)) {
  ------------------
  |  Branch (1352:20): [True: 501k, False: 0]
  ------------------
 1353|   501k|    return loadGlobalObjectProperty(Builder, globalProp, inhibitThrow);
 1354|   501k|  } else {
 1355|      0|    llvm_unreachable("invalid value to load from");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1356|      0|  }
 1357|   501k|}
_ZN6hermes5irgen11ESTreeIRGen9emitStoreEPNS_5ValueES3_b:
 1360|   105k|ESTreeIRGen::emitStore(Value *storedValue, Value *ptr, bool declInit) {
 1361|   105k|  if (auto *var = llvh::dyn_cast<Variable>(ptr)) {
  ------------------
  |  Branch (1361:13): [True: 104k, False: 1.25k]
  ------------------
 1362|   104k|    if (!declInit && var->getObeysTDZ()) {
  ------------------
  |  Branch (1362:9): [True: 1.16k, False: 103k]
  |  Branch (1362:22): [True: 0, False: 1.16k]
  ------------------
 1363|       |      // Must verify whether the variable is initialized.
 1364|      0|      Builder.createThrowIfEmptyInst(
 1365|      0|          Builder.createLoadFrameInst(var, currentIRScope_));
 1366|      0|      if (var->getDeclKind() == Variable::DeclKind::Const) {
  ------------------
  |  Branch (1366:11): [True: 0, False: 0]
  ------------------
 1367|      0|        if (!var->getStrictImmutableBinding() &&
  ------------------
  |  Branch (1367:13): [True: 0, False: 0]
  ------------------
 1368|      0|            !curFunction()->function->isStrictMode()) {
  ------------------
  |  Branch (1368:13): [True: 0, False: 0]
  ------------------
 1369|       |          // Ignore stores to non-strict immutable bindings in non-strict mode.
 1370|      0|          return nullptr;
 1371|      0|        }
 1372|       |
 1373|       |        // Assignment to const-declared variables should result in a runtime
 1374|       |        // TypeError exception, so raise it here.
 1375|      0|        Builder.getModule()->getContext().getSourceErrorManager().warning(
 1376|      0|            Builder.getLocation(), "Assignment to constant variable");
 1377|      0|        genRaiseNativeError(
 1378|      0|            Builder, NativeErrorTypes::TypeError, "can't modify const value");
 1379|       |        // genRaiseNativeError emits a ThrowInst, which is itself a terminator;
 1380|       |        // thus we can't append more instructions to the current basic block.
 1381|       |        // Create another basic block, and set it as the insertion pointer. The
 1382|       |        // newly-created basic block is unreachable, and will thus be removed
 1383|       |        // during optimization.
 1384|      0|        BasicBlock *unlinked =
 1385|      0|            Builder.createBasicBlock(curFunction()->function);
 1386|      0|        Builder.setInsertionBlock(unlinked);
 1387|      0|      }
 1388|      0|    }
 1389|   104k|    return Builder.createStoreFrameInst(storedValue, var, currentIRScope_);
 1390|   104k|  } else if (auto *globalProp = llvh::dyn_cast<GlobalObjectProperty>(ptr)) {
  ------------------
  |  Branch (1390:20): [True: 1.25k, False: 0]
  ------------------
 1391|  1.25k|    if (globalProp->isDeclared() || !Builder.getFunction()->isStrictMode())
  ------------------
  |  Branch (1391:9): [True: 0, False: 1.25k]
  |  Branch (1391:37): [True: 1.25k, False: 0]
  ------------------
 1392|  1.25k|      return Builder.createStorePropertyInst(
 1393|  1.25k|          storedValue, Builder.getGlobalObject(), globalProp->getName());
 1394|      0|    else
 1395|      0|      return Builder.createTryStoreGlobalPropertyInst(storedValue, globalProp);
 1396|  1.25k|  } else {
 1397|      0|    llvm_unreachable("unvalid value to load from");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1398|      0|  }
 1399|   105k|}
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoistingC2Ev:
  546|    114|  explicit DeclHoisting() = default;
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoistingD2Ev:
  547|    114|  ~DeclHoisting() = default;
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_0clEv:
  876|  22.3k|  auto storePreviousValue = [&lref, &handler, this, value]() {
  877|  22.3k|    if (lref && !lref->isEmpty()) {
  ------------------
  |  Branch (877:9): [True: 20.3k, False: 2.09k]
  |  Branch (877:17): [True: 20.3k, False: 0]
  ------------------
  878|  20.3k|      if (lref->canStoreWithoutSideEffects()) {
  ------------------
  |  Branch (878:11): [True: 0, False: 20.3k]
  ------------------
  879|      0|        lref->emitStore(Builder.createLoadStackInst(value));
  880|  20.3k|      } else {
  881|       |        // If we can't store without side effects, wrap the store in try/catch.
  882|  20.3k|        emitTryWithSharedHandler(&handler, [this, &lref, value]() {
  883|  20.3k|          lref->emitStore(Builder.createLoadStackInst(value));
  884|  20.3k|        });
  885|  20.3k|      }
  886|  20.3k|      lref.reset();
  887|  20.3k|    }
  888|  22.3k|  };
ESTreeIRGen.cpp:_ZZZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_0clEvENKUlvE_clEv:
  882|  20.3k|        emitTryWithSharedHandler(&handler, [this, &lref, value]() {
  883|  20.3k|          lref->emitStore(Builder.createLoadStackInst(value));
  884|  20.3k|        });
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting11shouldVisitEPNS_6ESTree4NodeE:
  562|  12.1k|  bool shouldVisit(ESTree::Node *V) {
  563|       |    // Collect declared names, even if we don't descend into children nodes.
  564|  12.1k|    collectDecls(V);
  565|       |
  566|       |    // Do not descend to child closures because the variables they define are
  567|       |    // not exposed to the outside function.
  568|  12.1k|    if (llvh::isa<ESTree::FunctionDeclarationNode>(V) ||
  ------------------
  |  Branch (568:9): [True: 3.87k, False: 8.32k]
  ------------------
  569|  12.1k|        llvh::isa<ESTree::FunctionExpressionNode>(V) ||
  ------------------
  |  Branch (569:9): [True: 0, False: 8.32k]
  ------------------
  570|  12.1k|        llvh::isa<ESTree::ArrowFunctionExpressionNode>(V))
  ------------------
  |  Branch (570:9): [True: 0, False: 8.32k]
  ------------------
  571|  3.87k|      return false;
  572|  8.32k|    return true;
  573|  12.1k|  }
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting12collectDeclsEPNS_6ESTree4NodeE:
  552|  12.1k|  void collectDecls(ESTree::Node *V) {
  553|  12.1k|    if (auto VD = llvh::dyn_cast<ESTree::VariableDeclaratorNode>(V)) {
  ------------------
  |  Branch (553:14): [True: 2.73k, False: 9.46k]
  ------------------
  554|  2.73k|      return decls.push_back(VD);
  555|  2.73k|    }
  556|       |
  557|  9.46k|    if (auto FD = llvh::dyn_cast<ESTree::FunctionDeclarationNode>(V)) {
  ------------------
  |  Branch (557:14): [True: 3.87k, False: 5.58k]
  ------------------
  558|  3.87k|      return closures.push_back(FD);
  559|  3.87k|    }
  560|  9.46k|  }
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting5enterEPNS_6ESTree4NodeE:
  575|  8.32k|  void enter(ESTree::Node *V) {}
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting5leaveEPNS_6ESTree4NodeE:
  576|  8.32k|  void leave(ESTree::Node *V) {}
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_1clEv:
  923|  20.3k|          &handler, [this, &lref, value, target, declInit]() {
  924|       |            // Store the previous value, if we have one.
  925|  20.3k|            if (lref && !lref->isEmpty())
  ------------------
  |  Branch (925:17): [True: 0, False: 20.3k]
  |  Branch (925:25): [True: 0, False: 0]
  ------------------
  926|      0|              lref->emitStore(Builder.createLoadStackInst(value));
  927|  20.3k|            lref = createLRef(target, declInit);
  928|  20.3k|          });

_ZNK6hermes5irgen15FunctionContext18getPreviousContextEv:
  203|   103k|  FunctionContext *getPreviousContext() const {
  204|   103k|    return oldContext_;
  205|   103k|  }
_ZN6hermes5irgen15FunctionContext10getSemInfoEv:
  209|   413k|  sem::FunctionInfo *getSemInfo() {
  210|   413k|    assert(semInfo_ && "semInfo is not set");
  211|   413k|    return semInfo_;
  212|   413k|  }
_ZN6hermes5irgen15FunctionContext9initLabelEPNS_6ESTree19LabelDecorationBaseEPNS_10BasicBlockES6_:
  226|   246k|      BasicBlock *continueTarget) {
  227|   246k|    auto &label = labels_[LDB->getLabelIndex()];
  228|   246k|    label.breakTarget = breakTarget;
  229|   246k|    label.continueTarget = continueTarget;
  230|   246k|    label.surroundingTry = surroundingTry;
  231|   246k|  }
_ZN6hermes5irgen10LReferenceC2ENS1_4KindEPNS0_11ESTreeIRGenEbPNS_5ValueES6_N4llvh5SMLocE:
  317|   105k|      : kind_(kind), irgen_(irgen), declInit_(declInit) {
  318|   105k|    base_ = base;
  319|   105k|    property_ = property;
  320|   105k|    loadLoc_ = loadLoc;
  321|   105k|  }
_ZN6hermes5irgen10LReferenceC2EPNS0_11ESTreeIRGenEbPNS_6ESTree11PatternNodeE:
  324|  22.3k|      : kind_(Kind::Destructuring), irgen_(irgen), declInit_(declInit) {
  325|  22.3k|    destructuringTarget_ = target;
  326|  22.3k|  }
_ZNK6hermes5irgen10LReference7isEmptyEv:
  328|  20.3k|  bool isEmpty() const {
  329|  20.3k|    return kind_ == Kind::Empty;
  330|  20.3k|  }
_ZN6hermes5irgen11ESTreeIRGen21genAnonymousLabelNameEN4llvh9StringRefE:
  428|   136k|  Identifier genAnonymousLabelName(llvh::StringRef hint) {
  429|   136k|    return curFunction()->genAnonymousLabelName(hint);
  430|   136k|  }
_ZN6hermes5irgen11ESTreeIRGen11curFunctionEv:
  963|  2.89M|  inline FunctionContext *curFunction() {
  964|  2.89M|    assert(functionContext_ && "No active function context");
  965|  2.89M|    return functionContext_;
  966|  2.89M|  }
_ZN6hermes5irgen11ESTreeIRGen16emitIteratorNextENS1_14IteratorRecordE:
 1094|  20.3k|  Value *emitIteratorNext(IteratorRecord iteratorRecord) {
 1095|  20.3k|    return Builder.createIteratorNextInst(
 1096|  20.3k|        iteratorRecord.iterStorage, iteratorRecord.sourceOrNext);
 1097|  20.3k|  }
_ZN6hermes5irgen11ESTreeIRGen20emitIteratorCompleteENS1_14IteratorRecordE:
 1102|  20.3k|  Value *emitIteratorComplete(IteratorRecord iteratorRecord) {
 1103|  20.3k|    return Builder.createBinaryOperatorInst(
 1104|  20.3k|        Builder.createLoadStackInst(iteratorRecord.iterStorage),
 1105|  20.3k|        Builder.getLiteralUndefined(),
 1106|  20.3k|        BinaryOperatorInst::OpKind::StrictlyEqualKind);
 1107|  20.3k|  }
_ZN6hermes5irgen11ESTreeIRGen17emitIteratorCloseENS1_14IteratorRecordEb:
 1114|  42.7k|      bool ignoreInnerException) {
 1115|  42.7k|    return Builder.createIteratorCloseInst(
 1116|  42.7k|        iteratorRecord.iterStorage, ignoreInnerException);
 1117|  42.7k|  }
_ZN6hermes5irgen11ESTreeIRGen14saveScopeChainEPNS_9ScopeDescE:
 1185|     81|  SerializedScopePtr saveScopeChain(ScopeDesc *S) {
 1186|     81|    return serializeScope(S, true);
 1187|     81|  }
_ZN6hermes5irgen11ESTreeIRGen12newScopeDescEv:
 1193|   103k|  ScopeDesc *newScopeDesc() {
 1194|   103k|    return currentIRScopeDesc_->createInnerScope();
 1195|   103k|  }
_ZN6hermes5irgen11ESTreeIRGen32genAnonymousFunctionNameIfNeededENS_10IdentifierE:
 1199|   103k|  Identifier genAnonymousFunctionNameIfNeeded(Identifier name) {
 1200|   103k|    if (LLVM_LIKELY(
  ------------------
  |  |  188|   204k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 103k, False: 0]
  |  |  |  Branch (188:51): [True: 2.32k, False: 100k]
  |  |  |  Branch (188:51): [True: 100k, False: 0]
  |  |  ------------------
  ------------------
 1201|   103k|            name.isValid() ||
 1202|   103k|            !Mod->getContext()
 1203|   103k|                 .getCodeGenerationSettings()
 1204|   103k|                 .generateNameForUnnamedFunctions)) {
 1205|   103k|      return name;
 1206|   103k|    }
 1207|       |
 1208|       |    // Use the current function's name to generate a globally-unique name.
 1209|      0|    return genAnonymousLabelName(
 1210|      0|        std::string("anonFunc@") +
 1211|      0|        curFunction()->function->getOriginalOrInferredName().c_str());
 1212|   103k|  }
_ZN6hermes5irgen18getNameFieldFromIDEPKNS_6ESTree4NodeE:
   49|  1.36M|inline Identifier getNameFieldFromID(const ESTree::Node *ID) {
   50|  1.36M|  return Identifier::getFromPointer(cast<ESTree::IdentifierNode>(ID)->_name);
   51|  1.36M|}
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_0clEvEUlvE_EEvPNS1_22SharedExceptionHandlerET_:
 1314|  20.3k|    EB emitBody) {
 1315|  20.3k|  emitTryCatchScaffolding(
 1316|  20.3k|      nullptr,
 1317|       |      // emitBody.
 1318|  20.3k|      emitBody,
 1319|       |      // emitNormalCleanup.
 1320|  20.3k|      []() {},
 1321|       |      // emitHandler.
 1322|  20.3k|      [this, handler](BasicBlock *nextBlock) {
 1323|  20.3k|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1324|  20.3k|        Builder.createBranchInst(handler->exceptionBlock);
 1325|  20.3k|        Builder.setInsertionBlock(nextBlock);
 1326|  20.3k|      });
 1327|  20.3k|  handler->emittedTry = true;
 1328|  20.3k|}
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen23emitTryCatchScaffoldingIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_0clEvEUlvE_ZNS1_24emitTryWithSharedHandlerIS9_EEvPNS1_22SharedExceptionHandlerET_EUlvE_ZNSA_IS9_EEvSC_SD_EUlPNS_10BasicBlockEE_EESG_SG_SD_T0_T1_:
 1278|  20.3k|    EH emitHandler) {
 1279|  20.3k|  auto *function = Builder.getFunction();
 1280|       |
 1281|  20.3k|  auto *catchBlock = Builder.createBasicBlock(function);
 1282|  20.3k|  if (!nextBlock)
  ------------------
  |  Branch (1282:7): [True: 20.3k, False: 0]
  ------------------
 1283|  20.3k|    nextBlock = Builder.createBasicBlock(function);
 1284|  20.3k|  auto *tryBodyBlock = Builder.createBasicBlock(function);
 1285|       |
 1286|       |  // Start with a TryStartInst, and transition to try body.
 1287|  20.3k|  Builder.createTryStartInst(tryBodyBlock, catchBlock);
 1288|  20.3k|  Builder.setInsertionBlock(tryBodyBlock);
 1289|       |
 1290|       |  // Generate IR for the body of Try
 1291|  20.3k|  emitBody();
 1292|       |
 1293|       |  // Emit TryEnd in a new block.
 1294|  20.3k|  auto *tryEndBlock = Builder.createBasicBlock(function);
 1295|  20.3k|  Builder.createBranchInst(tryEndBlock);
 1296|  20.3k|  Builder.setInsertionBlock(tryEndBlock);
 1297|  20.3k|  Builder.createTryEndInst();
 1298|       |
 1299|  20.3k|  emitNormalCleanup();
 1300|       |
 1301|  20.3k|  Builder.createBranchInst(nextBlock);
 1302|       |
 1303|       |  // Generate the catch/finally block.
 1304|  20.3k|  Builder.setInsertionBlock(catchBlock);
 1305|       |
 1306|  20.3k|  emitHandler(nextBlock);
 1307|       |
 1308|  20.3k|  return nextBlock;
 1309|  20.3k|}
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_0clEvEUlvE_EEvPNS1_22SharedExceptionHandlerET_ENKUlvE_clEv:
 1320|  20.3k|      []() {},
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_0clEvEUlvE_EEvPNS1_22SharedExceptionHandlerET_ENKUlPNS_10BasicBlockEE_clESE_:
 1322|  20.3k|      [this, handler](BasicBlock *nextBlock) {
 1323|  20.3k|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1324|  20.3k|        Builder.createBranchInst(handler->exceptionBlock);
 1325|  20.3k|        Builder.setInsertionBlock(nextBlock);
 1326|  20.3k|      });
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_1EEvPNS1_22SharedExceptionHandlerET_:
 1314|  20.3k|    EB emitBody) {
 1315|  20.3k|  emitTryCatchScaffolding(
 1316|  20.3k|      nullptr,
 1317|       |      // emitBody.
 1318|  20.3k|      emitBody,
 1319|       |      // emitNormalCleanup.
 1320|  20.3k|      []() {},
 1321|       |      // emitHandler.
 1322|  20.3k|      [this, handler](BasicBlock *nextBlock) {
 1323|  20.3k|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1324|  20.3k|        Builder.createBranchInst(handler->exceptionBlock);
 1325|  20.3k|        Builder.setInsertionBlock(nextBlock);
 1326|  20.3k|      });
 1327|  20.3k|  handler->emittedTry = true;
 1328|  20.3k|}
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen23emitTryCatchScaffoldingIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_1ZNS1_24emitTryWithSharedHandlerIS8_EEvPNS1_22SharedExceptionHandlerET_EUlvE_ZNS9_IS8_EEvSB_SC_EUlPNS_10BasicBlockEE_EESF_SF_SC_T0_T1_:
 1278|  20.3k|    EH emitHandler) {
 1279|  20.3k|  auto *function = Builder.getFunction();
 1280|       |
 1281|  20.3k|  auto *catchBlock = Builder.createBasicBlock(function);
 1282|  20.3k|  if (!nextBlock)
  ------------------
  |  Branch (1282:7): [True: 20.3k, False: 0]
  ------------------
 1283|  20.3k|    nextBlock = Builder.createBasicBlock(function);
 1284|  20.3k|  auto *tryBodyBlock = Builder.createBasicBlock(function);
 1285|       |
 1286|       |  // Start with a TryStartInst, and transition to try body.
 1287|  20.3k|  Builder.createTryStartInst(tryBodyBlock, catchBlock);
 1288|  20.3k|  Builder.setInsertionBlock(tryBodyBlock);
 1289|       |
 1290|       |  // Generate IR for the body of Try
 1291|  20.3k|  emitBody();
 1292|       |
 1293|       |  // Emit TryEnd in a new block.
 1294|  20.3k|  auto *tryEndBlock = Builder.createBasicBlock(function);
 1295|  20.3k|  Builder.createBranchInst(tryEndBlock);
 1296|  20.3k|  Builder.setInsertionBlock(tryEndBlock);
 1297|  20.3k|  Builder.createTryEndInst();
 1298|       |
 1299|  20.3k|  emitNormalCleanup();
 1300|       |
 1301|  20.3k|  Builder.createBranchInst(nextBlock);
 1302|       |
 1303|       |  // Generate the catch/finally block.
 1304|  20.3k|  Builder.setInsertionBlock(catchBlock);
 1305|       |
 1306|  20.3k|  emitHandler(nextBlock);
 1307|       |
 1308|  20.3k|  return nextBlock;
 1309|  20.3k|}
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_1EEvPNS1_22SharedExceptionHandlerET_ENKUlvE_clEv:
 1320|  20.3k|      []() {},
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_1EEvPNS1_22SharedExceptionHandlerET_ENKUlPNS_10BasicBlockEE_clESD_:
 1322|  20.3k|      [this, handler](BasicBlock *nextBlock) {
 1323|  20.3k|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1324|  20.3k|        Builder.createBranchInst(handler->exceptionBlock);
 1325|  20.3k|        Builder.setInsertionBlock(nextBlock);
 1326|  20.3k|      });

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

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

_ZN6hermes4inst10isCallTypeENS0_6OpCodeE:
  155|  2.40k|bool isCallType(OpCode opcode) {
  156|  2.40k|  switch (opcode) {
  157|      0|#define DEFINE_RET_TARGET(name) \
  158|      0|  case OpCode::name:            \
  159|      0|    return true;
  160|      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|       |/// Create a new inner environment, to store values captured by closures.
  |  |  249|       |/// Arg1 is the destination.
  |  |  250|       |/// Arg2 is the parent environment.
  |  |  251|       |/// Arg3 is the number of slots in the environment.
  |  |  252|      0|DEFINE_OPCODE_3(CreateInnerEnvironment, Reg8, Reg8, UInt32)
  |  |  253|       |
  |  |  254|       |/// Declare a global variable by string table index.
  |  |  255|       |/// The variable will be set to undefined.
  |  |  256|      0|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  257|      0|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  258|       |
  |  |  259|       |/// Checks if globalThis has a restricted global property with the given name.
  |  |  260|       |/// Arg1 is the name to check.
  |  |  261|      0|DEFINE_OPCODE_1(ThrowIfHasRestrictedGlobalProperty, UInt32)
  |  |  262|      0|OPERAND_STRING_ID(ThrowIfHasRestrictedGlobalProperty, 1)
  |  |  263|       |
  |  |  264|       |/// Get an object property by string table index.
  |  |  265|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  266|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  267|      0|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  268|      0|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  269|      0|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  270|      0|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  271|      0|OPERAND_STRING_ID(GetById, 4)
  |  |  272|      0|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  273|       |
  |  |  274|       |/// Get an object property by string table index, or throw if not found.
  |  |  275|       |/// This is similar to GetById, but intended for use with global variables
  |  |  276|       |/// where Arg2 = GetGlobalObject.
  |  |  277|      0|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  278|      0|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  279|      0|OPERAND_STRING_ID(TryGetById, 4)
  |  |  280|      0|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  281|       |
  |  |  282|       |/// Set an object property by string index.
  |  |  283|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  284|      0|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  285|      0|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  286|      0|OPERAND_STRING_ID(PutById, 4)
  |  |  287|      0|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  288|       |
  |  |  289|       |/// Set an object property by string index, or throw if undeclared.
  |  |  290|       |/// This is similar to PutById, but intended for use with global variables
  |  |  291|       |/// where Arg1 = GetGlobalObject.
  |  |  292|      0|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  293|      0|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  294|      0|OPERAND_STRING_ID(TryPutById, 4)
  |  |  295|      0|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  296|       |
  |  |  297|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  298|       |/// the destination must be an object, it only deals with own properties,
  |  |  299|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  300|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  301|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  302|       |/// Arg2 is the value to write.
  |  |  303|       |/// Arg3 is the string table ID of the property name.
  |  |  304|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  305|      0|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  306|      0|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  307|      0|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  308|      0|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  309|      0|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  310|      0|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  311|       |
  |  |  312|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  313|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  314|       |/// Arg1 is the destination object.
  |  |  315|       |/// Arg2 is the value to write.
  |  |  316|       |/// Arg3 is the string table ID of the property name.
  |  |  317|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  318|      0|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  319|      0|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  320|      0|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  321|      0|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  322|       |
  |  |  323|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  324|      0|ASSERT_MONOTONE_INCREASING(
  |  |  325|      0|    PutNewOwnByIdShort,
  |  |  326|      0|    PutNewOwnById,
  |  |  327|      0|    PutNewOwnByIdLong,
  |  |  328|      0|    PutNewOwnNEById,
  |  |  329|      0|    PutNewOwnNEByIdLong)
  |  |  330|       |
  |  |  331|       |/// Assign a value to a constant integer own property which will be created as
  |  |  332|       |/// enumerable. This is used (potentially in conjunction with
  |  |  333|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  334|       |/// Arg1[Arg3] = Arg2;
  |  |  335|      0|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  336|      0|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  337|       |
  |  |  338|       |/// Set an own property identified by value.
  |  |  339|       |/// Arg1 is the destination object.
  |  |  340|       |/// Arg2 is the value to write.
  |  |  341|       |/// Arg3 is the property name.
  |  |  342|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  343|       |///        non-enumerable otherwise.
  |  |  344|       |/// Arg1[Arg3] = Arg2;
  |  |  345|      0|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  346|       |
  |  |  347|       |/// Delete a property by string table index.
  |  |  348|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  349|      0|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  350|      0|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  351|      0|OPERAND_STRING_ID(DelById, 3)
  |  |  352|      0|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  353|       |
  |  |  354|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  355|       |/// Arg1 = Arg2[Arg3]
  |  |  356|      0|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  357|       |
  |  |  358|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  359|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  360|       |/// case this is still the right opcode).
  |  |  361|       |/// Arg1[Arg2] = Arg3
  |  |  362|      0|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  363|       |
  |  |  364|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  365|       |/// Arg1 = delete Arg2[Arg3]
  |  |  366|      0|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  367|       |
  |  |  368|       |/// Add a getter and a setter for a property by value.
  |  |  369|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  370|       |/// Arg1 is the target object which will have a property defined.
  |  |  371|       |/// Arg2 is the property name
  |  |  372|       |/// Arg3 is the getter closure or undefined
  |  |  373|       |/// Arg4 is the setter closure or undefined
  |  |  374|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  375|      0|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  376|       |
  |  |  377|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  378|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  379|       |/// Returns Undefined if the object is null/undefined.
  |  |  380|       |/// Arg2 is the register that holds the object.
  |  |  381|       |/// Arg3 is the register that holds the iterating index.
  |  |  382|       |/// Arg4 is the register that holds the size of the property list.
  |  |  383|      0|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  384|       |
  |  |  385|       |/// Get the next property in the for..in iterator.
  |  |  386|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  387|       |/// Arg2 is the register that holds array of properties.
  |  |  388|       |/// Arg3 is the register that holds the object.
  |  |  389|       |/// Arg4 is the register that holds the iterating index.
  |  |  390|       |/// Arg5 is the register that holds the size of the property list.
  |  |  391|      0|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  392|       |
  |  |  393|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  394|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  395|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  396|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  397|       |/// wider instructions appearing after narrower ones.
  |  |  398|       |
  |  |  399|       |/// Call a function.
  |  |  400|       |/// Arg1 is the destination of the return value.
  |  |  401|       |/// Arg2 is the closure to invoke.
  |  |  402|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  403|       |///      from the end of the current frame.
  |  |  404|      0|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  405|      0|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  158|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 0, False: 2.40k]
  |  |  |  |  ------------------
  |  |  |  |  159|      0|    return true;
  |  |  ------------------
  |  |  406|       |
  |  |  407|       |/// Call a constructor, with semantics identical to Call.
  |  |  408|       |/// Arg1 is the destination of the return value.
  |  |  409|       |/// Arg2 is the closure to invoke.
  |  |  410|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  411|       |///      from the end of the current frame. The first argument 'this'
  |  |  412|       |///      is assumed to be created with CreateThis.
  |  |  413|      0|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  414|    960|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  158|    960|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 960, False: 1.44k]
  |  |  |  |  ------------------
  |  |  |  |  159|    960|    return true;
  |  |  ------------------
  |  |  415|       |
  |  |  416|       |/// Call a function with one arg.
  |  |  417|       |/// Arg1 is the destination of the return value.
  |  |  418|       |/// Arg2 is the closure to invoke.
  |  |  419|       |/// Arg3 is the first argument.
  |  |  420|      0|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  421|    480|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  158|    480|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 480, False: 1.92k]
  |  |  |  |  ------------------
  |  |  |  |  159|    480|    return true;
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function directly without a closure.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  426|       |///      from the end of the current frame. The first argument 'this'
  |  |  427|       |///      is assumed to be created with CreateThis.
  |  |  428|       |/// Arg3 is index in the function table.
  |  |  429|       |/// Note that we expect the variable-sized argument to be last.
  |  |  430|      0|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  431|      0|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  432|      0|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  158|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 0, False: 2.40k]
  |  |  |  |  ------------------
  |  |  |  |  159|      0|    return true;
  |  |  ------------------
  |  |  433|       |
  |  |  434|       |/// Call a function with two args.
  |  |  435|       |/// Arg1 is the destination of the return value.
  |  |  436|       |/// Arg2 is the closure to invoke.
  |  |  437|       |/// Arg3 is the first argument.
  |  |  438|       |/// Arg4 is the second argument.
  |  |  439|      0|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  440|    960|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  158|    960|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 960, False: 1.44k]
  |  |  |  |  ------------------
  |  |  |  |  159|    960|    return true;
  |  |  ------------------
  |  |  441|       |
  |  |  442|       |/// Call a function with three args.
  |  |  443|       |/// Arg1 is the destination of the return value.
  |  |  444|       |/// Arg2 is the closure to invoke.
  |  |  445|       |/// Arg3 is the first argument.
  |  |  446|       |/// Arg4 is the second argument.
  |  |  447|       |/// Arg5 is the third argument.
  |  |  448|      0|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  449|      0|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  158|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 0, False: 2.40k]
  |  |  |  |  ------------------
  |  |  |  |  159|      0|    return true;
  |  |  ------------------
  |  |  450|       |
  |  |  451|       |/// Call a function with four args.
  |  |  452|       |/// Arg1 is the destination of the return value.
  |  |  453|       |/// Arg2 is the closure to invoke.
  |  |  454|       |/// Arg3 is the first argument.
  |  |  455|       |/// Arg4 is the second argument.
  |  |  456|       |/// Arg5 is the third argument.
  |  |  457|       |/// Arg6 is the fourth argument.
  |  |  458|      0|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  459|      0|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  158|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 0, False: 2.40k]
  |  |  |  |  ------------------
  |  |  |  |  159|      0|    return true;
  |  |  ------------------
  |  |  460|       |
  |  |  461|       |/// Identical to Call, but allowing more arguments.
  |  |  462|      0|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  463|      0|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  158|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 0, False: 2.40k]
  |  |  |  |  ------------------
  |  |  |  |  159|      0|    return true;
  |  |  ------------------
  |  |  464|       |
  |  |  465|       |/// Identical to Construct, but allowing more arguments.
  |  |  466|      0|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  467|      0|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  158|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 0, False: 2.40k]
  |  |  |  |  ------------------
  |  |  |  |  159|      0|    return true;
  |  |  ------------------
  |  |  468|       |
  |  |  469|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  470|      0|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  471|      0|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  158|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (158:3): [True: 0, False: 2.40k]
  |  |  |  |  ------------------
  |  |  |  |  159|      0|    return true;
  |  |  ------------------
  |  |  472|       |
  |  |  473|       |// Enforce the order.
  |  |  474|      0|ASSERT_MONOTONE_INCREASING(
  |  |  475|      0|    Call,
  |  |  476|      0|    Construct,
  |  |  477|      0|    Call1,
  |  |  478|      0|    CallDirect,
  |  |  479|      0|    Call2,
  |  |  480|      0|    Call3,
  |  |  481|      0|    Call4,
  |  |  482|      0|    CallLong,
  |  |  483|      0|    ConstructLong,
  |  |  484|      0|    CallDirectLongIndex)
  |  |  485|       |
  |  |  486|       |/// Call a builtin function.
  |  |  487|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  488|       |/// and therefore never JS.
  |  |  489|       |/// Arg1 is the destination of the return value.
  |  |  490|       |/// Arg2 is the builtin number.
  |  |  491|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  492|       |///      from the end of the current frame.
  |  |  493|       |/// thisArg is set to "undefined".
  |  |  494|      0|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  495|       |
  |  |  496|       |/// Call a builtin function.
  |  |  497|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  498|       |/// and therefore never JS.
  |  |  499|       |/// Arg1 is the destination of the return value.
  |  |  500|       |/// Arg2 is the builtin number.
  |  |  501|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  502|       |///      from the end of the current frame.
  |  |  503|       |/// thisArg is set to "undefined".
  |  |  504|      0|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  505|       |
  |  |  506|       |/// Get a closure from a builtin function.
  |  |  507|       |/// Arg1 is the destination of the return value.
  |  |  508|       |/// Arg2 is the builtin number.
  |  |  509|      0|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  510|       |
  |  |  511|       |///
  |  |  512|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  513|       |
  |  |  514|       |/// Return a value from the current function.
  |  |  515|       |/// return Arg1;
  |  |  516|      0|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  517|       |
  |  |  518|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  519|       |/// } catch(Arg1) {
  |  |  520|      0|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  521|       |
  |  |  522|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  523|       |/// Arg1 is the destination of the return value.
  |  |  524|       |/// Arg2 is the value to eval.
  |  |  525|       |/// Arg3 is a boolean which is true if the eval should be performed in strict mode.
  |  |  526|      0|DEFINE_OPCODE_3(DirectEval, Reg8, Reg8, UInt8)
  |  |  527|       |
  |  |  528|       |/// Throw an exception.
  |  |  529|       |/// throw Arg1;
  |  |  530|      0|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  531|       |
  |  |  532|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  533|       |/// Arg1 is the destination of the return value
  |  |  534|       |/// Arg2 is the value to check
  |  |  535|      0|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  536|       |
  |  |  537|       |/// Implementation dependent debugger action.
  |  |  538|      0|DEFINE_OPCODE_0(Debugger)
  |  |  539|       |
  |  |  540|       |/// Fast check for an async interrupt request.
  |  |  541|      0|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  542|       |
  |  |  543|       |/// Define a profile point.
  |  |  544|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  545|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  546|       |/// all the overflowed profile points have index zero.
  |  |  547|      0|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  548|       |
  |  |  549|       |/// Create a closure.
  |  |  550|       |/// Arg1 is the register in which to store the closure.
  |  |  551|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  552|       |/// Arg3 is index in the function table.
  |  |  553|      0|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  554|      0|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  555|      0|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  556|      0|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  557|       |
  |  |  558|       |/// Create a closure for a GeneratorFunction.
  |  |  559|       |/// Arg1 is the register in which to store the closure.
  |  |  560|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  561|       |/// Arg3 is index in the function table.
  |  |  562|      0|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  563|      0|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  564|      0|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  565|      0|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  566|       |
  |  |  567|       |/// Create a closure for an AsyncFunction.
  |  |  568|       |/// Arg1 is the register in which to store the closure.
  |  |  569|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  570|       |/// Arg3 is index in the function table.
  |  |  571|      0|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  572|      0|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  573|      0|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  574|      0|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  575|       |
  |  |  576|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  577|       |/// Arg1 is the destination register.
  |  |  578|       |/// Arg2 is the prototype to assign it.
  |  |  579|       |/// Arg3 is the constructor closure that will be used*.
  |  |  580|       |/// * To allow internal constructors to have special objects allocated.
  |  |  581|      0|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  582|       |
  |  |  583|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  584|       |/// Arg1 is the result.
  |  |  585|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  586|       |/// Arg3 is the constructor's return value.
  |  |  587|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  588|      0|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  589|       |
  |  |  590|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  591|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  592|      0|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  593|       |
  |  |  594|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  595|      0|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  596|       |
  |  |  597|       |/// Load a constant integer value.
  |  |  598|      0|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  599|      0|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  600|       |
  |  |  601|       |/// Load a constant double value.
  |  |  602|      0|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  603|       |
  |  |  604|       |/// Load a constant BigInt value by bigint table index.
  |  |  605|      0|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  606|      0|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  607|      0|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  608|      0|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  609|       |
  |  |  610|       |/// Load a constant string value by string table index.
  |  |  611|      0|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  612|      0|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  613|      0|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  614|      0|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  615|       |
  |  |  616|       |/// Load common constants.
  |  |  617|      0|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  618|      0|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  619|      0|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  620|      0|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  621|      0|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  622|      0|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  623|       |
  |  |  624|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  625|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  626|       |/// object.
  |  |  627|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  628|      0|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  629|       |
  |  |  630|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  631|       |/// \code
  |  |  632|       |///     LoadParam    Arg1, #0
  |  |  633|       |///     CoerceThisNS Arg1, Arg1
  |  |  634|       |/// \endcode
  |  |  635|      0|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  636|       |
  |  |  637|       |/// Convert a value to a number.
  |  |  638|       |/// Arg1 = Arg2 - 0
  |  |  639|      0|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  640|       |/// Convert a value to a numberic.
  |  |  641|       |/// Arg1 = ToNumeric(Arg2)
  |  |  642|      0|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  643|       |/// Convert a value to a 32-bit signed integer.
  |  |  644|       |/// Arg1 = Arg2 | 0
  |  |  645|      0|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  646|       |
  |  |  647|       |/// Convert a value to a string as if evaluating the expression:
  |  |  648|       |///     Arg1 = "" + Arg2
  |  |  649|       |/// In practice this means
  |  |  650|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  651|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  652|      0|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  653|       |
  |  |  654|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  655|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  656|       |// will be populated and the rest of the instruction will access it directly.
  |  |  657|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  658|       |// instead of doing a full array allocation and property lookup.
  |  |  659|       |
  |  |  660|       |/// Get a property of the 'arguments' array by value.
  |  |  661|       |/// Arg1 is the result.
  |  |  662|       |/// Arg2 is the index.
  |  |  663|       |/// Arg3 is the lazy loaded register.
  |  |  664|       |/// Arg1 = arguments[Arg2]
  |  |  665|      0|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  666|       |
  |  |  667|       |/// Get the length of the 'arguments' array.
  |  |  668|       |/// Arg1 is the result.
  |  |  669|       |/// Arg2 is the lazy loaded register.
  |  |  670|       |/// Arg1 = arguments.length
  |  |  671|      0|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  672|       |
  |  |  673|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  674|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  675|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  676|      0|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  677|       |
  |  |  678|       |/// Create a regular expression.
  |  |  679|       |/// Arg1 is the result.
  |  |  680|       |/// Arg2 is the string index of the pattern.
  |  |  681|       |/// Arg3 is the string index of the flags.
  |  |  682|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  683|      0|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  684|      0|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  685|      0|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  686|       |
  |  |  687|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  688|       |/// input or to the default block if out of range (or not right type)
  |  |  689|       |/// Arg 1 is the value to be branched upon
  |  |  690|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  691|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  692|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  693|       |/// less than this value jmp to
  |  |  694|       |///   default block
  |  |  695|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  696|       |///   default block.
  |  |  697|       |///
  |  |  698|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  699|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  700|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  701|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  702|      0|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  703|       |
  |  |  704|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  705|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  706|      0|DEFINE_OPCODE_0(StartGenerator)
  |  |  707|       |
  |  |  708|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  709|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  710|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  711|       |/// - throw(val): Throw val as an error
  |  |  712|       |/// Arg1 is the result provided by the user.
  |  |  713|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  714|      0|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  715|       |
  |  |  716|       |/// Set the generator status to complete, but do not return.
  |  |  717|      0|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  718|       |
  |  |  719|       |/// Create a generator.
  |  |  720|       |/// Arg1 is the register in which to store the generator.
  |  |  721|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  722|       |/// Arg3 is index in the function table.
  |  |  723|      0|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  724|      0|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  725|      0|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  726|      0|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  727|       |
  |  |  728|       |/// Arg1 [out] is the result iterator or index.
  |  |  729|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  730|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  731|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  732|       |/// method on the iterator.
  |  |  733|       |/// See IR.md for IteratorBeginInst.
  |  |  734|      0|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  735|       |
  |  |  736|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  737|       |/// Arg2 [in/out] is the iterator or index.
  |  |  738|       |/// Arg2 [in] is the source or the next method.
  |  |  739|       |/// If iterator is undefined, result = undefined.
  |  |  740|       |/// If iterator is a number:
  |  |  741|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  742|       |///   Else iterator = undefined and result = undefined
  |  |  743|       |/// Else:
  |  |  744|       |///   n = iterator.next()
  |  |  745|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  746|       |///   Else result = n.value
  |  |  747|       |/// See IR.md for IteratorNextInst.
  |  |  748|      0|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  749|       |
  |  |  750|       |/// Arg1 [in] is the iterator or array index.
  |  |  751|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  752|       |/// If the iterator is an object, call iterator.return().
  |  |  753|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  754|       |/// See IR.md for IteratorCloseInst.
  |  |  755|      0|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  756|       |
  |  |  757|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  758|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  759|       |// The macros will automatically generate two opcodes for each definition,
  |  |  760|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  761|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  762|      0|#define DEFINE_JUMP_1(name)           \
  |  |  763|      0|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  764|      0|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  765|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  766|       |
  |  |  767|      0|#define DEFINE_JUMP_2(name)                 \
  |  |  768|      0|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  769|      0|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  770|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  771|       |
  |  |  772|      0|#define DEFINE_JUMP_3(name)                       \
  |  |  773|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  774|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  775|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  776|       |
  |  |  777|       |/// Unconditional branch to Arg1.
  |  |  778|      0|DEFINE_JUMP_1(Jmp)
  |  |  779|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  780|      0|DEFINE_JUMP_2(JmpTrue)
  |  |  781|      0|DEFINE_JUMP_2(JmpFalse)
  |  |  782|       |/// Jump if the value is undefined.
  |  |  783|      0|DEFINE_JUMP_2(JmpUndefined)
  |  |  784|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  785|       |/// at the provided target.
  |  |  786|      0|DEFINE_JUMP_1(SaveGenerator)
  |  |  787|       |
  |  |  788|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  789|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  790|       |
  |  |  791|       |/// Not conditionals are required for NaN comparisons
  |  |  792|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  793|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  794|       |/// "jump when less than to BB1".
  |  |  795|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  796|      0|DEFINE_JUMP_3(JLess)
  |  |  797|      0|DEFINE_JUMP_3(JNotLess)
  |  |  798|      0|DEFINE_JUMP_3(JLessN)
  |  |  799|      0|DEFINE_JUMP_3(JNotLessN)
  |  |  800|      0|DEFINE_JUMP_3(JLessEqual)
  |  |  801|      0|DEFINE_JUMP_3(JNotLessEqual)
  |  |  802|      0|DEFINE_JUMP_3(JLessEqualN)
  |  |  803|      0|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  804|      0|DEFINE_JUMP_3(JGreater)
  |  |  805|      0|DEFINE_JUMP_3(JNotGreater)
  |  |  806|      0|DEFINE_JUMP_3(JGreaterN)
  |  |  807|      0|DEFINE_JUMP_3(JNotGreaterN)
  |  |  808|      0|DEFINE_JUMP_3(JGreaterEqual)
  |  |  809|      0|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  810|      0|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  811|      0|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  812|      0|DEFINE_JUMP_3(JEqual)
  |  |  813|      0|DEFINE_JUMP_3(JNotEqual)
  |  |  814|      0|DEFINE_JUMP_3(JStrictEqual)
  |  |  815|      0|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  816|       |
  |  |  817|       |#ifdef HERMES_RUN_WASM
  |  |  818|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  819|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  820|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  821|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  822|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  823|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  824|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  825|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  826|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  827|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  828|       |
  |  |  829|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  830|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  831|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  832|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  833|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  834|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  835|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  836|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  837|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  838|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  839|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  840|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  841|       |
  |  |  842|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  843|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  844|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  845|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  846|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  847|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  848|       |#endif
  |  |  849|       |
  |  |  850|       |// Implementations can rely on the following pairs of instructions having the
  |  |  851|       |// same number and type of operands.
  |  |  852|      0|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  853|      0|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  854|      0|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  855|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  856|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  857|      0|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  858|      0|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  859|      0|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  860|       |
  |  |  861|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  862|      0|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  863|      0|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  864|       |
  |  |  865|      0|#undef DEFINE_JUMP_1
  |  |  866|      0|#undef DEFINE_JUMP_2
  |  |  867|      0|#undef DEFINE_JUMP_3
  |  |  868|       |
  |  |  869|       |// Undefine all macros used to avoid confusing next include.
  |  |  870|      0|#undef DEFINE_OPERAND_TYPE
  |  |  871|      0|#undef DEFINE_OPCODE_0
  |  |  872|      0|#undef DEFINE_OPCODE_1
  |  |  873|      0|#undef DEFINE_OPCODE_2
  |  |  874|      0|#undef DEFINE_OPCODE_3
  |  |  875|      0|#undef DEFINE_OPCODE_4
  |  |  876|      0|#undef DEFINE_OPCODE_5
  |  |  877|      0|#undef DEFINE_OPCODE_6
  |  |  878|      0|#undef DEFINE_OPCODE
  |  |  879|      0|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  880|      0|#undef DEFINE_RET_TARGET
  |  |  881|      0|#undef ASSERT_EQUAL_LAYOUT1
  |  |  882|      0|#undef ASSERT_EQUAL_LAYOUT2
  |  |  883|      0|#undef ASSERT_EQUAL_LAYOUT3
  |  |  884|      0|#undef ASSERT_EQUAL_LAYOUT4
  |  |  885|      0|#undef ASSERT_MONOTONE_INCREASING
  |  |  886|      0|#undef OPERAND_BIGINT_ID
  |  |  887|      0|#undef OPERAND_FUNCTION_ID
  |  |  888|      0|#undef OPERAND_STRING_ID
  ------------------
  161|      0|    default:
  ------------------
  |  Branch (161:5): [True: 0, False: 2.40k]
  ------------------
  162|      0|      return false;
  163|  2.40k|  }
  164|  2.40k|}

_ZN6hermes2vm19getInternalBytecodeEv:
   14|    160|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|    160|  alignas(hbc::BYTECODE_ALIGNMENT) static const uint8_t InternalBytecode[] = {
   18|    160|#ifdef HERMES_CMAKE_BUILD
   19|    160|#include "InternalBytecode.inc"
   20|       |#else
   21|       |#include "hermes/InternalBytecode/InternalBytecode.inc"
   22|       |#endif
   23|    160|  };
   24|       |
   25|    160|  return llvh::makeArrayRef(InternalBytecode, sizeof(InternalBytecode));
   26|    160|}

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

_ZN6hermes19HoistStartGenerator13runOnFunctionEPNS_8FunctionE:
   16|   103k|bool HoistStartGenerator::runOnFunction(Function *F) {
   17|   103k|  auto *innerFn = llvh::dyn_cast<GeneratorInnerFunction>(F);
   18|   103k|  if (!innerFn) {
  ------------------
  |  Branch (18:7): [True: 103k, False: 0]
  ------------------
   19|       |    // StartGenerator is only in GeneratorInnerFunction.
   20|   103k|    return false;
   21|   103k|  }
   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|    196|std::unique_ptr<Pass> hermes::createHoistStartGenerator() {
   38|    196|  return std::make_unique<HoistStartGenerator>();
   39|    196|}

_ZN6hermes6parser7JSLexer10lookahead1ILb1EEENS_8OptValueINS0_9TokenKindEEES5_:
  972|    500|OptValue<TokenKind> JSLexer::lookahead1(OptValue<TokenKind> expectedToken) {
  973|       |  // We support TokenKind::question here because of Flow's render types.
  974|       |  // `renders?` is not a token itself (as making it a token would be bad for
  975|       |  // identifier parsing performance). When we are parsing something like
  976|       |  // (renders?: number) => string and the cursor is under the `?`, we need to
  977|       |  // perform a lookahead to see if the next token is a colon, in which case
  978|       |  // this is a function parameter, and if not then parse as a render type.
  979|    500|  assert(
  980|    500|      (token_.getKind() == TokenKind::identifier || token_.isResWord() ||
  981|    500|       token_.getKind() == TokenKind::question) &&
  982|    500|      "unsupported current token");
  983|    500|  UniqueString *savedIdent;
  984|    500|  if (token_.getKind() == TokenKind::identifier || token_.isResWord()) {
  ------------------
  |  Branch (984:7): [True: 500, False: 0]
  |  Branch (984:52): [True: 0, False: 0]
  ------------------
  985|    500|    savedIdent = token_.getResWordOrIdentifier();
  986|    500|  }
  987|    500|  TokenKind savedKind = token_.getKind();
  988|    500|  SMLoc start = token_.getStartLoc();
  989|    500|  SMLoc end = token_.getEndLoc();
  990|    500|  const char *cur = curCharPtr_;
  991|    500|  SourceErrorManager::SaveAndSuppressMessages suppress(&sm_);
  992|       |
  993|       |  // Remove any comments that were stored during the lookahead
  994|    500|  auto savedCommentStorageSize = commentStorage_.size();
  995|    500|  auto commentScope = llvh::make_scope_exit([&] {
  996|    500|    if (storeComments_)
  997|    500|      commentStorage_.erase(
  998|    500|          commentStorage_.begin() + savedCommentStorageSize,
  999|    500|          commentStorage_.end());
 1000|    500|  });
 1001|       |
 1002|    500|  advance();
 1003|    500|  OptValue<TokenKind> kind = token_.getKind();
 1004|    500|  if (RequireNoNewLine && isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (1004:7): [Folded - Ignored]
  |  Branch (1004:27): [True: 496, False: 4]
  ------------------
 1005|       |    // Disregard anything after LineTerminator.
 1006|    496|    kind = llvh::None;
 1007|    496|  } else if (expectedToken == kind) {
  ------------------
  |  Branch (1007:14): [True: 0, False: 4]
  ------------------
 1008|       |    // Do not move the cursor back.
 1009|      0|    return kind;
 1010|      0|  }
 1011|       |
 1012|    500|  token_.setStart(start.getPointer());
 1013|    500|  token_.setEnd(end.getPointer());
 1014|    500|  if (savedKind == TokenKind::identifier) {
  ------------------
  |  Branch (1014:7): [True: 500, False: 0]
  ------------------
 1015|    500|    token_.setIdentifier(savedIdent);
 1016|    500|  } else if (savedKind == TokenKind::question) {
  ------------------
  |  Branch (1016:14): [True: 0, False: 0]
  ------------------
 1017|      0|    token_.setPunctuator(TokenKind::question);
 1018|      0|  } else {
 1019|      0|    token_.setResWord(savedKind, savedIdent);
 1020|      0|  }
 1021|    500|  seek(SMLoc::getFromPointer(cur));
 1022|       |
 1023|       |  // Undo the storage for the token we just advanced to.
 1024|    500|  if (LLVM_UNLIKELY(storeTokens_)) {
  ------------------
  |  |  189|    500|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 500]
  |  |  ------------------
  ------------------
 1025|      0|    tokenStorage_.pop_back();
 1026|      0|  }
 1027|       |
 1028|    500|  return kind;
 1029|    500|}
_ZN6hermes6parser7JSLexer10lookahead1ILb0EEENS_8OptValueINS0_9TokenKindEEES5_:
  972|    100|OptValue<TokenKind> JSLexer::lookahead1(OptValue<TokenKind> expectedToken) {
  973|       |  // We support TokenKind::question here because of Flow's render types.
  974|       |  // `renders?` is not a token itself (as making it a token would be bad for
  975|       |  // identifier parsing performance). When we are parsing something like
  976|       |  // (renders?: number) => string and the cursor is under the `?`, we need to
  977|       |  // perform a lookahead to see if the next token is a colon, in which case
  978|       |  // this is a function parameter, and if not then parse as a render type.
  979|    100|  assert(
  980|    100|      (token_.getKind() == TokenKind::identifier || token_.isResWord() ||
  981|    100|       token_.getKind() == TokenKind::question) &&
  982|    100|      "unsupported current token");
  983|    100|  UniqueString *savedIdent;
  984|    100|  if (token_.getKind() == TokenKind::identifier || token_.isResWord()) {
  ------------------
  |  Branch (984:7): [True: 100, False: 0]
  |  Branch (984:52): [True: 0, False: 0]
  ------------------
  985|    100|    savedIdent = token_.getResWordOrIdentifier();
  986|    100|  }
  987|    100|  TokenKind savedKind = token_.getKind();
  988|    100|  SMLoc start = token_.getStartLoc();
  989|    100|  SMLoc end = token_.getEndLoc();
  990|    100|  const char *cur = curCharPtr_;
  991|    100|  SourceErrorManager::SaveAndSuppressMessages suppress(&sm_);
  992|       |
  993|       |  // Remove any comments that were stored during the lookahead
  994|    100|  auto savedCommentStorageSize = commentStorage_.size();
  995|    100|  auto commentScope = llvh::make_scope_exit([&] {
  996|    100|    if (storeComments_)
  997|    100|      commentStorage_.erase(
  998|    100|          commentStorage_.begin() + savedCommentStorageSize,
  999|    100|          commentStorage_.end());
 1000|    100|  });
 1001|       |
 1002|    100|  advance();
 1003|    100|  OptValue<TokenKind> kind = token_.getKind();
 1004|    100|  if (RequireNoNewLine && isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (1004:7): [Folded - Ignored]
  |  Branch (1004:27): [True: 0, False: 0]
  ------------------
 1005|       |    // Disregard anything after LineTerminator.
 1006|      0|    kind = llvh::None;
 1007|    100|  } else if (expectedToken == kind) {
  ------------------
  |  Branch (1007:14): [True: 0, False: 100]
  ------------------
 1008|       |    // Do not move the cursor back.
 1009|      0|    return kind;
 1010|      0|  }
 1011|       |
 1012|    100|  token_.setStart(start.getPointer());
 1013|    100|  token_.setEnd(end.getPointer());
 1014|    100|  if (savedKind == TokenKind::identifier) {
  ------------------
  |  Branch (1014:7): [True: 100, False: 0]
  ------------------
 1015|    100|    token_.setIdentifier(savedIdent);
 1016|    100|  } else if (savedKind == TokenKind::question) {
  ------------------
  |  Branch (1016:14): [True: 0, False: 0]
  ------------------
 1017|      0|    token_.setPunctuator(TokenKind::question);
 1018|      0|  } else {
 1019|      0|    token_.setResWord(savedKind, savedIdent);
 1020|      0|  }
 1021|    100|  seek(SMLoc::getFromPointer(cur));
 1022|       |
 1023|       |  // Undo the storage for the token we just advanced to.
 1024|    100|  if (LLVM_UNLIKELY(storeTokens_)) {
  ------------------
  |  |  189|    100|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 100]
  |  |  ------------------
  ------------------
 1025|      0|    tokenStorage_.pop_back();
 1026|      0|  }
 1027|       |
 1028|    100|  return kind;
 1029|    100|}
_ZN6hermes6parser12tokenKindStrENS0_9TokenKindE:
   38|  74.4k|const char *tokenKindStr(TokenKind kind) {
   39|  74.4k|  assert(kind <= TokenKind::_last_token);
   40|  74.4k|  return g_tokenStr[static_cast<unsigned>(kind)];
   41|  74.4k|}
_ZN6hermes6parser7JSLexerC2EjRNS_18SourceErrorManagerERNS_28BacktrackingBumpPtrAllocatorEPNS_11StringTableEbb:
   67|    450|    : sm_(sm),
   68|    450|      allocator_(allocator),
   69|    450|      ownStrTab_(strTab ? nullptr : new StringTable(allocator_)),
  ------------------
  |  Branch (69:18): [True: 450, False: 0]
  ------------------
   70|    450|      strTab_(strTab ? *strTab : *ownStrTab_),
  ------------------
  |  Branch (70:15): [True: 450, False: 0]
  ------------------
   71|       |#if HERMES_PARSE_JSX
   72|    450|      htmlEntities_(getHTMLEntities()),
   73|       |#endif
   74|    450|      strictMode_(strictMode),
   75|    450|      convertSurrogates_(convertSurrogates) {
   76|    450|  initializeWithBufferId(bufId);
   77|    450|  initializeReservedIdentifiers();
   78|    450|}
_ZN6hermes6parser7JSLexerC2ENSt3__110unique_ptrIN4llvh12MemoryBufferENS2_14default_deleteIS5_EEEERNS_18SourceErrorManagerERNS_28BacktrackingBumpPtrAllocatorEPNS_11StringTableEbb:
   87|    160|    : sm_(sm),
   88|    160|      allocator_(allocator),
   89|    160|      ownStrTab_(strTab ? nullptr : new StringTable(allocator_)),
  ------------------
  |  Branch (89:18): [True: 160, False: 0]
  ------------------
   90|    160|      strTab_(strTab ? *strTab : *ownStrTab_),
  ------------------
  |  Branch (90:15): [True: 160, False: 0]
  ------------------
   91|       |#if HERMES_PARSE_JSX
   92|    160|      htmlEntities_(getHTMLEntities()),
   93|       |#endif
   94|    160|      strictMode_(strictMode),
   95|    160|      convertSurrogates_(convertSurrogates) {
   96|    160|  auto bufId = sm_.addNewSourceBuffer(std::move(input));
   97|    160|  initializeWithBufferId(bufId);
   98|    160|  initializeReservedIdentifiers();
   99|    160|}
_ZN6hermes6parser7JSLexer22initializeWithBufferIdEj:
  101|    610|void JSLexer::initializeWithBufferId(uint32_t bufId) {
  102|    610|  auto *buffer = sm_.getSourceBuffer(bufId);
  103|    610|  bufId_ = bufId;
  104|    610|  bufferStart_ = buffer->getBufferStart();
  105|    610|  bufferEnd_ = buffer->getBufferEnd();
  106|    610|  curCharPtr_ = bufferStart_;
  107|    610|  assert(*bufferEnd_ == 0 && "buffer must be zero terminated");
  108|    610|}
_ZN6hermes6parser7JSLexer29initializeReservedIdentifiersEv:
  110|    610|void JSLexer::initializeReservedIdentifiers() {
  111|       |  // Add all reserved words to the identifier table
  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  113|    610|#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|    610|#ifndef TOK
  |  |    9|    610|#define TOK(name, str)
  |  |   10|    610|#endif
  |  |   11|       |
  |  |   12|       |#ifndef RESWORD
  |  |   13|       |#define RESWORD(name) TOK(rw_##name, #name)
  |  |   14|       |#endif
  |  |   15|       |
  |  |   16|    610|#ifndef PUNCTUATOR
  |  |   17|    610|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |   18|    610|#endif
  |  |   19|       |
  |  |   20|    610|#ifndef PUNCTUATOR_FLOW
  |  |   21|    610|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |   22|    610|#endif
  |  |   23|       |
  |  |   24|    610|#ifndef BINOP
  |  |   25|    610|#define BINOP(name, str, precedence) PUNCTUATOR(name, str)
  |  |   26|    610|#endif
  |  |   27|       |
  |  |   28|    610|#ifndef TEMPLATE
  |  |   29|    610|#define TEMPLATE(name, str) TOK(name, str)
  |  |   30|    610|#endif
  |  |   31|       |
  |  |   32|    610|#ifndef IDENT_OP
  |  |   33|    610|#define IDENT_OP(name, str, precedence) TOK(name, str)
  |  |   34|    610|#endif
  |  |   35|       |
  |  |   36|    610|#ifndef RANGE_MARKER
  |  |   37|    610|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |   38|    610|#endif
  |  |   39|       |
  |  |   40|       |// clang-format off
  |  |   41|       |
  |  |   42|    610|TOK(none, "<none>")
  |  |   43|    610|TOK(identifier, "identifier")
  |  |   44|    610|TOK(private_identifier, "private identifier")
  |  |   45|       |
  |  |   46|    610|RANGE_MARKER(_first_resword)
  |  |   47|    610|RESWORD(function)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   48|    610|RESWORD(for)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   49|    610|RESWORD(if)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   50|    610|RESWORD(in)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   51|    610|RESWORD(var)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   52|    610|RESWORD(break)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   53|    610|RESWORD(continue)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   54|    610|RESWORD(return)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   55|    610|RESWORD(switch)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   56|    610|RESWORD(this)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   57|       |
  |  |   58|    610|RESWORD(true)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   59|    610|RESWORD(false)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   60|    610|RESWORD(null)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   61|    610|RESWORD(case)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   62|    610|RESWORD(catch)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   63|    610|RESWORD(const)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   64|    610|RESWORD(debugger)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   65|    610|RESWORD(default)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   66|    610|RESWORD(delete)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   67|    610|RESWORD(do)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   68|    610|RESWORD(else)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   69|    610|RESWORD(finally)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   70|    610|RESWORD(instanceof)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   71|    610|RESWORD(new)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   72|    610|RESWORD(throw)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   73|    610|RESWORD(try)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   74|    610|RESWORD(typeof)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   75|    610|RESWORD(void)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   76|    610|RESWORD(while)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   77|    610|RESWORD(with)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   78|       |
  |  |   79|    610|RESWORD(export)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   80|    610|RESWORD(import)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   81|       |
  |  |   82|    610|RESWORD(class)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   83|    610|RESWORD(static)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   84|    610|RESWORD(extends)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   85|    610|RESWORD(super)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   86|       |
  |  |   87|       |// Future reserved words
  |  |   88|    610|RESWORD(enum)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   89|       |
  |  |   90|       |// Strict mode future reserved words
  |  |   91|    610|RESWORD(implements)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   92|    610|RESWORD(interface)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   93|    610|RESWORD(package)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   94|    610|RESWORD(private)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   95|    610|RESWORD(protected)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   96|    610|RESWORD(public)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   97|    610|RESWORD(yield)
  |  |  ------------------
  |  |  |  |  112|    610|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   98|    610|RANGE_MARKER(_last_resword)
  |  |   99|       |
  |  |  100|    610|PUNCTUATOR(l_brace,             "{")
  |  |  101|    610|PUNCTUATOR_FLOW(l_bracepipe,    "{|")
  |  |  102|    610|PUNCTUATOR(r_brace,             "}")
  |  |  103|    610|PUNCTUATOR_FLOW(piper_brace,    "|}")
  |  |  104|    610|PUNCTUATOR(l_paren,             "(")
  |  |  105|    610|PUNCTUATOR(r_paren,             ")")
  |  |  106|    610|PUNCTUATOR(l_square,            "[")
  |  |  107|    610|PUNCTUATOR(r_square,            "]")
  |  |  108|    610|PUNCTUATOR(period,              ".")
  |  |  109|    610|PUNCTUATOR(questiondot,         "?.")
  |  |  110|    610|PUNCTUATOR(dotdotdot,           "...")
  |  |  111|    610|PUNCTUATOR(semi,                ";")
  |  |  112|    610|PUNCTUATOR(comma,               ",")
  |  |  113|    610|PUNCTUATOR(plusplus,            "++")
  |  |  114|    610|PUNCTUATOR(minusminus,          "--")
  |  |  115|    610|RANGE_MARKER(_first_binary)
  |  |  116|    610|BINOP(     starstar,            "**",  12)
  |  |  117|    610|BINOP(     star,                "*",   11)
  |  |  118|    610|BINOP(     percent,             "%",   11)
  |  |  119|    610|BINOP(     slash,               "/",   11)
  |  |  120|    610|BINOP(     plus,                "+",   10)
  |  |  121|    610|BINOP(     minus,               "-",   10)
  |  |  122|    610|BINOP(     lessless,            "<<",   9)
  |  |  123|    610|BINOP(     greatergreater,      ">>",   9)
  |  |  124|    610|BINOP(     greatergreatergreater,">>>", 9)
  |  |  125|    610|BINOP(     less,                "<",    8)
  |  |  126|    610|BINOP(     greater,             ">",    8)
  |  |  127|    610|BINOP(     lessequal,           "<=",   8)
  |  |  128|    610|BINOP(     greaterequal,        ">=",   8)
  |  |  129|    610|BINOP(     equalequal,          "==",   7)
  |  |  130|    610|BINOP(     exclaimequal,        "!=",   7)
  |  |  131|    610|BINOP(     equalequalequal,     "===",  7)
  |  |  132|    610|BINOP(     exclaimequalequal,   "!==",  7)
  |  |  133|    610|BINOP(     amp,                 "&",    6)
  |  |  134|    610|BINOP(     caret,               "^",    5)
  |  |  135|    610|BINOP(     pipe,                "|",    4)
  |  |  136|    610|BINOP(     ampamp,              "&&",   3)
  |  |  137|    610|BINOP(     pipepipe,            "||",   2)
  |  |  138|    610|BINOP(     questionquestion,    "??",   1)
  |  |  139|    610|RANGE_MARKER(_last_binary)
  |  |  140|    610|PUNCTUATOR(exclaim,             "!")
  |  |  141|    610|PUNCTUATOR(tilde,               "~")
  |  |  142|    610|PUNCTUATOR(question,            "?")
  |  |  143|    610|PUNCTUATOR(colon,               ":")
  |  |  144|    610|PUNCTUATOR(equal,               "=")
  |  |  145|    610|PUNCTUATOR(plusequal,           "+=")
  |  |  146|    610|PUNCTUATOR(minusequal,          "-=")
  |  |  147|    610|PUNCTUATOR(starequal,           "*=")
  |  |  148|    610|PUNCTUATOR(starstarequal,       "**=")
  |  |  149|    610|PUNCTUATOR(percentequal,        "%=")
  |  |  150|    610|PUNCTUATOR(slashequal,          "/=")
  |  |  151|    610|PUNCTUATOR(lesslessequal,       "<<=")
  |  |  152|    610|PUNCTUATOR(greatergreaterequal, ">>=")
  |  |  153|    610|PUNCTUATOR(greatergreatergreaterequal, ">>>=")
  |  |  154|    610|PUNCTUATOR(ampequal,            "&=")
  |  |  155|    610|PUNCTUATOR(pipeequal,           "|=")
  |  |  156|    610|PUNCTUATOR(ampampequal,         "&&=")
  |  |  157|    610|PUNCTUATOR(pipepipeequal,       "||=")
  |  |  158|    610|PUNCTUATOR(questionquestionequal, "\?\?=")
  |  |  159|    610|PUNCTUATOR(caretequal,          "^=")
  |  |  160|    610|PUNCTUATOR(equalgreater,        "=>")
  |  |  161|       |
  |  |  162|    610|IDENT_OP(as_operator,           "as",   8)
  |  |  163|       |
  |  |  164|    610|TOK(numeric_literal, "number")
  |  |  165|    610|TOK(string_literal, "string")
  |  |  166|    610|TOK(regexp_literal, "regexp")
  |  |  167|    610|TOK(jsx_text, "JSX text")
  |  |  168|    610|TOK(bigint_literal, "bigint")
  |  |  169|       |
  |  |  170|    610|TEMPLATE(no_substitution_template, "template literal")
  |  |  171|    610|TEMPLATE(template_head, "template literal start")
  |  |  172|    610|TEMPLATE(template_middle, "template literal resume")
  |  |  173|    610|TEMPLATE(template_tail, "template literal end")
  |  |  174|       |
  |  |  175|    610|TOK(eof, "<eof>")
  |  |  176|    610|RANGE_MARKER(_last_token)
  |  |  177|       |
  |  |  178|    610|#undef TOK
  |  |  179|    610|#undef RESWORD
  |  |  180|    610|#undef PUNCTUATOR
  |  |  181|    610|#undef PUNCTUATOR_FLOW
  |  |  182|    610|#undef BINOP
  |  |  183|    610|#undef TEMPLATE
  |  |  184|    610|#undef IDENT_OP
  |  |  185|    610|#undef RANGE_MARKER
  ------------------
  114|    610|}
_ZN6hermes6parser7JSLexer24isLetFollowedByDeclStartEv:
  116|    100|bool JSLexer::isLetFollowedByDeclStart() {
  117|    100|  assert(
  118|    100|      token_.getKind() == TokenKind::identifier &&
  119|    100|      token_.getIdentifier()->str() == "let");
  120|       |
  121|       |  /// Skip over whitespace that doesn't need to modify any flags in the JSLexer.
  122|       |  /// Does not skip over newlines due to newLineBeforeCurrentToken_.
  123|       |  /// Does not skip over comments.
  124|       |  /// Used to avoid lookahead.
  125|       |  /// \return the character at curCharPtr_ at the end.
  126|    100|  auto optimisticSkipWhitespace = [this]() -> char {
  127|    100|    while (char cur = *curCharPtr_) {
  128|    100|      switch (cur) {
  129|    100|        case ' ':
  130|    100|        case '\t':
  131|    100|        case '\v':
  132|    100|        case '\f':
  133|    100|          ++curCharPtr_;
  134|    100|          continue;
  135|       |
  136|    100|        default:
  137|    100|          return cur;
  138|    100|      }
  139|    100|    }
  140|    100|    return '\0';
  141|    100|  };
  142|       |
  143|    100|  const char curChar = optimisticSkipWhitespace();
  144|       |
  145|       |  // Fast path.
  146|       |  // If the next character is a '{', then this is a let declaration.
  147|       |  // If the next character is a '[', then this is a let declaration.
  148|    100|  if (curChar == '{' || curChar == '[') {
  ------------------
  |  Branch (148:7): [True: 0, False: 100]
  |  Branch (148:25): [True: 0, False: 100]
  ------------------
  149|      0|    return true;
  150|      0|  }
  151|       |
  152|       |  // Fast path.
  153|       |  // If the next character starts an ASCII identifier,
  154|       |  // then this is a declaration.
  155|       |  // Don't check for UTF-8 here to avoid having to read a codepoint
  156|       |  // or determine Unicode letter value membership.
  157|    100|  if (isASCIIIdentifierStart(curChar)) {
  ------------------
  |  Branch (157:7): [True: 0, False: 100]
  ------------------
  158|       |    // If the next characters are 'in', this may result in 'in' or 'instanceof'.
  159|       |    // So we'd actually have to run a lookahead.
  160|      0|    if (!(curChar == 'i' && curCharPtr_[1] == 'n')) {
  ------------------
  |  Branch (160:11): [True: 0, False: 0]
  |  Branch (160:29): [True: 0, False: 0]
  ------------------
  161|      0|      return true;
  162|      0|    }
  163|      0|  }
  164|       |
  165|       |  // Slow path.
  166|       |  // There might be comments, newlines, UTF-8 identifiers, etc.
  167|       |  // If there's a next token and it's an identifier, '[', '{', then this is a
  168|       |  // declaration. Otherwise, it's not.
  169|       |  // Pass RequireNoNewLine=false because
  170|       |  //   let
  171|       |  //   x = 3;
  172|       |  // is supposed to parse as a let declaration of x, no ASI here.
  173|       |  // https://262.ecma-international.org/14.0/#prod-LexicalBinding
  174|    100|  OptValue<TokenKind> nextTokenKind =
  175|    100|      lookahead1</* RequireNoNewLine=*/false>(llvh::None);
  176|    100|  return nextTokenKind.hasValue() &&
  ------------------
  |  Branch (176:10): [True: 100, False: 0]
  ------------------
  177|    100|      (*nextTokenKind == TokenKind::identifier ||
  ------------------
  |  Branch (177:8): [True: 100, False: 0]
  ------------------
  178|    100|       *nextTokenKind == TokenKind::l_brace ||
  ------------------
  |  Branch (178:8): [True: 0, False: 0]
  ------------------
  179|    100|       *nextTokenKind == TokenKind::l_square);
  ------------------
  |  Branch (179:8): [True: 0, False: 0]
  ------------------
  180|    100|}
_ZN6hermes6parser7JSLexer7advanceENS1_14GrammarContextE:
  182|  17.9M|const Token *JSLexer::advance(GrammarContext grammarContext) {
  183|  17.9M|  newLineBeforeCurrentToken_ = false;
  184|       |
  185|  19.1M|  for (;;) {
  186|  19.1M|    assert(curCharPtr_ <= bufferEnd_ && "lexing past end of input");
  187|  19.1M|#define PUNC_L1_1(ch, tok)        \
  188|  19.1M|  case ch:                        \
  189|  19.1M|    token_.setStart(curCharPtr_); \
  190|  19.1M|    token_.setPunctuator(tok);    \
  191|  19.1M|    ++curCharPtr_;                \
  192|  19.1M|    break
  193|       |
  194|  19.1M|#define PUNC_L2_3(ch1, tok1, ch2a, tok2a, ch2b, tok2b) \
  195|  19.1M|  case ch1:                                            \
  196|  19.1M|    token_.setStart(curCharPtr_);                      \
  197|  19.1M|    if (curCharPtr_[1] == ch2a) {                      \
  198|  19.1M|      token_.setPunctuator(tok2a);                     \
  199|  19.1M|      curCharPtr_ += 2;                                \
  200|  19.1M|    } else if (curCharPtr_[1] == ch2b) {               \
  201|  19.1M|      token_.setPunctuator(tok2b);                     \
  202|  19.1M|      curCharPtr_ += 2;                                \
  203|  19.1M|    } else {                                           \
  204|  19.1M|      token_.setPunctuator(tok1);                      \
  205|  19.1M|      curCharPtr_ += 1;                                \
  206|  19.1M|    }                                                  \
  207|  19.1M|    break
  208|       |
  209|  19.1M|#define PUNC_L2_2(ch1, tok1, ch2, tok2) \
  210|  19.1M|  case ch1:                             \
  211|  19.1M|    token_.setStart(curCharPtr_);       \
  212|  19.1M|    if (curCharPtr_[1] == (ch2)) {      \
  213|  19.1M|      token_.setPunctuator(tok2);       \
  214|  19.1M|      curCharPtr_ += 2;                 \
  215|  19.1M|    } else {                            \
  216|  19.1M|      token_.setPunctuator(tok1);       \
  217|  19.1M|      curCharPtr_ += 1;                 \
  218|  19.1M|    }                                   \
  219|  19.1M|    break
  220|       |
  221|  19.1M|#define PUNC_L3_3(ch1, tok1, ch2, tok2, ch3, tok3) \
  222|  19.1M|  case ch1:                                        \
  223|  19.1M|    token_.setStart(curCharPtr_);                  \
  224|  19.1M|    if (curCharPtr_[1] != (ch2)) {                 \
  225|  19.1M|      token_.setPunctuator(tok1);                  \
  226|  19.1M|      curCharPtr_ += 1;                            \
  227|  19.1M|    } else if (curCharPtr_[2] == (ch3)) {          \
  228|  19.1M|      token_.setPunctuator(tok3);                  \
  229|  19.1M|      curCharPtr_ += 3;                            \
  230|  19.1M|    } else {                                       \
  231|  19.1M|      token_.setPunctuator(tok2);                  \
  232|  19.1M|      curCharPtr_ += 2;                            \
  233|  19.1M|    }                                              \
  234|  19.1M|    break
  235|       |
  236|  19.1M|    switch ((unsigned char)*curCharPtr_) {
  237|    597|      case 0:
  ------------------
  |  Branch (237:7): [True: 597, False: 19.1M]
  ------------------
  238|    597|        token_.setStart(curCharPtr_);
  239|    597|        if (curCharPtr_ == bufferEnd_) {
  ------------------
  |  Branch (239:13): [True: 595, False: 2]
  ------------------
  240|    595|          token_.setEof();
  241|    595|        } else {
  242|      2|          if (!error(
  ------------------
  |  Branch (242:15): [True: 2, False: 0]
  ------------------
  243|      2|                  token_.getStartLoc(),
  244|      2|                  "unrecognized Unicode character \\u0000")) {
  245|      2|            token_.setEof();
  246|      2|          } else {
  247|      0|            ++curCharPtr_;
  248|      0|            continue;
  249|      0|          }
  250|      2|        }
  251|    597|        break;
  252|       |
  253|       |        // clang-format off
  254|   708k|      PUNC_L1_1('}', TokenKind::r_brace);
  ------------------
  |  |  188|   708k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 708k, False: 18.4M]
  |  |  ------------------
  |  |  189|   708k|    token_.setStart(curCharPtr_); \
  |  |  190|   708k|    token_.setPunctuator(tok);    \
  |  |  191|   708k|    ++curCharPtr_;                \
  |  |  192|   708k|    break
  ------------------
  255|  10.2k|      PUNC_L1_1('(', TokenKind::l_paren);
  ------------------
  |  |  188|  10.2k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 10.2k, False: 19.1M]
  |  |  ------------------
  |  |  189|  10.2k|    token_.setStart(curCharPtr_); \
  |  |  190|  10.2k|    token_.setPunctuator(tok);    \
  |  |  191|  10.2k|    ++curCharPtr_;                \
  |  |  192|  10.2k|    break
  ------------------
  256|  8.18k|      PUNC_L1_1(')', TokenKind::r_paren);
  ------------------
  |  |  188|  8.18k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 8.18k, False: 19.1M]
  |  |  ------------------
  |  |  189|  8.18k|    token_.setStart(curCharPtr_); \
  |  |  190|  8.18k|    token_.setPunctuator(tok);    \
  |  |  191|  8.18k|    ++curCharPtr_;                \
  |  |  192|  8.18k|    break
  ------------------
  257|  47.2k|      PUNC_L1_1('[', TokenKind::l_square);
  ------------------
  |  |  188|  47.2k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 47.2k, False: 19.1M]
  |  |  ------------------
  |  |  189|  47.2k|    token_.setStart(curCharPtr_); \
  |  |  190|  47.2k|    token_.setPunctuator(tok);    \
  |  |  191|  47.2k|    ++curCharPtr_;                \
  |  |  192|  47.2k|    break
  ------------------
  258|  45.1k|      PUNC_L1_1(']', TokenKind::r_square);
  ------------------
  |  |  188|  45.1k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 45.1k, False: 19.1M]
  |  |  ------------------
  |  |  189|  45.1k|    token_.setStart(curCharPtr_); \
  |  |  190|  45.1k|    token_.setPunctuator(tok);    \
  |  |  191|  45.1k|    ++curCharPtr_;                \
  |  |  192|  45.1k|    break
  ------------------
  259|   522k|      PUNC_L1_1(';', TokenKind::semi);
  ------------------
  |  |  188|   522k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 522k, False: 18.6M]
  |  |  ------------------
  |  |  189|   522k|    token_.setStart(curCharPtr_); \
  |  |  190|   522k|    token_.setPunctuator(tok);    \
  |  |  191|   522k|    ++curCharPtr_;                \
  |  |  192|   522k|    break
  ------------------
  260|  4.42M|      PUNC_L1_1(',', TokenKind::comma);
  ------------------
  |  |  188|  4.42M|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 4.42M, False: 14.7M]
  |  |  ------------------
  |  |  189|  4.42M|    token_.setStart(curCharPtr_); \
  |  |  190|  4.42M|    token_.setPunctuator(tok);    \
  |  |  191|  4.42M|    ++curCharPtr_;                \
  |  |  192|  4.42M|    break
  ------------------
  261|  7.09k|      PUNC_L1_1('~', TokenKind::tilde);
  ------------------
  |  |  188|  7.09k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 7.09k, False: 19.1M]
  |  |  ------------------
  |  |  189|  7.09k|    token_.setStart(curCharPtr_); \
  |  |  190|  7.09k|    token_.setPunctuator(tok);    \
  |  |  191|  7.09k|    ++curCharPtr_;                \
  |  |  192|  7.09k|    break
  ------------------
  262|   499k|      PUNC_L1_1(':', TokenKind::colon);
  ------------------
  |  |  188|   499k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (188:3): [True: 499k, False: 18.6M]
  |  |  ------------------
  |  |  189|   499k|    token_.setStart(curCharPtr_); \
  |  |  190|   499k|    token_.setPunctuator(tok);    \
  |  |  191|   499k|    ++curCharPtr_;                \
  |  |  192|   499k|    break
  ------------------
  263|       |
  264|       |      // { {|
  265|  5.61k|      case '{':
  ------------------
  |  Branch (265:7): [True: 5.61k, False: 19.1M]
  ------------------
  266|  5.61k|        token_.setStart(curCharPtr_);
  267|  5.61k|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  11.2k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  268|  5.61k|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type) &&
  ------------------
  |  |  189|  11.2k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.61k]
  |  |  ------------------
  ------------------
  269|  5.61k|            curCharPtr_[1] == '|') {
  ------------------
  |  Branch (269:13): [True: 0, False: 0]
  ------------------
  270|      0|          token_.setPunctuator(TokenKind::l_bracepipe);
  271|      0|          curCharPtr_ += 2;
  272|  5.61k|        } else {
  273|  5.61k|          token_.setPunctuator(TokenKind::l_brace);
  274|  5.61k|          curCharPtr_ += 1;
  275|  5.61k|        }
  276|  5.61k|        break;
  277|       |
  278|       |      // = => == ===
  279|   215k|      case '=':
  ------------------
  |  Branch (279:7): [True: 215k, False: 18.9M]
  ------------------
  280|   215k|        token_.setStart(curCharPtr_);
  281|   215k|        if (curCharPtr_[1] == '>') {
  ------------------
  |  Branch (281:13): [True: 206k, False: 9.16k]
  ------------------
  282|   206k|          token_.setPunctuator(TokenKind::equalgreater);
  283|   206k|          curCharPtr_ += 2;
  284|   206k|        } else if (curCharPtr_[1] != '=') {
  ------------------
  |  Branch (284:20): [True: 9.14k, False: 14]
  ------------------
  285|  9.14k|          token_.setPunctuator(TokenKind::equal);
  286|  9.14k|          curCharPtr_ += 1;
  287|  9.14k|        } else if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (287:20): [True: 0, False: 14]
  ------------------
  288|      0|          token_.setPunctuator(TokenKind::equalequalequal);
  289|      0|          curCharPtr_ += 3;
  290|     14|        } else {
  291|     14|          token_.setPunctuator(TokenKind::equalequal);
  292|     14|          curCharPtr_ += 2;
  293|     14|        }
  294|   215k|        break;
  295|       |
  296|       |      // ! != !==
  297|    597|      PUNC_L3_3('!', TokenKind::exclaim, '=', TokenKind::exclaimequal, '=', TokenKind::exclaimequalequal);
  ------------------
  |  |  222|     49|  case ch1:                                        \
  |  |  ------------------
  |  |  |  Branch (222:3): [True: 49, False: 19.1M]
  |  |  ------------------
  |  |  223|     49|    token_.setStart(curCharPtr_);                  \
  |  |  224|     49|    if (curCharPtr_[1] != (ch2)) {                 \
  |  |  ------------------
  |  |  |  Branch (224:9): [True: 49, False: 0]
  |  |  ------------------
  |  |  225|     49|      token_.setPunctuator(tok1);                  \
  |  |  226|     49|      curCharPtr_ += 1;                            \
  |  |  227|     49|    } else if (curCharPtr_[2] == (ch3)) {          \
  |  |  ------------------
  |  |  |  Branch (227:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  228|      0|      token_.setPunctuator(tok3);                  \
  |  |  229|      0|      curCharPtr_ += 3;                            \
  |  |  230|      0|    } else {                                       \
  |  |  231|      0|      token_.setPunctuator(tok2);                  \
  |  |  232|      0|      curCharPtr_ += 2;                            \
  |  |  233|      0|    }                                              \
  |  |  234|     49|    break
  ------------------
  298|       |
  299|       |      // + ++ +=
  300|       |      // - -- -=
  301|       |      // & && &=
  302|       |      // | || |=
  303|  1.89M|      PUNC_L2_3('+', TokenKind::plus,  '+', TokenKind::plusplus,   '=', TokenKind::plusequal);
  ------------------
  |  |  195|  1.89M|  case ch1:                                            \
  |  |  ------------------
  |  |  |  Branch (195:3): [True: 1.89M, False: 17.2M]
  |  |  ------------------
  |  |  196|  1.89M|    token_.setStart(curCharPtr_);                      \
  |  |  197|  1.89M|    if (curCharPtr_[1] == ch2a) {                      \
  |  |  ------------------
  |  |  |  Branch (197:9): [True: 2, False: 1.89M]
  |  |  ------------------
  |  |  198|      2|      token_.setPunctuator(tok2a);                     \
  |  |  199|      2|      curCharPtr_ += 2;                                \
  |  |  200|  1.89M|    } else if (curCharPtr_[1] == ch2b) {               \
  |  |  ------------------
  |  |  |  Branch (200:16): [True: 3, False: 1.89M]
  |  |  ------------------
  |  |  201|      3|      token_.setPunctuator(tok2b);                     \
  |  |  202|      3|      curCharPtr_ += 2;                                \
  |  |  203|  1.89M|    } else {                                           \
  |  |  204|  1.89M|      token_.setPunctuator(tok1);                      \
  |  |  205|  1.89M|      curCharPtr_ += 1;                                \
  |  |  206|  1.89M|    }                                                  \
  |  |  207|  1.89M|    break
  ------------------
  304|  45.1k|      PUNC_L2_3('-', TokenKind::minus, '-', TokenKind::minusminus, '=', TokenKind::minusequal);
  ------------------
  |  |  195|  45.1k|  case ch1:                                            \
  |  |  ------------------
  |  |  |  Branch (195:3): [True: 45.1k, False: 19.1M]
  |  |  ------------------
  |  |  196|  45.1k|    token_.setStart(curCharPtr_);                      \
  |  |  197|  45.1k|    if (curCharPtr_[1] == ch2a) {                      \
  |  |  ------------------
  |  |  |  Branch (197:9): [True: 0, False: 45.1k]
  |  |  ------------------
  |  |  198|      0|      token_.setPunctuator(tok2a);                     \
  |  |  199|      0|      curCharPtr_ += 2;                                \
  |  |  200|  45.1k|    } else if (curCharPtr_[1] == ch2b) {               \
  |  |  ------------------
  |  |  |  Branch (200:16): [True: 0, False: 45.1k]
  |  |  ------------------
  |  |  201|      0|      token_.setPunctuator(tok2b);                     \
  |  |  202|      0|      curCharPtr_ += 2;                                \
  |  |  203|  45.1k|    } else {                                           \
  |  |  204|  45.1k|      token_.setPunctuator(tok1);                      \
  |  |  205|  45.1k|      curCharPtr_ += 1;                                \
  |  |  206|  45.1k|    }                                                  \
  |  |  207|  45.1k|    break
  ------------------
  305|       |
  306|  65.3k|      case '&':
  ------------------
  |  Branch (306:7): [True: 65.3k, False: 19.1M]
  ------------------
  307|  65.3k|        token_.setStart(curCharPtr_);
  308|  65.3k|        if (curCharPtr_[1] == '&') {
  ------------------
  |  Branch (308:13): [True: 32.6k, False: 32.6k]
  ------------------
  309|  32.6k|          if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (309:15): [True: 0, False: 32.6k]
  ------------------
  310|      0|            token_.setPunctuator(TokenKind::ampampequal);
  311|      0|            curCharPtr_ += 3;
  312|  32.6k|          } else {
  313|  32.6k|            token_.setPunctuator(TokenKind::ampamp);
  314|  32.6k|            curCharPtr_ += 2;
  315|  32.6k|          }
  316|  32.6k|        } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (316:20): [True: 0, False: 32.6k]
  ------------------
  317|      0|          token_.setPunctuator(TokenKind::ampequal);
  318|      0|          curCharPtr_ += 2;
  319|  32.6k|        } else {
  320|  32.6k|          token_.setPunctuator(TokenKind::amp);
  321|  32.6k|          curCharPtr_ += 1;
  322|  32.6k|        }
  323|  65.3k|        break;
  324|       |
  325|   261k|      case '|':
  ------------------
  |  Branch (325:7): [True: 261k, False: 18.9M]
  ------------------
  326|   261k|        token_.setStart(curCharPtr_);
  327|   261k|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|   523k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  328|   261k|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type) &&
  ------------------
  |  |  189|   523k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 261k]
  |  |  ------------------
  ------------------
  329|   261k|            curCharPtr_[1] == '}') {
  ------------------
  |  Branch (329:13): [True: 0, False: 0]
  ------------------
  330|      0|          token_.setPunctuator(TokenKind::piper_brace);
  331|      0|          curCharPtr_ += 2;
  332|   261k|        } else {
  333|   261k|          if (curCharPtr_[1] == '|') {
  ------------------
  |  Branch (333:15): [True: 38.0k, False: 223k]
  ------------------
  334|  38.0k|            if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (334:17): [True: 4, False: 38.0k]
  ------------------
  335|      4|              token_.setPunctuator(TokenKind::pipepipeequal);
  336|      4|              curCharPtr_ += 3;
  337|  38.0k|            } else {
  338|  38.0k|              token_.setPunctuator(TokenKind::pipepipe);
  339|  38.0k|              curCharPtr_ += 2;
  340|  38.0k|            }
  341|   223k|          } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (341:22): [True: 0, False: 223k]
  ------------------
  342|      0|            token_.setPunctuator(TokenKind::pipeequal);
  343|      0|            curCharPtr_ += 2;
  344|   223k|          } else {
  345|   223k|            token_.setPunctuator(TokenKind::pipe);
  346|   223k|            curCharPtr_ += 1;
  347|   223k|          }
  348|   261k|        }
  349|   261k|        break;
  350|       |
  351|       |      // ? ?? ?.
  352|  9.30k|      case '?':
  ------------------
  |  Branch (352:7): [True: 9.30k, False: 19.1M]
  ------------------
  353|  9.30k|        token_.setStart(curCharPtr_);
  354|  9.30k|        if (curCharPtr_[1] == '.' && !isdigit(curCharPtr_[2])) {
  ------------------
  |  Branch (354:13): [True: 1.96k, False: 7.33k]
  |  Branch (354:38): [True: 1.96k, False: 0]
  ------------------
  355|       |          // OptionalChainingPunctuator ::
  356|       |          // ?. [lookahead does not contain DecimalDigit]
  357|       |          // This is done to prevent `x?.3:y` from being recognized
  358|       |          // as `x ?. 3 : y` instead of `x ? .3 : y`.
  359|  1.96k|          token_.setPunctuator(TokenKind::questiondot);
  360|  1.96k|          curCharPtr_ += 2;
  361|  7.33k|        } else if (
  362|  7.33k|            curCharPtr_[1] == '?' &&
  ------------------
  |  Branch (362:13): [True: 0, False: 7.33k]
  ------------------
  363|  7.33k|            LLVM_LIKELY(grammarContext != GrammarContext::Type)) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  364|      0|          if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (364:15): [True: 0, False: 0]
  ------------------
  365|      0|            token_.setPunctuator(TokenKind::questionquestionequal);
  366|      0|            curCharPtr_ += 3;
  367|      0|          } else {
  368|      0|            token_.setPunctuator(TokenKind::questionquestion);
  369|      0|            curCharPtr_ += 2;
  370|      0|          }
  371|  7.33k|        } else {
  372|  7.33k|          token_.setPunctuator(TokenKind::question);
  373|  7.33k|          curCharPtr_ += 1;
  374|  7.33k|        }
  375|  9.30k|        break;
  376|       |
  377|       |      // * *= ** **=
  378|  3.35k|      case '*':
  ------------------
  |  Branch (378:7): [True: 3.35k, False: 19.1M]
  ------------------
  379|  3.35k|        token_.setStart(curCharPtr_);
  380|  3.35k|        if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (380:13): [True: 0, False: 3.35k]
  ------------------
  381|      0|          token_.setPunctuator(TokenKind::starequal);
  382|      0|          curCharPtr_ += 2;
  383|  3.35k|        } else if (curCharPtr_[1] != '*') {
  ------------------
  |  Branch (383:20): [True: 3.35k, False: 1]
  ------------------
  384|  3.35k|          token_.setPunctuator(TokenKind::star);
  385|  3.35k|          curCharPtr_ += 1;
  386|  3.35k|        } else if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (386:20): [True: 0, False: 1]
  ------------------
  387|      0|          token_.setPunctuator(TokenKind::starstarequal);
  388|      0|          curCharPtr_ += 3;
  389|      1|        } else {
  390|      1|          token_.setPunctuator(TokenKind::starstar);
  391|      1|          curCharPtr_ += 2;
  392|      1|        }
  393|  3.35k|        break;
  394|       |
  395|       |        // * *=
  396|       |        // ^ ^=
  397|       |        // / /=
  398|    597|        PUNC_L2_2('^', TokenKind::caret, '=', TokenKind::caretequal);
  ------------------
  |  |  210|    121|  case ch1:                             \
  |  |  ------------------
  |  |  |  Branch (210:3): [True: 121, False: 19.1M]
  |  |  ------------------
  |  |  211|    121|    token_.setStart(curCharPtr_);       \
  |  |  212|    121|    if (curCharPtr_[1] == (ch2)) {      \
  |  |  ------------------
  |  |  |  Branch (212:9): [True: 120, False: 1]
  |  |  ------------------
  |  |  213|    120|      token_.setPunctuator(tok2);       \
  |  |  214|    120|      curCharPtr_ += 2;                 \
  |  |  215|    120|    } else {                            \
  |  |  216|      1|      token_.setPunctuator(tok1);       \
  |  |  217|      1|      curCharPtr_ += 1;                 \
  |  |  218|      1|    }                                   \
  |  |  219|    121|    break
  ------------------
  399|       |
  400|       |      // % %=
  401|  56.1k|      case '%':
  ------------------
  |  Branch (401:7): [True: 56.1k, False: 19.1M]
  ------------------
  402|  56.1k|        token_.setStart(curCharPtr_);
  403|  56.1k|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|   112k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  404|  56.1k|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type) &&
  ------------------
  |  |  189|   112k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 56.1k]
  |  |  ------------------
  ------------------
  405|  56.1k|            curCharPtr_ + 7 <= bufferEnd_ &&
  ------------------
  |  Branch (405:13): [True: 0, False: 0]
  ------------------
  406|  56.1k|            llvh::StringRef(curCharPtr_, 7) == "%checks") {
  ------------------
  |  Branch (406:13): [True: 0, False: 0]
  ------------------
  407|      0|          token_.setIdentifier(getStringLiteral("%checks"));
  408|      0|          curCharPtr_ += 7;
  409|  56.1k|        } else if (curCharPtr_[1] == ('=')) {
  ------------------
  |  Branch (409:20): [True: 0, False: 56.1k]
  ------------------
  410|      0|          token_.setPunctuator(TokenKind::percentequal);
  411|      0|          curCharPtr_ += 2;
  412|  56.1k|        } else {
  413|  56.1k|          token_.setPunctuator(TokenKind::percent);
  414|  56.1k|          curCharPtr_ += 1;
  415|  56.1k|        }
  416|  56.1k|        break;
  417|       |
  418|       |        // clang-format on
  419|       |
  420|    203|      case '\r':
  ------------------
  |  Branch (420:7): [True: 203, False: 19.1M]
  ------------------
  421|  1.19M|      case '\n':
  ------------------
  |  Branch (421:7): [True: 1.19M, False: 17.9M]
  ------------------
  422|  1.19M|        ++curCharPtr_;
  423|  1.19M|        newLineBeforeCurrentToken_ = true;
  424|  1.19M|        continue;
  425|       |
  426|       |      // Line separator \u2028 UTF8 encoded is      : e2 80 a8
  427|       |      // Paragraph separator \u2029 UTF8 encoded is : e2 80 a9
  428|     82|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (428:7): [True: 82, False: 19.1M]
  ------------------
  429|     82|        if (matchUnicodeLineTerminatorOffset1(curCharPtr_)) {
  ------------------
  |  Branch (429:13): [True: 1, False: 81]
  ------------------
  430|      1|          curCharPtr_ += 3;
  431|      1|          newLineBeforeCurrentToken_ = true;
  432|      1|          continue;
  433|     81|        } else {
  434|     81|          goto default_label;
  435|     81|        }
  436|       |
  437|     69|      case '\v':
  ------------------
  |  Branch (437:7): [True: 69, False: 19.1M]
  ------------------
  438|    171|      case '\f':
  ------------------
  |  Branch (438:7): [True: 102, False: 19.1M]
  ------------------
  439|    171|        ++curCharPtr_;
  440|    171|        continue;
  441|       |
  442|     21|      case '\t':
  ------------------
  |  Branch (442:7): [True: 21, False: 19.1M]
  ------------------
  443|  17.3k|      case ' ':
  ------------------
  |  Branch (443:7): [True: 17.3k, False: 19.1M]
  ------------------
  444|       |        // Spaces frequently come in groups, so use a tight inner loop to skip.
  445|  17.3k|        do
  446|  50.6k|          ++curCharPtr_;
  447|  50.6k|        while (*curCharPtr_ == '\t' || *curCharPtr_ == ' ');
  ------------------
  |  Branch (447:16): [True: 125, False: 50.5k]
  |  Branch (447:40): [True: 33.1k, False: 17.3k]
  ------------------
  448|  17.3k|        continue;
  449|       |
  450|       |      // No-break space \u00A0 is UTF8 encoded as: c2 a0
  451|    129|      case 0xc2:
  ------------------
  |  Branch (451:7): [True: 129, False: 19.1M]
  ------------------
  452|    129|        if ((unsigned char)curCharPtr_[1] == 0xa0) {
  ------------------
  |  Branch (452:13): [True: 129, False: 0]
  ------------------
  453|    129|          curCharPtr_ += 2;
  454|    129|          continue;
  455|    129|        } else {
  456|      0|          goto default_label;
  457|      0|        }
  458|       |
  459|       |      // Byte-order mark \uFEFF is encoded as: ef bb bf
  460|      1|      case 0xef:
  ------------------
  |  Branch (460:7): [True: 1, False: 19.1M]
  ------------------
  461|      1|        if ((unsigned char)curCharPtr_[1] == 0xbb &&
  ------------------
  |  Branch (461:13): [True: 0, False: 1]
  ------------------
  462|      1|            (unsigned char)curCharPtr_[2] == 0xbf) {
  ------------------
  |  Branch (462:13): [True: 0, False: 0]
  ------------------
  463|      0|          curCharPtr_ += 3;
  464|      0|          continue;
  465|      1|        } else {
  466|      1|          goto default_label;
  467|      1|        }
  468|       |
  469|  6.69k|      case '/':
  ------------------
  |  Branch (469:7): [True: 6.69k, False: 19.1M]
  ------------------
  470|  6.69k|        if (curCharPtr_[1] == '/') { // Line comment?
  ------------------
  |  Branch (470:13): [True: 6, False: 6.68k]
  ------------------
  471|      6|          scanLineComment(curCharPtr_);
  472|      6|          continue;
  473|  6.68k|        } else if (curCharPtr_[1] == '*') { // Block comment?
  ------------------
  |  Branch (473:20): [True: 0, False: 6.68k]
  ------------------
  474|      0|          curCharPtr_ = skipBlockComment(curCharPtr_);
  475|      0|          continue;
  476|  6.68k|        } else {
  477|  6.68k|          token_.setStart(curCharPtr_);
  478|  6.68k|          if (grammarContext == AllowRegExp) {
  ------------------
  |  Branch (478:15): [True: 240, False: 6.44k]
  ------------------
  479|    240|            scanRegExp();
  480|  6.44k|          } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (480:22): [True: 0, False: 6.44k]
  ------------------
  481|      0|            token_.setPunctuator(TokenKind::slashequal);
  482|      0|            curCharPtr_ += 2;
  483|  6.44k|          } else {
  484|  6.44k|            token_.setPunctuator(TokenKind::slash);
  485|  6.44k|            curCharPtr_ += 1;
  486|  6.44k|          }
  487|  6.68k|        }
  488|  6.68k|        break;
  489|       |
  490|  6.68k|      case '#':
  ------------------
  |  Branch (490:7): [True: 0, False: 19.1M]
  ------------------
  491|      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]
  |  |  ------------------
  ------------------
  492|      0|                curCharPtr_ == bufferStart_ && curCharPtr_[1] == '!')) {
  493|       |          // #! (hashbang) at the very start of the buffer.
  494|      0|          scanLineComment(curCharPtr_);
  495|      0|          continue;
  496|      0|        }
  497|      0|        token_.setStart(curCharPtr_);
  498|      0|        if (!scanPrivateIdentifier()) {
  ------------------
  |  Branch (498:13): [True: 0, False: 0]
  ------------------
  499|      0|          continue;
  500|      0|        }
  501|      0|        break;
  502|       |
  503|       |      // <  <= << <<=
  504|     18|      case '<':
  ------------------
  |  Branch (504:7): [True: 18, False: 19.1M]
  ------------------
  505|     18|        token_.setStart(curCharPtr_);
  506|     18|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|     36|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  507|     18|            LLVM_UNLIKELY(grammarContext == JSLexer::GrammarContext::Type)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  508|      0|          token_.setPunctuator(TokenKind::less);
  509|      0|          curCharPtr_ += 1;
  510|     18|        } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (510:20): [True: 0, False: 18]
  ------------------
  511|      0|          token_.setPunctuator(TokenKind::lessequal);
  512|      0|          curCharPtr_ += 2;
  513|     18|        } else if (curCharPtr_[1] == '<') {
  ------------------
  |  Branch (513:20): [True: 3, False: 15]
  ------------------
  514|      3|          if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (514:15): [True: 0, False: 3]
  ------------------
  515|      0|            token_.setPunctuator(TokenKind::lesslessequal);
  516|      0|            curCharPtr_ += 3;
  517|      3|          } else {
  518|      3|            token_.setPunctuator(TokenKind::lessless);
  519|      3|            curCharPtr_ += 2;
  520|      3|          }
  521|     15|        } else {
  522|     15|          token_.setPunctuator(TokenKind::less);
  523|     15|          curCharPtr_ += 1;
  524|     15|        }
  525|     18|        break;
  526|       |
  527|       |      // > >= >> >>> >>= >>>=
  528|  2.44k|      case '>':
  ------------------
  |  Branch (528:7): [True: 2.44k, False: 19.1M]
  ------------------
  529|  2.44k|        token_.setStart(curCharPtr_);
  530|  2.44k|        if ((HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  4.88k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  531|  2.44k|             LLVM_UNLIKELY(grammarContext == JSLexer::GrammarContext::Type)) ||
  ------------------
  |  |  189|  2.44k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.44k]
  |  |  ------------------
  ------------------
  532|  2.44k|            (HERMES_PARSE_JSX &&
  ------------------
  |  |   15|  4.88k|#define HERMES_PARSE_JSX 1
  |  |  ------------------
  |  |  |  Branch (15:26): [Folded - Ignored]
  |  |  ------------------
  ------------------
  533|  2.44k|             LLVM_UNLIKELY(
  ------------------
  |  |  189|  2.44k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.44k]
  |  |  ------------------
  ------------------
  534|  2.44k|                 grammarContext ==
  535|  2.44k|                 JSLexer::GrammarContext::AllowJSXIdentifier))) {
  536|      0|          token_.setPunctuator(TokenKind::greater);
  537|      0|          curCharPtr_ += 1;
  538|  2.44k|        } else if (curCharPtr_[1] == '=') { // >=
  ------------------
  |  Branch (538:20): [True: 0, False: 2.44k]
  ------------------
  539|      0|          token_.setPunctuator(TokenKind::greaterequal);
  540|      0|          curCharPtr_ += 2;
  541|  2.44k|        } else if (curCharPtr_[1] == '>') { // >>
  ------------------
  |  Branch (541:20): [True: 12, False: 2.43k]
  ------------------
  542|     12|          if (curCharPtr_[2] == '=') { // >>=
  ------------------
  |  Branch (542:15): [True: 0, False: 12]
  ------------------
  543|      0|            token_.setPunctuator(TokenKind::greatergreaterequal);
  544|      0|            curCharPtr_ += 3;
  545|     12|          } else if (curCharPtr_[2] == '>') { // >>>
  ------------------
  |  Branch (545:22): [True: 0, False: 12]
  ------------------
  546|      0|            if (curCharPtr_[3] == '=') { // >>>=
  ------------------
  |  Branch (546:17): [True: 0, False: 0]
  ------------------
  547|      0|              token_.setPunctuator(TokenKind::greatergreatergreaterequal);
  548|      0|              curCharPtr_ += 4;
  549|      0|            } else {
  550|      0|              token_.setPunctuator(TokenKind::greatergreatergreater);
  551|      0|              curCharPtr_ += 3;
  552|      0|            }
  553|     12|          } else {
  554|     12|            token_.setPunctuator(TokenKind::greatergreater);
  555|     12|            curCharPtr_ += 2;
  556|     12|          }
  557|  2.43k|        } else {
  558|  2.43k|          token_.setPunctuator(TokenKind::greater);
  559|  2.43k|          curCharPtr_ += 1;
  560|  2.43k|        }
  561|  2.44k|        break;
  562|       |
  563|  85.0k|      case '.':
  ------------------
  |  Branch (563:7): [True: 85.0k, False: 19.0M]
  ------------------
  564|  85.0k|        token_.setStart(curCharPtr_);
  565|  85.0k|        if (curCharPtr_[1] >= '0' && curCharPtr_[1] <= '9') {
  ------------------
  |  Branch (565:13): [True: 85.0k, False: 24]
  |  Branch (565:38): [True: 0, False: 85.0k]
  ------------------
  566|      0|          scanNumber(grammarContext);
  567|  85.0k|        } else if (curCharPtr_[1] == '.' && curCharPtr_[2] == '.') {
  ------------------
  |  Branch (567:20): [True: 0, False: 85.0k]
  |  Branch (567:45): [True: 0, False: 0]
  ------------------
  568|      0|          token_.setPunctuator(TokenKind::dotdotdot);
  569|      0|          curCharPtr_ += 3;
  570|  85.0k|        } else {
  571|  85.0k|          token_.setPunctuator(TokenKind::period);
  572|  85.0k|          ++curCharPtr_;
  573|  85.0k|        }
  574|  85.0k|        break;
  575|       |
  576|       |        // clang-format off
  577|  3.73M|      case '0': case '1': case '2': case '3': case '4':
  ------------------
  |  Branch (577:7): [True: 3.19M, False: 15.9M]
  |  Branch (577:17): [True: 316k, False: 18.8M]
  |  Branch (577:27): [True: 90.1k, False: 19.0M]
  |  Branch (577:37): [True: 123k, False: 19.0M]
  |  Branch (577:47): [True: 8.40k, False: 19.1M]
  ------------------
  578|  5.13M|      case '5': case '6': case '7': case '8': case '9':
  ------------------
  |  Branch (578:7): [True: 720k, False: 18.4M]
  |  Branch (578:17): [True: 385k, False: 18.7M]
  |  Branch (578:27): [True: 38.1k, False: 19.1M]
  |  Branch (578:37): [True: 27.8k, False: 19.1M]
  |  Branch (578:47): [True: 229k, False: 18.9M]
  ------------------
  579|       |        // clang-format on
  580|  5.13M|        token_.setStart(curCharPtr_);
  581|  5.13M|        scanNumber(grammarContext);
  582|  5.13M|        break;
  583|       |
  584|       |        // clang-format off
  585|  35.5k|      case '_': case '$':
  ------------------
  |  Branch (585:7): [True: 0, False: 19.1M]
  |  Branch (585:17): [True: 35.5k, False: 19.1M]
  ------------------
  586|  1.15M|      case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
  ------------------
  |  Branch (586:7): [True: 490k, False: 18.6M]
  |  Branch (586:17): [True: 522k, False: 18.6M]
  |  Branch (586:27): [True: 3.17k, False: 19.1M]
  |  Branch (586:37): [True: 533, False: 19.1M]
  |  Branch (586:47): [True: 95.6k, False: 19.0M]
  |  Branch (586:57): [True: 6.01k, False: 19.1M]
  |  Branch (586:67): [True: 1.16k, False: 19.1M]
  ------------------
  587|  1.55M|      case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
  ------------------
  |  Branch (587:7): [True: 145, False: 19.1M]
  |  Branch (587:17): [True: 84.2k, False: 19.0M]
  |  Branch (587:27): [True: 629, False: 19.1M]
  |  Branch (587:37): [True: 2.39k, False: 19.1M]
  |  Branch (587:47): [True: 849, False: 19.1M]
  |  Branch (587:57): [True: 1.48k, False: 19.1M]
  |  Branch (587:67): [True: 311k, False: 18.8M]
  ------------------
  588|  1.62M|      case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
  ------------------
  |  Branch (588:7): [True: 403, False: 19.1M]
  |  Branch (588:17): [True: 637, False: 19.1M]
  |  Branch (588:27): [True: 7.32k, False: 19.1M]
  |  Branch (588:37): [True: 59.4k, False: 19.1M]
  |  Branch (588:47): [True: 380, False: 19.1M]
  |  Branch (588:57): [True: 87, False: 19.1M]
  |  Branch (588:67): [True: 422, False: 19.1M]
  ------------------
  589|  1.63M|      case 'v': case 'w': case 'x': case 'y': case 'z':
  ------------------
  |  Branch (589:7): [True: 4.52k, False: 19.1M]
  |  Branch (589:17): [True: 834, False: 19.1M]
  |  Branch (589:27): [True: 47, False: 19.1M]
  |  Branch (589:37): [True: 8, False: 19.1M]
  |  Branch (589:47): [True: 205, False: 19.1M]
  ------------------
  590|  3.26M|      case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
  ------------------
  |  Branch (590:7): [True: 1.51M, False: 17.6M]
  |  Branch (590:17): [True: 4.01k, False: 19.1M]
  |  Branch (590:27): [True: 115k, False: 19.0M]
  |  Branch (590:37): [True: 1.65k, False: 19.1M]
  |  Branch (590:47): [True: 1.42k, False: 19.1M]
  |  Branch (590:57): [True: 603, False: 19.1M]
  |  Branch (590:67): [True: 88, False: 19.1M]
  ------------------
  591|  3.47M|      case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
  ------------------
  |  Branch (591:7): [True: 1.66k, False: 19.1M]
  |  Branch (591:17): [True: 7.79k, False: 19.1M]
  |  Branch (591:27): [True: 277, False: 19.1M]
  |  Branch (591:37): [True: 611, False: 19.1M]
  |  Branch (591:47): [True: 198k, False: 18.9M]
  |  Branch (591:57): [True: 1.22k, False: 19.1M]
  |  Branch (591:67): [True: 1.17k, False: 19.1M]
  ------------------
  592|  3.48M|      case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
  ------------------
  |  Branch (592:7): [True: 344, False: 19.1M]
  |  Branch (592:17): [True: 162, False: 19.1M]
  |  Branch (592:27): [True: 0, False: 19.1M]
  |  Branch (592:37): [True: 649, False: 19.1M]
  |  Branch (592:47): [True: 646, False: 19.1M]
  |  Branch (592:57): [True: 251, False: 19.1M]
  |  Branch (592:67): [True: 1.06k, False: 19.1M]
  ------------------
  593|  3.49M|      case 'V': case 'W': case 'X': case 'Y': case 'Z':
  ------------------
  |  Branch (593:7): [True: 12, False: 19.1M]
  |  Branch (593:17): [True: 329, False: 19.1M]
  |  Branch (593:27): [True: 11.3k, False: 19.1M]
  |  Branch (593:37): [True: 5.47k, False: 19.1M]
  |  Branch (593:47): [True: 0, False: 19.1M]
  ------------------
  594|       |        // clang-format on
  595|  3.49M|        token_.setStart(curCharPtr_);
  596|  3.49M|        scanIdentifierFastPathInContext(curCharPtr_, grammarContext);
  597|  3.49M|        break;
  598|       |
  599|      0|      case '@':
  ------------------
  |  Branch (599:7): [True: 0, False: 19.1M]
  ------------------
  600|      0|        token_.setStart(curCharPtr_);
  601|      0|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|      0|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  602|      0|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  603|      0|          scanIdentifierFastPathInContext(curCharPtr_, grammarContext);
  604|      0|        } else {
  605|      0|          curCharPtr_ += 1;
  606|      0|          errorRange(token_.getStartLoc(), "unrecognized character '@'");
  607|      0|          continue;
  608|      0|        }
  609|      0|        break;
  610|       |
  611|      0|      case '\\': {
  ------------------
  |  Branch (611:7): [True: 0, False: 19.1M]
  ------------------
  612|      0|        token_.setStart(curCharPtr_);
  613|      0|        tmpStorage_.clear();
  614|      0|        uint32_t cp = consumeUnicodeEscape();
  615|      0|        if (!isUnicodeIDStart(cp)) {
  ------------------
  |  Branch (615:13): [True: 0, False: 0]
  ------------------
  616|      0|          errorRange(
  617|      0|              token_.getStartLoc(),
  618|      0|              "Unicode escape \\u" + Twine::utohexstr(cp) +
  619|      0|                  " is not a valid identifier start");
  620|      0|          continue;
  621|      0|        } else {
  622|      0|          appendUnicodeToStorage(cp);
  623|      0|        }
  624|      0|        scanIdentifierPartsInContext(grammarContext);
  625|      0|        break;
  626|      0|      }
  627|       |
  628|     12|      case '\'':
  ------------------
  |  Branch (628:7): [True: 12, False: 19.1M]
  ------------------
  629|     52|      case '"':
  ------------------
  |  Branch (629:7): [True: 40, False: 19.1M]
  ------------------
  630|     52|        token_.setStart(curCharPtr_);
  631|     52|        scanStringInContext(grammarContext);
  632|     52|        break;
  633|       |
  634|   388k|      case '`':
  ------------------
  |  Branch (634:7): [True: 388k, False: 18.7M]
  ------------------
  635|   388k|        token_.setStart(curCharPtr_);
  636|   388k|        scanTemplateLiteral();
  637|   388k|        break;
  638|       |
  639|     82|      default_label:
  640|    105|      default: {
  ------------------
  |  Branch (640:7): [True: 23, False: 19.1M]
  ------------------
  641|    105|        token_.setStart(curCharPtr_);
  642|    105|        uint32_t ch = decodeUTF8();
  643|       |
  644|    105|        if (isUnicodeOnlyLetter(ch)) {
  ------------------
  |  Branch (644:13): [True: 17, False: 88]
  ------------------
  645|     17|          tmpStorage_.clear();
  646|     17|          appendUnicodeToStorage(ch);
  647|     17|          scanIdentifierPartsInContext(grammarContext);
  648|     88|        } else if (isUnicodeOnlySpace(ch)) {
  ------------------
  |  Branch (648:20): [True: 81, False: 7]
  ------------------
  649|     81|          continue;
  650|     81|        } else {
  651|      7|          if (ch > 31 && ch < 127)
  ------------------
  |  Branch (651:15): [True: 3, False: 4]
  |  Branch (651:26): [True: 0, False: 3]
  ------------------
  652|      0|            errorRange(
  653|      0|                token_.getStartLoc(),
  654|      0|                "unrecognized character '" + Twine((char)ch) + "'");
  655|      7|          else
  656|      7|            errorRange(
  657|      7|                token_.getStartLoc(),
  658|      7|                "unrecognized Unicode character \\u" + Twine::utohexstr(ch));
  659|      7|          continue;
  660|      7|        }
  661|       |
  662|     17|        break;
  663|    105|      }
  664|  19.1M|    }
  665|       |
  666|       |    // Always terminate the loop unless "continue" was used.
  667|  17.9M|    break;
  668|  19.1M|  } // for(;;)
  669|       |
  670|  17.9M|  finishToken(curCharPtr_);
  671|       |
  672|  17.9M|  return &token_;
  673|  17.9M|}
_ZN6hermes6parser7JSLexer24isCurrentTokenADirectiveEv:
  839|     14|bool JSLexer::isCurrentTokenADirective() {
  840|       |  // The current token must be a string literal without escapes.
  841|     14|  if (token_.getKind() != TokenKind::string_literal ||
  ------------------
  |  Branch (841:7): [True: 0, False: 14]
  ------------------
  842|     14|      token_.getStringLiteralContainsEscapes()) {
  ------------------
  |  Branch (842:7): [True: 1, False: 13]
  ------------------
  843|      1|    return false;
  844|      1|  }
  845|       |
  846|     13|  const char *ptr = curCharPtr_;
  847|       |
  848|       |  // A directive is a string literal (the current token, directly behind
  849|       |  // curCharPtr_), followed by a semicolon, new line, or eof that we will now
  850|       |  // try to find. There can also be comments. So, we loop, consuming whitespace
  851|       |  // until we encounter:
  852|       |  // - EOF. Don't consume it and succeed.
  853|       |  // - Semicolon. Don't consume it and succeed.
  854|       |  // - Right brace. Don't consume it and succeed.
  855|       |  // - A new line. Don't consume it and succeed.
  856|       |  // - A line comment. It implies a new line. Don't consume it and succeed.
  857|       |  // - A block comment. Consume it and continue.
  858|       |  // - Anything else. We consume nothing and fail.
  859|       |
  860|     13|  for (;;) {
  861|     13|    assert(ptr <= bufferEnd_ && "lexing past end of input");
  862|       |
  863|     13|    switch (*((const unsigned char *)ptr)) {
  864|      4|      case 0:
  ------------------
  |  Branch (864:7): [True: 4, False: 9]
  ------------------
  865|       |        // EOF?
  866|      4|        if (ptr == bufferEnd_)
  ------------------
  |  Branch (866:13): [True: 4, False: 0]
  ------------------
  867|      4|          return true;
  868|       |        // We encountered a stray 0 character.
  869|      0|        return false;
  870|       |
  871|      0|      case ';':
  ------------------
  |  Branch (871:7): [True: 0, False: 13]
  ------------------
  872|      0|      case '}':
  ------------------
  |  Branch (872:7): [True: 0, False: 13]
  ------------------
  873|      0|        return true;
  874|       |
  875|      0|      case '\r':
  ------------------
  |  Branch (875:7): [True: 0, False: 13]
  ------------------
  876|      0|      case '\n':
  ------------------
  |  Branch (876:7): [True: 0, False: 13]
  ------------------
  877|      0|        return true;
  878|       |
  879|       |      // Line separator \u2028 UTF8 encoded is      : e2 80 a8
  880|       |      // Paragraph separator \u2029 UTF8 encoded is : e2 80 a9
  881|      0|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (881:7): [True: 0, False: 13]
  ------------------
  882|      0|        if (matchUnicodeLineTerminatorOffset1(ptr))
  ------------------
  |  Branch (882:13): [True: 0, False: 0]
  ------------------
  883|      0|          return true;
  884|      0|        return false;
  885|       |
  886|      0|      case '\v':
  ------------------
  |  Branch (886:7): [True: 0, False: 13]
  ------------------
  887|      0|      case '\f':
  ------------------
  |  Branch (887:7): [True: 0, False: 13]
  ------------------
  888|       |        // Skip whitespace.
  889|      0|        ++ptr;
  890|      0|        continue;
  891|       |
  892|      0|      case '\t':
  ------------------
  |  Branch (892:7): [True: 0, False: 13]
  ------------------
  893|      0|      case ' ':
  ------------------
  |  Branch (893:7): [True: 0, False: 13]
  ------------------
  894|       |        // Spaces frequently come in groups, so use a tight inner loop to skip.
  895|      0|        do
  896|      0|          ++ptr;
  897|      0|        while (*ptr == '\t' || *ptr == ' ');
  ------------------
  |  Branch (897:16): [True: 0, False: 0]
  |  Branch (897:32): [True: 0, False: 0]
  ------------------
  898|      0|        continue;
  899|       |
  900|       |      // No-break space \u00A0 is UTF8 encoded as: c2 a0
  901|      0|      case 0xc2:
  ------------------
  |  Branch (901:7): [True: 0, False: 13]
  ------------------
  902|      0|        if ((unsigned char)ptr[1] == 0xa0) {
  ------------------
  |  Branch (902:13): [True: 0, False: 0]
  ------------------
  903|      0|          ptr += 2;
  904|      0|          continue;
  905|      0|        } else {
  906|      0|          goto default_label;
  907|      0|        }
  908|       |
  909|       |      // Byte-order mark \uFEFF is encoded as: ef bb bf
  910|      0|      case 0xef:
  ------------------
  |  Branch (910:7): [True: 0, False: 13]
  ------------------
  911|      0|        if ((unsigned char)ptr[1] == 0xbb && (unsigned char)ptr[2] == 0xbf) {
  ------------------
  |  Branch (911:13): [True: 0, False: 0]
  |  Branch (911:46): [True: 0, False: 0]
  ------------------
  912|      0|          ptr += 3;
  913|      0|          continue;
  914|      0|        } else {
  915|      0|          goto default_label;
  916|      0|        }
  917|       |
  918|      0|      case '/':
  ------------------
  |  Branch (918:7): [True: 0, False: 13]
  ------------------
  919|      0|        if (ptr[1] == '/') { // Line comment?
  ------------------
  |  Branch (919:13): [True: 0, False: 0]
  ------------------
  920|       |          // It implies a new line, so we are good.
  921|      0|          return true;
  922|      0|        } else if (ptr[1] == '*') { // Block comment?
  ------------------
  |  Branch (922:20): [True: 0, False: 0]
  ------------------
  923|      0|          auto savedCommentStorageSize = commentStorage_.size();
  924|      0|          auto commentScope = llvh::make_scope_exit([&] {
  925|      0|            if (storeComments_)
  926|      0|              commentStorage_.erase(
  927|      0|                  commentStorage_.begin() + savedCommentStorageSize,
  928|      0|                  commentStorage_.end());
  929|      0|          });
  930|      0|          SourceErrorManager::SaveAndSuppressMessages suppress(&sm_);
  931|      0|          ptr = skipBlockComment(ptr);
  932|      0|          continue;
  933|      0|        } else {
  934|      0|          return false;
  935|      0|        }
  936|       |
  937|       |      // Handle all other characters: if it is a unicode space, skip it.
  938|       |      // Otherwise we have failed.
  939|      0|      default_label:
  940|      9|      default: {
  ------------------
  |  Branch (940:7): [True: 9, False: 4]
  ------------------
  941|      9|        if (hermes::isUTF8Start(*ptr)) {
  ------------------
  |  Branch (941:13): [True: 0, False: 9]
  ------------------
  942|      0|          auto peeked = _peekUTF8(ptr);
  943|      0|          if (isUnicodeOnlySpace(peeked.first)) {
  ------------------
  |  Branch (943:15): [True: 0, False: 0]
  ------------------
  944|      0|            ptr = peeked.second;
  945|      0|            continue;
  946|      0|          }
  947|      0|        }
  948|      9|        return false;
  949|      9|      }
  950|     13|    }
  951|     13|  }
  952|       |
  953|       |  // We arrive here if we matched a directive. 'ptr' is the final character.
  954|      0|  return true;
  955|     13|}
_ZN6hermes6parser7JSLexer29rescanRBraceInTemplateLiteralEv:
  957|   703k|const Token *JSLexer::rescanRBraceInTemplateLiteral() {
  958|   703k|  assert(token_.getKind() == TokenKind::r_brace && "need } to rescan");
  959|   703k|  --curCharPtr_;
  960|       |  // Undo the storage for the '}'.
  961|   703k|  if (LLVM_UNLIKELY(storeTokens_)) {
  ------------------
  |  |  189|   703k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 703k]
  |  |  ------------------
  ------------------
  962|      0|    tokenStorage_.pop_back();
  963|      0|  }
  964|   703k|  assert(*curCharPtr_ == '}' && "non-} was scanned as r_brace");
  965|   703k|  token_.setStart(curCharPtr_);
  966|   703k|  scanTemplateLiteral();
  967|   703k|  finishToken(curCharPtr_);
  968|   703k|  return &token_;
  969|   703k|}
_ZN6hermes6parser7JSLexer20consumeUnicodeEscapeEv:
 1034|      2|uint32_t JSLexer::consumeUnicodeEscape() {
 1035|      2|  assert(*curCharPtr_ == '\\');
 1036|      2|  ++curCharPtr_;
 1037|       |
 1038|      2|  if (*curCharPtr_ != 'u') {
  ------------------
  |  Branch (1038:7): [True: 0, False: 2]
  ------------------
 1039|      0|    error(
 1040|      0|        {SMLoc::getFromPointer(curCharPtr_ - 1),
 1041|      0|         SMLoc::getFromPointer(curCharPtr_ + 1)},
 1042|      0|        "invalid Unicode escape");
 1043|      0|    return UNICODE_REPLACEMENT_CHARACTER;
 1044|      0|  }
 1045|      2|  ++curCharPtr_;
 1046|       |
 1047|      2|  if (*curCharPtr_ == '{') {
  ------------------
  |  Branch (1047:7): [True: 0, False: 2]
  ------------------
 1048|      0|    auto cp = consumeBracedCodePoint();
 1049|      0|    if (!cp.hasValue()) {
  ------------------
  |  Branch (1049:9): [True: 0, False: 0]
  ------------------
 1050|       |      // consumeBracedCodePoint has reported an error.
 1051|      0|      return UNICODE_REPLACEMENT_CHARACTER;
 1052|      0|    }
 1053|      0|    return *cp;
 1054|      0|  }
 1055|       |
 1056|      2|  auto cp = consumeHex(4);
 1057|      2|  if (!cp)
  ------------------
  |  Branch (1057:7): [True: 0, False: 2]
  ------------------
 1058|      0|    return UNICODE_REPLACEMENT_CHARACTER;
 1059|       |
 1060|       |  // We don't need t check for valid UTF-16. JavaScript allows invalid surrogate
 1061|       |  // pairs, so we just encode every UTF-16 code into a UTF-8 sequence, even
 1062|       |  // though theoretically it is not a valid UTF-8. (UTF-8 would be "valid" if we
 1063|       |  // collected the surrogate pair, decoded it into UTF-32 and encoded that into
 1064|       |  // UTF-16).
 1065|      2|  return cp.getValue();
 1066|      2|}
_ZN6hermes6parser7JSLexer28consumeUnicodeEscapeOptionalEv:
 1068|    200|llvh::Optional<uint32_t> JSLexer::consumeUnicodeEscapeOptional() {
 1069|    200|  const char *start = curCharPtr_;
 1070|    200|  assert(*curCharPtr_ == '\\');
 1071|    200|  ++curCharPtr_;
 1072|       |
 1073|    200|  if (*curCharPtr_ != 'u') {
  ------------------
  |  Branch (1073:7): [True: 0, False: 200]
  ------------------
 1074|      0|    curCharPtr_ = start;
 1075|      0|    return llvh::None;
 1076|      0|  }
 1077|    200|  ++curCharPtr_;
 1078|       |
 1079|    200|  if (*curCharPtr_ == '{') {
  ------------------
  |  Branch (1079:7): [True: 0, False: 200]
  ------------------
 1080|       |    // Avoid reporting an error because we are consuming the escape optionally.
 1081|      0|    auto cp = consumeBracedCodePoint(false);
 1082|      0|    if (!cp) {
  ------------------
  |  Branch (1082:9): [True: 0, False: 0]
  ------------------
 1083|      0|      curCharPtr_ = start;
 1084|      0|      return llvh::None;
 1085|      0|    }
 1086|      0|    return *cp;
 1087|      0|  }
 1088|       |
 1089|    200|  auto cp = consumeHex(4, false);
 1090|    200|  if (!cp) {
  ------------------
  |  Branch (1090:7): [True: 99, False: 101]
  ------------------
 1091|     99|    curCharPtr_ = start;
 1092|     99|    return llvh::None;
 1093|     99|  }
 1094|       |
 1095|       |  // We don't need t check for valid UTF-16. JavaScript allows invalid surrogate
 1096|       |  // pairs, so we just encode every UTF-16 code into a UTF-8 sequence, even
 1097|       |  // though theoretically it is not a valid UTF-8. (UTF-8 would be "valid" if we
 1098|       |  // collected the surrogate pair, decoded it into UTF-32 and encoded that into
 1099|       |  // UTF-16).
 1100|    101|  return cp.getValue();
 1101|    200|}
_ZN6hermes6parser7JSLexer22consumeIdentifierStartEv:
 1103|  5.13M|bool JSLexer::consumeIdentifierStart() {
 1104|  5.13M|  if (*curCharPtr_ == '_' || *curCharPtr_ == '$' ||
  ------------------
  |  Branch (1104:7): [True: 0, False: 5.13M]
  |  Branch (1104:30): [True: 0, False: 5.13M]
  ------------------
 1105|  5.13M|      ((*curCharPtr_ | 32) >= 'a' && (*curCharPtr_ | 32) <= 'z')) {
  ------------------
  |  Branch (1105:8): [True: 703k, False: 4.43M]
  |  Branch (1105:38): [True: 55, False: 703k]
  ------------------
 1106|     55|    tmpStorage_.clear();
 1107|     55|    tmpStorage_.push_back(*curCharPtr_++);
 1108|     55|    return true;
 1109|     55|  }
 1110|       |
 1111|  5.13M|  if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (1111:7): [True: 0, False: 5.13M]
  ------------------
 1112|      0|    SMLoc startLoc = SMLoc::getFromPointer(curCharPtr_);
 1113|      0|    tmpStorage_.clear();
 1114|      0|    uint32_t cp = consumeUnicodeEscape();
 1115|      0|    if (!isUnicodeIDStart(cp)) {
  ------------------
  |  Branch (1115:9): [True: 0, False: 0]
  ------------------
 1116|      0|      errorRange(
 1117|      0|          startLoc,
 1118|      0|          "Unicode escape \\u" + Twine::utohexstr(cp) +
 1119|      0|              "is not a valid identifier start");
 1120|      0|    } else {
 1121|      0|      appendUnicodeToStorage(cp);
 1122|      0|    }
 1123|      0|    return true;
 1124|      0|  }
 1125|       |
 1126|  5.13M|  if (LLVM_LIKELY(!isUTF8Start(*curCharPtr_)))
  ------------------
  |  |  188|  5.13M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5.13M, False: 1]
  |  |  ------------------
  ------------------
 1127|  5.13M|    return false;
 1128|       |
 1129|      1|  auto decoded = _peekUTF8();
 1130|      1|  if (isUnicodeIDStart(decoded.first)) {
  ------------------
  |  Branch (1130:7): [True: 0, False: 1]
  ------------------
 1131|      0|    tmpStorage_.clear();
 1132|      0|    appendUnicodeToStorage(decoded.first);
 1133|      0|    curCharPtr_ = decoded.second;
 1134|      0|    return true;
 1135|      0|  }
 1136|       |
 1137|      1|  return false;
 1138|      1|}
_ZN6hermes6parser7JSLexer12consumeOctalEj:
 1186|  4.40k|unsigned char JSLexer::consumeOctal(unsigned maxLen) {
 1187|  4.40k|  assert(*curCharPtr_ >= '0' && *curCharPtr_ <= '7');
 1188|       |
 1189|  4.40k|  if (strictMode_) {
  ------------------
  |  Branch (1189:7): [True: 0, False: 4.40k]
  ------------------
 1190|      0|    if (!error(
  ------------------
  |  Branch (1190:9): [True: 0, False: 0]
  ------------------
 1191|      0|            SMLoc::getFromPointer(curCharPtr_ - 1),
 1192|      0|            "octals not allowed in strict mode")) {
 1193|      0|      return 0;
 1194|      0|    }
 1195|      0|  }
 1196|       |
 1197|  4.40k|  auto res = (unsigned char)(*curCharPtr_++ - '0');
 1198|  13.2k|  while (--maxLen && *curCharPtr_ >= '0' && *curCharPtr_ <= '7')
  ------------------
  |  Branch (1198:10): [True: 8.81k, False: 4.40k]
  |  Branch (1198:22): [True: 8.81k, False: 0]
  |  Branch (1198:45): [True: 8.80k, False: 5]
  ------------------
 1199|  8.80k|    res = (res << 3) + *curCharPtr_++ - '0';
 1200|       |
 1201|  4.40k|  return res;
 1202|  4.40k|}
_ZN6hermes6parser7JSLexer10consumeHexEjb:
 1206|    253|    bool errorOnFail) {
 1207|    253|  uint32_t cp = 0;
 1208|    830|  for (unsigned i = 0; i != requiredLen; ++i) {
  ------------------
  |  Branch (1208:24): [True: 727, False: 103]
  ------------------
 1209|    727|    unsigned ch = *curCharPtr_;
 1210|    727|    if (ch >= '0' && ch <= '9') {
  ------------------
  |  Branch (1210:9): [True: 650, False: 77]
  |  Branch (1210:22): [True: 397, False: 253]
  ------------------
 1211|    397|      ch -= '0';
 1212|    397|    } else {
 1213|       |      // Now that we know it is not a digit, it is safe to lowercase.
 1214|    330|      ch |= 32;
 1215|    330|      if (ch >= 'a' && ch <= 'f') {
  ------------------
  |  Branch (1215:11): [True: 226, False: 104]
  |  Branch (1215:24): [True: 180, False: 46]
  ------------------
 1216|    180|        ch -= 'a' - 10;
 1217|    180|      } else {
 1218|    150|        if (errorOnFail) {
  ------------------
  |  Branch (1218:13): [True: 0, False: 150]
  ------------------
 1219|      0|          error(SMLoc::getFromPointer(curCharPtr_), "invalid hex number");
 1220|      0|        }
 1221|    150|        return llvh::None;
 1222|    150|      }
 1223|    330|    }
 1224|    577|    cp = (cp << 4) + ch;
 1225|    577|    ++curCharPtr_;
 1226|    577|  }
 1227|       |
 1228|    103|  return cp;
 1229|    253|}
_ZN6hermes6parser7JSLexer17lineCommentHelperEPKc:
 1305|      6|llvh::StringRef JSLexer::lineCommentHelper(const char *start) {
 1306|      6|  assert(
 1307|      6|      (start[0] == '/' && start[1] == '/') ||
 1308|      6|      (start[0] == '#' && start[1] == '!'));
 1309|      6|  const char *lineCommentEnd;
 1310|      6|  const char *cur = start + 2;
 1311|       |
 1312|   581k|  for (;;) {
 1313|   581k|    switch ((unsigned char)*cur) {
 1314|  1.48k|      case 0:
  ------------------
  |  Branch (1314:7): [True: 1.48k, False: 579k]
  ------------------
 1315|  1.48k|        if (cur == bufferEnd_) {
  ------------------
  |  Branch (1315:13): [True: 4, False: 1.47k]
  ------------------
 1316|      4|          lineCommentEnd = cur;
 1317|      4|          goto endLoop;
 1318|  1.47k|        } else {
 1319|  1.47k|          ++cur;
 1320|  1.47k|        }
 1321|  1.47k|        break;
 1322|       |
 1323|  1.47k|      case '\r':
  ------------------
  |  Branch (1323:7): [True: 0, False: 581k]
  ------------------
 1324|      2|      case '\n':
  ------------------
  |  Branch (1324:7): [True: 2, False: 581k]
  ------------------
 1325|      2|        lineCommentEnd = cur;
 1326|      2|        ++cur;
 1327|      2|        newLineBeforeCurrentToken_ = true;
 1328|      2|        goto endLoop;
 1329|       |
 1330|       |        // Line separator \u2028 UTF8 encoded is      : e2 80 a8
 1331|       |        // Paragraph separator \u2029 UTF8 encoded is: e2 80 a9
 1332|    171|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (1332:7): [True: 171, False: 580k]
  ------------------
 1333|    171|        if (matchUnicodeLineTerminatorOffset1(cur)) {
  ------------------
  |  Branch (1333:13): [True: 0, False: 171]
  ------------------
 1334|      0|          lineCommentEnd = cur;
 1335|      0|          cur += 3;
 1336|      0|          newLineBeforeCurrentToken_ = true;
 1337|      0|          goto endLoop;
 1338|    171|        } else {
 1339|    171|          _decodeUTF8SlowPath(cur);
 1340|    171|        }
 1341|    171|        break;
 1342|       |
 1343|   579k|      default:
  ------------------
  |  Branch (1343:7): [True: 579k, False: 1.65k]
  ------------------
 1344|   579k|        if (LLVM_UNLIKELY(isUTF8Start(*cur)))
  ------------------
  |  |  189|   579k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.27k, False: 578k]
  |  |  ------------------
  ------------------
 1345|  1.27k|          _decodeUTF8SlowPath(cur);
 1346|   578k|        else
 1347|   578k|          ++cur;
 1348|   579k|        break;
 1349|   581k|    }
 1350|   581k|  }
 1351|      6|endLoop:
 1352|       |
 1353|      6|  curCharPtr_ = cur;
 1354|      6|  return llvh::StringRef(start, lineCommentEnd - start);
 1355|      6|}
_ZN6hermes6parser7JSLexer15scanLineCommentEPKc:
 1357|      6|void JSLexer::scanLineComment(const char *start) {
 1358|      6|  llvh::StringRef comment = lineCommentHelper(start);
 1359|       |
 1360|      6|  if (storeComments_) {
  ------------------
  |  Branch (1360:7): [True: 0, False: 6]
  ------------------
 1361|      0|    commentStorage_.emplace_back(
 1362|      0|        start[0] == '/' ? StoredComment::Kind::Line
  ------------------
  |  Branch (1362:9): [True: 0, False: 0]
  ------------------
 1363|      0|                        : StoredComment::Kind::Hashbang,
 1364|      0|        SMRange{
 1365|      0|            SMLoc::getFromPointer(comment.begin()),
 1366|      0|            SMLoc::getFromPointer(comment.end())});
 1367|      0|  }
 1368|       |
 1369|       |  // Check for magic comments, which excludes #!.
 1370|       |  // Syntax is //# name=value
 1371|      6|  if (!comment.consume_front(llvh::StringLiteral("//# ")))
  ------------------
  |  Branch (1371:7): [True: 4, False: 2]
  ------------------
 1372|      4|    return;
 1373|       |
 1374|      2|  if (comment.consume_front(llvh::StringLiteral("sourceURL="))) {
  ------------------
  |  Branch (1374:7): [True: 2, False: 0]
  ------------------
 1375|      2|    sourceURL_ = comment;
 1376|      2|#ifndef STATIC_HERMES
 1377|      2|    sm_.setSourceUrl(bufId_, comment);
 1378|      2|#endif
 1379|      2|  } else if (comment.consume_front(llvh::StringLiteral("sourceMappingURL="))) {
  ------------------
  |  Branch (1379:14): [True: 0, False: 0]
  ------------------
 1380|      0|    sourceMappingURL_ = comment;
 1381|      0|#ifndef STATIC_HERMES
 1382|      0|    sm_.setSourceMappingUrl(bufId_, comment);
 1383|      0|#endif
 1384|      0|  }
 1385|      2|}
_ZN6hermes6parser7JSLexer10scanNumberENS1_14GrammarContextE:
 1448|  5.13M|void JSLexer::scanNumber(GrammarContext grammarContext) {
 1449|       |  // A somewhat ugly state machine for scanning a number
 1450|       |
 1451|  5.13M|  unsigned radix = 10;
 1452|  5.13M|  bool real = false;
 1453|  5.13M|  bool ok = true;
 1454|  5.13M|  const char *rawStart = curCharPtr_;
 1455|  5.13M|  const char *start = curCharPtr_;
 1456|       |
 1457|       |  // True when we encounter the numeric literal separator: '_'.
 1458|  5.13M|  bool seenSeparator = false;
 1459|       |
 1460|       |  // True when we encounter a legacy octal number (starts with '0').
 1461|  5.13M|  bool legacyOctal = false;
 1462|       |
 1463|       |  // Detect the radix
 1464|  5.13M|  if (*curCharPtr_ == '0') {
  ------------------
  |  Branch (1464:7): [True: 3.19M, False: 1.93M]
  ------------------
 1465|  3.19M|    if ((curCharPtr_[1] | 32) == 'x') {
  ------------------
  |  Branch (1465:9): [True: 0, False: 3.19M]
  ------------------
 1466|      0|      radix = 16;
 1467|      0|      curCharPtr_ += 2;
 1468|      0|      start += 2;
 1469|  3.19M|    } else if ((curCharPtr_[1] | 32) == 'o') {
  ------------------
  |  Branch (1469:16): [True: 0, False: 3.19M]
  ------------------
 1470|      0|      radix = 8;
 1471|      0|      curCharPtr_ += 2;
 1472|      0|      start += 2;
 1473|  3.19M|    } else if ((curCharPtr_[1] | 32) == 'b') {
  ------------------
  |  Branch (1473:16): [True: 0, False: 3.19M]
  ------------------
 1474|      0|      radix = 2;
 1475|      0|      curCharPtr_ += 2;
 1476|      0|      start += 2;
 1477|  3.19M|    } else if (curCharPtr_[1] == '.') {
  ------------------
  |  Branch (1477:16): [True: 197, False: 3.19M]
  ------------------
 1478|    197|      curCharPtr_ += 2;
 1479|    197|      goto fraction;
 1480|  3.19M|    } else if ((curCharPtr_[1] | 32) == 'e') {
  ------------------
  |  Branch (1480:16): [True: 0, False: 3.19M]
  ------------------
 1481|      0|      curCharPtr_ += 2;
 1482|      0|      goto exponent;
 1483|  3.19M|    } else {
 1484|  3.19M|      radix = 8;
 1485|  3.19M|      legacyOctal = true;
 1486|  3.19M|      ++curCharPtr_;
 1487|  3.19M|    }
 1488|  3.19M|  }
 1489|       |
 1490|  10.1M|  while (isdigit(*curCharPtr_) ||
  ------------------
  |  Branch (1490:10): [True: 4.96M, False: 5.13M]
  ------------------
 1491|  10.1M|         (radix == 16 && (*curCharPtr_ | 32) >= 'a' &&
  ------------------
  |  Branch (1491:11): [True: 0, False: 5.13M]
  |  Branch (1491:26): [True: 0, False: 0]
  ------------------
 1492|  5.13M|          (*curCharPtr_ | 32) <= 'f') ||
  ------------------
  |  Branch (1492:11): [True: 0, False: 0]
  ------------------
 1493|  10.1M|         (*curCharPtr_ == '_')) {
  ------------------
  |  Branch (1493:10): [True: 0, False: 5.13M]
  ------------------
 1494|  4.96M|    seenSeparator |= *curCharPtr_ == '_';
 1495|  4.96M|    ++curCharPtr_;
 1496|  4.96M|  }
 1497|       |
 1498|  5.13M|  if (radix == 10 || legacyOctal) {
  ------------------
  |  Branch (1498:7): [True: 1.93M, False: 3.19M]
  |  Branch (1498:22): [True: 3.19M, False: 0]
  ------------------
 1499|       |    // It is not necessarily an integer.
 1500|       |    // We could have interpreted as legacyOctal initially but will have to
 1501|       |    // change to decimal later.
 1502|  5.13M|    if (*curCharPtr_ == '.') {
  ------------------
  |  Branch (1502:9): [True: 10, False: 5.13M]
  ------------------
 1503|     10|      ++curCharPtr_;
 1504|     10|      goto fraction;
 1505|     10|    }
 1506|       |
 1507|  5.13M|    if ((*curCharPtr_ | 32) == 'e') {
  ------------------
  |  Branch (1507:9): [True: 0, False: 5.13M]
  ------------------
 1508|      0|      ++curCharPtr_;
 1509|      0|      goto exponent;
 1510|      0|    }
 1511|  5.13M|  }
 1512|       |
 1513|  5.13M|  goto end;
 1514|       |
 1515|  5.13M|fraction:
 1516|       |  // We arrive here after we have consumed the decimal dot ".".
 1517|       |  //
 1518|    207|  real = true;
 1519|  5.78M|  while (isdigit(*curCharPtr_) || *curCharPtr_ == '_') {
  ------------------
  |  Branch (1519:10): [True: 5.78M, False: 207]
  |  Branch (1519:35): [True: 0, False: 207]
  ------------------
 1520|  5.78M|    seenSeparator |= *curCharPtr_ == '_';
 1521|  5.78M|    ++curCharPtr_;
 1522|  5.78M|  }
 1523|       |
 1524|    207|  if ((*curCharPtr_ | 32) == 'e') {
  ------------------
  |  Branch (1524:7): [True: 8, False: 199]
  ------------------
 1525|      8|    ++curCharPtr_;
 1526|      8|    goto exponent;
 1527|    199|  } else {
 1528|    199|    goto end;
 1529|    199|  }
 1530|       |
 1531|      8|exponent:
 1532|       |  // We arrive here after we have consumed the exponent character 'e' or 'E'.
 1533|       |  //
 1534|      8|  real = true;
 1535|      8|  if (*curCharPtr_ == '+' || *curCharPtr_ == '-')
  ------------------
  |  Branch (1535:7): [True: 4, False: 4]
  |  Branch (1535:30): [True: 4, False: 0]
  ------------------
 1536|      8|    ++curCharPtr_;
 1537|      8|  if (isdigit(*curCharPtr_)) {
  ------------------
  |  Branch (1537:7): [True: 8, False: 0]
  ------------------
 1538|     69|    do {
 1539|     69|      seenSeparator |= *curCharPtr_ == '_';
 1540|     69|      ++curCharPtr_;
 1541|     69|    } while (isdigit(*curCharPtr_) || *curCharPtr_ == '_');
  ------------------
  |  Branch (1541:14): [True: 61, False: 8]
  |  Branch (1541:39): [True: 0, False: 8]
  ------------------
 1542|      8|  } else {
 1543|      0|    ok = false;
 1544|      0|  }
 1545|       |
 1546|  5.13M|end:
 1547|       |  // We arrive here after we have consumed all we can from the number. Now,
 1548|       |  // as per the spec, we consume a sequence of identifier characters if they
 1549|       |  // follow directly, which means the number is invalid if it's not BigInt.
 1550|  5.13M|  if (consumeIdentifierStart()) {
  ------------------
  |  Branch (1550:7): [True: 55, False: 5.13M]
  ------------------
 1551|     55|    consumeIdentifierParts<IdentifierMode::JS>();
 1552|       |
 1553|     55|    llvh::StringRef raw{rawStart, (size_t)(curCharPtr_ - rawStart)};
 1554|     55|    if (ok && !real && (!legacyOctal || raw == "0n") && tmpStorage_ == "n") {
  ------------------
  |  Branch (1554:9): [True: 55, False: 0]
  |  Branch (1554:15): [True: 55, False: 0]
  |  Branch (1554:25): [True: 16, False: 39]
  |  Branch (1554:41): [True: 39, False: 0]
  |  Branch (1554:57): [True: 55, False: 0]
  ------------------
 1555|     55|      assert(curCharPtr_ > start && "Must consume at least the trailing n.");
 1556|     55|      llvh::ArrayRef<char> digits{start, curCharPtr_ - 1};
 1557|       |      // Use parseIntWithRadixDigits to validate the bigint literal's digits.
 1558|       |      // The digits themselves can be ignored, since we're only interested in
 1559|       |      // whether the string was parsed correctly.
 1560|     55|      if (digits.size() &&
  ------------------
  |  Branch (1560:11): [True: 55, False: 0]
  ------------------
 1561|     55|          parseIntWithRadixDigits</* AllowNumericSeparator */ true>(
  ------------------
  |  Branch (1561:11): [True: 55, False: 0]
  ------------------
 1562|     55|              digits, radix, [](uint8_t) {})) {
 1563|       |        // This is a BigInt.
 1564|     55|        rawStorage_.clear();
 1565|     55|        rawStorage_.append(raw);
 1566|     55|        token_.setBigIntLiteral(getStringLiteral(rawStorage_));
 1567|     55|        return;
 1568|     55|      }
 1569|       |
 1570|       |      // This is a BigInt with invalid digits; fail.
 1571|     55|    }
 1572|       |
 1573|      0|    ok = false;
 1574|      0|  }
 1575|       |
 1576|  5.13M|  double val;
 1577|       |
 1578|       |  /// ES6.0 B.1.1
 1579|       |  /// If we encounter a "legacy" octal number (starting with a '0') but if
 1580|       |  /// the integer contains '8' or '9' we interpret it as decimal.
 1581|  5.13M|  const auto updateLegacyOctalRadix =
 1582|  5.13M|      [this, &radix, start, &legacyOctal]() -> void {
 1583|  5.13M|    assert(
 1584|  5.13M|        legacyOctal &&
 1585|  5.13M|        "updateLegacyOctalRadix can only be called in legacyOctal mode");
 1586|  5.13M|    (void)legacyOctal;
 1587|  5.13M|    for (auto *scanPtr = start; scanPtr != curCharPtr_; ++scanPtr) {
 1588|  5.13M|      if (*scanPtr == '.' || *scanPtr == 'e') {
 1589|  5.13M|        break;
 1590|  5.13M|      }
 1591|  5.13M|      if (LLVM_UNLIKELY(*scanPtr >= '8') && LLVM_LIKELY(*scanPtr != '_')) {
 1592|  5.13M|        sm_.warning(
 1593|  5.13M|            SMRange(token_.getStartLoc(), SMLoc::getFromPointer(curCharPtr_)),
 1594|  5.13M|            "Numeric literal starts with 0 but contains an 8 or 9 digit. "
 1595|  5.13M|            "Interpreting as decimal (not octal).");
 1596|  5.13M|        radix = 10;
 1597|  5.13M|        break;
 1598|  5.13M|      }
 1599|  5.13M|    }
 1600|  5.13M|  };
 1601|       |
 1602|  5.13M|  if (!ok) {
  ------------------
  |  Branch (1602:7): [True: 0, False: 5.13M]
  ------------------
 1603|      0|    errorRange(token_.getStartLoc(), "invalid numeric literal");
 1604|      0|    val = std::numeric_limits<double>::quiet_NaN();
 1605|  5.13M|  } else if (
 1606|  5.13M|      !real && radix == 10 && curCharPtr_ - start <= 9 &&
  ------------------
  |  Branch (1606:7): [True: 5.13M, False: 207]
  |  Branch (1606:16): [True: 1.93M, False: 3.19M]
  |  Branch (1606:31): [True: 1.89M, False: 43.2k]
  ------------------
 1607|  5.13M|      LLVM_LIKELY(!seenSeparator)) {
  ------------------
  |  |  188|  1.89M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.89M, False: 0]
  |  |  ------------------
  ------------------
 1608|       |    // If this is a decimal integer of at most 9 digits (log10(2**31-1), it
 1609|       |    // can fit in a 32-bit integer. Use a faster conversion.
 1610|  1.89M|    int32_t ival = *start - '0';
 1611|  2.26M|    while (++start != curCharPtr_)
  ------------------
  |  Branch (1611:12): [True: 372k, False: 1.89M]
  ------------------
 1612|   372k|      ival = ival * 10 + (*start - '0');
 1613|  1.89M|    val = ival;
 1614|  3.24M|  } else if (real || radix == 10) {
  ------------------
  |  Branch (1614:14): [True: 207, False: 3.24M]
  |  Branch (1614:22): [True: 43.2k, False: 3.19M]
  ------------------
 1615|  43.4k|    if (legacyOctal) {
  ------------------
  |  Branch (1615:9): [True: 0, False: 43.4k]
  ------------------
 1616|      0|      if (strictMode_ || grammarContext == GrammarContext::Type) {
  ------------------
  |  Branch (1616:11): [True: 0, False: 0]
  |  Branch (1616:26): [True: 0, False: 0]
  ------------------
 1617|      0|        if (!errorRange(
  ------------------
  |  Branch (1617:13): [True: 0, False: 0]
  ------------------
 1618|      0|                token_.getStartLoc(),
 1619|      0|                "Decimals with leading zeros are not allowed in strict mode")) {
 1620|      0|          val = std::numeric_limits<double>::quiet_NaN();
 1621|      0|          goto done;
 1622|      0|        }
 1623|      0|      } else {
 1624|       |        // Check to see if we can actually scan this as radix 10.
 1625|       |        // Non-integer numbers must be in base 10, otherwise we error.
 1626|      0|        updateLegacyOctalRadix();
 1627|      0|        if (LLVM_LIKELY(radix != 10)) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1628|      0|          if (!errorRange(
  ------------------
  |  Branch (1628:15): [True: 0, False: 0]
  ------------------
 1629|      0|                  token_.getStartLoc(),
 1630|      0|                  "Octal numeric literals must be integers")) {
 1631|      0|            val = std::numeric_limits<double>::quiet_NaN();
 1632|      0|            goto done;
 1633|      0|          }
 1634|      0|        }
 1635|      0|      }
 1636|      0|    }
 1637|       |
 1638|       |    // We need a zero-terminated buffer for hermes_g_strtod().
 1639|  43.4k|    llvh::SmallString<32> buf;
 1640|  43.4k|    buf.reserve(curCharPtr_ - start + 1);
 1641|  43.4k|    if (LLVM_UNLIKELY(seenSeparator)) {
  ------------------
  |  |  189|  43.4k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 43.4k]
  |  |  ------------------
  ------------------
 1642|      0|      for (const char *it = start; it != curCharPtr_; ++it) {
  ------------------
  |  Branch (1642:36): [True: 0, False: 0]
  ------------------
 1643|      0|        if (LLVM_LIKELY(*it != '_')) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1644|      0|          buf.push_back(*it);
 1645|      0|        } else {
 1646|       |          // Check to ensure that '_' is surrounded by digits.
 1647|       |          // This is safe because the source buffer is zero-terminated and
 1648|       |          // we know that the numeric literal didn't start with '_'.
 1649|       |          // Note that we could have a 0b_11 literal, but we'd still fail
 1650|       |          // properly because of the radix==16 check.
 1651|      0|          char prev = *(it - 1);
 1652|      0|          char next = *(it + 1);
 1653|      0|          if (!isdigit(prev) &&
  ------------------
  |  Branch (1653:15): [True: 0, False: 0]
  ------------------
 1654|      0|              !(radix == 16 && 'a' <= (prev | 32) && (prev | 32) <= 'f')) {
  ------------------
  |  Branch (1654:17): [True: 0, False: 0]
  |  Branch (1654:32): [True: 0, False: 0]
  |  Branch (1654:54): [True: 0, False: 0]
  ------------------
 1655|      0|            errorRange(
 1656|      0|                token_.getStartLoc(),
 1657|      0|                "numeric separator must come after a digit");
 1658|      0|          } else if (
 1659|      0|              !isdigit(next) &&
  ------------------
  |  Branch (1659:15): [True: 0, False: 0]
  ------------------
 1660|      0|              !(radix == 16 && 'a' <= (next | 32) && (next | 32) <= 'f')) {
  ------------------
  |  Branch (1660:17): [True: 0, False: 0]
  |  Branch (1660:32): [True: 0, False: 0]
  |  Branch (1660:54): [True: 0, False: 0]
  ------------------
 1661|      0|            errorRange(
 1662|      0|                token_.getStartLoc(),
 1663|      0|                "numeric separator must come before a digit");
 1664|      0|          }
 1665|      0|        }
 1666|      0|      }
 1667|  43.4k|    } else {
 1668|  43.4k|      buf.append(start, curCharPtr_);
 1669|  43.4k|    }
 1670|  43.4k|    buf.push_back(0);
 1671|  43.4k|    char *endPtr;
 1672|  43.4k|    val = ::hermes_g_strtod(buf.data(), &endPtr);
 1673|  43.4k|    if (endPtr != &buf.back()) {
  ------------------
  |  Branch (1673:9): [True: 0, False: 43.4k]
  ------------------
 1674|      0|      errorRange(token_.getStartLoc(), "invalid numeric literal");
 1675|      0|      val = std::numeric_limits<double>::quiet_NaN();
 1676|      0|    }
 1677|  3.19M|  } else {
 1678|  3.19M|    if (legacyOctal &&
  ------------------
  |  Branch (1678:9): [True: 3.19M, False: 0]
  ------------------
 1679|  3.19M|        (strictMode_ || grammarContext == GrammarContext::Type) &&
  ------------------
  |  Branch (1679:10): [True: 0, False: 3.19M]
  |  Branch (1679:25): [True: 0, False: 3.19M]
  ------------------
 1680|  3.19M|        curCharPtr_ - start > 1) {
  ------------------
  |  Branch (1680:9): [True: 0, False: 0]
  ------------------
 1681|      0|      if (!errorRange(
  ------------------
  |  Branch (1681:11): [True: 0, False: 0]
  ------------------
 1682|      0|              token_.getStartLoc(),
 1683|      0|              "Octal literals must use '0o' in strict mode")) {
 1684|      0|        val = std::numeric_limits<double>::quiet_NaN();
 1685|      0|        goto done;
 1686|      0|      }
 1687|      0|    }
 1688|       |
 1689|       |    // Handle the zero-radix case. This could only happen with radix 16
 1690|       |    // because otherwise start wouldn't have been changed.
 1691|  3.19M|    if (curCharPtr_ == start) {
  ------------------
  |  Branch (1691:9): [True: 0, False: 3.19M]
  ------------------
 1692|      0|      errorRange(
 1693|      0|          token_.getStartLoc(),
 1694|      0|          llvh::Twine("No digits after ") + llvh::StringRef(start - 2, 2));
 1695|      0|      val = std::numeric_limits<double>::quiet_NaN();
 1696|  3.19M|    } else {
 1697|       |      // Parse the rest of the number:
 1698|  3.19M|      if (legacyOctal) {
  ------------------
  |  Branch (1698:11): [True: 3.19M, False: 0]
  ------------------
 1699|  3.19M|        updateLegacyOctalRadix();
 1700|       |        // LegacyOctalLikeDecimalIntegerLiteral cannot contain separators.
 1701|  3.19M|        if (LLVM_UNLIKELY(seenSeparator)) {
  ------------------
  |  |  189|  3.19M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.19M]
  |  |  ------------------
  ------------------
 1702|      0|          errorRange(
 1703|      0|              token_.getStartLoc(),
 1704|      0|              "Numeric separator cannot be used in literal after leading 0");
 1705|      0|        }
 1706|  3.19M|      }
 1707|  3.19M|      auto parsedInt = parseIntWithRadix</* AllowNumericSeparator */ true>(
 1708|  3.19M|          llvh::ArrayRef<char>{start, (size_t)(curCharPtr_ - start)}, radix);
 1709|  3.19M|      if (!parsedInt) {
  ------------------
  |  Branch (1709:11): [True: 0, False: 3.19M]
  ------------------
 1710|      0|        errorRange(token_.getStartLoc(), "invalid integer literal");
 1711|      0|        val = std::numeric_limits<double>::quiet_NaN();
 1712|  3.19M|      } else {
 1713|  3.19M|        val = parsedInt.getValue();
 1714|  3.19M|      }
 1715|  3.19M|    }
 1716|  3.19M|  }
 1717|       |
 1718|  5.13M|done:
 1719|  5.13M|  token_.setNumericLiteral(val);
 1720|  5.13M|}
_ZN6hermes6parser7JSLexer16scanReservedWordEPKcj:
 1729|  3.49M|TokenKind JSLexer::scanReservedWord(const char *start, unsigned length) {
 1730|  3.49M|  TokenKind rw = matchReservedWord(start, length);
 1731|       |
 1732|       |  // Check for "Future reserved words" which should not be recognised in non-
 1733|       |  // strict mode.
 1734|  3.49M|  if (!strictMode_ && rw != TokenKind::identifier) {
  ------------------
  |  Branch (1734:7): [True: 3.49M, False: 0]
  |  Branch (1734:23): [True: 62.2k, False: 3.43M]
  ------------------
 1735|  62.2k|    switch (rw) {
 1736|      0|      case TokenKind::rw_implements:
  ------------------
  |  Branch (1736:7): [True: 0, False: 62.2k]
  ------------------
 1737|      0|      case TokenKind::rw_interface:
  ------------------
  |  Branch (1737:7): [True: 0, False: 62.2k]
  ------------------
 1738|      0|      case TokenKind::rw_package:
  ------------------
  |  Branch (1738:7): [True: 0, False: 62.2k]
  ------------------
 1739|     38|      case TokenKind::rw_private:
  ------------------
  |  Branch (1739:7): [True: 38, False: 62.2k]
  ------------------
 1740|     38|      case TokenKind::rw_protected:
  ------------------
  |  Branch (1740:7): [True: 0, False: 62.2k]
  ------------------
 1741|     38|      case TokenKind::rw_public:
  ------------------
  |  Branch (1741:7): [True: 0, False: 62.2k]
  ------------------
 1742|     38|      case TokenKind::rw_static:
  ------------------
  |  Branch (1742:7): [True: 0, False: 62.2k]
  ------------------
 1743|     38|      case TokenKind::rw_yield:
  ------------------
  |  Branch (1743:7): [True: 0, False: 62.2k]
  ------------------
 1744|     38|        rw = TokenKind::identifier;
 1745|     38|        break;
 1746|  62.2k|      default:
  ------------------
  |  Branch (1746:7): [True: 62.2k, False: 38]
  ------------------
 1747|  62.2k|        break;
 1748|  62.2k|    }
 1749|  62.2k|  }
 1750|  3.49M|  return rw;
 1751|  3.49M|}
_ZN6hermes6parser7JSLexer19scanTemplateLiteralEv:
 1992|  1.09M|void JSLexer::scanTemplateLiteral() {
 1993|  1.09M|  assert(*curCharPtr_ == '`' || *curCharPtr_ == '}');
 1994|       |
 1995|       |  // Whether the token will result in TemplateHead upon encountering ${.
 1996|       |  // If we end the literal with `, then the result is NoSubstitutionTemplate,
 1997|       |  // so this will be ignored.
 1998|  1.09M|  bool isHead = *curCharPtr_ == '`';
 1999|       |
 2000|       |  // If the token ended with a ` then it's a tail (or NoSubstitutionTemplate),
 2001|       |  // and if it ended with a ${ then it's not a tail.
 2002|  1.09M|  bool isTail = false;
 2003|       |
 2004|       |  // Advance past the initial `.
 2005|  1.09M|  ++curCharPtr_;
 2006|       |
 2007|       |  // Track whether we encounter any NotEscapeSequence instances,
 2008|       |  // which will be used to error out on non-tagged sequences.
 2009|  1.09M|  bool foundNotEscapeSequence = false;
 2010|       |
 2011|       |  // Store the Template Value (TV) in the tmpStorage_.
 2012|  1.09M|  tmpStorage_.clear();
 2013|       |
 2014|       |  // Store the Template Raw Value (TRV) in the rawStorage_.
 2015|  1.09M|  rawStorage_.clear();
 2016|       |
 2017|       |  /// Return the Template Raw Value (TRV) of character \p c.
 2018|       |  /// The only time the TRV is different from c is when c is a <CR>.
 2019|       |  /// In that case, this function will return 0x0a (LINE FEED).
 2020|  1.09M|  const auto trv = [](char c) -> char {
 2021|  1.09M|    if (c == '\r') {
 2022|       |      // This case takes \r and \r\n into account.
 2023|       |      // The code below which consumes line separators will skip the following
 2024|       |      // \n if there is a \r\n.
 2025|       |      // For the purposes of finding the TRV it doesn't matter.
 2026|  1.09M|      return 0x0a;
 2027|  1.09M|    }
 2028|  1.09M|    return c;
 2029|  1.09M|  };
 2030|       |
 2031|  10.4M|  for (;;) {
 2032|  10.4M|    if (*curCharPtr_ == '`') {
  ------------------
  |  Branch (2032:9): [True: 388k, False: 10.0M]
  ------------------
 2033|   388k|      isTail = true;
 2034|   388k|      ++curCharPtr_;
 2035|   388k|      break;
 2036|  10.0M|    } else if (*curCharPtr_ == '$' && curCharPtr_[1] == '{') {
  ------------------
  |  Branch (2036:16): [True: 837k, False: 9.22M]
  |  Branch (2036:39): [True: 703k, False: 134k]
  ------------------
 2037|       |      // End of the TemplateCharacters.
 2038|   703k|      isTail = false;
 2039|   703k|      curCharPtr_ += 2;
 2040|   703k|      break;
 2041|  9.36M|    } else if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (2041:16): [True: 123k, False: 9.23M]
  ------------------
 2042|   123k|      rawStorage_.push_back(*curCharPtr_);
 2043|   123k|      ++curCharPtr_;
 2044|   123k|      rawStorage_.push_back(trv(*curCharPtr_));
 2045|   123k|      switch ((unsigned char)*curCharPtr_) {
 2046|      0|        case '\'':
  ------------------
  |  Branch (2046:9): [True: 0, False: 123k]
  ------------------
 2047|      2|        case '"':
  ------------------
  |  Branch (2047:9): [True: 2, False: 123k]
  ------------------
 2048|   123k|        case '\\':
  ------------------
  |  Branch (2048:9): [True: 123k, False: 394]
  ------------------
 2049|   123k|          tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 2050|   123k|          break;
 2051|       |
 2052|      0|        case 'b':
  ------------------
  |  Branch (2052:9): [True: 0, False: 123k]
  ------------------
 2053|      0|          ++curCharPtr_;
 2054|      0|          tmpStorage_.push_back(8);
 2055|      0|          break;
 2056|      0|        case 'f':
  ------------------
  |  Branch (2056:9): [True: 0, False: 123k]
  ------------------
 2057|      0|          ++curCharPtr_;
 2058|      0|          tmpStorage_.push_back(12);
 2059|      0|          break;
 2060|      0|        case 'n':
  ------------------
  |  Branch (2060:9): [True: 0, False: 123k]
  ------------------
 2061|      0|          ++curCharPtr_;
 2062|      0|          tmpStorage_.push_back(10);
 2063|      0|          break;
 2064|     10|        case 'r':
  ------------------
  |  Branch (2064:9): [True: 10, False: 123k]
  ------------------
 2065|     10|          ++curCharPtr_;
 2066|     10|          tmpStorage_.push_back(13);
 2067|     10|          break;
 2068|      0|        case 't':
  ------------------
  |  Branch (2068:9): [True: 0, False: 123k]
  ------------------
 2069|      0|          ++curCharPtr_;
 2070|      0|          tmpStorage_.push_back(9);
 2071|      0|          break;
 2072|      0|        case 'v':
  ------------------
  |  Branch (2072:9): [True: 0, False: 123k]
  ------------------
 2073|      0|          ++curCharPtr_;
 2074|      0|          tmpStorage_.push_back(11);
 2075|      0|          break;
 2076|       |
 2077|      0|        case '\0': // EOF?
  ------------------
  |  Branch (2077:9): [True: 0, False: 123k]
  ------------------
 2078|      0|          if (curCharPtr_ == bufferEnd_) { // eof?
  ------------------
  |  Branch (2078:15): [True: 0, False: 0]
  ------------------
 2079|      0|            error(
 2080|      0|                SMLoc::getFromPointer(curCharPtr_),
 2081|      0|                "non-terminated template literal");
 2082|      0|            sm_.note(token_.getStartLoc(), "template literal started here");
 2083|      0|            goto breakLoop;
 2084|      0|          } else {
 2085|      0|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 2086|      0|          }
 2087|      0|          break;
 2088|       |
 2089|      0|        case '0':
  ------------------
  |  Branch (2089:9): [True: 0, False: 123k]
  ------------------
 2090|       |          // '\0' is only a valid escape sequence if not followed by a
 2091|       |          // DecimalDigit.
 2092|      0|          if (!(curCharPtr_[1] >= '0' && curCharPtr_[1] <= '9')) {
  ------------------
  |  Branch (2092:17): [True: 0, False: 0]
  |  Branch (2092:42): [True: 0, False: 0]
  ------------------
 2093|      0|            ++curCharPtr_;
 2094|      0|            appendUnicodeToStorage(0);
 2095|      0|            break;
 2096|      0|          }
 2097|      0|          [[fallthrough]];
 2098|       |
 2099|      9|        case '1':
  ------------------
  |  Branch (2099:9): [True: 9, False: 123k]
  ------------------
 2100|      9|        case '2':
  ------------------
  |  Branch (2100:9): [True: 0, False: 123k]
  ------------------
 2101|      9|        case '3':
  ------------------
  |  Branch (2101:9): [True: 0, False: 123k]
  ------------------
 2102|      9|        case '4':
  ------------------
  |  Branch (2102:9): [True: 0, False: 123k]
  ------------------
 2103|      9|        case '5':
  ------------------
  |  Branch (2103:9): [True: 0, False: 123k]
  ------------------
 2104|     23|        case '6':
  ------------------
  |  Branch (2104:9): [True: 14, False: 123k]
  ------------------
 2105|     23|        case '7':
  ------------------
  |  Branch (2105:9): [True: 0, False: 123k]
  ------------------
 2106|     41|        case '8':
  ------------------
  |  Branch (2106:9): [True: 18, False: 123k]
  ------------------
 2107|     41|        case '9':
  ------------------
  |  Branch (2107:9): [True: 0, False: 123k]
  ------------------
 2108|       |          // NotEscapeSequence :: DecimalDigit but not 0
 2109|       |          // NotEscapeSequence :: 0 DecimalDigit
 2110|       |          // Octal numbers are not supported in template strings,
 2111|       |          // so leave the number in the raw storage (done above) and move on.
 2112|     41|          ++curCharPtr_;
 2113|     41|          foundNotEscapeSequence = true;
 2114|     41|          break;
 2115|       |
 2116|     51|        case 'x': {
  ------------------
  |  Branch (2116:9): [True: 51, False: 123k]
  ------------------
 2117|     51|          ++curCharPtr_;
 2118|     51|          const char *start = curCharPtr_;
 2119|     51|          auto v = consumeHex(2, false);
 2120|     51|          if (!v) {
  ------------------
  |  Branch (2120:15): [True: 51, False: 0]
  ------------------
 2121|     51|            foundNotEscapeSequence = true;
 2122|     51|          }
 2123|     51|          appendUnicodeToStorage(v ? *v : 0);
  ------------------
  |  Branch (2123:34): [True: 0, False: 51]
  ------------------
 2124|     51|          rawStorage_.append({start, (size_t)(curCharPtr_ - start)});
 2125|     51|          break;
 2126|     41|        }
 2127|       |
 2128|    200|        case 'u': {
  ------------------
  |  Branch (2128:9): [True: 200, False: 123k]
  ------------------
 2129|       |          // Pointer to the first character after the 'u', which is where we
 2130|       |          // can continue scanning from if we fail to decode an escape.
 2131|    200|          const char *start = curCharPtr_ + 1;
 2132|       |          // Reset the pointer to the '\' to scan the unicode escape.
 2133|    200|          --curCharPtr_;
 2134|    200|          assert(*curCharPtr_ == '\\' && "must have started with \\");
 2135|    200|          auto codepoint = consumeUnicodeEscapeOptional();
 2136|    200|          if (!codepoint) {
  ------------------
  |  Branch (2136:15): [True: 99, False: 101]
  ------------------
 2137|     99|            foundNotEscapeSequence = true;
 2138|     99|            curCharPtr_ = start;
 2139|     99|            break;
 2140|     99|          }
 2141|    101|          appendUnicodeToStorage(*codepoint);
 2142|    101|          rawStorage_.append({start, (size_t)(curCharPtr_ - start)});
 2143|    101|          break;
 2144|    200|        }
 2145|       |
 2146|       |        // Escaped line terminator. We just need to skip it, because it was
 2147|       |        // added to the raw storage at the start of the switch statement.
 2148|      0|        case '\n':
  ------------------
  |  Branch (2148:9): [True: 0, False: 123k]
  ------------------
 2149|      0|          ++curCharPtr_;
 2150|      0|          break;
 2151|      0|        case '\r':
  ------------------
  |  Branch (2151:9): [True: 0, False: 123k]
  ------------------
 2152|      0|          ++curCharPtr_;
 2153|      0|          if (*curCharPtr_ == '\n') // skip CR LF
  ------------------
  |  Branch (2153:15): [True: 0, False: 0]
  ------------------
 2154|      0|            ++curCharPtr_;
 2155|      0|          break;
 2156|      0|        case UTF8_LINE_TERMINATOR_CHAR0: {
  ------------------
  |  Branch (2156:9): [True: 0, False: 123k]
  ------------------
 2157|      0|          bool isLineTerminator =
 2158|      0|              matchUnicodeLineTerminatorOffset1(curCharPtr_);
 2159|      0|          uint32_t codepoint = _decodeUTF8SlowPath(curCharPtr_);
 2160|       |          // Needs to be added to the rawStorage_ regardless,
 2161|       |          // but we first need to pop off the byte that was added prior to the
 2162|       |          // switch statement.
 2163|      0|          rawStorage_.pop_back();
 2164|      0|          appendUnicodeToStorage(codepoint, rawStorage_);
 2165|      0|          if (!isLineTerminator) {
  ------------------
  |  Branch (2165:15): [True: 0, False: 0]
  ------------------
 2166|       |            // Only add the codepoint to the tmpStorage if it wasn't a line
 2167|       |            // terminator.
 2168|      0|            appendUnicodeToStorage(codepoint);
 2169|      0|          }
 2170|      0|          break;
 2171|    200|        }
 2172|       |
 2173|     90|        default:
  ------------------
  |  Branch (2173:9): [True: 90, False: 123k]
  ------------------
 2174|     90|          if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_))) {
  ------------------
  |  |  189|     90|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 90]
  |  |  ------------------
  ------------------
 2175|      0|            uint32_t codepoint = _decodeUTF8SlowPath(curCharPtr_);
 2176|      0|            appendUnicodeToStorage(codepoint);
 2177|       |            // Remove the last byte from rawStorage_ and then append the
 2178|       |            // unicode codepoint to it. The already inserted byte will change
 2179|       |            // if this codepoint is in Supplementary Planes.
 2180|      0|            rawStorage_.pop_back();
 2181|      0|            appendUnicodeToStorage(codepoint, rawStorage_);
 2182|     90|          } else {
 2183|       |            // The TV of EscapeSequence is the SV of EscapeSequence.
 2184|     90|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 2185|     90|          }
 2186|     90|          break;
 2187|   123k|      }
 2188|  9.23M|    } else if (LLVM_UNLIKELY(*curCharPtr_ == 0 && curCharPtr_ == bufferEnd_)) {
  ------------------
  |  |  189|  9.60M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 3, False: 9.23M]
  |  |  |  Branch (189:53): [True: 368k, False: 8.87M]
  |  |  |  Branch (189:53): [True: 3, False: 368k]
  |  |  ------------------
  ------------------
 2189|      3|      error(
 2190|      3|          SMLoc::getFromPointer(curCharPtr_),
 2191|      3|          "non-terminated template literal");
 2192|      3|      sm_.note(token_.getStartLoc(), "template literal started here");
 2193|      3|      break;
 2194|  9.23M|    } else if (*curCharPtr_ == '\r') {
  ------------------
  |  Branch (2194:16): [True: 74, False: 9.23M]
  ------------------
 2195|       |      // The TV of LineTerminatorSequence is the TRV of
 2196|       |      // LineTerminatorSequence. The only time this differs from the same
 2197|       |      // characters as the bytes in the file is when the sequence begins with
 2198|       |      // a <CR>.
 2199|     74|      tmpStorage_.push_back(trv(*curCharPtr_));
 2200|     74|      rawStorage_.push_back(trv(*curCharPtr_));
 2201|     74|      curCharPtr_++;
 2202|     74|      if (*curCharPtr_ == '\n') {
  ------------------
  |  Branch (2202:11): [True: 0, False: 74]
  ------------------
 2203|       |        // Skip the <CR> <LF>
 2204|      0|        curCharPtr_++;
 2205|      0|      }
 2206|  9.23M|    } else {
 2207|  9.23M|      if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_))) {
  ------------------
  |  |  189|  9.23M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2.22k, False: 9.23M]
  |  |  ------------------
  ------------------
 2208|       |        // Decode and re-encode the character and append it to the string
 2209|       |        // storage
 2210|  2.22k|        uint32_t codepoint = _decodeUTF8SlowPath(curCharPtr_);
 2211|  2.22k|        appendUnicodeToStorage(codepoint);
 2212|  2.22k|        appendUnicodeToStorage(codepoint, rawStorage_);
 2213|  9.23M|      } else {
 2214|  9.23M|        rawStorage_.push_back(*curCharPtr_);
 2215|  9.23M|        tmpStorage_.push_back(*curCharPtr_++);
 2216|  9.23M|      }
 2217|  9.23M|    }
 2218|  10.4M|  }
 2219|  1.09M|breakLoop:
 2220|       |  // If the template literal is tagged and contains invalid escapes, then
 2221|       |  // cooked should be null because there is no way to cook it, per the ESTree
 2222|       |  // 2018 spec. The parser will error when encountering an untagged literal
 2223|       |  // with invalid escapes, so we place nullptr here.
 2224|  1.09M|  UniqueString *cookedStr =
 2225|  1.09M|      foundNotEscapeSequence ? nullptr : getStringLiteral(tmpStorage_.str());
  ------------------
  |  Branch (2225:7): [True: 162, False: 1.09M]
  ------------------
 2226|  1.09M|  UniqueString *rawStr = getStringLiteral(rawStorage_.str());
 2227|  1.09M|  if (isHead) {
  ------------------
  |  Branch (2227:7): [True: 388k, False: 703k]
  ------------------
 2228|   388k|    if (isTail) {
  ------------------
  |  Branch (2228:9): [True: 388k, False: 50]
  ------------------
 2229|       |      // ` characters `
 2230|   388k|      token_.setTemplateLiteral(
 2231|   388k|          TokenKind::no_substitution_template, cookedStr, rawStr);
 2232|   388k|    } else {
 2233|       |      // ` characters ${
 2234|     50|      token_.setTemplateLiteral(TokenKind::template_head, cookedStr, rawStr);
 2235|     50|    }
 2236|   703k|  } else {
 2237|   703k|    if (isTail) {
  ------------------
  |  Branch (2237:9): [True: 47, False: 703k]
  ------------------
 2238|       |      // } characters `
 2239|     47|      token_.setTemplateLiteral(TokenKind::template_tail, cookedStr, rawStr);
 2240|   703k|    } else {
 2241|       |      // } characters ${
 2242|   703k|      token_.setTemplateLiteral(TokenKind::template_middle, cookedStr, rawStr);
 2243|   703k|    }
 2244|   703k|  }
 2245|  1.09M|}
_ZN6hermes6parser7JSLexer10scanRegExpEv:
 2248|    240|void JSLexer::scanRegExp() {
 2249|    240|  SMLoc startLoc = SMLoc::getFromPointer(curCharPtr_);
 2250|    240|  assert(*curCharPtr_ == '/');
 2251|    240|  ++curCharPtr_;
 2252|       |
 2253|    240|  tmpStorage_.clear();
 2254|    240|  bool inClass = false;
 2255|       |
 2256|  1.91M|  for (;;) {
 2257|  1.91M|    switch ((unsigned char)*curCharPtr_) {
  ------------------
  |  Branch (2257:13): [True: 1.91M, False: 4.58k]
  ------------------
 2258|    240|      case '/':
  ------------------
  |  Branch (2258:7): [True: 240, False: 1.91M]
  ------------------
 2259|    240|        if (!inClass) {
  ------------------
  |  Branch (2259:13): [True: 240, False: 0]
  ------------------
 2260|    240|          ++curCharPtr_;
 2261|    240|          goto exitLoop;
 2262|    240|        }
 2263|      0|        break;
 2264|       |
 2265|    252|      case '[':
  ------------------
  |  Branch (2265:7): [True: 252, False: 1.91M]
  ------------------
 2266|    252|        inClass = true; // It may be true already, but so what.
 2267|    252|        break;
 2268|       |
 2269|    432|      case ']':
  ------------------
  |  Branch (2269:7): [True: 432, False: 1.91M]
  ------------------
 2270|    432|        inClass = false; // It may be false already, but so what.
 2271|    432|        break;
 2272|       |
 2273|  2.13k|      case '\\': // an escape
  ------------------
  |  Branch (2273:7): [True: 2.13k, False: 1.91M]
  ------------------
 2274|  2.13k|        tmpStorage_.push_back((unsigned char)*curCharPtr_);
 2275|  2.13k|        ++curCharPtr_;
 2276|  2.13k|        switch ((unsigned char)*curCharPtr_) {
  ------------------
  |  Branch (2276:17): [True: 2.06k, False: 68]
  ------------------
 2277|     68|          case '\0':
  ------------------
  |  Branch (2277:11): [True: 68, False: 2.06k]
  ------------------
 2278|     68|            if (curCharPtr_ == bufferEnd_)
  ------------------
  |  Branch (2278:17): [True: 0, False: 68]
  ------------------
 2279|      0|              goto unterminated;
 2280|     68|            break;
 2281|     68|          case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (2281:11): [True: 0, False: 2.13k]
  ------------------
 2282|      0|            if (matchUnicodeLineTerminatorOffset1(curCharPtr_))
  ------------------
  |  Branch (2282:17): [True: 0, False: 0]
  ------------------
 2283|      0|              goto unterminated;
 2284|      0|            break;
 2285|      0|          case '\n':
  ------------------
  |  Branch (2285:11): [True: 0, False: 2.13k]
  ------------------
 2286|      0|          case '\r':
  ------------------
  |  Branch (2286:11): [True: 0, False: 2.13k]
  ------------------
 2287|      0|            goto unterminated;
 2288|  2.13k|        }
 2289|  2.13k|        break;
 2290|       |
 2291|  2.13k|      case '\0':
  ------------------
  |  Branch (2291:7): [True: 1.53k, False: 1.91M]
  ------------------
 2292|  1.53k|        if (curCharPtr_ == bufferEnd_)
  ------------------
  |  Branch (2292:13): [True: 0, False: 1.53k]
  ------------------
 2293|      0|          goto unterminated;
 2294|  1.53k|        break;
 2295|  1.53k|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (2295:7): [True: 0, False: 1.91M]
  ------------------
 2296|      0|        if (matchUnicodeLineTerminatorOffset1(curCharPtr_))
  ------------------
  |  Branch (2296:13): [True: 0, False: 0]
  ------------------
 2297|      0|          goto unterminated;
 2298|      0|        break;
 2299|       |
 2300|      0|      case '\n':
  ------------------
  |  Branch (2300:7): [True: 0, False: 1.91M]
  ------------------
 2301|      0|      case '\r':
  ------------------
  |  Branch (2301:7): [True: 0, False: 1.91M]
  ------------------
 2302|      0|      unterminated:
 2303|      0|        error(
 2304|      0|            SMLoc::getFromPointer(curCharPtr_),
 2305|      0|            "non-terminated regular expression literal");
 2306|      0|        sm_.note(startLoc, "regular expression started here");
 2307|      0|        goto exitLoop;
 2308|  1.91M|    }
 2309|       |
 2310|  1.91M|    if (LLVM_UNLIKELY(isUTF8Start((unsigned char)*curCharPtr_)))
  ------------------
  |  |  189|  1.91M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 38, False: 1.91M]
  |  |  ------------------
  ------------------
 2311|     38|      appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 2312|  1.91M|    else
 2313|  1.91M|      tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 2314|  1.91M|  }
 2315|    240|exitLoop:
 2316|    240|  UniqueString *body = getStringLiteral(tmpStorage_.str());
 2317|       |
 2318|       |  // Scan the flags. We must not interpret escape sequences.
 2319|       |  // E6 5.1 7.8.5: "The Strings of characters comprising the
 2320|       |  // RegularExpressionBody and the RegularExpressionFlags are passed
 2321|       |  // uninterpreted to the regular expression constructor"
 2322|    240|  tmpStorage_.clear();
 2323|    240|  bool escapingBackslash = false;
 2324|    258|  for (;;) {
 2325|    258|    if (consumeOneIdentifierPartNoEscape<IdentifierMode::JS>()) {
  ------------------
  |  Branch (2325:9): [True: 18, False: 240]
  ------------------
 2326|     18|      escapingBackslash = false;
 2327|     18|      continue;
 2328|    240|    } else if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (2328:16): [True: 0, False: 240]
  ------------------
 2329|      0|      tmpStorage_.push_back(*curCharPtr_++);
 2330|       |
 2331|       |      // ES6 11.8.5.1: It is a Syntax Error if IdentifierPart contains a
 2332|       |      // Unicode escape sequence.
 2333|      0|      escapingBackslash = !escapingBackslash;
 2334|      0|      if (escapingBackslash && *curCharPtr_ == 'u') {
  ------------------
  |  Branch (2334:11): [True: 0, False: 0]
  |  Branch (2334:32): [True: 0, False: 0]
  ------------------
 2335|      0|        error(
 2336|      0|            SMLoc::getFromPointer(curCharPtr_),
 2337|      0|            "Unicode escape sequences are not allowed in regular expression flags");
 2338|      0|      }
 2339|    240|    } else {
 2340|    240|      break;
 2341|    240|    }
 2342|    258|  }
 2343|       |
 2344|    240|  UniqueString *flags = getStringLiteral(tmpStorage_.str());
 2345|       |
 2346|    240|  token_.setRegExpLiteral(new (allocator_.Allocate<RegExpLiteral>(1))
 2347|    240|                              RegExpLiteral(body, flags));
 2348|    240|}
_ZN6hermes6parser7JSLexer5errorEN4llvh5SMLocERKNS2_5TwineE:
 2356|     18|bool JSLexer::error(llvh::SMLoc loc, const llvh::Twine &msg) {
 2357|     18|  sm_.error(loc, msg, Subsystem::Lexer);
 2358|     18|  if (!sm_.isErrorLimitReached())
  ------------------
  |  Branch (2358:7): [True: 0, False: 18]
  ------------------
 2359|      0|    return true;
 2360|     18|  forceEOF();
 2361|     18|  return false;
 2362|     18|}
_ZN6hermes6parser7JSLexer5errorEN4llvh7SMRangeERKNS2_5TwineE:
 2364|      7|bool JSLexer::error(llvh::SMRange range, const llvh::Twine &msg) {
 2365|      7|  sm_.error(range, msg, Subsystem::Lexer);
 2366|      7|  if (!sm_.isErrorLimitReached())
  ------------------
  |  Branch (2366:7): [True: 0, False: 7]
  ------------------
 2367|      0|    return true;
 2368|      7|  forceEOF();
 2369|      7|  return false;
 2370|      7|}
JSLexer.cpp:_ZN6hermes6parserL15getHTMLEntitiesEv:
   54|    610|static const llvh::DenseMap<llvh::StringRef, uint32_t> &getHTMLEntities() {
   55|    610|  static const auto entities = initializeHTMLEntities();
   56|    610|  return entities;
   57|    610|}
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:_ZZN6hermes6parser7JSLexer24isLetFollowedByDeclStartEvENK3$_0clEv:
  126|    100|  auto optimisticSkipWhitespace = [this]() -> char {
  127|    100|    while (char cur = *curCharPtr_) {
  ------------------
  |  Branch (127:17): [True: 100, False: 0]
  ------------------
  128|    100|      switch (cur) {
  129|      0|        case ' ':
  ------------------
  |  Branch (129:9): [True: 0, False: 100]
  ------------------
  130|      0|        case '\t':
  ------------------
  |  Branch (130:9): [True: 0, False: 100]
  ------------------
  131|      0|        case '\v':
  ------------------
  |  Branch (131:9): [True: 0, False: 100]
  ------------------
  132|      0|        case '\f':
  ------------------
  |  Branch (132:9): [True: 0, False: 100]
  ------------------
  133|      0|          ++curCharPtr_;
  134|      0|          continue;
  135|       |
  136|    100|        default:
  ------------------
  |  Branch (136:9): [True: 100, False: 0]
  ------------------
  137|    100|          return cur;
  138|    100|      }
  139|    100|    }
  140|      0|    return '\0';
  141|    100|  };
JSLexer.cpp:_ZN6hermes6parser12_GLOBAL__N_133matchUnicodeLineTerminatorOffset1EPKc:
   29|    253|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|    253|  return (unsigned char)curCharPtr_[1] == 0x80 &&
  ------------------
  |  Branch (32:10): [True: 251, False: 2]
  ------------------
   33|    253|      ((unsigned char)curCharPtr_[2] == 0xa8 ||
  ------------------
  |  Branch (33:8): [True: 1, False: 250]
  ------------------
   34|    251|       (unsigned char)curCharPtr_[2] == 0xa9);
  ------------------
  |  Branch (34:8): [True: 0, False: 250]
  ------------------
   35|    253|}
_ZN6hermes6parser7JSLexer10scanStringILb0EEEvv:
 1842|     52|void JSLexer::scanString() {
 1843|     52|  assert(*curCharPtr_ == '\'' || *curCharPtr_ == '"');
 1844|     52|  char quoteCh = *curCharPtr_++;
 1845|       |
 1846|       |  // Track whether we encounter any escapes or new line continuations. We need
 1847|       |  // that information in order to detect directives.
 1848|     52|  bool escapes = false;
 1849|       |
 1850|     52|  tmpStorage_.clear();
 1851|       |
 1852|  14.4M|  for (;;) {
 1853|  14.4M|    if (*curCharPtr_ == quoteCh) {
  ------------------
  |  Branch (1853:9): [True: 44, False: 14.4M]
  ------------------
 1854|     44|      ++curCharPtr_;
 1855|     44|      break;
 1856|  14.4M|    } else if (!JSX && *curCharPtr_ == '\\') {
  ------------------
  |  Branch (1856:16): [Folded - Ignored]
  |  Branch (1856:24): [True: 231k, False: 14.2M]
  ------------------
 1857|   231k|      escapes = true;
 1858|   231k|      ++curCharPtr_;
 1859|   231k|      switch ((unsigned char)*curCharPtr_) {
 1860|      0|        case '\'':
  ------------------
  |  Branch (1860:9): [True: 0, False: 231k]
  ------------------
 1861|    160|        case '"':
  ------------------
  |  Branch (1861:9): [True: 160, False: 230k]
  ------------------
 1862|   141k|        case '\\':
  ------------------
  |  Branch (1862:9): [True: 141k, False: 89.9k]
  ------------------
 1863|   141k|          tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1864|   141k|          break;
 1865|       |
 1866|    392|        case 'b':
  ------------------
  |  Branch (1866:9): [True: 392, False: 230k]
  ------------------
 1867|    392|          ++curCharPtr_;
 1868|    392|          tmpStorage_.push_back(8);
 1869|    392|          break;
 1870|      0|        case 'f':
  ------------------
  |  Branch (1870:9): [True: 0, False: 231k]
  ------------------
 1871|      0|          ++curCharPtr_;
 1872|      0|          tmpStorage_.push_back(12);
 1873|      0|          break;
 1874|  83.1k|        case 'n':
  ------------------
  |  Branch (1874:9): [True: 83.1k, False: 147k]
  ------------------
 1875|  83.1k|          ++curCharPtr_;
 1876|  83.1k|          tmpStorage_.push_back(10);
 1877|  83.1k|          break;
 1878|  1.77k|        case 'r':
  ------------------
  |  Branch (1878:9): [True: 1.77k, False: 229k]
  ------------------
 1879|  1.77k|          ++curCharPtr_;
 1880|  1.77k|          tmpStorage_.push_back(13);
 1881|  1.77k|          break;
 1882|      2|        case 't':
  ------------------
  |  Branch (1882:9): [True: 2, False: 231k]
  ------------------
 1883|      2|          ++curCharPtr_;
 1884|      2|          tmpStorage_.push_back(9);
 1885|      2|          break;
 1886|      0|        case 'v':
  ------------------
  |  Branch (1886:9): [True: 0, False: 231k]
  ------------------
 1887|      0|          ++curCharPtr_;
 1888|      0|          tmpStorage_.push_back(11);
 1889|      0|          break;
 1890|       |
 1891|      2|        case '\0': // EOF?
  ------------------
  |  Branch (1891:9): [True: 2, False: 231k]
  ------------------
 1892|      2|          if (curCharPtr_ == bufferEnd_) { // eof?
  ------------------
  |  Branch (1892:15): [True: 2, False: 0]
  ------------------
 1893|      2|            error(SMLoc::getFromPointer(curCharPtr_), "non-terminated string");
 1894|      2|            sm_.note(token_.getStartLoc(), "string started here");
 1895|      2|            goto breakLoop;
 1896|      2|          } else {
 1897|      0|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1898|      0|          }
 1899|      0|          break;
 1900|       |
 1901|      4|        case '0':
  ------------------
  |  Branch (1901:9): [True: 4, False: 231k]
  ------------------
 1902|       |          // '\0' is not an octal so handle it separately.
 1903|      4|          if (!(curCharPtr_[1] >= '0' && curCharPtr_[1] <= '7')) {
  ------------------
  |  Branch (1903:17): [True: 2, False: 2]
  |  Branch (1903:42): [True: 1, False: 1]
  ------------------
 1904|      3|            ++curCharPtr_;
 1905|      3|            appendUnicodeToStorage(0);
 1906|      3|            break;
 1907|      3|          }
 1908|      1|          [[fallthrough]];
 1909|  4.40k|        case '1':
  ------------------
  |  Branch (1909:9): [True: 4.40k, False: 226k]
  ------------------
 1910|  4.40k|        case '2':
  ------------------
  |  Branch (1910:9): [True: 4, False: 231k]
  ------------------
 1911|  4.40k|        case '3':
  ------------------
  |  Branch (1911:9): [True: 1, False: 231k]
  ------------------
 1912|  4.40k|          appendUnicodeToStorage(consumeOctal(3));
 1913|  4.40k|          break;
 1914|      0|        case '4':
  ------------------
  |  Branch (1914:9): [True: 0, False: 231k]
  ------------------
 1915|      0|        case '5':
  ------------------
  |  Branch (1915:9): [True: 0, False: 231k]
  ------------------
 1916|      0|        case '6':
  ------------------
  |  Branch (1916:9): [True: 0, False: 231k]
  ------------------
 1917|      2|        case '7':
  ------------------
  |  Branch (1917:9): [True: 2, False: 231k]
  ------------------
 1918|      2|          appendUnicodeToStorage(consumeOctal(2));
 1919|      2|          break;
 1920|       |
 1921|      0|        case 'x': {
  ------------------
  |  Branch (1921:9): [True: 0, False: 231k]
  ------------------
 1922|      0|          ++curCharPtr_;
 1923|      0|          auto v = consumeHex(2);
 1924|      0|          appendUnicodeToStorage(v ? *v : 0);
  ------------------
  |  Branch (1924:34): [True: 0, False: 0]
  ------------------
 1925|      0|          break;
 1926|      0|        }
 1927|       |
 1928|      2|        case 'u':
  ------------------
  |  Branch (1928:9): [True: 2, False: 231k]
  ------------------
 1929|      2|          --curCharPtr_;
 1930|      2|          appendUnicodeToStorage(consumeUnicodeEscape());
 1931|      2|          break;
 1932|       |
 1933|       |        // Escaped line terminator. We just need to skip it.
 1934|      0|        case '\n':
  ------------------
  |  Branch (1934:9): [True: 0, False: 231k]
  ------------------
 1935|      0|          ++curCharPtr_;
 1936|      0|          break;
 1937|      0|        case '\r':
  ------------------
  |  Branch (1937:9): [True: 0, False: 231k]
  ------------------
 1938|      0|          ++curCharPtr_;
 1939|      0|          if (*curCharPtr_ == '\n') // skip CR LF
  ------------------
  |  Branch (1939:15): [True: 0, False: 0]
  ------------------
 1940|      0|            ++curCharPtr_;
 1941|      0|          break;
 1942|      0|        case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (1942:9): [True: 0, False: 231k]
  ------------------
 1943|      0|          if (matchUnicodeLineTerminatorOffset1(curCharPtr_)) {
  ------------------
  |  Branch (1943:15): [True: 0, False: 0]
  ------------------
 1944|      0|            curCharPtr_ += 3;
 1945|      0|            break;
 1946|      0|          }
 1947|      0|          appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 1948|      0|          break;
 1949|       |
 1950|     19|        default:
  ------------------
  |  Branch (1950:9): [True: 19, False: 231k]
  ------------------
 1951|     19|          if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_)))
  ------------------
  |  |  189|     19|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 19]
  |  |  ------------------
  ------------------
 1952|      0|            appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 1953|     19|          else
 1954|     19|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1955|     19|          break;
 1956|   231k|      }
 1957|  14.2M|    } else if (LLVM_UNLIKELY(*curCharPtr_ == '\n' || *curCharPtr_ == '\r')) {
  ------------------
  |  |  189|  28.4M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 14.2M]
  |  |  |  Branch (189:53): [True: 2, False: 14.2M]
  |  |  |  Branch (189:53): [True: 0, False: 14.2M]
  |  |  ------------------
  ------------------
 1958|      2|      if (JSX) {
  ------------------
  |  Branch (1958:11): [Folded - Ignored]
  ------------------
 1959|      0|        tmpStorage_.push_back(*curCharPtr_++);
 1960|      2|      } else {
 1961|      2|        error(SMLoc::getFromPointer(curCharPtr_), "non-terminated string");
 1962|      2|        sm_.note(token_.getStartLoc(), "string started here");
 1963|      2|        break;
 1964|      2|      }
 1965|      2|#if HERMES_PARSE_JSX
 1966|  14.2M|    } else if (LLVM_UNLIKELY(JSX && *curCharPtr_ == '&')) {
  ------------------
  |  |  189|  14.2M|#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]
  |  |  ------------------
  ------------------
 1967|      0|      auto codePoint = consumeHTMLEntityOptional();
 1968|      0|      if (codePoint.hasValue()) {
  ------------------
  |  Branch (1968:11): [True: 0, False: 0]
  ------------------
 1969|      0|        appendUnicodeToStorage(*codePoint);
 1970|      0|      } else {
 1971|      0|        tmpStorage_.push_back(*curCharPtr_++);
 1972|      0|      }
 1973|      0|#endif
 1974|  14.2M|    } else if (LLVM_UNLIKELY(*curCharPtr_ == 0 && curCharPtr_ == bufferEnd_)) {
  ------------------
  |  |  189|  14.2M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 14.2M]
  |  |  |  Branch (189:53): [True: 744, False: 14.2M]
  |  |  |  Branch (189:53): [True: 4, False: 740]
  |  |  ------------------
  ------------------
 1975|      4|      error(SMLoc::getFromPointer(curCharPtr_), "non-terminated string");
 1976|      4|      sm_.note(token_.getStartLoc(), "string started here");
 1977|      4|      break;
 1978|  14.2M|    } else {
 1979|  14.2M|      if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_))) {
  ------------------
  |  |  189|  14.2M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 30, False: 14.2M]
  |  |  ------------------
  ------------------
 1980|       |        // Decode and re-encode the character and append it to the string
 1981|       |        // storage
 1982|     30|        appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 1983|  14.2M|      } else {
 1984|  14.2M|        tmpStorage_.push_back(*curCharPtr_++);
 1985|  14.2M|      }
 1986|  14.2M|    }
 1987|  14.4M|  }
 1988|     52|breakLoop:
 1989|     52|  token_.setStringLiteral(getStringLiteral(tmpStorage_.str()), escapes);
 1990|     52|}
JSLexer.cpp:_ZZN6hermes6parser7JSLexer10scanNumberENS1_14GrammarContextEENK3$_1clEv:
 1582|  3.19M|      [this, &radix, start, &legacyOctal]() -> void {
 1583|  3.19M|    assert(
 1584|  3.19M|        legacyOctal &&
 1585|  3.19M|        "updateLegacyOctalRadix can only be called in legacyOctal mode");
 1586|  3.19M|    (void)legacyOctal;
 1587|  8.30M|    for (auto *scanPtr = start; scanPtr != curCharPtr_; ++scanPtr) {
  ------------------
  |  Branch (1587:33): [True: 5.10M, False: 3.19M]
  ------------------
 1588|  5.10M|      if (*scanPtr == '.' || *scanPtr == 'e') {
  ------------------
  |  Branch (1588:11): [True: 0, False: 5.10M]
  |  Branch (1588:30): [True: 0, False: 5.10M]
  ------------------
 1589|      0|        break;
 1590|      0|      }
 1591|  5.10M|      if (LLVM_UNLIKELY(*scanPtr >= '8') && LLVM_LIKELY(*scanPtr != '_')) {
  ------------------
  |  |  189|  10.2M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 670, False: 5.10M]
  |  |  ------------------
  ------------------
                    if (LLVM_UNLIKELY(*scanPtr >= '8') && LLVM_LIKELY(*scanPtr != '_')) {
  ------------------
  |  |  188|    670|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 670, False: 0]
  |  |  ------------------
  ------------------
 1592|    670|        sm_.warning(
 1593|    670|            SMRange(token_.getStartLoc(), SMLoc::getFromPointer(curCharPtr_)),
 1594|    670|            "Numeric literal starts with 0 but contains an 8 or 9 digit. "
 1595|    670|            "Interpreting as decimal (not octal).");
 1596|    670|        radix = 10;
 1597|    670|        break;
 1598|    670|      }
 1599|  5.10M|    }
 1600|  3.19M|  };
JSLexer.cpp:_ZN6hermes6parserL17matchReservedWordEPKcj:
 1722|  3.49M|static TokenKind matchReservedWord(const char *str, unsigned len) {
 1723|  3.49M|  return llvh::StringSwitch<TokenKind>(llvh::StringRef(str, len))
 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
 1725|  3.49M|#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|  3.49M|#ifndef TOK
  |  |    9|  3.49M|#define TOK(name, str)
  |  |   10|  3.49M|#endif
  |  |   11|       |
  |  |   12|       |#ifndef RESWORD
  |  |   13|       |#define RESWORD(name) TOK(rw_##name, #name)
  |  |   14|       |#endif
  |  |   15|       |
  |  |   16|  3.49M|#ifndef PUNCTUATOR
  |  |   17|  3.49M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |   18|  3.49M|#endif
  |  |   19|       |
  |  |   20|  3.49M|#ifndef PUNCTUATOR_FLOW
  |  |   21|  3.49M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |   22|  3.49M|#endif
  |  |   23|       |
  |  |   24|  3.49M|#ifndef BINOP
  |  |   25|  3.49M|#define BINOP(name, str, precedence) PUNCTUATOR(name, str)
  |  |   26|  3.49M|#endif
  |  |   27|       |
  |  |   28|  3.49M|#ifndef TEMPLATE
  |  |   29|  3.49M|#define TEMPLATE(name, str) TOK(name, str)
  |  |   30|  3.49M|#endif
  |  |   31|       |
  |  |   32|  3.49M|#ifndef IDENT_OP
  |  |   33|  3.49M|#define IDENT_OP(name, str, precedence) TOK(name, str)
  |  |   34|  3.49M|#endif
  |  |   35|       |
  |  |   36|  3.49M|#ifndef RANGE_MARKER
  |  |   37|  3.49M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |   38|  3.49M|#endif
  |  |   39|       |
  |  |   40|       |// clang-format off
  |  |   41|       |
  |  |   42|  3.49M|TOK(none, "<none>")
  |  |   43|  3.49M|TOK(identifier, "identifier")
  |  |   44|  3.49M|TOK(private_identifier, "private identifier")
  |  |   45|       |
  |  |   46|  3.49M|RANGE_MARKER(_first_resword)
  |  |   47|  3.49M|RESWORD(function)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   48|  3.49M|RESWORD(for)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   49|  3.49M|RESWORD(if)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   50|  3.49M|RESWORD(in)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   51|  3.49M|RESWORD(var)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   52|  3.49M|RESWORD(break)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   53|  3.49M|RESWORD(continue)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   54|  3.49M|RESWORD(return)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   55|  3.49M|RESWORD(switch)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   56|  3.49M|RESWORD(this)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   57|       |
  |  |   58|  3.49M|RESWORD(true)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   59|  3.49M|RESWORD(false)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   60|  3.49M|RESWORD(null)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   61|  3.49M|RESWORD(case)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   62|  3.49M|RESWORD(catch)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   63|  3.49M|RESWORD(const)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   64|  3.49M|RESWORD(debugger)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   65|  3.49M|RESWORD(default)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   66|  3.49M|RESWORD(delete)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   67|  3.49M|RESWORD(do)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   68|  3.49M|RESWORD(else)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   69|  3.49M|RESWORD(finally)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   70|  3.49M|RESWORD(instanceof)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   71|  3.49M|RESWORD(new)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   72|  3.49M|RESWORD(throw)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   73|  3.49M|RESWORD(try)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   74|  3.49M|RESWORD(typeof)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   75|  3.49M|RESWORD(void)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   76|  3.49M|RESWORD(while)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   77|  3.49M|RESWORD(with)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   78|       |
  |  |   79|  3.49M|RESWORD(export)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   80|  3.49M|RESWORD(import)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   81|       |
  |  |   82|  3.49M|RESWORD(class)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   83|  3.49M|RESWORD(static)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   84|  3.49M|RESWORD(extends)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   85|  3.49M|RESWORD(super)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   86|       |
  |  |   87|       |// Future reserved words
  |  |   88|  3.49M|RESWORD(enum)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   89|       |
  |  |   90|       |// Strict mode future reserved words
  |  |   91|  3.49M|RESWORD(implements)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   92|  3.49M|RESWORD(interface)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   93|  3.49M|RESWORD(package)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   94|  3.49M|RESWORD(private)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   95|  3.49M|RESWORD(protected)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   96|  3.49M|RESWORD(public)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   97|  3.49M|RESWORD(yield)
  |  |  ------------------
  |  |  |  | 1724|  3.49M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   98|  3.49M|RANGE_MARKER(_last_resword)
  |  |   99|       |
  |  |  100|  3.49M|PUNCTUATOR(l_brace,             "{")
  |  |  101|  3.49M|PUNCTUATOR_FLOW(l_bracepipe,    "{|")
  |  |  102|  3.49M|PUNCTUATOR(r_brace,             "}")
  |  |  103|  3.49M|PUNCTUATOR_FLOW(piper_brace,    "|}")
  |  |  104|  3.49M|PUNCTUATOR(l_paren,             "(")
  |  |  105|  3.49M|PUNCTUATOR(r_paren,             ")")
  |  |  106|  3.49M|PUNCTUATOR(l_square,            "[")
  |  |  107|  3.49M|PUNCTUATOR(r_square,            "]")
  |  |  108|  3.49M|PUNCTUATOR(period,              ".")
  |  |  109|  3.49M|PUNCTUATOR(questiondot,         "?.")
  |  |  110|  3.49M|PUNCTUATOR(dotdotdot,           "...")
  |  |  111|  3.49M|PUNCTUATOR(semi,                ";")
  |  |  112|  3.49M|PUNCTUATOR(comma,               ",")
  |  |  113|  3.49M|PUNCTUATOR(plusplus,            "++")
  |  |  114|  3.49M|PUNCTUATOR(minusminus,          "--")
  |  |  115|  3.49M|RANGE_MARKER(_first_binary)
  |  |  116|  3.49M|BINOP(     starstar,            "**",  12)
  |  |  117|  3.49M|BINOP(     star,                "*",   11)
  |  |  118|  3.49M|BINOP(     percent,             "%",   11)
  |  |  119|  3.49M|BINOP(     slash,               "/",   11)
  |  |  120|  3.49M|BINOP(     plus,                "+",   10)
  |  |  121|  3.49M|BINOP(     minus,               "-",   10)
  |  |  122|  3.49M|BINOP(     lessless,            "<<",   9)
  |  |  123|  3.49M|BINOP(     greatergreater,      ">>",   9)
  |  |  124|  3.49M|BINOP(     greatergreatergreater,">>>", 9)
  |  |  125|  3.49M|BINOP(     less,                "<",    8)
  |  |  126|  3.49M|BINOP(     greater,             ">",    8)
  |  |  127|  3.49M|BINOP(     lessequal,           "<=",   8)
  |  |  128|  3.49M|BINOP(     greaterequal,        ">=",   8)
  |  |  129|  3.49M|BINOP(     equalequal,          "==",   7)
  |  |  130|  3.49M|BINOP(     exclaimequal,        "!=",   7)
  |  |  131|  3.49M|BINOP(     equalequalequal,     "===",  7)
  |  |  132|  3.49M|BINOP(     exclaimequalequal,   "!==",  7)
  |  |  133|  3.49M|BINOP(     amp,                 "&",    6)
  |  |  134|  3.49M|BINOP(     caret,               "^",    5)
  |  |  135|  3.49M|BINOP(     pipe,                "|",    4)
  |  |  136|  3.49M|BINOP(     ampamp,              "&&",   3)
  |  |  137|  3.49M|BINOP(     pipepipe,            "||",   2)
  |  |  138|  3.49M|BINOP(     questionquestion,    "??",   1)
  |  |  139|  3.49M|RANGE_MARKER(_last_binary)
  |  |  140|  3.49M|PUNCTUATOR(exclaim,             "!")
  |  |  141|  3.49M|PUNCTUATOR(tilde,               "~")
  |  |  142|  3.49M|PUNCTUATOR(question,            "?")
  |  |  143|  3.49M|PUNCTUATOR(colon,               ":")
  |  |  144|  3.49M|PUNCTUATOR(equal,               "=")
  |  |  145|  3.49M|PUNCTUATOR(plusequal,           "+=")
  |  |  146|  3.49M|PUNCTUATOR(minusequal,          "-=")
  |  |  147|  3.49M|PUNCTUATOR(starequal,           "*=")
  |  |  148|  3.49M|PUNCTUATOR(starstarequal,       "**=")
  |  |  149|  3.49M|PUNCTUATOR(percentequal,        "%=")
  |  |  150|  3.49M|PUNCTUATOR(slashequal,          "/=")
  |  |  151|  3.49M|PUNCTUATOR(lesslessequal,       "<<=")
  |  |  152|  3.49M|PUNCTUATOR(greatergreaterequal, ">>=")
  |  |  153|  3.49M|PUNCTUATOR(greatergreatergreaterequal, ">>>=")
  |  |  154|  3.49M|PUNCTUATOR(ampequal,            "&=")
  |  |  155|  3.49M|PUNCTUATOR(pipeequal,           "|=")
  |  |  156|  3.49M|PUNCTUATOR(ampampequal,         "&&=")
  |  |  157|  3.49M|PUNCTUATOR(pipepipeequal,       "||=")
  |  |  158|  3.49M|PUNCTUATOR(questionquestionequal, "\?\?=")
  |  |  159|  3.49M|PUNCTUATOR(caretequal,          "^=")
  |  |  160|  3.49M|PUNCTUATOR(equalgreater,        "=>")
  |  |  161|       |
  |  |  162|  3.49M|IDENT_OP(as_operator,           "as",   8)
  |  |  163|       |
  |  |  164|  3.49M|TOK(numeric_literal, "number")
  |  |  165|  3.49M|TOK(string_literal, "string")
  |  |  166|  3.49M|TOK(regexp_literal, "regexp")
  |  |  167|  3.49M|TOK(jsx_text, "JSX text")
  |  |  168|  3.49M|TOK(bigint_literal, "bigint")
  |  |  169|       |
  |  |  170|  3.49M|TEMPLATE(no_substitution_template, "template literal")
  |  |  171|  3.49M|TEMPLATE(template_head, "template literal start")
  |  |  172|  3.49M|TEMPLATE(template_middle, "template literal resume")
  |  |  173|  3.49M|TEMPLATE(template_tail, "template literal end")
  |  |  174|       |
  |  |  175|  3.49M|TOK(eof, "<eof>")
  |  |  176|  3.49M|RANGE_MARKER(_last_token)
  |  |  177|       |
  |  |  178|  3.49M|#undef TOK
  |  |  179|  3.49M|#undef RESWORD
  |  |  180|  3.49M|#undef PUNCTUATOR
  |  |  181|  3.49M|#undef PUNCTUATOR_FLOW
  |  |  182|  3.49M|#undef BINOP
  |  |  183|  3.49M|#undef TEMPLATE
  |  |  184|  3.49M|#undef IDENT_OP
  |  |  185|  3.49M|#undef RANGE_MARKER
  ------------------
 1726|  3.49M|      .Default(TokenKind::identifier);
 1727|  3.49M|}
JSLexer.cpp:_ZZN6hermes6parser7JSLexer19scanTemplateLiteralEvENK3$_0clEc:
 2020|   124k|  const auto trv = [](char c) -> char {
 2021|   124k|    if (c == '\r') {
  ------------------
  |  Branch (2021:9): [True: 148, False: 123k]
  ------------------
 2022|       |      // This case takes \r and \r\n into account.
 2023|       |      // The code below which consumes line separators will skip the following
 2024|       |      // \n if there is a \r\n.
 2025|       |      // For the purposes of finding the TRV it doesn't matter.
 2026|    148|      return 0x0a;
 2027|    148|    }
 2028|   123k|    return c;
 2029|   124k|  };
_ZN6hermes6parser7JSLexer22scanIdentifierFastPathILNS1_14IdentifierModeE0EEEvPKc:
 1754|  3.49M|void JSLexer::scanIdentifierFastPath(const char *start) {
 1755|  3.49M|  const char *end = start;
 1756|       |
 1757|       |  // Quickly consume the ASCII identifier part.
 1758|  3.49M|  char ch;
 1759|  3.49M|  do
 1760|  35.4M|    ch = (unsigned char)*++end;
 1761|  35.4M|  while (ch == '_' || ch == '$' || ((ch | 32) >= 'a' && (ch | 32) <= 'z') ||
  ------------------
  |  Branch (1761:10): [True: 133, False: 35.4M]
  |  Branch (1761:23): [True: 4.86k, False: 35.4M]
  |  Branch (1761:37): [True: 5.69M, False: 29.7M]
  |  Branch (1761:57): [True: 5.43M, False: 261k]
  ------------------
 1762|  35.4M|         (ch >= '0' && ch <= '9') ||
  ------------------
  |  Branch (1762:11): [True: 27.9M, False: 2.02M]
  |  Branch (1762:24): [True: 26.5M, False: 1.47M]
  ------------------
 1763|  35.4M|         (Mode == IdentifierMode::JSX && ch == '-') ||
  ------------------
  |  Branch (1763:11): [Folded - Ignored]
  |  Branch (1763:42): [True: 0, False: 0]
  ------------------
 1764|  35.4M|         (Mode == IdentifierMode::Flow && ch == '@'));
  ------------------
  |  Branch (1764:11): [Folded - Ignored]
  |  Branch (1764:43): [True: 0, False: 0]
  ------------------
 1765|       |
 1766|       |  // Check whether a slow part of the identifier follows.
 1767|  3.49M|  if (LLVM_UNLIKELY(ch == '\\')) {
  ------------------
  |  |  189|  3.49M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.49M]
  |  |  ------------------
  ------------------
 1768|       |    // An escape. Pass the baton to the slow path.
 1769|      0|    initStorageWith(start, end);
 1770|      0|    curCharPtr_ = end;
 1771|      0|    scanIdentifierParts<Mode>();
 1772|      0|    return;
 1773|  3.49M|  } else if (LLVM_UNLIKELY(isUTF8Start(ch))) {
  ------------------
  |  |  189|  3.49M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 14.1k, False: 3.48M]
  |  |  ------------------
  ------------------
 1774|       |    // If we have encountered a Unicode character, we try to decode it. If it
 1775|       |    // can be a part of the identifier,
 1776|       |    // we consume it, otherwise we leave it alone.
 1777|  14.1k|    auto decoded = _peekUTF8(end);
 1778|  14.1k|    if (isUnicodeIDContinue(decoded.first)) {
  ------------------
  |  Branch (1778:9): [True: 14.1k, False: 21]
  ------------------
 1779|  14.1k|      initStorageWith(start, end);
 1780|  14.1k|      appendUnicodeToStorage(decoded.first);
 1781|  14.1k|      curCharPtr_ = decoded.second;
 1782|  14.1k|      scanIdentifierParts<Mode>();
 1783|  14.1k|      return;
 1784|  14.1k|    }
 1785|  14.1k|  }
 1786|       |
 1787|  3.48M|  curCharPtr_ = end;
 1788|       |
 1789|  3.48M|  size_t length = end - start;
 1790|       |
 1791|  3.48M|  auto rw = scanReservedWord(start, (unsigned)length);
 1792|  3.48M|  if (rw != TokenKind::identifier) {
  ------------------
  |  Branch (1792:7): [True: 62.2k, False: 3.42M]
  ------------------
 1793|  62.2k|    token_.setResWord(rw, resWordIdent(rw));
 1794|  3.42M|  } else {
 1795|  3.42M|    token_.setIdentifier(getIdentifier(llvh::StringRef(start, length)));
 1796|  3.42M|  }
 1797|  3.48M|}
_ZN6hermes6parser7JSLexer19scanIdentifierPartsILNS1_14IdentifierModeE0EEEvv:
 1800|  14.1k|void JSLexer::scanIdentifierParts() {
 1801|  14.1k|  consumeIdentifierParts<Mode>();
 1802|  14.1k|  auto rw =
 1803|  14.1k|      scanReservedWord(tmpStorage_.str().begin(), tmpStorage_.str().size());
 1804|  14.1k|  if (rw != TokenKind::identifier) {
  ------------------
  |  Branch (1804:7): [True: 0, False: 14.1k]
  ------------------
 1805|      0|    token_.setResWord(rw, resWordIdent(rw));
 1806|      0|    sm_.warning(
 1807|      0|        {token_.getStartLoc(), SMLoc::getFromPointer(curCharPtr_)},
 1808|      0|        "scanning identifier with unicode escape as reserved word",
 1809|      0|        Subsystem::Lexer);
 1810|  14.1k|  } else {
 1811|  14.1k|    token_.setIdentifier(getIdentifier(tmpStorage_.str()));
 1812|  14.1k|  }
 1813|  14.1k|}
_ZZN6hermes6parser7JSLexer10lookahead1ILb1EEENS_8OptValueINS0_9TokenKindEEES5_ENKUlvE_clEv:
  995|    500|  auto commentScope = llvh::make_scope_exit([&] {
  996|    500|    if (storeComments_)
  ------------------
  |  Branch (996:9): [True: 0, False: 500]
  ------------------
  997|      0|      commentStorage_.erase(
  998|      0|          commentStorage_.begin() + savedCommentStorageSize,
  999|      0|          commentStorage_.end());
 1000|    500|  });
_ZZN6hermes6parser7JSLexer10lookahead1ILb0EEENS_8OptValueINS0_9TokenKindEEES5_ENKUlvE_clEv:
  995|    100|  auto commentScope = llvh::make_scope_exit([&] {
  996|    100|    if (storeComments_)
  ------------------
  |  Branch (996:9): [True: 0, False: 100]
  ------------------
  997|      0|      commentStorage_.erase(
  998|      0|          commentStorage_.begin() + savedCommentStorageSize,
  999|      0|          commentStorage_.end());
 1000|    100|  });
_ZN6hermes6parser7JSLexer22consumeIdentifierPartsILNS1_14IdentifierModeE0EEEvv:
 1163|  14.1k|void JSLexer::consumeIdentifierParts() {
 1164|  79.4k|  for (;;) {
 1165|       |    // Try consuming an non-escaped identifier part. Failing that, check for an
 1166|       |    // escape.
 1167|  79.4k|    if (consumeOneIdentifierPartNoEscape<Mode>())
  ------------------
  |  Branch (1167:9): [True: 65.2k, False: 14.1k]
  ------------------
 1168|  65.2k|      continue;
 1169|  14.1k|    else if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (1169:14): [True: 0, False: 14.1k]
  ------------------
 1170|       |      // Decode the escape.
 1171|      0|      SMLoc startLoc = SMLoc::getFromPointer(curCharPtr_);
 1172|      0|      uint32_t cp = consumeUnicodeEscape();
 1173|      0|      if (!isUnicodeIDContinue(cp)) {
  ------------------
  |  Branch (1173:11): [True: 0, False: 0]
  ------------------
 1174|      0|        errorRange(
 1175|      0|            startLoc,
 1176|      0|            "Unicode escape \\u" + Twine::utohexstr(cp) +
 1177|      0|                " is not a valid identifier codepoint");
 1178|      0|      } else {
 1179|      0|        appendUnicodeToStorage(cp);
 1180|      0|      }
 1181|      0|    } else
 1182|  14.1k|      break;
 1183|  79.4k|  }
 1184|  14.1k|}
JSLexer.cpp:_ZZN6hermes6parser7JSLexer10scanNumberENS1_14GrammarContextEENK3$_0clEh:
 1562|     90|              digits, radix, [](uint8_t) {})) {
_ZN6hermes6parser7JSLexer32consumeOneIdentifierPartNoEscapeILNS1_14IdentifierModeE0EEEbv:
 1141|  79.6k|bool JSLexer::consumeOneIdentifierPartNoEscape() {
 1142|  79.6k|  char ch = *curCharPtr_;
 1143|  79.6k|  if (ch == '_' || ch == '$' || ((ch | 32) >= 'a' && (ch | 32) <= 'z') ||
  ------------------
  |  Branch (1143:7): [True: 0, False: 79.6k]
  |  Branch (1143:20): [True: 0, False: 79.6k]
  |  Branch (1143:34): [True: 63.2k, False: 16.3k]
  |  Branch (1143:54): [True: 63.2k, False: 25]
  ------------------
 1144|  79.6k|      (ch >= '0' && ch <= '9') || (Mode == IdentifierMode::JSX && ch == '-') ||
  ------------------
  |  Branch (1144:8): [True: 13.3k, False: 3.07k]
  |  Branch (1144:21): [True: 20, False: 13.3k]
  |  Branch (1144:36): [Folded - Ignored]
  |  Branch (1144:67): [True: 0, False: 0]
  ------------------
 1145|  79.6k|      (Mode == IdentifierMode::Flow && ch == '@')) {
  ------------------
  |  Branch (1145:8): [Folded - Ignored]
  |  Branch (1145:40): [True: 0, False: 0]
  ------------------
 1146|  63.2k|    tmpStorage_.push_back(*curCharPtr_++);
 1147|  63.2k|    return true;
 1148|  63.2k|  } else if (LLVM_UNLIKELY(isUTF8Start(ch))) {
  ------------------
  |  |  189|  16.3k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.97k, False: 14.4k]
  |  |  ------------------
  ------------------
 1149|       |    // If we have encountered a Unicode character, we try to decode it. If it
 1150|       |    // can be a part of the identifier, we consume it, otherwise we leave it
 1151|       |    // alone.
 1152|  1.97k|    auto decoded = _peekUTF8();
 1153|  1.97k|    if (isUnicodeIDContinue(decoded.first)) {
  ------------------
  |  Branch (1153:9): [True: 1.97k, False: 0]
  ------------------
 1154|  1.97k|      appendUnicodeToStorage(decoded.first);
 1155|  1.97k|      curCharPtr_ = decoded.second;
 1156|  1.97k|      return true;
 1157|  1.97k|    }
 1158|  1.97k|  }
 1159|  14.4k|  return false;
 1160|  79.6k|}

_ZN6hermes6parser8JSParserC2ERNS_7ContextENSt3__110unique_ptrIN4llvh12MemoryBufferENS4_14default_deleteIS7_EEEE:
   15|    160|    : impl_(std::make_shared<detail::JSParserImpl>(context, std::move(input))) {
   16|    160|}
_ZN6hermes6parser8JSParserC2ERNS_7ContextEjNS0_10ParserPassE:
   19|    206|    : impl_(std::make_shared<detail::JSParserImpl>(context, bufferId, pass)) {}
_ZN6hermes6parser8JSParserD2Ev:
   21|    569|JSParser::~JSParser() = default;
_ZNK6hermes6parser8JSParser17registerMagicURLsEh:
   47|    364|void JSParser::registerMagicURLs(MCFlag::Type flags) const {
   48|       |#ifdef STATIC_HERMES
   49|       |  uint32_t bufId = impl_->getLexer().getBufferId();
   50|       |  SourceErrorManager &sm = impl_->getContext().getSourceErrorManager();
   51|       |  if (flags & MCFlag::SourceURL)
   52|       |    sm.setSourceUrl(bufId, getSourceURL());
   53|       |  if (flags & MCFlag::SourceMappingURL)
   54|       |    sm.setSourceMappingUrl(bufId, getSourceMappingURL());
   55|       |#endif
   56|    364|}
_ZNK6hermes6parser8JSParser19getUseStaticBuiltinEv:
   78|    204|bool JSParser::getUseStaticBuiltin() const {
   79|    204|  return impl_->getUseStaticBuiltin();
   80|    204|}
_ZN6hermes6parser8JSParser5parseEv:
   82|    366|llvh::Optional<ESTree::ProgramNode *> JSParser::parse() {
   83|    366|  return impl_->parse();
   84|    366|}
_ZN6hermes6parser8JSParser14preParseBufferERNS_7ContextEj:
   92|    244|    uint32_t bufferId) {
   93|    244|  if (auto preParser =
  ------------------
  |  Branch (93:12): [True: 203, False: 41]
  ------------------
   94|    244|          detail::JSParserImpl::preParseBuffer(context, bufferId)) {
   95|    203|    return std::unique_ptr<JSParser>(new JSParser(std::move(preParser)));
   96|    203|  } else {
   97|     41|    return nullptr;
   98|     41|  }
   99|    244|}

_ZN6hermes6parser6detail12JSParserImplC2ERNS_7ContextENSt3__110unique_ptrIN4llvh12MemoryBufferENS5_14default_deleteIS8_EEEE:
   26|    160|    : context_(context),
   27|    160|      sm_(context.getSourceErrorManager()),
   28|    160|      lexer_(
   29|    160|          std::move(input),
   30|    160|          context.getSourceErrorManager(),
   31|    160|          context.getAllocator(),
   32|    160|          &context.getStringTable(),
   33|    160|          context.isStrictMode()),
   34|    160|      pass_(FullParse) {
   35|    160|  initializeIdentifiers();
   36|    160|}
_ZN6hermes6parser6detail12JSParserImplC2ERNS_7ContextEjNS0_10ParserPassE:
   39|    450|    : context_(context),
   40|    450|      sm_(context.getSourceErrorManager()),
   41|    450|      lexer_(
   42|    450|          bufferId,
   43|    450|          context.getSourceErrorManager(),
   44|    450|          context.getAllocator(),
   45|    450|          &context.getStringTable(),
   46|    450|          context.isStrictMode()),
   47|    450|      pass_(pass) {
   48|    450|  preParsed_ = context.getPreParsedBufferInfo(bufferId);
   49|    450|  initializeIdentifiers();
   50|    450|}
_ZN6hermes6parser6detail12JSParserImpl21initializeIdentifiersEv:
   52|    610|void JSParserImpl::initializeIdentifiers() {
   53|    610|  getIdent_ = lexer_.getIdentifier("get");
   54|    610|  setIdent_ = lexer_.getIdentifier("set");
   55|    610|  initIdent_ = lexer_.getIdentifier("init");
   56|    610|  useStrictIdent_ = lexer_.getIdentifier("use strict");
   57|    610|  showSourceIdent_ = lexer_.getIdentifier("show source");
   58|    610|  hideSourceIdent_ = lexer_.getIdentifier("hide source");
   59|    610|  sensitiveIdent_ = lexer_.getIdentifier("sensitive");
   60|    610|  useStaticBuiltinIdent_ = lexer_.getIdentifier("use static builtin");
   61|    610|  letIdent_ = lexer_.getIdentifier("let");
   62|    610|  ofIdent_ = lexer_.getIdentifier("of");
   63|    610|  fromIdent_ = lexer_.getIdentifier("from");
   64|    610|  asIdent_ = lexer_.getIdentifier("as");
   65|    610|  implementsIdent_ = lexer_.getIdentifier("implements");
   66|    610|  interfaceIdent_ = lexer_.getIdentifier("interface");
   67|    610|  packageIdent_ = lexer_.getIdentifier("package");
   68|    610|  privateIdent_ = lexer_.getIdentifier("private");
   69|    610|  protectedIdent_ = lexer_.getIdentifier("protected");
   70|    610|  publicIdent_ = lexer_.getIdentifier("public");
   71|    610|  staticIdent_ = lexer_.getIdentifier("static");
   72|    610|  methodIdent_ = lexer_.getIdentifier("method");
   73|    610|  constructorIdent_ = lexer_.getIdentifier("constructor");
   74|    610|  yieldIdent_ = lexer_.getIdentifier("yield");
   75|    610|  newIdent_ = lexer_.getIdentifier("new");
   76|    610|  targetIdent_ = lexer_.getIdentifier("target");
   77|    610|  importIdent_ = lexer_.getIdentifier("import");
   78|    610|  metaIdent_ = lexer_.getIdentifier("meta");
   79|    610|  valueIdent_ = lexer_.getIdentifier("value");
   80|    610|  typeIdent_ = lexer_.getIdentifier("type");
   81|    610|  asyncIdent_ = lexer_.getIdentifier("async");
   82|    610|  awaitIdent_ = lexer_.getIdentifier("await");
   83|    610|  assertIdent_ = lexer_.getIdentifier("assert");
   84|       |
   85|    610|#if HERMES_PARSE_FLOW
   86|       |
   87|    610|  typeofIdent_ = lexer_.getIdentifier("typeof");
   88|    610|  keyofIdent_ = lexer_.getIdentifier("keyof");
   89|    610|  declareIdent_ = lexer_.getIdentifier("declare");
   90|    610|  protoIdent_ = lexer_.getIdentifier("proto");
   91|    610|  opaqueIdent_ = lexer_.getIdentifier("opaque");
   92|    610|  plusIdent_ = lexer_.getIdentifier("plus");
   93|    610|  minusIdent_ = lexer_.getIdentifier("minus");
   94|    610|  moduleIdent_ = lexer_.getIdentifier("module");
   95|    610|  exportsIdent_ = lexer_.getIdentifier("exports");
   96|    610|  esIdent_ = lexer_.getIdentifier("ES");
   97|    610|  commonJSIdent_ = lexer_.getIdentifier("CommonJS");
   98|    610|  mixinsIdent_ = lexer_.getIdentifier("mixins");
   99|    610|  thisIdent_ = lexer_.getIdentifier("this");
  100|       |
  101|    610|  anyIdent_ = lexer_.getIdentifier("any");
  102|    610|  mixedIdent_ = lexer_.getIdentifier("mixed");
  103|    610|  emptyIdent_ = lexer_.getIdentifier("empty");
  104|    610|  booleanIdent_ = lexer_.getIdentifier("boolean");
  105|    610|  boolIdent_ = lexer_.getIdentifier("bool");
  106|    610|  numberIdent_ = lexer_.getIdentifier("number");
  107|    610|  stringIdent_ = lexer_.getIdentifier("string");
  108|    610|  voidIdent_ = lexer_.getIdentifier("void");
  109|    610|  nullIdent_ = lexer_.getIdentifier("null");
  110|    610|  symbolIdent_ = lexer_.getIdentifier("symbol");
  111|    610|  bigintIdent_ = lexer_.getIdentifier("bigint");
  112|       |
  113|    610|  mappedTypeOptionalIdent_ = lexer_.getIdentifier("Optional");
  114|    610|  mappedTypePlusOptionalIdent_ = lexer_.getIdentifier("PlusOptional");
  115|    610|  mappedTypeMinusOptionalIdent_ = lexer_.getIdentifier("MinusOptional");
  116|       |
  117|    610|  checksIdent_ = lexer_.getIdentifier("%checks");
  118|    610|  assertsIdent_ = lexer_.getIdentifier("asserts");
  119|    610|  impliesIdent_ = lexer_.getIdentifier("implies");
  120|       |
  121|       |  // Flow Component syntax
  122|    610|  componentIdent_ = lexer_.getIdentifier("component");
  123|    610|  rendersIdent_ = lexer_.getIdentifier("renders");
  124|    610|  rendersMaybeOperator_ = lexer_.getIdentifier("renders?");
  125|    610|  rendersStarOperator_ = lexer_.getIdentifier("renders*");
  126|    610|  hookIdent_ = lexer_.getIdentifier("hook");
  127|       |
  128|       |  // Flow match expressions and statements
  129|    610|  matchIdent_ = lexer_.getIdentifier("match");
  130|    610|  underscoreIdent_ = lexer_.getIdentifier("_");
  131|    610|#endif
  132|       |
  133|    610|#if HERMES_PARSE_TS
  134|    610|  readonlyIdent_ = lexer_.getIdentifier("readonly");
  135|    610|  neverIdent_ = lexer_.getIdentifier("never");
  136|    610|  undefinedIdent_ = lexer_.getIdentifier("undefined");
  137|    610|  unknownIdent_ = lexer_.getIdentifier("unknown");
  138|    610|#endif
  139|       |
  140|    610|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
  141|    610|  namespaceIdent_ = lexer_.getIdentifier("namespace");
  142|    610|  isIdent_ = lexer_.getIdentifier("is");
  143|    610|  inferIdent_ = lexer_.getIdentifier("infer");
  144|    610|  constIdent_ = lexer_.getIdentifier("const");
  145|    610|#endif
  146|       |
  147|       |  // Generate the string representation of all tokens.
  148|  75.0k|  for (unsigned i = 0; i != NUM_JS_TOKENS; ++i)
  ------------------
  |  Branch (148:24): [True: 74.4k, False: 610]
  ------------------
  149|  74.4k|    tokenIdent_[i] = lexer_.getIdentifier(tokenKindStr((TokenKind)i));
  150|    610|}
_ZN6hermes6parser6detail12JSParserImpl5parseEv:
  152|    610|Optional<ESTree::ProgramNode *> JSParserImpl::parse() {
  153|    610|  PerfSection parsing("Parsing JavaScript");
  154|    610|  tok_ = lexer_.advance();
  155|    610|  auto res = parseProgram();
  156|    610|  if (!res)
  ------------------
  |  Branch (156:7): [True: 29, False: 581]
  ------------------
  157|     29|    return None;
  158|    581|  if (lexer_.getSourceMgr().getErrorCount() != 0)
  ------------------
  |  Branch (158:7): [True: 14, False: 567]
  ------------------
  159|     14|    return None;
  160|    567|  return res.getValue();
  161|    581|}
_ZN6hermes6parser6detail12JSParserImpl13errorExpectedEN4llvh8ArrayRefINS0_9TokenKindEEEPKcS8_NS3_5SMLocE:
  167|     11|    SMLoc whatLoc) {
  168|     11|  llvh::SmallString<4> str;
  169|     11|  llvh::raw_svector_ostream ss{str};
  170|       |
  171|     22|  for (unsigned i = 0; i < toks.size(); ++i) {
  ------------------
  |  Branch (171:24): [True: 11, False: 11]
  ------------------
  172|       |    // Insert a separator after the first token.
  173|     11|    if (i > 0) {
  ------------------
  |  Branch (173:9): [True: 0, False: 11]
  ------------------
  174|       |      // Use " or " instead of ", " before the last token.
  175|      0|      if (i == toks.size() - 1)
  ------------------
  |  Branch (175:11): [True: 0, False: 0]
  ------------------
  176|      0|        ss << " or ";
  177|      0|      else
  178|      0|        ss << ", ";
  179|      0|    }
  180|     11|    ss << "'" << tokenKindStr(toks[i]) << "'";
  181|     11|  }
  182|       |
  183|     11|  ss << " expected";
  184|       |
  185|       |  // Optionally append the 'where' description.
  186|     11|  if (where)
  ------------------
  |  Branch (186:7): [True: 11, False: 0]
  ------------------
  187|     11|    ss << " " << where;
  188|       |
  189|     11|  SMLoc errorLoc = tok_->getStartLoc();
  190|     11|  SourceErrorManager::SourceCoords curCoords;
  191|     11|  SourceErrorManager::SourceCoords whatCoords;
  192|       |
  193|       |  // If the location of 'what' is provided, find its and the error's source
  194|       |  // coordinates.
  195|     11|  if (whatLoc.isValid()) {
  ------------------
  |  Branch (195:7): [True: 11, False: 0]
  ------------------
  196|     11|    sm_.findBufferLineAndLoc(errorLoc, curCoords);
  197|     11|    sm_.findBufferLineAndLoc(whatLoc, whatCoords);
  198|     11|  }
  199|       |
  200|     11|  if (whatCoords.isSameSourceLineAs(curCoords)) {
  ------------------
  |  Branch (200:7): [True: 10, False: 1]
  ------------------
  201|       |    // If the what source coordinates are on the same line as the error, show
  202|       |    // them both.
  203|     10|    sm_.error(
  204|     10|        errorLoc,
  205|     10|        SourceErrorManager::combineIntoRange(whatLoc, errorLoc),
  206|     10|        ss.str(),
  207|     10|        Subsystem::Parser);
  208|     10|  } else {
  209|      1|    sm_.error(errorLoc, ss.str(), Subsystem::Parser);
  210|       |
  211|      1|    if (what && whatCoords.isValid())
  ------------------
  |  Branch (211:9): [True: 1, False: 0]
  |  Branch (211:17): [True: 1, False: 0]
  ------------------
  212|      1|      sm_.note(whatLoc, what, Subsystem::Parser);
  213|      1|  }
  214|     11|}
_ZN6hermes6parser6detail12JSParserImpl4needENS0_9TokenKindEPKcS5_N4llvh5SMLocE:
  220|   283k|    SMLoc whatLoc) {
  221|   283k|  if (tok_->getKind() == kind) {
  ------------------
  |  Branch (221:7): [True: 283k, False: 11]
  ------------------
  222|   283k|    return true;
  223|   283k|  }
  224|     11|  errorExpected(kind, where, what, whatLoc);
  225|     11|  return false;
  226|   283k|}
_ZN6hermes6parser6detail12JSParserImpl3eatENS0_9TokenKindENS0_7JSLexer14GrammarContextEPKcS7_N4llvh5SMLocE:
  233|   272k|    SMLoc whatLoc) {
  234|   272k|  if (need(kind, where, what, whatLoc)) {
  ------------------
  |  Branch (234:7): [True: 272k, False: 11]
  ------------------
  235|   272k|    advance(grammarContext);
  236|   272k|    return true;
  237|   272k|  }
  238|     11|  return false;
  239|   272k|}
_ZN6hermes6parser6detail12JSParserImpl11checkAndEatENS0_9TokenKindENS0_7JSLexer14GrammarContextE:
  243|  12.8M|    JSLexer::GrammarContext grammarContext) {
  244|  12.8M|  if (tok_->getKind() == kind) {
  ------------------
  |  Branch (244:7): [True: 3.05M, False: 9.78M]
  ------------------
  245|  3.05M|    advance(grammarContext);
  246|  3.05M|    return true;
  247|  3.05M|  }
  248|  9.78M|  return false;
  249|  12.8M|}
_ZNK6hermes6parser6detail12JSParserImpl11checkAssignEv:
  261|  6.40M|bool JSParserImpl::checkAssign() const {
  262|  6.40M|  return checkN(
  263|  6.40M|      TokenKind::equal,
  264|  6.40M|      TokenKind::starequal,
  265|  6.40M|      TokenKind::slashequal,
  266|  6.40M|      TokenKind::percentequal,
  267|  6.40M|      TokenKind::plusequal,
  268|  6.40M|      TokenKind::minusequal,
  269|  6.40M|      TokenKind::lesslessequal,
  270|  6.40M|      TokenKind::greatergreaterequal,
  271|  6.40M|      TokenKind::greatergreatergreaterequal,
  272|  6.40M|      TokenKind::starstarequal,
  273|  6.40M|      TokenKind::pipepipeequal,
  274|  6.40M|      TokenKind::ampampequal,
  275|  6.40M|      TokenKind::questionquestionequal,
  276|  6.40M|      TokenKind::ampequal,
  277|  6.40M|      TokenKind::caretequal,
  278|  6.40M|      TokenKind::pipeequal);
  279|  6.40M|}
_ZNK6hermes6parser6detail12JSParserImpl28checkEndAssignmentExpressionENS2_16OfEndsAssignmentE:
  282|  9.27k|    OfEndsAssignment ofEndsAssignment) const {
  283|  9.27k|  return checkN(
  ------------------
  |  Branch (283:10): [True: 234, False: 9.03k]
  ------------------
  284|  9.27k|             TokenKind::rw_in,
  285|  9.27k|             TokenKind::r_paren,
  286|  9.27k|             TokenKind::r_brace,
  287|  9.27k|             TokenKind::r_square,
  288|  9.27k|             TokenKind::comma,
  289|  9.27k|             TokenKind::semi,
  290|  9.27k|             TokenKind::colon,
  291|  9.27k|             TokenKind::eof) ||
  292|  9.27k|      (ofEndsAssignment == OfEndsAssignment::Yes && check(ofIdent_)) ||
  ------------------
  |  Branch (292:8): [True: 9.03k, False: 0]
  |  Branch (292:53): [True: 0, False: 9.03k]
  ------------------
  293|  9.27k|      lexer_.isNewLineBeforeCurrentToken();
  ------------------
  |  Branch (293:7): [True: 9.03k, False: 2]
  ------------------
  294|  9.27k|}
_ZN6hermes6parser6detail12JSParserImpl18checkAsyncFunctionEv:
  296|    375|bool JSParserImpl::checkAsyncFunction() {
  297|       |  // async [no LineTerminator here] function
  298|       |  // ^
  299|    375|  assert(
  300|    375|      check(asyncIdent_) && "check for async function must occur at 'async'");
  301|       |  // Avoid passing TokenKind::rw_function here, because parseFunctionHelper
  302|       |  // relies on seeing `async` in order to construct its AST node.
  303|       |  // This function must also be idempotent to allow for branching based on its
  304|       |  // result in parseStatementListItem without having to store another flag,
  305|       |  // for example.
  306|    375|  OptValue<TokenKind> optNext = lexer_.lookahead1(llvh::None);
  307|    375|  return optNext.hasValue() && *optNext == TokenKind::rw_function;
  ------------------
  |  Branch (307:10): [True: 3, False: 372]
  |  Branch (307:32): [True: 0, False: 3]
  ------------------
  308|    375|}
_ZN6hermes6parser6detail12JSParserImpl7eatSemiEb:
  310|   723k|bool JSParserImpl::eatSemi(bool optional) {
  311|   723k|  if (tok_->getKind() == TokenKind::semi) {
  ------------------
  |  Branch (311:7): [True: 512k, False: 210k]
  ------------------
  312|   512k|    advance();
  313|   512k|    return true;
  314|   512k|  }
  315|       |
  316|   210k|  if (tok_->getKind() == TokenKind::r_brace ||
  ------------------
  |  Branch (316:7): [True: 82, False: 210k]
  ------------------
  317|   210k|      tok_->getKind() == TokenKind::eof ||
  ------------------
  |  Branch (317:7): [True: 413, False: 210k]
  ------------------
  318|   210k|      lexer_.isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (318:7): [True: 210k, False: 5]
  ------------------
  319|   210k|    return true;
  320|   210k|  }
  321|       |
  322|      5|  if (!optional)
  ------------------
  |  Branch (322:7): [True: 4, False: 1]
  ------------------
  323|      4|    error(tok_->getStartLoc(), "';' expected");
  324|      5|  return false;
  325|   210k|}
_ZN6hermes6parser6detail12JSParserImpl16processDirectiveEPNS_12UniqueStringE:
  327|      4|void JSParserImpl::processDirective(UniqueString *directive) {
  328|      4|  seenDirectives_.push_back(directive);
  329|      4|  if (directive == useStrictIdent_)
  ------------------
  |  Branch (329:7): [True: 0, False: 4]
  ------------------
  330|      0|    setStrictMode(true);
  331|      4|  if (directive == useStaticBuiltinIdent_)
  ------------------
  |  Branch (331:7): [True: 0, False: 4]
  ------------------
  332|      0|    setUseStaticBuiltin();
  333|      4|}
_ZN6hermes6parser6detail12JSParserImpl22recursionDepthExceededEv:
  335|      4|bool JSParserImpl::recursionDepthExceeded() {
  336|      4|  error(
  337|      4|      tok_->getStartLoc(),
  338|      4|      "Too many nested expressions/statements/declarations");
  339|      4|  return true;
  340|      4|}
_ZN6hermes6parser6detail12JSParserImpl12parseProgramEv:
  342|    610|Optional<ESTree::ProgramNode *> JSParserImpl::parseProgram() {
  343|    610|  SMLoc startLoc = tok_->getStartLoc();
  344|    610|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
  345|    610|  ESTree::NodeList stmtList;
  346|       |
  347|    610|  if (!parseStatementList(
  ------------------
  |  Branch (347:7): [True: 29, False: 581]
  ------------------
  348|    610|          Param{}, TokenKind::eof, true, AllowImportExport::Yes, stmtList))
  349|     29|    return None;
  350|       |
  351|    581|  SMLoc endLoc = startLoc;
  352|    581|  if (!stmtList.empty()) {
  ------------------
  |  Branch (352:7): [True: 577, False: 4]
  ------------------
  353|    577|    endLoc = stmtList.back().getEndLoc();
  354|    577|  }
  355|    581|  auto *program = setLocation(
  356|    581|      startLoc,
  357|    581|      endLoc,
  358|    581|      new (context_) ESTree::ProgramNode(std::move(stmtList)));
  359|    581|  return program;
  360|    610|}
_ZN6hermes6parser6detail12JSParserImpl24parseFunctionDeclarationENS1_5ParamEb:
  363|  5.44k|JSParserImpl::parseFunctionDeclaration(Param param, bool forceEagerly) {
  364|  5.44k|  auto optRes = parseFunctionHelper(param, true, forceEagerly);
  365|  5.44k|  if (!optRes)
  ------------------
  |  Branch (365:7): [True: 0, False: 5.44k]
  ------------------
  366|      0|    return None;
  367|  5.44k|  return cast<ESTree::FunctionDeclarationNode>(*optRes);
  368|  5.44k|}
_ZN6hermes6parser6detail12JSParserImpl19parseFunctionHelperENS1_5ParamEbb:
  373|  5.60k|    bool forceEagerly) {
  374|       |  // function or async function
  375|  5.60k|  assert(check(TokenKind::rw_function) || check(asyncIdent_));
  376|  5.60k|  bool isAsync = check(asyncIdent_);
  377|       |
  378|  5.60k|  SMLoc startLoc = advance().Start;
  379|       |
  380|  5.60k|  if (isAsync) {
  ------------------
  |  Branch (380:7): [True: 0, False: 5.60k]
  ------------------
  381|       |    // async function
  382|       |    //       ^
  383|      0|    advance();
  384|      0|  }
  385|       |
  386|  5.60k|  bool isGenerator = checkAndEat(TokenKind::star);
  387|       |
  388|       |  // newParamYield setting per the grammar:
  389|       |  // FunctionDeclaration: BindingIdentifier[?Yield, ?Await]
  390|       |  // FunctionExpression: BindingIdentifier[~Yield, ~Await]
  391|       |  // GeneratorFunctionDeclaration: BindingIdentifier[?Yield, ?Await]
  392|       |  // GeneratorFunctionExpression: BindingIdentifier[+Yield, ~Await]
  393|       |  // AsyncFunctionDeclaration: BindingIdentifier[?Yield, ?Await]
  394|       |  // AsyncFunctionExpression: BindingIdentifier[+Yield, +Await]
  395|       |  // AsyncGeneratorDeclaration: BindingIdentifier[?Yield, ?Await]
  396|       |  // AsyncGeneratorExpression: BindingIdentifier[+Yield, +Await]
  397|  5.60k|  bool nameParamYield = isDeclaration ? paramYield_ : isGenerator;
  ------------------
  |  Branch (397:25): [True: 5.44k, False: 168]
  ------------------
  398|  5.60k|  llvh::SaveAndRestore<bool> saveNameParamYield(paramYield_, nameParamYield);
  399|  5.60k|  bool nameParamAwait = isDeclaration ? paramAwait_ : isAsync;
  ------------------
  |  Branch (399:25): [True: 5.44k, False: 168]
  ------------------
  400|  5.60k|  llvh::SaveAndRestore<bool> saveNameParamAwait(paramAwait_, nameParamAwait);
  401|       |
  402|       |  // identifier
  403|  5.60k|  auto optId = parseBindingIdentifier(Param{});
  404|       |  // If this is a default function declaration, then we can match
  405|       |  // [+Default] function ( FormalParameters ) { FunctionBody }
  406|       |  // so the identifier is optional and we can make it nullptr.
  407|  5.60k|  if (isDeclaration && !param.has(ParamDefault) && !optId) {
  ------------------
  |  Branch (407:7): [True: 5.44k, False: 168]
  |  Branch (407:24): [True: 5.44k, False: 0]
  |  Branch (407:52): [True: 0, False: 5.44k]
  ------------------
  408|      0|    errorExpected(
  409|      0|        TokenKind::identifier,
  410|      0|        "after 'function'",
  411|      0|        "location of 'function'",
  412|      0|        startLoc);
  413|      0|    return None;
  414|      0|  }
  415|       |
  416|  5.60k|  ESTree::Node *typeParams = nullptr;
  417|       |
  418|  5.60k|#if HERMES_PARSE_FLOW
  419|  5.60k|  if (context_.getParseFlow() && check(TokenKind::less)) {
  ------------------
  |  Branch (419:7): [True: 0, False: 5.60k]
  |  Branch (419:34): [True: 0, False: 0]
  ------------------
  420|      0|    auto optTypeParams = parseTypeParamsFlow();
  421|      0|    if (!optTypeParams)
  ------------------
  |  Branch (421:9): [True: 0, False: 0]
  ------------------
  422|      0|      return None;
  423|      0|    typeParams = *optTypeParams;
  424|      0|  }
  425|  5.60k|#endif
  426|       |
  427|  5.60k|#if HERMES_PARSE_TS
  428|  5.60k|  if (context_.getParseTS() && check(TokenKind::less)) {
  ------------------
  |  Branch (428:7): [True: 0, False: 5.60k]
  |  Branch (428:32): [True: 0, False: 0]
  ------------------
  429|      0|    auto optTypeParams = parseTSTypeParameters();
  430|      0|    if (!optTypeParams)
  ------------------
  |  Branch (430:9): [True: 0, False: 0]
  ------------------
  431|      0|      return None;
  432|      0|    typeParams = *optTypeParams;
  433|      0|  }
  434|  5.60k|#endif
  435|       |
  436|       |  // (
  437|  5.60k|  if (!need(
  ------------------
  |  Branch (437:7): [True: 0, False: 5.60k]
  ------------------
  438|  5.60k|          TokenKind::l_paren,
  439|  5.60k|          "at start of function parameter list",
  440|  5.60k|          isDeclaration ? "function declaration starts here"
  ------------------
  |  Branch (440:11): [True: 5.44k, False: 168]
  ------------------
  441|  5.60k|                        : "function expression starts here",
  442|  5.60k|          startLoc)) {
  443|      0|    return None;
  444|      0|  }
  445|       |
  446|  5.60k|  ESTree::NodeList paramList;
  447|       |
  448|  5.60k|  llvh::SaveAndRestore<bool> saveArgsAndBodyParamYield(
  449|  5.60k|      paramYield_, isGenerator);
  450|  5.60k|  llvh::SaveAndRestore<bool> saveArgsAndBodyParamAwait(paramAwait_, isAsync);
  451|       |
  452|  5.60k|  if (!parseFormalParameters(param, paramList))
  ------------------
  |  Branch (452:7): [True: 1, False: 5.60k]
  ------------------
  453|      1|    return None;
  454|       |
  455|  5.60k|  ESTree::Node *returnType = nullptr;
  456|  5.60k|  ESTree::Node *predicate = nullptr;
  457|  5.60k|#if HERMES_PARSE_FLOW
  458|  5.60k|  if (context_.getParseFlow() && check(TokenKind::colon)) {
  ------------------
  |  Branch (458:7): [True: 0, False: 5.60k]
  |  Branch (458:34): [True: 0, False: 0]
  ------------------
  459|      0|    SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
  460|      0|    if (!check(checksIdent_)) {
  ------------------
  |  Branch (460:9): [True: 0, False: 0]
  ------------------
  461|      0|      auto optRet = parseReturnTypeAnnotationFlow(annotStart);
  462|      0|      if (!optRet)
  ------------------
  |  Branch (462:11): [True: 0, False: 0]
  ------------------
  463|      0|        return None;
  464|      0|      returnType = *optRet;
  465|      0|    }
  466|       |
  467|      0|    if (check(checksIdent_)) {
  ------------------
  |  Branch (467:9): [True: 0, False: 0]
  ------------------
  468|      0|      auto optPred = parsePredicateFlow();
  469|      0|      if (!optPred)
  ------------------
  |  Branch (469:11): [True: 0, False: 0]
  ------------------
  470|      0|        return None;
  471|      0|      predicate = *optPred;
  472|      0|    }
  473|      0|  }
  474|  5.60k|#endif
  475|  5.60k|#if HERMES_PARSE_TS
  476|  5.60k|  if (context_.getParseTS() && check(TokenKind::colon)) {
  ------------------
  |  Branch (476:7): [True: 0, False: 5.60k]
  |  Branch (476:32): [True: 0, False: 0]
  ------------------
  477|      0|    SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
  478|      0|    if (!check(checksIdent_)) {
  ------------------
  |  Branch (478:9): [True: 0, False: 0]
  ------------------
  479|      0|      auto optRet = parseTypeAnnotationTS(annotStart);
  480|      0|      if (!optRet)
  ------------------
  |  Branch (480:11): [True: 0, False: 0]
  ------------------
  481|      0|        return None;
  482|      0|      returnType = *optRet;
  483|      0|    }
  484|      0|  }
  485|  5.60k|#endif
  486|       |
  487|       |  // {
  488|  5.60k|  if (!need(
  ------------------
  |  Branch (488:7): [True: 0, False: 5.60k]
  ------------------
  489|  5.60k|          TokenKind::l_brace,
  490|  5.60k|          isDeclaration ? "in function declaration" : "in function expression",
  ------------------
  |  Branch (490:11): [True: 5.44k, False: 167]
  ------------------
  491|  5.60k|          isDeclaration ? "start of function declaration"
  ------------------
  |  Branch (491:11): [True: 5.44k, False: 167]
  ------------------
  492|  5.60k|                        : "start of function expression",
  493|  5.60k|          startLoc)) {
  494|      0|    return None;
  495|      0|  }
  496|       |
  497|  5.60k|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
  498|       |
  499|       |  // Grammar context to be used when lexing the closing brace.
  500|  5.60k|  auto grammarContext =
  501|  5.60k|      isDeclaration ? JSLexer::AllowRegExp : JSLexer::AllowDiv;
  ------------------
  |  Branch (501:7): [True: 5.44k, False: 167]
  ------------------
  502|       |
  503|  5.60k|  if (pass_ == PreParse) {
  ------------------
  |  Branch (503:7): [True: 83, False: 5.52k]
  ------------------
  504|       |    // Create the nodes we want to keep before the AllocationScope.
  505|     83|    ESTree::FunctionLikeNode *node;
  506|       |
  507|     83|    if (isDeclaration) {
  ------------------
  |  Branch (507:9): [True: 0, False: 83]
  ------------------
  508|      0|      auto *decl = new (context_) ESTree::FunctionDeclarationNode(
  509|      0|          optId ? *optId : nullptr,
  ------------------
  |  Branch (509:11): [True: 0, False: 0]
  ------------------
  510|      0|          std::move(paramList),
  511|      0|          nullptr,
  512|      0|          typeParams,
  513|      0|          returnType,
  514|      0|          predicate,
  515|      0|          isGenerator,
  516|      0|          isAsync);
  517|       |      // Initialize the node with a blank body.
  518|      0|      decl->_body = new (context_) ESTree::BlockStatementNode({});
  519|      0|      node = decl;
  520|     83|    } else {
  521|     83|      auto *expr = new (context_) ESTree::FunctionExpressionNode(
  522|     83|          optId ? *optId : nullptr,
  ------------------
  |  Branch (522:11): [True: 0, False: 83]
  ------------------
  523|     83|          std::move(paramList),
  524|     83|          nullptr,
  525|     83|          typeParams,
  526|     83|          returnType,
  527|     83|          predicate,
  528|     83|          isGenerator,
  529|     83|          isAsync);
  530|       |      // Initialize the node with a blank body.
  531|     83|      expr->_body = new (context_) ESTree::BlockStatementNode({});
  532|     83|      node = expr;
  533|     83|    }
  534|       |
  535|     83|    AllocationScope scope(context_.getAllocator());
  536|     83|    auto body = parseFunctionBody(
  537|     83|        Param{},
  538|     83|        false,
  539|     83|        saveArgsAndBodyParamYield.get(),
  540|     83|        saveArgsAndBodyParamAwait.get(),
  541|     83|        grammarContext,
  542|     83|        true);
  543|     83|    if (!body)
  ------------------
  |  Branch (543:9): [True: 2, False: 81]
  ------------------
  544|      2|      return None;
  545|       |
  546|     81|    return setLocation(startLoc, body.getValue(), node);
  547|     83|  }
  548|       |
  549|  5.52k|  auto parsedBody = parseFunctionBody(
  550|  5.52k|      Param{},
  551|  5.52k|      forceEagerly,
  552|  5.52k|      saveArgsAndBodyParamYield.get(),
  553|  5.52k|      saveArgsAndBodyParamAwait.get(),
  554|  5.52k|      grammarContext,
  555|  5.52k|      true);
  556|  5.52k|  if (!parsedBody)
  ------------------
  |  Branch (556:7): [True: 2, False: 5.52k]
  ------------------
  557|      2|    return None;
  558|  5.52k|  auto *body = parsedBody.getValue();
  559|       |
  560|  5.52k|  ESTree::FunctionLikeNode *node;
  561|  5.52k|  if (isDeclaration) {
  ------------------
  |  Branch (561:7): [True: 5.44k, False: 82]
  ------------------
  562|  5.44k|    auto *decl = new (context_) ESTree::FunctionDeclarationNode(
  563|  5.44k|        optId ? *optId : nullptr,
  ------------------
  |  Branch (563:9): [True: 5.44k, False: 0]
  ------------------
  564|  5.44k|        std::move(paramList),
  565|  5.44k|        body,
  566|  5.44k|        typeParams,
  567|  5.44k|        returnType,
  568|  5.44k|        predicate,
  569|  5.44k|        isGenerator,
  570|  5.44k|        isAsync);
  571|  5.44k|    node = decl;
  572|  5.44k|  } else {
  573|     82|    auto *expr = new (context_) ESTree::FunctionExpressionNode(
  574|     82|        optId ? *optId : nullptr,
  ------------------
  |  Branch (574:9): [True: 0, False: 82]
  ------------------
  575|     82|        std::move(paramList),
  576|     82|        body,
  577|     82|        typeParams,
  578|     82|        returnType,
  579|     82|        predicate,
  580|     82|        isGenerator,
  581|     82|        isAsync);
  582|     82|    node = expr;
  583|     82|  }
  584|  5.52k|  return setLocation(startLoc, body, node);
  585|  5.52k|}
_ZN6hermes6parser6detail12JSParserImpl21parseFormalParametersENS1_5ParamERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
  589|  5.60k|    ESTree::NodeList &paramList) {
  590|  5.60k|  assert(check(TokenKind::l_paren) && "FormalParameters must start with '('");
  591|       |  // (
  592|  5.60k|  SMLoc lparenLoc = advance().Start;
  593|       |
  594|  5.60k|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
  595|       |  // The first parameter can be 'this' in Flow and TypeScript.
  596|  5.60k|  if (context_.getParseTypes() && check(TokenKind::rw_this)) {
  ------------------
  |  Branch (596:7): [True: 0, False: 5.60k]
  |  Branch (596:35): [True: 0, False: 0]
  ------------------
  597|      0|    auto *name = tok_->getResWordIdentifier();
  598|      0|    SMLoc thisParamStart = advance().Start;
  599|       |
  600|      0|    SMLoc annotStart = tok_->getStartLoc();
  601|      0|    if (!eat(
  ------------------
  |  Branch (601:9): [True: 0, False: 0]
  ------------------
  602|      0|            TokenKind::colon,
  603|      0|            JSLexer::GrammarContext::Type,
  604|      0|            "in 'this' type annotation",
  605|      0|            "start of 'this'",
  606|      0|            thisParamStart))
  607|      0|      return false;
  608|       |
  609|      0|    auto optType = parseTypeAnnotation(annotStart);
  610|      0|    if (!optType)
  ------------------
  |  Branch (610:9): [True: 0, False: 0]
  ------------------
  611|      0|      return false;
  612|      0|    ESTree::Node *type = *optType;
  613|      0|    paramList.push_back(*setLocation(
  614|      0|        thisParamStart,
  615|      0|        getPrevTokenEndLoc(),
  616|      0|        new (context_) ESTree::IdentifierNode(name, type, false)));
  617|       |
  618|      0|    checkAndEat(TokenKind::comma);
  619|      0|  }
  620|  5.60k|#endif
  621|       |
  622|  5.60k|  while (!check(TokenKind::r_paren)) {
  ------------------
  |  Branch (622:10): [True: 1, False: 5.60k]
  ------------------
  623|      1|    if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (623:9): [True: 0, False: 1]
  ------------------
  624|       |      // BindingRestElement.
  625|      0|      auto optRestElem = parseBindingRestElement(param);
  626|      0|      if (!optRestElem)
  ------------------
  |  Branch (626:11): [True: 0, False: 0]
  ------------------
  627|      0|        return false;
  628|      0|      paramList.push_back(*optRestElem.getValue());
  629|      0|      break;
  630|      0|    }
  631|       |
  632|       |    // BindingElement.
  633|      1|    auto optElem = parseBindingElement(param);
  634|      1|    if (!optElem)
  ------------------
  |  Branch (634:9): [True: 0, False: 1]
  ------------------
  635|      0|      return false;
  636|       |
  637|      1|    paramList.push_back(*optElem.getValue());
  638|       |
  639|      1|    if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (639:9): [True: 1, False: 0]
  ------------------
  640|      1|      break;
  641|      1|  }
  642|       |
  643|       |  // )
  644|  5.60k|  if (!eat(
  ------------------
  |  Branch (644:7): [True: 1, False: 5.60k]
  ------------------
  645|  5.60k|          TokenKind::r_paren,
  646|  5.60k|          JSLexer::AllowRegExp,
  647|  5.60k|          "at end of function parameter list",
  648|  5.60k|          "start of parameter list",
  649|  5.60k|          lparenLoc)) {
  650|      1|    return false;
  651|      1|  }
  652|       |
  653|  5.60k|  return true;
  654|  5.60k|}
_ZN6hermes6parser6detail12JSParserImpl14parseStatementENS1_5ParamE:
  656|  1.22M|Optional<ESTree::Node *> JSParserImpl::parseStatement(Param param) {
  657|  1.22M|  CHECK_RECURSION;
  ------------------
  |  | 1538|  1.22M|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  1.22M|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 1.22M]
  |  |  ------------------
  |  | 1540|  1.22M|    return llvh::None;
  ------------------
  658|       |
  659|  1.22M|#define _RET(parseFunc)       \
  660|  1.22M|  if (auto res = (parseFunc)) \
  661|  1.22M|    return res.getValue();    \
  662|  1.22M|  else                        \
  663|  1.22M|    return None;
  664|       |
  665|  1.22M|  switch (tok_->getKind()) {
  666|      2|    case TokenKind::l_brace:
  ------------------
  |  Branch (666:5): [True: 2, False: 1.22M]
  ------------------
  667|      2|      _RET(parseBlock(param));
  ------------------
  |  |  660|      2|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 2]
  |  |  ------------------
  |  |  661|      2|    return res.getValue();    \
  |  |  662|      2|  else                        \
  |  |  663|      2|    return None;
  ------------------
  668|  3.84k|    case TokenKind::rw_var:
  ------------------
  |  Branch (668:5): [True: 3.84k, False: 1.22M]
  ------------------
  669|  3.84k|      _RET(parseVariableStatement(Param{}));
  ------------------
  |  |  660|  3.84k|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 3.84k, False: 0]
  |  |  ------------------
  |  |  661|  3.84k|    return res.getValue();    \
  |  |  662|  3.84k|  else                        \
  |  |  663|  3.84k|    return None;
  ------------------
  670|  10.6k|    case TokenKind::semi:
  ------------------
  |  Branch (670:5): [True: 10.6k, False: 1.21M]
  ------------------
  671|  10.6k|      _RET(parseEmptyStatement());
  ------------------
  |  |  660|  10.6k|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 10.6k, False: 0]
  |  |  ------------------
  |  |  661|  10.6k|    return res.getValue();    \
  |  |  662|  10.6k|  else                        \
  |  |  663|  10.6k|    return None;
  ------------------
  672|      0|    case TokenKind::rw_if:
  ------------------
  |  Branch (672:5): [True: 0, False: 1.22M]
  ------------------
  673|      0|      _RET(parseIfStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  674|      0|    case TokenKind::rw_while:
  ------------------
  |  Branch (674:5): [True: 0, False: 1.22M]
  ------------------
  675|      0|      _RET(parseWhileStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  676|      0|    case TokenKind::rw_do:
  ------------------
  |  Branch (676:5): [True: 0, False: 1.22M]
  ------------------
  677|      0|      _RET(parseDoWhileStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  678|     32|    case TokenKind::rw_for:
  ------------------
  |  Branch (678:5): [True: 32, False: 1.22M]
  ------------------
  679|     32|      _RET(parseForStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|     32|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 31, False: 1]
  |  |  ------------------
  |  |  661|     32|    return res.getValue();    \
  |  |  662|     32|  else                        \
  |  |  663|     32|    return None;
  ------------------
  680|      0|    case TokenKind::rw_continue:
  ------------------
  |  Branch (680:5): [True: 0, False: 1.22M]
  ------------------
  681|      0|      _RET(parseContinueStatement());
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  682|      1|    case TokenKind::rw_break:
  ------------------
  |  Branch (682:5): [True: 1, False: 1.22M]
  ------------------
  683|      1|      _RET(parseBreakStatement());
  ------------------
  |  |  660|      1|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 1, False: 0]
  |  |  ------------------
  |  |  661|      1|    return res.getValue();    \
  |  |  662|      1|  else                        \
  |  |  663|      1|    return None;
  ------------------
  684|      0|    case TokenKind::rw_return:
  ------------------
  |  Branch (684:5): [True: 0, False: 1.22M]
  ------------------
  685|      0|      if (!param.has(ParamReturn) && !context_.allowReturnOutsideFunction()) {
  ------------------
  |  Branch (685:11): [True: 0, False: 0]
  |  Branch (685:38): [True: 0, False: 0]
  ------------------
  686|       |        // Illegal location for a return statement, but we can keep parsing.
  687|      0|        error(tok_->getSourceRange(), "'return' not in a function");
  688|      0|      }
  689|      0|      _RET(parseReturnStatement());
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  690|      0|    case TokenKind::rw_with:
  ------------------
  |  Branch (690:5): [True: 0, False: 1.22M]
  ------------------
  691|      0|      _RET(parseWithStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  692|      0|    case TokenKind::rw_switch:
  ------------------
  |  Branch (692:5): [True: 0, False: 1.22M]
  ------------------
  693|      0|      _RET(parseSwitchStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  694|      0|    case TokenKind::rw_throw:
  ------------------
  |  Branch (694:5): [True: 0, False: 1.22M]
  ------------------
  695|      0|      _RET(parseThrowStatement(Param{}));
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  696|      0|    case TokenKind::rw_try:
  ------------------
  |  Branch (696:5): [True: 0, False: 1.22M]
  ------------------
  697|      0|      _RET(parseTryStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  698|      0|    case TokenKind::rw_debugger:
  ------------------
  |  Branch (698:5): [True: 0, False: 1.22M]
  ------------------
  699|      0|      _RET(parseDebuggerStatement());
  ------------------
  |  |  660|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  661|      0|    return res.getValue();    \
  |  |  662|      0|  else                        \
  |  |  663|      0|    return None;
  ------------------
  700|       |
  701|  1.21M|    default:
  ------------------
  |  Branch (701:5): [True: 1.21M, False: 14.5k]
  ------------------
  702|  1.21M|#if HERMES_PARSE_FLOW
  703|  1.21M|      if (context_.getParseFlow() && context_.getParseFlowMatch() &&
  ------------------
  |  Branch (703:11): [True: 0, False: 1.21M]
  |  Branch (703:38): [True: 0, False: 0]
  ------------------
  704|  1.21M|          LLVM_UNLIKELY(checkMaybeFlowMatch())) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  705|      0|        auto optMatch = tryParseMatchStatementFlow(param.get(ParamReturn));
  706|      0|        if (!optMatch)
  ------------------
  |  Branch (706:13): [True: 0, False: 0]
  ------------------
  707|      0|          return None;
  708|      0|        if (*optMatch)
  ------------------
  |  Branch (708:13): [True: 0, False: 0]
  ------------------
  709|      0|          return *optMatch;
  710|      0|      }
  711|  1.21M|#endif
  712|  1.21M|      _RET(parseExpressionOrLabelledStatement(param.get(ParamReturn)));
  ------------------
  |  |  660|  1.21M|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (660:12): [True: 1.21M, False: 37]
  |  |  ------------------
  |  |  661|  1.21M|    return res.getValue();    \
  |  |  662|  1.21M|  else                        \
  |  |  663|  1.21M|    return None;
  ------------------
  713|  1.22M|  }
  714|       |
  715|  1.22M|#undef _RET
  716|  1.22M|}
_ZNK6hermes6parser6detail12JSParserImpl18copySeenDirectivesEv:
  719|     81|    const {
  720|     81|  llvh::SmallVector<llvh::SmallString<24>, 1> copies;
  721|     81|  for (UniqueString *directive : seenDirectives_) {
  ------------------
  |  Branch (721:32): [True: 0, False: 81]
  ------------------
  722|      0|    copies.emplace_back(directive->str());
  723|      0|  }
  724|     81|  return copies;
  725|     81|}
_ZN6hermes6parser6detail12JSParserImpl17parseFunctionBodyENS1_5ParamEbbbNS0_7JSLexer14GrammarContextEb:
  733|  5.60k|    bool parseDirectives) {
  734|  5.60k|  if (pass_ == LazyParse && !eagerly) {
  ------------------
  |  Branch (734:7): [True: 81, False: 5.52k]
  |  Branch (734:29): [True: 81, False: 0]
  ------------------
  735|     81|    auto startLoc = tok_->getStartLoc();
  736|     81|    assert(
  737|     81|        preParsed_->functionInfo.count(startLoc) == 1 &&
  738|     81|        "no function info stored during preparse");
  739|     81|    PreParsedFunctionInfo functionInfo = preParsed_->functionInfo[startLoc];
  740|     81|    SMLoc endLoc = functionInfo.end;
  741|     81|    if ((unsigned)(endLoc.getPointer() - startLoc.getPointer()) >=
  ------------------
  |  Branch (741:9): [True: 81, False: 0]
  ------------------
  742|     81|        context_.getPreemptiveFunctionCompilationThreshold()) {
  743|     81|      lexer_.seek(endLoc);
  744|     81|      advance(grammarContext);
  745|       |
  746|       |      // Emulate parsing the "use strict" directive in parseBlock.
  747|     81|      setStrictMode(functionInfo.strictMode);
  748|       |
  749|       |      // PreParse collected directives idents into \c PreParsedFunctionInfo,
  750|       |      // iterate on them and fabricate directive nodes into the body node so
  751|       |      // the semantic validator can scan them back.
  752|     81|      ESTree::NodeList stmtList;
  753|     81|      for (const llvh::SmallString<24> &directive : functionInfo.directives) {
  ------------------
  |  Branch (753:51): [True: 0, False: 81]
  ------------------
  754|      0|        auto *strLit = new (context_)
  755|      0|            ESTree::StringLiteralNode(lexer_.getIdentifier(directive));
  756|      0|        auto *dirStmt = new (context_)
  757|      0|            ESTree::ExpressionStatementNode(strLit, strLit->_value);
  758|      0|        stmtList.push_back(*dirStmt);
  759|      0|      }
  760|       |
  761|     81|      auto *body =
  762|     81|          new (context_) ESTree::BlockStatementNode(std::move(stmtList));
  763|     81|      body->isLazyFunctionBody = true;
  764|       |      // Set params based on what they were at the _start_ of the function's
  765|       |      // source, not what they are now, because they might have changed.
  766|       |      // For example,
  767|       |      // get [yield]() {}
  768|       |      // means different things based on the value of paramYield at `get`,
  769|       |      // not at the `{`.
  770|     81|      body->paramYield = paramYield;
  771|     81|      body->paramAwait = paramAwait;
  772|     81|      body->bufferId = lexer_.getBufferId();
  773|     81|      return setLocation(startLoc, endLoc, body);
  774|     81|    }
  775|     81|  }
  776|       |
  777|  5.52k|  auto body = parseBlock(ParamReturn, grammarContext, parseDirectives);
  778|  5.52k|  if (!body)
  ------------------
  |  Branch (778:7): [True: 4, False: 5.52k]
  ------------------
  779|      4|    return None;
  780|       |
  781|  5.52k|  if (pass_ == PreParse) {
  ------------------
  |  Branch (781:7): [True: 81, False: 5.44k]
  ------------------
  782|     81|    preParsed_->functionInfo[(*body)->getStartLoc()] = PreParsedFunctionInfo{
  783|     81|        (*body)->getEndLoc(), isStrictMode(), copySeenDirectives()};
  784|     81|  }
  785|       |
  786|  5.52k|  return body;
  787|  5.52k|}
_ZN6hermes6parser6detail12JSParserImpl16parseDeclarationENS1_5ParamE:
  789|  5.49k|Optional<ESTree::Node *> JSParserImpl::parseDeclaration(Param param) {
  790|  5.49k|  CHECK_RECURSION;
  ------------------
  |  | 1538|  5.49k|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  5.49k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 5.49k]
  |  |  ------------------
  |  | 1540|  5.49k|    return llvh::None;
  ------------------
  791|       |
  792|  5.49k|  assert(checkDeclaration() && "invalid start for declaration");
  793|       |
  794|  5.49k|  if (check(TokenKind::rw_function) || check(asyncIdent_)) {
  ------------------
  |  Branch (794:7): [True: 5.44k, False: 50]
  |  Branch (794:40): [True: 0, False: 50]
  ------------------
  795|  5.44k|    auto fdecl = parseFunctionDeclaration(Param{});
  796|  5.44k|    if (!fdecl)
  ------------------
  |  Branch (796:9): [True: 0, False: 5.44k]
  ------------------
  797|      0|      return None;
  798|       |
  799|  5.44k|    return *fdecl;
  800|  5.44k|  }
  801|       |
  802|     50|  if (check(TokenKind::rw_class)) {
  ------------------
  |  Branch (802:7): [True: 0, False: 50]
  ------------------
  803|      0|    auto optClass = parseClassDeclaration(Param{});
  804|      0|    if (!optClass)
  ------------------
  |  Branch (804:9): [True: 0, False: 0]
  ------------------
  805|      0|      return None;
  806|       |
  807|      0|    return *optClass;
  808|      0|  }
  809|       |
  810|     50|  if (checkN(TokenKind::rw_const, letIdent_)) {
  ------------------
  |  Branch (810:7): [True: 50, False: 0]
  ------------------
  811|     50|    auto optLexDecl = parseLexicalDeclaration(ParamIn);
  812|     50|    if (!optLexDecl)
  ------------------
  |  Branch (812:9): [True: 0, False: 50]
  ------------------
  813|      0|      return None;
  814|       |
  815|     50|    return *optLexDecl;
  816|     50|  }
  817|       |
  818|      0|#if HERMES_PARSE_FLOW
  819|      0|  if (context_.getParseFlow()) {
  ------------------
  |  Branch (819:7): [True: 0, False: 0]
  ------------------
  820|      0|    auto optDecl = parseFlowDeclaration();
  821|      0|    if (!optDecl)
  ------------------
  |  Branch (821:9): [True: 0, False: 0]
  ------------------
  822|      0|      return None;
  823|      0|    return *optDecl;
  824|      0|  }
  825|      0|#endif
  826|       |
  827|      0|#if HERMES_PARSE_TS
  828|      0|  if (context_.getParseTS()) {
  ------------------
  |  Branch (828:7): [True: 0, False: 0]
  ------------------
  829|      0|    auto optDecl = parseTSDeclaration();
  830|      0|    if (!optDecl)
  ------------------
  |  Branch (830:9): [True: 0, False: 0]
  ------------------
  831|      0|      return None;
  832|      0|    return *optDecl;
  833|      0|  }
  834|      0|#endif
  835|       |
  836|      0|  assert(false && "checkDeclaration() returned true without a declaration");
  837|      0|  return None;
  838|      0|}
_ZN6hermes6parser6detail12JSParserImpl22parseStatementListItemENS1_5ParamENS2_17AllowImportExportERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
  843|   739k|    ESTree::NodeList &stmtList) {
  844|   739k|  if (checkDeclaration()) {
  ------------------
  |  Branch (844:7): [True: 5.49k, False: 733k]
  ------------------
  845|  5.49k|    auto decl = parseDeclaration(Param{});
  846|  5.49k|    if (!decl)
  ------------------
  |  Branch (846:9): [True: 0, False: 5.49k]
  ------------------
  847|      0|      return false;
  848|       |
  849|  5.49k|    stmtList.push_back(*decl.getValue());
  850|  5.49k|#if HERMES_PARSE_FLOW
  851|   733k|  } else if (context_.getParseFlow() && checkDeclareType()) {
  ------------------
  |  Branch (851:14): [True: 0, False: 733k]
  |  Branch (851:41): [True: 0, False: 0]
  ------------------
  852|       |    // declare var, declare function, declare interface, etc.
  853|      0|    SMLoc start = advance(JSLexer::GrammarContext::Type).Start;
  854|      0|    auto decl = parseDeclareFLow(start);
  855|      0|    if (!decl)
  ------------------
  |  Branch (855:9): [True: 0, False: 0]
  ------------------
  856|      0|      return false;
  857|      0|    stmtList.push_back(*decl.getValue());
  858|      0|#endif
  859|   733k|  } else if (tok_->getKind() == TokenKind::rw_import) {
  ------------------
  |  Branch (859:14): [True: 0, False: 733k]
  ------------------
  860|       |    // 'import' can indicate an import declaration, but it's also possible a
  861|       |    // Statement begins with a call to `import()`, so do a lookahead to see if
  862|       |    // the next token is '('.
  863|       |    // It can also be import.meta, so check for '.'.
  864|      0|    auto optNext = lexer_.lookahead1(None);
  865|      0|    if (optNext.hasValue() &&
  ------------------
  |  Branch (865:9): [True: 0, False: 0]
  ------------------
  866|      0|        (*optNext == TokenKind::l_paren || *optNext == TokenKind::period)) {
  ------------------
  |  Branch (866:10): [True: 0, False: 0]
  |  Branch (866:44): [True: 0, False: 0]
  ------------------
  867|      0|      auto stmt = parseStatement(param.get(ParamReturn));
  868|      0|      if (!stmt)
  ------------------
  |  Branch (868:11): [True: 0, False: 0]
  ------------------
  869|      0|        return false;
  870|       |
  871|      0|      stmtList.push_back(*stmt.getValue());
  872|      0|    } else {
  873|      0|      auto importDecl = parseImportDeclaration();
  874|      0|      if (!importDecl) {
  ------------------
  |  Branch (874:11): [True: 0, False: 0]
  ------------------
  875|      0|        return false;
  876|      0|      }
  877|       |
  878|      0|      stmtList.push_back(*importDecl.getValue());
  879|      0|      if (allowImportExport == AllowImportExport::No) {
  ------------------
  |  Branch (879:11): [True: 0, False: 0]
  ------------------
  880|      0|        error(
  881|      0|            importDecl.getValue()->getSourceRange(),
  882|      0|            "import declaration must be at top level of module");
  883|      0|      }
  884|      0|    }
  885|   733k|  } else if (tok_->getKind() == TokenKind::rw_export) {
  ------------------
  |  Branch (885:14): [True: 0, False: 733k]
  ------------------
  886|      0|    auto exportDecl = parseExportDeclaration();
  887|      0|    if (!exportDecl) {
  ------------------
  |  Branch (887:9): [True: 0, False: 0]
  ------------------
  888|      0|      return false;
  889|      0|    }
  890|       |
  891|      0|    if (allowImportExport == AllowImportExport::Yes) {
  ------------------
  |  Branch (891:9): [True: 0, False: 0]
  ------------------
  892|      0|      stmtList.push_back(**exportDecl);
  893|      0|    } else {
  894|      0|      error(
  895|      0|          exportDecl.getValue()->getSourceRange(),
  896|      0|          "export declaration must be at top level of module");
  897|      0|    }
  898|   733k|  } else {
  899|   733k|    auto stmt = parseStatement(param.get(ParamReturn));
  900|   733k|    if (!stmt)
  ------------------
  |  Branch (900:9): [True: 35, False: 733k]
  ------------------
  901|     35|      return false;
  902|       |
  903|   733k|    stmtList.push_back(*stmt.getValue());
  904|   733k|  }
  905|       |
  906|   739k|  return true;
  907|   739k|}
_ZN6hermes6parser6detail12JSParserImpl10parseBlockENS1_5ParamENS0_7JSLexer14GrammarContextEb:
  937|  5.52k|    bool parseDirectives) {
  938|       |  // {
  939|  5.52k|  assert(check(TokenKind::l_brace));
  940|  5.52k|  SMLoc startLoc = advance().Start;
  941|       |
  942|  5.52k|  ESTree::NodeList stmtList;
  943|       |
  944|  5.52k|  if (!parseStatementList(
  ------------------
  |  Branch (944:7): [True: 6, False: 5.52k]
  ------------------
  945|  5.52k|          param,
  946|  5.52k|          TokenKind::r_brace,
  947|  5.52k|          parseDirectives,
  948|  5.52k|          AllowImportExport::No,
  949|  5.52k|          stmtList)) {
  950|      6|    return None;
  951|      6|  }
  952|       |
  953|       |  // }
  954|  5.52k|  auto *body = setLocation(
  955|  5.52k|      startLoc,
  956|  5.52k|      tok_,
  957|  5.52k|      new (context_) ESTree::BlockStatementNode(std::move(stmtList)));
  958|  5.52k|  if (!eat(
  ------------------
  |  Branch (958:7): [True: 0, False: 5.52k]
  ------------------
  959|  5.52k|          TokenKind::r_brace,
  960|  5.52k|          grammarContext,
  961|  5.52k|          "at end of block",
  962|  5.52k|          "block starts here",
  963|  5.52k|          startLoc))
  964|      0|    return None;
  965|       |
  966|  5.52k|  return body;
  967|  5.52k|}
_ZN6hermes6parser6detail12JSParserImpl25validateBindingIdentifierENS1_5ParamEN4llvh7SMRangeEPNS_12UniqueStringENS0_9TokenKindE:
  973|   215k|    TokenKind kind) {
  974|   215k|  if (id == yieldIdent_) {
  ------------------
  |  Branch (974:7): [True: 0, False: 215k]
  ------------------
  975|       |    // yield is permitted as BindingIdentifier in the grammar,
  976|       |    // and prohibited with static semantics.
  977|      0|    if (isStrictMode() || paramYield_) {
  ------------------
  |  Branch (977:9): [True: 0, False: 0]
  |  Branch (977:27): [True: 0, False: 0]
  ------------------
  978|      0|      error(range, "Unexpected usage of 'yield' as an identifier");
  979|      0|    }
  980|      0|  }
  981|       |
  982|   215k|  if (id == awaitIdent_) {
  ------------------
  |  Branch (982:7): [True: 0, False: 215k]
  ------------------
  983|       |    // await is permitted as BindingIdentifier in the grammar,
  984|       |    // and prohibited with static semantics.
  985|      0|    if (paramAwait_) {
  ------------------
  |  Branch (985:9): [True: 0, False: 0]
  ------------------
  986|      0|      error(range, "Unexpected usage of 'await' as an identifier");
  987|      0|    }
  988|      0|  }
  989|       |
  990|   215k|  if (isStrictMode() && id == letIdent_) {
  ------------------
  |  Branch (990:7): [True: 0, False: 215k]
  |  Branch (990:25): [True: 0, False: 0]
  ------------------
  991|       |    // ES9.0 12.1.1
  992|       |    // BindingIdentifier : Identifier
  993|       |    // Identifier : IdentifierName (but not ReservedWord)
  994|       |    // It is a Syntax Error if this phrase is contained in strict mode code
  995|       |    // and the StringValue of IdentifierName is: "implements", "interface",
  996|       |    // "let", "package", "private", "protected", "public", "static", or
  997|       |    // "yield".
  998|       |    // NOTE: All except 'let' are scanned as reserved words instead of
  999|       |    // identifiers, so we only check for `let` here.
 1000|      0|    error(
 1001|      0|        range,
 1002|      0|        "Invalid use of strict mode reserved word as binding identifier");
 1003|      0|  }
 1004|       |
 1005|   215k|  return kind == TokenKind::identifier || kind == TokenKind::rw_yield;
  ------------------
  |  Branch (1005:10): [True: 215k, False: 0]
  |  Branch (1005:43): [True: 0, False: 0]
  ------------------
 1006|   215k|}
_ZN6hermes6parser6detail12JSParserImpl22parseBindingIdentifierENS1_5ParamE:
 1009|  9.49k|    Param param) {
 1010|  9.49k|  if (!check(TokenKind::identifier) && !tok_->isResWord()) {
  ------------------
  |  Branch (1010:7): [True: 168, False: 9.33k]
  |  Branch (1010:40): [True: 168, False: 0]
  ------------------
 1011|    168|    return None;
 1012|    168|  }
 1013|  9.33k|  SMRange identRng = tok_->getSourceRange();
 1014|       |
 1015|       |  // If we have an identifier or reserved word, then store it and the kind,
 1016|       |  // and pass it to the validateBindingIdentifier function.
 1017|  9.33k|  UniqueString *id = tok_->getResWordOrIdentifier();
 1018|  9.33k|  TokenKind kind = tok_->getKind();
 1019|  9.33k|  if (!validateBindingIdentifier(param, tok_->getSourceRange(), id, kind)) {
  ------------------
  |  Branch (1019:7): [True: 0, False: 9.33k]
  ------------------
 1020|      0|    return None;
 1021|      0|  }
 1022|  9.33k|  advance();
 1023|       |
 1024|  9.33k|  ESTree::Node *type = nullptr;
 1025|  9.33k|  bool optional = false;
 1026|  9.33k|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 1027|  9.33k|  if (context_.getParseTypes()) {
  ------------------
  |  Branch (1027:7): [True: 0, False: 9.33k]
  ------------------
 1028|      0|    if (check(TokenKind::question)) {
  ------------------
  |  Branch (1028:9): [True: 0, False: 0]
  ------------------
 1029|      0|      optional = true;
 1030|      0|      advance(JSLexer::GrammarContext::Type);
 1031|      0|    }
 1032|       |
 1033|      0|    if (check(TokenKind::colon)) {
  ------------------
  |  Branch (1033:9): [True: 0, False: 0]
  ------------------
 1034|      0|      SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 1035|      0|      auto optType = parseTypeAnnotation(annotStart);
 1036|      0|      if (!optType)
  ------------------
  |  Branch (1036:11): [True: 0, False: 0]
  ------------------
 1037|      0|        return None;
 1038|      0|      type = *optType;
 1039|      0|    }
 1040|      0|  }
 1041|  9.33k|#endif
 1042|       |
 1043|  9.33k|  return setLocation(
 1044|  9.33k|      identRng,
 1045|  9.33k|      getPrevTokenEndLoc(),
 1046|  9.33k|      new (context_) ESTree::IdentifierNode(id, type, optional));
 1047|  9.33k|}
_ZN6hermes6parser6detail12JSParserImpl23parseLexicalDeclarationENS1_5ParamE:
 1050|  3.89k|JSParserImpl::parseLexicalDeclaration(Param param) {
 1051|  3.89k|  assert(
 1052|  3.89k|      (check(TokenKind::rw_var) || check(TokenKind::rw_const) ||
 1053|  3.89k|       check(letIdent_)) &&
 1054|  3.89k|      "parseLexicalDeclaration() expects var/const/let");
 1055|  3.89k|  bool isConst = check(TokenKind::rw_const);
 1056|  3.89k|  auto kindIdent = tok_->getResWordOrIdentifier();
 1057|       |
 1058|  3.89k|  SMLoc startLoc = advance().Start;
 1059|       |
 1060|  3.89k|  ESTree::NodeList declList;
 1061|  3.89k|  if (!parseVariableDeclarationList(param, declList, startLoc))
  ------------------
  |  Branch (1061:7): [True: 0, False: 3.89k]
  ------------------
 1062|      0|    return None;
 1063|       |
 1064|  3.89k|  if (!eatSemi())
  ------------------
  |  Branch (1064:7): [True: 0, False: 3.89k]
  ------------------
 1065|      0|    return None;
 1066|       |
 1067|  3.89k|  if (isConst) {
  ------------------
  |  Branch (1067:7): [True: 0, False: 3.89k]
  ------------------
 1068|      0|    for (const ESTree::Node &decl : declList) {
  ------------------
  |  Branch (1068:35): [True: 0, False: 0]
  ------------------
 1069|      0|      const auto *varDecl = cast<ESTree::VariableDeclaratorNode>(&decl);
 1070|      0|      if (!varDecl->_init) {
  ------------------
  |  Branch (1070:11): [True: 0, False: 0]
  ------------------
 1071|       |        // ES9.0 13.3.1.1
 1072|       |        // LexicalBinding : BindingIdentifier Initializer
 1073|       |        // It is a Syntax Error if Initializer is not present and
 1074|       |        // IsConstantDeclaration of the LexicalDeclaration containing this
 1075|       |        // LexicalBinding is true.
 1076|       |        // Note that we don't perform this check in the SemanticValidator
 1077|       |        // because `const` declarations in `for` loops don't need initializers.
 1078|      0|        error(
 1079|      0|            varDecl->getSourceRange(),
 1080|      0|            "missing initializer in const declaration");
 1081|      0|      }
 1082|      0|    }
 1083|      0|  }
 1084|       |
 1085|  3.89k|  auto *res = setLocation(
 1086|  3.89k|      startLoc,
 1087|  3.89k|      getPrevTokenEndLoc(),
 1088|  3.89k|      new (context_)
 1089|  3.89k|          ESTree::VariableDeclarationNode(kindIdent, std::move(declList)));
 1090|       |
 1091|  3.89k|  ensureDestructuringInitialized(res);
 1092|       |
 1093|  3.89k|  return res;
 1094|  3.89k|}
_ZN6hermes6parser6detail12JSParserImpl22parseVariableStatementENS1_5ParamE:
 1097|  3.84k|JSParserImpl::parseVariableStatement(Param param) {
 1098|  3.84k|  return parseLexicalDeclaration(ParamIn);
 1099|  3.84k|}
_ZN6hermes6parser6detail12JSParserImpl28parseVariableDeclarationListENS1_5ParamERN4llvh12simple_ilistINS_6ESTree4NodeEJEEENS4_5SMLocE:
 1116|  3.89k|    SMLoc declLoc) {
 1117|  3.89k|  do {
 1118|  3.89k|    auto optDecl = parseVariableDeclaration(param, declLoc);
 1119|  3.89k|    if (!optDecl)
  ------------------
  |  Branch (1119:9): [True: 0, False: 3.89k]
  ------------------
 1120|      0|      return None;
 1121|  3.89k|    declList.push_back(*optDecl.getValue());
 1122|  3.89k|  } while (checkAndEat(TokenKind::comma));
  ------------------
  |  Branch (1122:12): [True: 0, False: 3.89k]
  ------------------
 1123|       |
 1124|  3.89k|  return "OK";
 1125|  3.89k|}
_ZN6hermes6parser6detail12JSParserImpl30ensureDestructuringInitializedEPNS_6ESTree23VariableDeclarationNodeE:
 1128|  3.89k|    ESTree::VariableDeclarationNode *declNode) {
 1129|  3.89k|  for (auto &elem : declNode->_declarations) {
  ------------------
  |  Branch (1129:19): [True: 3.89k, False: 3.89k]
  ------------------
 1130|  3.89k|    auto *declarator = cast<ESTree::VariableDeclaratorNode>(&elem);
 1131|       |
 1132|  3.89k|    if (!isa<ESTree::PatternNode>(declarator->_id) || declarator->_init)
  ------------------
  |  Branch (1132:9): [True: 3.89k, False: 0]
  |  Branch (1132:55): [True: 0, False: 0]
  ------------------
 1133|  3.89k|      continue;
 1134|       |
 1135|      0|    error(
 1136|      0|        declarator->_id->getSourceRange(),
 1137|      0|        "destucturing declaration must be initialized");
 1138|      0|  }
 1139|  3.89k|}
_ZN6hermes6parser6detail12JSParserImpl24parseVariableDeclarationENS1_5ParamEN4llvh5SMLocE:
 1142|  3.89k|JSParserImpl::parseVariableDeclaration(Param param, SMLoc declLoc) {
 1143|  3.89k|  ESTree::Node *target;
 1144|  3.89k|  SMLoc startLoc = tok_->getStartLoc();
 1145|       |
 1146|  3.89k|  if (check(TokenKind::l_square, TokenKind::l_brace)) {
  ------------------
  |  Branch (1146:7): [True: 0, False: 3.89k]
  ------------------
 1147|      0|    auto optPat = parseBindingPattern(param);
 1148|      0|    if (!optPat)
  ------------------
  |  Branch (1148:9): [True: 0, False: 0]
  ------------------
 1149|      0|      return None;
 1150|       |
 1151|      0|    target = *optPat;
 1152|  3.89k|  } else {
 1153|  3.89k|    auto optIdent = parseBindingIdentifier(Param{});
 1154|  3.89k|    if (!optIdent) {
  ------------------
  |  Branch (1154:9): [True: 0, False: 3.89k]
  ------------------
 1155|      0|      errorExpected(
 1156|      0|          TokenKind::identifier,
 1157|      0|          "in declaration",
 1158|      0|          "declaration started here",
 1159|      0|          declLoc);
 1160|      0|      return None;
 1161|      0|    }
 1162|       |
 1163|  3.89k|    target = *optIdent;
 1164|  3.89k|  }
 1165|       |
 1166|       |  // No initializer?
 1167|  3.89k|  if (!check(TokenKind::equal)) {
  ------------------
  |  Branch (1167:7): [True: 3.89k, False: 0]
  ------------------
 1168|  3.89k|    return setLocation(
 1169|  3.89k|        startLoc,
 1170|  3.89k|        getPrevTokenEndLoc(),
 1171|  3.89k|        new (context_) ESTree::VariableDeclaratorNode(nullptr, target));
 1172|  3.89k|  };
 1173|       |
 1174|       |  // Parse the initializer.
 1175|      0|  auto debugLoc = advance().Start;
 1176|       |
 1177|      0|  auto expr = parseAssignmentExpression(
 1178|      0|      param, AllowTypedArrowFunction::Yes, CoverTypedParameters::No);
 1179|      0|  if (!expr)
  ------------------
  |  Branch (1179:7): [True: 0, False: 0]
  ------------------
 1180|      0|    return None;
 1181|       |
 1182|      0|  return setLocation(
 1183|      0|      startLoc,
 1184|      0|      getPrevTokenEndLoc(),
 1185|      0|      debugLoc,
 1186|      0|      new (context_) ESTree::VariableDeclaratorNode(*expr, target));
 1187|      0|}
_ZN6hermes6parser6detail12JSParserImpl19parseBindingElementENS1_5ParamE:
 1270|      1|Optional<ESTree::Node *> JSParserImpl::parseBindingElement(Param param) {
 1271|      1|  CHECK_RECURSION;
  ------------------
  |  | 1538|      1|  TrackRecursion trackRecursion{this}; \
  |  | 1539|      1|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 1]
  |  |  ------------------
  |  | 1540|      1|    return llvh::None;
  ------------------
 1272|      1|  ESTree::Node *elem;
 1273|       |
 1274|      1|  if (check(TokenKind::l_square, TokenKind::l_brace)) {
  ------------------
  |  Branch (1274:7): [True: 0, False: 1]
  ------------------
 1275|      0|    auto optPat = parseBindingPattern(param);
 1276|      0|    if (!optPat)
  ------------------
  |  Branch (1276:9): [True: 0, False: 0]
  ------------------
 1277|      0|      return None;
 1278|      0|    elem = *optPat;
 1279|      1|  } else {
 1280|      1|    auto optIdent = parseBindingIdentifier(param);
 1281|      1|    if (!optIdent) {
  ------------------
  |  Branch (1281:9): [True: 0, False: 1]
  ------------------
 1282|      0|      error(
 1283|      0|          tok_->getStartLoc(),
 1284|      0|          "identifier, '{' or '[' expected in binding pattern");
 1285|      0|      return None;
 1286|      0|    }
 1287|      1|    elem = *optIdent;
 1288|      1|  }
 1289|       |
 1290|       |  // No initializer?
 1291|      1|  if (!check(TokenKind::equal))
  ------------------
  |  Branch (1291:7): [True: 1, False: 0]
  ------------------
 1292|      1|    return elem;
 1293|       |
 1294|      0|  auto optInit = parseBindingInitializer(param, elem);
 1295|      0|  if (!optInit)
  ------------------
  |  Branch (1295:7): [True: 0, False: 0]
  ------------------
 1296|      0|    return None;
 1297|      0|  return *optInit;
 1298|      0|}
_ZN6hermes6parser6detail12JSParserImpl19parseEmptyStatementEv:
 1499|  10.6k|Optional<ESTree::EmptyStatementNode *> JSParserImpl::parseEmptyStatement() {
 1500|  10.6k|  assert(check(TokenKind::semi));
 1501|  10.6k|  auto *empty =
 1502|  10.6k|      setLocation(tok_, tok_, new (context_) ESTree::EmptyStatementNode());
 1503|  10.6k|  advance();
 1504|       |
 1505|  10.6k|  return empty;
 1506|  10.6k|}
_ZN6hermes6parser6detail12JSParserImpl34parseExpressionOrLabelledStatementENS1_5ParamE:
 1509|  1.21M|    Param param) {
 1510|  1.21M|  bool startsWithIdentifier = check(TokenKind::identifier);
 1511|       |
 1512|       |  // ES9.0 13.5
 1513|       |  // Lookahead cannot be any of: {, function, async function, class, let [
 1514|       |  // Allow execution to continue because the expression may be parsed,
 1515|       |  // but report an error because it will be ambiguous whether the parse was
 1516|       |  // correct.
 1517|  1.21M|  if (checkN(TokenKind::l_brace, TokenKind::rw_function, TokenKind::rw_class) ||
  ------------------
  |  Branch (1517:7): [True: 0, False: 1.21M]
  ------------------
 1518|  1.21M|      (check(asyncIdent_) && checkAsyncFunction())) {
  ------------------
  |  Branch (1518:8): [True: 125, False: 1.21M]
  |  Branch (1518:30): [True: 0, False: 125]
  ------------------
 1519|       |    // There's no need to stop reporting errors.
 1520|      0|    error(
 1521|      0|        tok_->getSourceRange(),
 1522|      0|        "declaration not allowed as expression statement");
 1523|      0|  }
 1524|       |
 1525|  1.21M|  if (check(letIdent_)) {
  ------------------
  |  Branch (1525:7): [True: 0, False: 1.21M]
  ------------------
 1526|      0|    SMLoc letLoc = advance().Start;
 1527|      0|    if (check(TokenKind::l_square)) {
  ------------------
  |  Branch (1527:9): [True: 0, False: 0]
  ------------------
 1528|       |      // let [
 1529|      0|      error(
 1530|      0|          {letLoc, tok_->getEndLoc()},
 1531|      0|          "ambiguous 'let [': either a 'let' binding or a member expression");
 1532|      0|    }
 1533|      0|    lexer_.seek(letLoc);
 1534|      0|    advance();
 1535|      0|  }
 1536|       |
 1537|  1.21M|  SMLoc startLoc = tok_->getStartLoc();
 1538|  1.21M|  auto optExpr = parseExpression(ParamIn, CoverTypedParameters::No);
 1539|  1.21M|  if (!optExpr)
  ------------------
  |  Branch (1539:7): [True: 29, False: 1.21M]
  ------------------
 1540|     29|    return None;
 1541|       |
 1542|       |  // Check whether this is a label. The expression must have started with an
 1543|       |  // identifier, be just an identifier and be
 1544|       |  // followed by ':'
 1545|  1.21M|  if (startsWithIdentifier && isa<ESTree::IdentifierNode>(optExpr.getValue()) &&
  ------------------
  |  Branch (1545:7): [True: 1.19M, False: 21.2k]
  |  Branch (1545:31): [True: 1.08M, False: 104k]
  ------------------
 1546|  1.21M|      checkAndEat(TokenKind::colon)) {
  ------------------
  |  Branch (1546:7): [True: 492k, False: 593k]
  ------------------
 1547|   492k|    auto *id = cast<ESTree::IdentifierNode>(optExpr.getValue());
 1548|       |
 1549|   492k|    ESTree::Node *body = nullptr;
 1550|   492k|    if (check(TokenKind::rw_function)) {
  ------------------
  |  Branch (1550:9): [True: 0, False: 492k]
  ------------------
 1551|      0|      auto optFunc = parseFunctionDeclaration(param);
 1552|      0|      if (!optFunc)
  ------------------
  |  Branch (1552:11): [True: 0, False: 0]
  ------------------
 1553|      0|        return None;
 1554|       |      /// ES9.0 13.13.1
 1555|       |      /// It is a Syntax Error if any source text matches this rule.
 1556|       |      /// LabelledItem : FunctionDeclaration
 1557|       |      /// NOTE: GeneratorDeclarations are disallowed as part of the grammar
 1558|       |      /// as well, so all FunctionDeclarations are disallowed as labeled
 1559|       |      /// items, except via an AnnexB extension which is unsupported in
 1560|       |      /// Hermes.
 1561|      0|      error(
 1562|      0|          optFunc.getValue()->getSourceRange().Start,
 1563|      0|          "Function declaration not allowed as body of labeled statement");
 1564|      0|      body = optFunc.getValue();
 1565|   492k|    } else {
 1566|       |      // Statement
 1567|   492k|      auto optBody = parseStatement(param.get(ParamReturn));
 1568|   492k|      if (!optBody)
  ------------------
  |  Branch (1568:11): [True: 4, False: 492k]
  ------------------
 1569|      4|        return None;
 1570|   492k|      body = optBody.getValue();
 1571|   492k|    }
 1572|       |
 1573|   492k|    return setLocation(
 1574|   492k|        id, body, new (context_) ESTree::LabeledStatementNode(id, body));
 1575|   719k|  } else {
 1576|   719k|    if (!eatSemi())
  ------------------
  |  Branch (1576:9): [True: 4, False: 719k]
  ------------------
 1577|      4|      return None;
 1578|       |
 1579|   719k|    return setLocation(
 1580|   719k|        startLoc,
 1581|   719k|        getPrevTokenEndLoc(),
 1582|   719k|        new (context_)
 1583|   719k|            ESTree::ExpressionStatementNode(optExpr.getValue(), nullptr));
 1584|   719k|  }
 1585|  1.21M|}
_ZN6hermes6parser6detail12JSParserImpl17parseForStatementENS1_5ParamE:
 1749|     32|Optional<ESTree::Node *> JSParserImpl::parseForStatement(Param param) {
 1750|     32|  assert(check(TokenKind::rw_for));
 1751|     32|  SMLoc startLoc = advance().Start;
 1752|       |
 1753|     32|  bool await = false;
 1754|     32|  SMRange awaitRng;
 1755|     32|  if (paramAwait_ && check(awaitIdent_)) {
  ------------------
  |  Branch (1755:7): [True: 0, False: 32]
  |  Branch (1755:22): [True: 0, False: 0]
  ------------------
 1756|      0|    awaitRng = advance();
 1757|      0|    await = true;
 1758|      0|  }
 1759|       |
 1760|     32|  SMLoc lparenLoc = tok_->getStartLoc();
 1761|     32|  if (!eat(
  ------------------
  |  Branch (1761:7): [True: 0, False: 32]
  ------------------
 1762|     32|          TokenKind::l_paren,
 1763|     32|          JSLexer::AllowRegExp,
 1764|     32|          "after 'for'",
 1765|     32|          "location of 'for'",
 1766|     32|          startLoc))
 1767|      0|    return None;
 1768|       |
 1769|     32|  ESTree::VariableDeclarationNode *decl = nullptr;
 1770|     32|  ESTree::NodePtr expr1 = nullptr;
 1771|       |
 1772|     32|  if (checkN(TokenKind::rw_var, TokenKind::rw_const, letIdent_)) {
  ------------------
  |  Branch (1772:7): [True: 0, False: 32]
  ------------------
 1773|       |    // Productions valid here:
 1774|       |    //   for ( var/let/const VariableDeclarationList
 1775|       |    //   for [await] ( var/let/const VariableDeclaration
 1776|      0|    SMLoc varStartLoc = tok_->getStartLoc();
 1777|      0|    auto *declIdent = tok_->getResWordOrIdentifier();
 1778|      0|    advance();
 1779|       |
 1780|      0|    ESTree::NodeList declList;
 1781|      0|    if (!parseVariableDeclarationList(Param{}, declList, varStartLoc))
  ------------------
  |  Branch (1781:9): [True: 0, False: 0]
  ------------------
 1782|      0|      return None;
 1783|       |
 1784|      0|    auto endLoc = declList.back().getEndLoc();
 1785|      0|    decl = setLocation(
 1786|      0|        varStartLoc,
 1787|      0|        endLoc,
 1788|      0|        new (context_)
 1789|      0|            ESTree::VariableDeclarationNode(declIdent, std::move(declList)));
 1790|     32|  } else {
 1791|     32|    if (!check(TokenKind::semi)) {
  ------------------
  |  Branch (1791:9): [True: 31, False: 1]
  ------------------
 1792|     31|      llvh::Optional<ESTree::Node *> optExpr1;
 1793|     31|      if (await) {
  ------------------
  |  Branch (1793:11): [True: 0, False: 31]
  ------------------
 1794|       |        //   for await ( LeftHandSideExpression
 1795|       |        //               ^
 1796|      0|        optExpr1 = parseLeftHandSideExpression();
 1797|     31|      } else {
 1798|       |        // ForStatement:
 1799|       |        //   for ( Expression_opt
 1800|       |        //         ^
 1801|       |        // ForInOfStatement:
 1802|       |        //   for ( LeftHandSideExpression
 1803|       |        //         ^
 1804|       |        // Lookahead for LeftHandSideExpression cannot be 'let' or 'async of'.
 1805|       |        // We've handled `let` above.
 1806|       |        // To distinguish between the two productions here, we let the resolver
 1807|       |        // check that the LHS of the `of` or `in` is valid (the resolver will
 1808|       |        // throw the error instead of the parser).
 1809|     31|        optExpr1 = parseExpression(Param{});
 1810|     31|      }
 1811|     31|      if (!optExpr1)
  ------------------
  |  Branch (1811:11): [True: 0, False: 31]
  ------------------
 1812|      0|        return None;
 1813|     31|      expr1 = optExpr1.getValue();
 1814|     31|    }
 1815|     32|  }
 1816|       |
 1817|     32|  if (checkN(TokenKind::rw_in, ofIdent_)) {
  ------------------
  |  Branch (1817:7): [True: 31, False: 1]
  ------------------
 1818|       |    // Productions valid here:
 1819|       |    //   for [await] ( var/let/const VariableDeclaration[In] in/of
 1820|       |    //   for [await] ( LeftHandSideExpression in/of
 1821|       |
 1822|     31|    if (decl && decl->_declarations.size() > 1) {
  ------------------
  |  Branch (1822:9): [True: 0, False: 31]
  |  Branch (1822:17): [True: 0, False: 0]
  ------------------
 1823|      0|      error(
 1824|      0|          decl->getSourceRange(),
 1825|      0|          "Only one binding must be declared in a for-in/for-of loop");
 1826|      0|      return None;
 1827|      0|    }
 1828|       |
 1829|       |    // Check for destructuring pattern on the left and reparse it.
 1830|     31|    if (expr1 &&
  ------------------
  |  Branch (1830:9): [True: 31, False: 0]
  ------------------
 1831|     31|        (isa<ESTree::ArrayExpressionNode>(expr1) ||
  ------------------
  |  Branch (1831:10): [True: 0, False: 31]
  ------------------
 1832|     31|         isa<ESTree::ObjectExpressionNode>(expr1))) {
  ------------------
  |  Branch (1832:10): [True: 0, False: 31]
  ------------------
 1833|      0|      auto optExpr1 = reparseAssignmentPattern(expr1, false);
 1834|      0|      if (!optExpr1)
  ------------------
  |  Branch (1834:11): [True: 0, False: 0]
  ------------------
 1835|      0|        return None;
 1836|      0|      expr1 = *optExpr1;
 1837|      0|    }
 1838|       |
 1839|       |    // Remember whether we are parsing for-in or for-of.
 1840|     31|    bool const forInLoop = check(TokenKind::rw_in);
 1841|     31|    advance();
 1842|       |
 1843|     31|    if (forInLoop && await)
  ------------------
  |  Branch (1843:9): [True: 31, False: 0]
  |  Branch (1843:22): [True: 0, False: 31]
  ------------------
 1844|      0|      error(awaitRng, "unexpected 'await' in for..in loop");
 1845|       |
 1846|     31|    auto optRightExpr =
 1847|     31|        forInLoop ? parseExpression() : parseAssignmentExpression(ParamIn);
  ------------------
  |  Branch (1847:9): [True: 31, False: 0]
  ------------------
 1848|       |
 1849|     31|    if (!eat(
  ------------------
  |  Branch (1849:9): [True: 0, False: 31]
  ------------------
 1850|     31|            TokenKind::r_paren,
 1851|     31|            JSLexer::AllowRegExp,
 1852|     31|            "after 'for(... in/of ...'",
 1853|     31|            "location of '('",
 1854|     31|            lparenLoc))
 1855|      0|      return None;
 1856|       |
 1857|     31|    auto optBody = parseStatement(param.get(ParamReturn));
 1858|     31|    if (!optBody || !optRightExpr)
  ------------------
  |  Branch (1858:9): [True: 0, False: 31]
  |  Branch (1858:21): [True: 0, False: 31]
  ------------------
 1859|      0|      return None;
 1860|       |
 1861|     31|    ESTree::Node *node;
 1862|     31|    if (forInLoop) {
  ------------------
  |  Branch (1862:9): [True: 31, False: 0]
  ------------------
 1863|     31|      node = new (context_) ESTree::ForInStatementNode(
 1864|     31|          decl ? decl : expr1, optRightExpr.getValue(), optBody.getValue());
  ------------------
  |  Branch (1864:11): [True: 0, False: 31]
  ------------------
 1865|     31|    } else {
 1866|      0|      node = new (context_) ESTree::ForOfStatementNode(
 1867|      0|          decl ? decl : expr1,
  ------------------
  |  Branch (1867:11): [True: 0, False: 0]
  ------------------
 1868|      0|          optRightExpr.getValue(),
 1869|      0|          optBody.getValue(),
 1870|      0|          await);
 1871|      0|    }
 1872|     31|    return setLocation(startLoc, optBody.getValue(), node);
 1873|     31|  } else if (checkAndEat(TokenKind::semi)) {
  ------------------
  |  Branch (1873:14): [True: 1, False: 0]
  ------------------
 1874|       |    // Productions valid here:
 1875|       |    //   for ( var/let/const VariableDeclarationList[In] ; Expressionopt ;
 1876|       |    //   Expressionopt )
 1877|       |    //       Statement
 1878|       |    //   for ( Expression[In]opt ; Expressionopt ; Expressionopt ) Statement
 1879|       |
 1880|      1|    if (await)
  ------------------
  |  Branch (1880:9): [True: 0, False: 1]
  ------------------
 1881|      0|      error(awaitRng, "unexpected 'await' in for loop without 'of'");
 1882|       |
 1883|      1|    if (decl)
  ------------------
  |  Branch (1883:9): [True: 0, False: 1]
  ------------------
 1884|      0|      ensureDestructuringInitialized(decl);
 1885|       |
 1886|      1|    ESTree::NodePtr test = nullptr;
 1887|      1|    if (!check(TokenKind::semi)) {
  ------------------
  |  Branch (1887:9): [True: 1, False: 0]
  ------------------
 1888|      1|      auto optTest = parseExpression();
 1889|      1|      if (!optTest)
  ------------------
  |  Branch (1889:11): [True: 0, False: 1]
  ------------------
 1890|      0|        return None;
 1891|      1|      test = optTest.getValue();
 1892|      1|    }
 1893|       |
 1894|      1|    if (!eat(
  ------------------
  |  Branch (1894:9): [True: 0, False: 1]
  ------------------
 1895|      1|            TokenKind::semi,
 1896|      1|            JSLexer::AllowRegExp,
 1897|      1|            "after 'for( ... ; ...'",
 1898|      1|            "location of '('",
 1899|      1|            lparenLoc))
 1900|      0|      return None;
 1901|       |
 1902|      1|    ESTree::NodePtr update = nullptr;
 1903|      1|    if (!check(TokenKind::r_paren)) {
  ------------------
  |  Branch (1903:9): [True: 0, False: 1]
  ------------------
 1904|      0|      auto optUpdate = parseExpression();
 1905|      0|      if (!optUpdate)
  ------------------
  |  Branch (1905:11): [True: 0, False: 0]
  ------------------
 1906|      0|        return None;
 1907|      0|      update = optUpdate.getValue();
 1908|      0|    }
 1909|       |
 1910|      1|    if (!eat(
  ------------------
  |  Branch (1910:9): [True: 0, False: 1]
  ------------------
 1911|      1|            TokenKind::r_paren,
 1912|      1|            JSLexer::AllowRegExp,
 1913|      1|            "after 'for( ... ; ... ; ...'",
 1914|      1|            "location of '('",
 1915|      1|            lparenLoc))
 1916|      0|      return None;
 1917|       |
 1918|      1|    auto optBody = parseStatement(param.get(ParamReturn));
 1919|      1|    if (!optBody)
  ------------------
  |  Branch (1919:9): [True: 1, False: 0]
  ------------------
 1920|      1|      return None;
 1921|       |
 1922|      0|    return setLocation(
 1923|      0|        startLoc,
 1924|      0|        optBody.getValue(),
 1925|      0|        new (context_) ESTree::ForStatementNode(
 1926|      0|            decl ? decl : expr1, test, update, optBody.getValue()));
  ------------------
  |  Branch (1926:13): [True: 0, False: 0]
  ------------------
 1927|      1|  } else {
 1928|      0|    errorExpected(
 1929|      0|        TokenKind::semi,
 1930|      0|        TokenKind::rw_in,
 1931|      0|        "inside 'for'",
 1932|      0|        "location of the 'for'",
 1933|      0|        startLoc);
 1934|      0|    return None;
 1935|      0|  }
 1936|     32|}
_ZN6hermes6parser6detail12JSParserImpl19parseBreakStatementEv:
 1971|      1|Optional<ESTree::BreakStatementNode *> JSParserImpl::parseBreakStatement() {
 1972|      1|  assert(check(TokenKind::rw_break));
 1973|      1|  SMLoc startLoc = advance().Start;
 1974|       |
 1975|      1|  if (eatSemi(true))
  ------------------
  |  Branch (1975:7): [True: 0, False: 1]
  ------------------
 1976|      0|    return setLocation(
 1977|      0|        startLoc,
 1978|      0|        getPrevTokenEndLoc(),
 1979|      0|        new (context_) ESTree::BreakStatementNode(nullptr));
 1980|       |
 1981|      1|  if (!need(
  ------------------
  |  Branch (1981:7): [True: 0, False: 1]
  ------------------
 1982|      1|          TokenKind::identifier,
 1983|      1|          "after 'break'",
 1984|      1|          "location of 'break'",
 1985|      1|          startLoc))
 1986|      0|    return None;
 1987|      1|  auto *id = setLocation(
 1988|      1|      tok_,
 1989|      1|      tok_,
 1990|      1|      new (context_)
 1991|      1|          ESTree::IdentifierNode(tok_->getIdentifier(), nullptr, false));
 1992|      1|  advance();
 1993|       |
 1994|      1|  if (!eatSemi())
  ------------------
  |  Branch (1994:7): [True: 0, False: 1]
  ------------------
 1995|      0|    return None;
 1996|       |
 1997|      1|  return setLocation(
 1998|      1|      startLoc,
 1999|      1|      getPrevTokenEndLoc(),
 2000|      1|      new (context_) ESTree::BreakStatementNode(id));
 2001|      1|}
_ZN6hermes6parser6detail12JSParserImpl22parsePrimaryExpressionEv:
 2324|  8.90M|Optional<ESTree::Node *> JSParserImpl::parsePrimaryExpression() {
 2325|  8.90M|  CHECK_RECURSION;
  ------------------
  |  | 1538|  8.90M|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  8.90M|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 4, False: 8.90M]
  |  |  ------------------
  |  | 1540|  8.90M|    return llvh::None;
  ------------------
 2326|       |
 2327|  8.90M|  switch (tok_->getKind()) {
 2328|      4|    case TokenKind::rw_this: {
  ------------------
  |  Branch (2328:5): [True: 4, False: 8.90M]
  ------------------
 2329|      4|      auto *res =
 2330|      4|          setLocation(tok_, tok_, new (context_) ESTree::ThisExpressionNode());
 2331|      4|      advance(JSLexer::AllowDiv);
 2332|      4|      return res;
 2333|      0|    }
 2334|       |
 2335|  3.34M|    case TokenKind::identifier: {
  ------------------
  |  Branch (2335:5): [True: 3.34M, False: 5.56M]
  ------------------
 2336|  3.34M|      if (check(yieldIdent_)) {
  ------------------
  |  Branch (2336:11): [True: 0, False: 3.34M]
  ------------------
 2337|       |        // yield is only allowed as an IdentifierReference when ParamYield is
 2338|       |        // false.
 2339|      0|        if (paramYield_) {
  ------------------
  |  Branch (2339:13): [True: 0, False: 0]
  ------------------
 2340|      0|          error(
 2341|      0|              tok_->getSourceRange(),
 2342|      0|              "Unexpected usage of 'yield' as an identifier reference");
 2343|      0|        }
 2344|      0|      }
 2345|  3.34M|      if (check(asyncIdent_) && checkAsyncFunction()) {
  ------------------
  |  Branch (2345:11): [True: 125, False: 3.34M]
  |  Branch (2345:33): [True: 0, False: 125]
  ------------------
 2346|      0|        auto func = parseFunctionExpression();
 2347|      0|        if (!func)
  ------------------
  |  Branch (2347:13): [True: 0, False: 0]
  ------------------
 2348|      0|          return None;
 2349|      0|        return func.getValue();
 2350|      0|      }
 2351|  3.34M|#if HERMES_PARSE_FLOW
 2352|  3.34M|      if (context_.getParseFlow() && context_.getParseFlowMatch() &&
  ------------------
  |  Branch (2352:11): [True: 0, False: 3.34M]
  |  Branch (2352:38): [True: 0, False: 0]
  ------------------
 2353|  3.34M|          checkMaybeFlowMatch()) {
  ------------------
  |  Branch (2353:11): [True: 0, False: 0]
  ------------------
 2354|      0|        return parseMatchCallOrMatchExpressionFlow();
 2355|      0|      }
 2356|  3.34M|#endif
 2357|  3.34M|      auto *res = setLocation(
 2358|  3.34M|          tok_,
 2359|  3.34M|          tok_,
 2360|  3.34M|          new (context_)
 2361|  3.34M|              ESTree::IdentifierNode(tok_->getIdentifier(), nullptr, false));
 2362|  3.34M|      advance(JSLexer::AllowDiv);
 2363|  3.34M|      return res;
 2364|  3.34M|    }
 2365|       |
 2366|      0|    case TokenKind::rw_null: {
  ------------------
  |  Branch (2366:5): [True: 0, False: 8.90M]
  ------------------
 2367|      0|      auto *res =
 2368|      0|          setLocation(tok_, tok_, new (context_) ESTree::NullLiteralNode());
 2369|      0|      advance(JSLexer::AllowDiv);
 2370|      0|      return res;
 2371|  3.34M|    }
 2372|       |
 2373|      0|    case TokenKind::rw_true:
  ------------------
  |  Branch (2373:5): [True: 0, False: 8.90M]
  ------------------
 2374|      0|    case TokenKind::rw_false: {
  ------------------
  |  Branch (2374:5): [True: 0, False: 8.90M]
  ------------------
 2375|      0|      auto *res = setLocation(
 2376|      0|          tok_,
 2377|      0|          tok_,
 2378|      0|          new (context_) ESTree::BooleanLiteralNode(
 2379|      0|              tok_->getKind() == TokenKind::rw_true));
 2380|      0|      advance(JSLexer::AllowDiv);
 2381|      0|      return res;
 2382|      0|    }
 2383|       |
 2384|  5.13M|    case TokenKind::numeric_literal: {
  ------------------
  |  Branch (2384:5): [True: 5.13M, False: 3.77M]
  ------------------
 2385|  5.13M|      auto *res = setLocation(
 2386|  5.13M|          tok_,
 2387|  5.13M|          tok_,
 2388|  5.13M|          new (context_) ESTree::NumericLiteralNode(tok_->getNumericLiteral()));
 2389|  5.13M|      advance(JSLexer::AllowDiv);
 2390|  5.13M|      return res;
 2391|      0|    }
 2392|       |
 2393|     54|    case TokenKind::bigint_literal: {
  ------------------
  |  Branch (2393:5): [True: 54, False: 8.90M]
  ------------------
 2394|     54|      auto *res = setLocation(
 2395|     54|          tok_,
 2396|     54|          tok_,
 2397|     54|          new (context_) ESTree::BigIntLiteralNode(tok_->getBigIntLiteral()));
 2398|     54|      advance(JSLexer::AllowDiv);
 2399|     54|      return res;
 2400|      0|    }
 2401|       |
 2402|     45|    case TokenKind::string_literal: {
  ------------------
  |  Branch (2402:5): [True: 45, False: 8.90M]
  ------------------
 2403|     45|      auto *res = setLocation(
 2404|     45|          tok_,
 2405|     45|          tok_,
 2406|     45|          new (context_) ESTree::StringLiteralNode(tok_->getStringLiteral()));
 2407|     45|      advance(JSLexer::AllowDiv);
 2408|     45|      return res;
 2409|      0|    }
 2410|       |
 2411|    240|    case TokenKind::regexp_literal: {
  ------------------
  |  Branch (2411:5): [True: 240, False: 8.90M]
  ------------------
 2412|    240|      auto *res = setLocation(
 2413|    240|          tok_,
 2414|    240|          tok_,
 2415|    240|          new (context_) ESTree::RegExpLiteralNode(
 2416|    240|              tok_->getRegExpLiteral()->getBody(),
 2417|    240|              tok_->getRegExpLiteral()->getFlags()));
 2418|    240|      advance(JSLexer::AllowDiv);
 2419|    240|      return res;
 2420|      0|    }
 2421|       |
 2422|  45.0k|    case TokenKind::l_square: {
  ------------------
  |  Branch (2422:5): [True: 45.0k, False: 8.86M]
  ------------------
 2423|  45.0k|      auto res = parseArrayLiteral();
 2424|  45.0k|      if (!res)
  ------------------
  |  Branch (2424:11): [True: 12, False: 45.0k]
  ------------------
 2425|     12|        return None;
 2426|  45.0k|      return res.getValue();
 2427|  45.0k|    }
 2428|       |
 2429|      4|    case TokenKind::l_brace: {
  ------------------
  |  Branch (2429:5): [True: 4, False: 8.90M]
  ------------------
 2430|      4|      auto res = parseObjectLiteral();
 2431|      4|      if (!res)
  ------------------
  |  Branch (2431:11): [True: 0, False: 4]
  ------------------
 2432|      0|        return None;
 2433|      4|      return res.getValue();
 2434|      4|    }
 2435|       |
 2436|  1.62k|    case TokenKind::l_paren: {
  ------------------
  |  Branch (2436:5): [True: 1.62k, False: 8.90M]
  ------------------
 2437|  1.62k|      SMLoc startLoc = advance().Start;
 2438|       |
 2439|       |      // Cover "()".
 2440|  1.62k|      if (check(TokenKind::r_paren)) {
  ------------------
  |  Branch (2440:11): [True: 292, False: 1.33k]
  ------------------
 2441|    292|        SMLoc endLoc = advance().End;
 2442|    292|        return setLocation(
 2443|    292|            startLoc, endLoc, new (context_) ESTree::CoverEmptyArgsNode());
 2444|    292|      }
 2445|       |
 2446|  1.33k|      ESTree::Node *expr;
 2447|  1.33k|      if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (2447:11): [True: 0, False: 1.33k]
  ------------------
 2448|      0|        auto optRest = parseBindingRestElement(ParamIn);
 2449|      0|        if (!optRest)
  ------------------
  |  Branch (2449:13): [True: 0, False: 0]
  ------------------
 2450|      0|          return None;
 2451|       |
 2452|      0|        expr = setLocation(
 2453|      0|            *optRest,
 2454|      0|            *optRest,
 2455|      0|            new (context_) ESTree::CoverRestElementNode(*optRest));
 2456|  1.33k|      } else {
 2457|  1.33k|        auto optExpr = parseExpression(ParamIn, CoverTypedParameters::Yes);
 2458|  1.33k|        if (!optExpr)
  ------------------
  |  Branch (2458:13): [True: 1.17k, False: 163]
  ------------------
 2459|  1.17k|          return None;
 2460|    163|        expr = *optExpr;
 2461|    163|      }
 2462|       |
 2463|    163|#if HERMES_PARSE_FLOW
 2464|    163|      if (context_.getParseFlow()) {
  ------------------
  |  Branch (2464:11): [True: 0, False: 163]
  ------------------
 2465|       |        // In both these cases, we set the location to encompass the `()`.
 2466|       |        // (x: T)
 2467|       |        // ^^^^^^
 2468|       |        // by using `startLoc` and `tok_` as the start/end.
 2469|       |        // If `tok_` is not `)`, then we'll error on the `eat` call immediately
 2470|       |        // after these checks.
 2471|      0|        if (auto *cover = dyn_cast<ESTree::CoverTypedIdentifierNode>(expr)) {
  ------------------
  |  Branch (2471:19): [True: 0, False: 0]
  ------------------
 2472|      0|          if (cover->_right && !cover->_optional) {
  ------------------
  |  Branch (2472:15): [True: 0, False: 0]
  |  Branch (2472:32): [True: 0, False: 0]
  ------------------
 2473|      0|            expr = setLocation(
 2474|      0|                startLoc,
 2475|      0|                tok_,
 2476|      0|                new (context_) ESTree::TypeCastExpressionNode(
 2477|      0|                    cover->_left, cover->_right));
 2478|      0|          }
 2479|      0|        } else if (check(TokenKind::colon)) {
  ------------------
  |  Branch (2479:20): [True: 0, False: 0]
  ------------------
 2480|      0|          SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 2481|      0|          auto optType = parseTypeAnnotationFlow(annotStart);
 2482|      0|          if (!optType)
  ------------------
  |  Branch (2482:15): [True: 0, False: 0]
  ------------------
 2483|      0|            return None;
 2484|      0|          ESTree::Node *type = *optType;
 2485|      0|          expr = setLocation(
 2486|      0|              startLoc,
 2487|      0|              tok_,
 2488|      0|              new (context_) ESTree::TypeCastExpressionNode(expr, type));
 2489|      0|        }
 2490|      0|      }
 2491|    163|#endif
 2492|       |
 2493|    163|      if (!eat(
  ------------------
  |  Branch (2493:11): [True: 0, False: 163]
  ------------------
 2494|    163|              TokenKind::r_paren,
 2495|    163|              JSLexer::AllowDiv,
 2496|    163|              "at end of parenthesized expression",
 2497|    163|              "started here",
 2498|    163|              startLoc))
 2499|      0|        return None;
 2500|       |      // Record the number of parens surrounding an expression.
 2501|    163|      expr->incParens();
 2502|    163|      return expr;
 2503|    163|    }
 2504|       |
 2505|    168|    case TokenKind::rw_function: {
  ------------------
  |  Branch (2505:5): [True: 168, False: 8.90M]
  ------------------
 2506|    168|      auto fExpr = parseFunctionExpression();
 2507|    168|      if (!fExpr)
  ------------------
  |  Branch (2507:11): [True: 5, False: 163]
  ------------------
 2508|      5|        return None;
 2509|    163|      return fExpr.getValue();
 2510|    168|    }
 2511|       |
 2512|      0|    case TokenKind::rw_class: {
  ------------------
  |  Branch (2512:5): [True: 0, False: 8.90M]
  ------------------
 2513|      0|      auto optClass = parseClassExpression();
 2514|      0|      if (!optClass)
  ------------------
  |  Branch (2514:11): [True: 0, False: 0]
  ------------------
 2515|      0|        return None;
 2516|      0|      return optClass.getValue();
 2517|      0|    }
 2518|       |
 2519|   382k|    case TokenKind::no_substitution_template:
  ------------------
  |  Branch (2519:5): [True: 382k, False: 8.52M]
  ------------------
 2520|   382k|    case TokenKind::template_head: {
  ------------------
  |  Branch (2520:5): [True: 3, False: 8.90M]
  ------------------
 2521|   382k|      auto optTemplate = parseTemplateLiteral(Param{});
 2522|   382k|      if (!optTemplate) {
  ------------------
  |  Branch (2522:11): [True: 3, False: 382k]
  ------------------
 2523|      3|        return None;
 2524|      3|      }
 2525|   382k|      return optTemplate.getValue();
 2526|   382k|    }
 2527|       |
 2528|      0|#if HERMES_PARSE_JSX
 2529|      0|    case TokenKind::less:
  ------------------
  |  Branch (2529:5): [True: 0, False: 8.90M]
  ------------------
 2530|      0|      if (context_.getParseJSX()) {
  ------------------
  |  Branch (2530:11): [True: 0, False: 0]
  ------------------
 2531|      0|        auto optJSX = parseJSX();
 2532|      0|        if (!optJSX)
  ------------------
  |  Branch (2532:13): [True: 0, False: 0]
  ------------------
 2533|      0|          return None;
 2534|      0|        return optJSX.getValue();
 2535|      0|      }
 2536|      0|      error(
 2537|      0|          tok_->getStartLoc(),
 2538|      0|          "invalid expression (possible JSX: pass -parse-jsx to parse)");
 2539|      0|      return None;
 2540|      0|#endif
 2541|       |
 2542|      8|    default:
  ------------------
  |  Branch (2542:5): [True: 8, False: 8.90M]
  ------------------
 2543|      8|      error(tok_->getStartLoc(), "invalid expression");
 2544|      8|      return None;
 2545|  8.90M|  }
 2546|  8.90M|}
_ZN6hermes6parser6detail12JSParserImpl17parseArrayLiteralEv:
 2548|  45.0k|Optional<ESTree::ArrayExpressionNode *> JSParserImpl::parseArrayLiteral() {
 2549|  45.0k|  assert(check(TokenKind::l_square));
 2550|  45.0k|  SMLoc startLoc = advance().Start;
 2551|       |
 2552|  45.0k|  ESTree::NodeList elemList;
 2553|       |
 2554|  45.0k|  bool trailingComma = false;
 2555|       |
 2556|  45.0k|  if (!check(TokenKind::r_square)) {
  ------------------
  |  Branch (2556:7): [True: 40.6k, False: 4.33k]
  ------------------
 2557|  2.51M|    for (;;) {
 2558|       |      // Elision.
 2559|  2.51M|      if (check(TokenKind::comma)) {
  ------------------
  |  Branch (2559:11): [True: 82, False: 2.51M]
  ------------------
 2560|     82|        elemList.push_back(
 2561|     82|            *setLocation(tok_, tok_, new (context_) ESTree::EmptyNode()));
 2562|  2.51M|      } else if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (2562:18): [True: 0, False: 2.51M]
  ------------------
 2563|       |        // Spread.
 2564|      0|        auto optSpread = parseSpreadElement();
 2565|      0|        if (!optSpread)
  ------------------
  |  Branch (2565:13): [True: 0, False: 0]
  ------------------
 2566|      0|          return None;
 2567|       |
 2568|      0|        elemList.push_back(**optSpread);
 2569|  2.51M|      } else {
 2570|  2.51M|        auto expr = parseAssignmentExpression();
 2571|  2.51M|        if (!expr)
  ------------------
  |  Branch (2571:13): [True: 2, False: 2.51M]
  ------------------
 2572|      2|          return None;
 2573|  2.51M|        elemList.push_back(*expr.getValue());
 2574|  2.51M|      }
 2575|       |
 2576|  2.51M|      if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (2576:11): [True: 40.6k, False: 2.47M]
  ------------------
 2577|  40.6k|        break;
 2578|  2.47M|      if (check(TokenKind::r_square)) {
  ------------------
  |  Branch (2578:11): [True: 2, False: 2.47M]
  ------------------
 2579|       |        // Check for ",]".
 2580|      2|        trailingComma = true;
 2581|      2|        break;
 2582|      2|      }
 2583|  2.47M|    }
 2584|  40.6k|  }
 2585|       |
 2586|  45.0k|  SMLoc endLoc = tok_->getEndLoc();
 2587|  45.0k|  if (!eat(
  ------------------
  |  Branch (2587:7): [True: 10, False: 45.0k]
  ------------------
 2588|  45.0k|          TokenKind::r_square,
 2589|  45.0k|          JSLexer::AllowDiv,
 2590|  45.0k|          "at end of array literal '[...'",
 2591|  45.0k|          "location of '['",
 2592|  45.0k|          startLoc))
 2593|     10|    return None;
 2594|       |
 2595|  45.0k|  return setLocation(
 2596|  45.0k|      startLoc,
 2597|  45.0k|      endLoc,
 2598|  45.0k|      new (context_)
 2599|  45.0k|          ESTree::ArrayExpressionNode(std::move(elemList), trailingComma));
 2600|  45.0k|}
_ZN6hermes6parser6detail12JSParserImpl18parseObjectLiteralEv:
 2602|      4|Optional<ESTree::ObjectExpressionNode *> JSParserImpl::parseObjectLiteral() {
 2603|      4|  assert(check(TokenKind::l_brace));
 2604|      4|  SMLoc startLoc = advance().Start;
 2605|       |
 2606|      4|  ESTree::NodeList elemList;
 2607|       |
 2608|      4|  if (!check(TokenKind::r_brace)) {
  ------------------
  |  Branch (2608:7): [True: 2, False: 2]
  ------------------
 2609|      2|    for (;;) {
 2610|      2|      if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (2610:11): [True: 0, False: 2]
  ------------------
 2611|       |        // Spread.
 2612|      0|        auto optSpread = parseSpreadElement();
 2613|      0|        if (!optSpread)
  ------------------
  |  Branch (2613:13): [True: 0, False: 0]
  ------------------
 2614|      0|          return None;
 2615|       |
 2616|      0|        elemList.push_back(**optSpread);
 2617|      2|      } else {
 2618|      2|        auto prop = parsePropertyAssignment(false);
 2619|      2|        if (!prop)
  ------------------
  |  Branch (2619:13): [True: 0, False: 2]
  ------------------
 2620|      0|          return None;
 2621|       |
 2622|      2|        elemList.push_back(*prop.getValue());
 2623|      2|      }
 2624|       |
 2625|      2|      if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (2625:11): [True: 0, False: 2]
  ------------------
 2626|      0|        break;
 2627|      2|      if (check(TokenKind::r_brace)) // check for ",}"
  ------------------
  |  Branch (2627:11): [True: 2, False: 0]
  ------------------
 2628|      2|        break;
 2629|      2|    }
 2630|      2|  }
 2631|       |
 2632|      4|  SMLoc endLoc = tok_->getEndLoc();
 2633|      4|  if (!eat(
  ------------------
  |  Branch (2633:7): [True: 0, False: 4]
  ------------------
 2634|      4|          TokenKind::r_brace,
 2635|      4|          JSLexer::AllowDiv,
 2636|      4|          "at end of object literal '{...'",
 2637|      4|          "location of '{'",
 2638|      4|          startLoc))
 2639|      0|    return None;
 2640|       |
 2641|      4|  return setLocation(
 2642|      4|      startLoc,
 2643|      4|      endLoc,
 2644|      4|      new (context_) ESTree::ObjectExpressionNode(std::move(elemList)));
 2645|      4|}
_ZN6hermes6parser6detail12JSParserImpl23parsePropertyAssignmentEb:
 2661|      2|Optional<ESTree::Node *> JSParserImpl::parsePropertyAssignment(bool eagerly) {
 2662|      2|  SMLoc startLoc = tok_->getStartLoc();
 2663|      2|  ESTree::NodePtr key = nullptr;
 2664|       |
 2665|      2|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
 2666|       |
 2667|      2|  bool computed = false;
 2668|      2|  bool generator = false;
 2669|      2|  bool async = false;
 2670|      2|  bool method = false;
 2671|       |
 2672|      2|  if (check(getIdent_)) {
  ------------------
  |  Branch (2672:7): [True: 0, False: 2]
  ------------------
 2673|      0|    UniqueString *ident = tok_->getResWordOrIdentifier();
 2674|      0|    SMRange identRng = tok_->getSourceRange();
 2675|      0|    advance();
 2676|       |
 2677|       |    // This could either be a getter, or a property named 'get'.
 2678|      0|    if (check(TokenKind::colon, TokenKind::l_paren)) {
  ------------------
  |  Branch (2678:9): [True: 0, False: 0]
  ------------------
 2679|       |      // This is just a property.
 2680|      0|      key = setLocation(
 2681|      0|          identRng,
 2682|      0|          identRng,
 2683|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2684|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2685|      0|    } else if (context_.getParseTypes() && check(TokenKind::less)) {
  ------------------
  |  Branch (2685:16): [True: 0, False: 0]
  |  Branch (2685:44): [True: 0, False: 0]
  ------------------
 2686|       |      // This is a method definition.
 2687|      0|      method = true;
 2688|      0|      key = setLocation(
 2689|      0|          identRng,
 2690|      0|          identRng,
 2691|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2692|      0|#endif
 2693|      0|    } else if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2693:16): [True: 0, False: 0]
  ------------------
 2694|       |      // If the next token is "," or "}", this is a shorthand property
 2695|       |      // definition.
 2696|      0|      key = setLocation(
 2697|      0|          identRng,
 2698|      0|          identRng,
 2699|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2700|      0|      auto *value = setLocation(
 2701|      0|          key,
 2702|      0|          key,
 2703|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2704|      0|      return setLocation(
 2705|      0|          startLoc,
 2706|      0|          value,
 2707|      0|          new (context_)
 2708|      0|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2709|      0|    } else {
 2710|       |      // A getter method.
 2711|      0|      computed = check(TokenKind::l_square);
 2712|      0|      auto optKey = parsePropertyName();
 2713|      0|      if (!optKey)
  ------------------
  |  Branch (2713:11): [True: 0, False: 0]
  ------------------
 2714|      0|        return None;
 2715|       |
 2716|      0|      if (!eat(
  ------------------
  |  Branch (2716:11): [True: 0, False: 0]
  ------------------
 2717|      0|              TokenKind::l_paren,
 2718|      0|              JSLexer::AllowRegExp,
 2719|      0|              "in getter declaration",
 2720|      0|              "start of getter declaration",
 2721|      0|              startLoc))
 2722|      0|        return None;
 2723|      0|      if (!eat(
  ------------------
  |  Branch (2723:11): [True: 0, False: 0]
  ------------------
 2724|      0|              TokenKind::r_paren,
 2725|      0|              JSLexer::AllowRegExp,
 2726|      0|              "in empty getter parameter list",
 2727|      0|              "start of getter declaration",
 2728|      0|              startLoc))
 2729|      0|        return None;
 2730|       |
 2731|      0|      ESTree::Node *returnType = nullptr;
 2732|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2733|      0|      if (context_.getParseTypes() && check(TokenKind::colon)) {
  ------------------
  |  Branch (2733:11): [True: 0, False: 0]
  |  Branch (2733:39): [True: 0, False: 0]
  ------------------
 2734|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 2735|      0|        auto optRet = parseReturnTypeAnnotation(annotStart);
 2736|      0|        if (!optRet)
  ------------------
  |  Branch (2736:13): [True: 0, False: 0]
  ------------------
 2737|      0|          return None;
 2738|      0|        returnType = *optRet;
 2739|      0|      }
 2740|      0|#endif
 2741|       |
 2742|      0|      llvh::SaveAndRestore<bool> oldParamYield(paramYield_, false);
 2743|      0|      llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, false);
 2744|      0|      if (!need(
  ------------------
  |  Branch (2744:11): [True: 0, False: 0]
  ------------------
 2745|      0|              TokenKind::l_brace,
 2746|      0|              "in getter declaration",
 2747|      0|              "start of getter declaration",
 2748|      0|              startLoc))
 2749|      0|        return None;
 2750|      0|      auto block = parseFunctionBody(
 2751|      0|          ParamReturn,
 2752|      0|          eagerly,
 2753|      0|          oldParamYield.get(),
 2754|      0|          oldParamAwait.get(),
 2755|      0|          JSLexer::AllowRegExp,
 2756|      0|          true);
 2757|      0|      if (!block)
  ------------------
  |  Branch (2757:11): [True: 0, False: 0]
  ------------------
 2758|      0|        return None;
 2759|       |
 2760|      0|      auto *funcExpr = new (context_) ESTree::FunctionExpressionNode(
 2761|      0|          nullptr,
 2762|      0|          ESTree::NodeList{},
 2763|      0|          block.getValue(),
 2764|      0|          nullptr,
 2765|      0|          returnType,
 2766|      0|          /* predicate */ nullptr,
 2767|      0|          false,
 2768|      0|          false);
 2769|      0|      funcExpr->isMethodDefinition = true;
 2770|      0|      setLocation(startLoc, block.getValue(), funcExpr);
 2771|       |
 2772|      0|      auto *node = new (context_) ESTree::PropertyNode(
 2773|      0|          optKey.getValue(), funcExpr, getIdent_, computed, false, false);
 2774|      0|      return setLocation(startLoc, block.getValue(), node);
 2775|      0|    }
 2776|      2|  } else if (check(setIdent_)) {
  ------------------
  |  Branch (2776:14): [True: 0, False: 2]
  ------------------
 2777|      0|    UniqueString *ident = tok_->getResWordOrIdentifier();
 2778|      0|    SMRange identRng = tok_->getSourceRange();
 2779|      0|    advance();
 2780|       |
 2781|       |    // This could either be a setter, or a property named 'set'.
 2782|      0|    if (check(TokenKind::colon, TokenKind::l_paren)) {
  ------------------
  |  Branch (2782:9): [True: 0, False: 0]
  ------------------
 2783|       |      // This is just a property.
 2784|      0|      key = setLocation(
 2785|      0|          identRng,
 2786|      0|          identRng,
 2787|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2788|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2789|      0|    } else if (context_.getParseTypes() && check(TokenKind::less)) {
  ------------------
  |  Branch (2789:16): [True: 0, False: 0]
  |  Branch (2789:44): [True: 0, False: 0]
  ------------------
 2790|       |      // This is a method definition.
 2791|      0|      method = true;
 2792|      0|      key = setLocation(
 2793|      0|          identRng,
 2794|      0|          identRng,
 2795|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2796|      0|#endif
 2797|      0|    } else if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2797:16): [True: 0, False: 0]
  ------------------
 2798|       |      // If the next token is "," or "}", this is a shorthand property
 2799|       |      // definition.
 2800|      0|      key = setLocation(
 2801|      0|          identRng,
 2802|      0|          identRng,
 2803|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2804|      0|      auto *value = setLocation(
 2805|      0|          key,
 2806|      0|          key,
 2807|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2808|      0|      return setLocation(
 2809|      0|          startLoc,
 2810|      0|          value,
 2811|      0|          new (context_)
 2812|      0|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2813|      0|    } else {
 2814|       |      // A setter method.
 2815|      0|      computed = check(TokenKind::l_square);
 2816|      0|      auto optKey = parsePropertyName();
 2817|      0|      if (!optKey)
  ------------------
  |  Branch (2817:11): [True: 0, False: 0]
  ------------------
 2818|      0|        return None;
 2819|       |
 2820|      0|      llvh::SaveAndRestore<bool> oldParamYield(paramYield_, false);
 2821|      0|      llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, false);
 2822|       |
 2823|      0|      ESTree::NodeList params;
 2824|      0|      eat(TokenKind::l_paren,
 2825|      0|          JSLexer::AllowRegExp,
 2826|      0|          "in setter declaration",
 2827|      0|          "start of setter declaration",
 2828|      0|          startLoc);
 2829|       |
 2830|       |      // PropertySetParameterList -> FormalParameter -> BindingElement
 2831|      0|      auto optParam = parseBindingElement(Param{});
 2832|      0|      if (!optParam)
  ------------------
  |  Branch (2832:11): [True: 0, False: 0]
  ------------------
 2833|      0|        return None;
 2834|      0|      params.push_back(**optParam);
 2835|       |
 2836|      0|      if (!eat(
  ------------------
  |  Branch (2836:11): [True: 0, False: 0]
  ------------------
 2837|      0|              TokenKind::r_paren,
 2838|      0|              JSLexer::AllowRegExp,
 2839|      0|              "at end of setter parameter list",
 2840|      0|              "start of setter declaration",
 2841|      0|              startLoc))
 2842|      0|        return None;
 2843|       |
 2844|      0|      ESTree::Node *returnType = nullptr;
 2845|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2846|      0|      if (context_.getParseTypes() && check(TokenKind::colon)) {
  ------------------
  |  Branch (2846:11): [True: 0, False: 0]
  |  Branch (2846:39): [True: 0, False: 0]
  ------------------
 2847|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 2848|      0|        auto optRet = parseReturnTypeAnnotation(annotStart);
 2849|      0|        if (!optRet)
  ------------------
  |  Branch (2849:13): [True: 0, False: 0]
  ------------------
 2850|      0|          return None;
 2851|      0|        returnType = *optRet;
 2852|      0|      }
 2853|      0|#endif
 2854|       |
 2855|      0|      if (!need(
  ------------------
  |  Branch (2855:11): [True: 0, False: 0]
  ------------------
 2856|      0|              TokenKind::l_brace,
 2857|      0|              "in setter declaration",
 2858|      0|              "start of setter declaration",
 2859|      0|              startLoc))
 2860|      0|        return None;
 2861|      0|      auto block = parseFunctionBody(
 2862|      0|          ParamReturn,
 2863|      0|          eagerly,
 2864|      0|          oldParamYield.get(),
 2865|      0|          oldParamAwait.get(),
 2866|      0|          JSLexer::AllowRegExp,
 2867|      0|          true);
 2868|      0|      if (!block)
  ------------------
  |  Branch (2868:11): [True: 0, False: 0]
  ------------------
 2869|      0|        return None;
 2870|       |
 2871|      0|      auto *funcExpr = new (context_) ESTree::FunctionExpressionNode(
 2872|      0|          nullptr,
 2873|      0|          std::move(params),
 2874|      0|          block.getValue(),
 2875|      0|          nullptr,
 2876|      0|          returnType,
 2877|      0|          /* predicate */ nullptr,
 2878|      0|          false,
 2879|      0|          false);
 2880|      0|      funcExpr->isMethodDefinition = true;
 2881|      0|      setLocation(startLoc, block.getValue(), funcExpr);
 2882|       |
 2883|      0|      auto *node = new (context_) ESTree::PropertyNode(
 2884|      0|          optKey.getValue(), funcExpr, setIdent_, computed, false, false);
 2885|      0|      return setLocation(startLoc, block.getValue(), node);
 2886|      0|    }
 2887|      2|  } else if (check(asyncIdent_)) {
  ------------------
  |  Branch (2887:14): [True: 0, False: 2]
  ------------------
 2888|      0|    UniqueString *ident = tok_->getResWordOrIdentifier();
 2889|      0|    SMRange identRng = tok_->getSourceRange();
 2890|      0|    advance();
 2891|       |
 2892|       |    // This could either be an async function, or a property named 'async'.
 2893|      0|    if (check(TokenKind::colon, TokenKind::l_paren)) {
  ------------------
  |  Branch (2893:9): [True: 0, False: 0]
  ------------------
 2894|       |      // This is just a property (or method) called 'async'.
 2895|      0|      key = setLocation(
 2896|      0|          identRng,
 2897|      0|          identRng,
 2898|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2899|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2900|      0|    } else if (context_.getParseTypes() && check(TokenKind::less)) {
  ------------------
  |  Branch (2900:16): [True: 0, False: 0]
  |  Branch (2900:44): [True: 0, False: 0]
  ------------------
 2901|       |      // This is a method definition.
 2902|      0|      method = true;
 2903|      0|      key = setLocation(
 2904|      0|          identRng,
 2905|      0|          identRng,
 2906|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2907|      0|#endif
 2908|      0|    } else if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2908:16): [True: 0, False: 0]
  ------------------
 2909|       |      // If the next token is "," or "}", this is a shorthand property
 2910|       |      // definition.
 2911|      0|      key = setLocation(
 2912|      0|          identRng,
 2913|      0|          identRng,
 2914|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2915|      0|      auto *value = setLocation(
 2916|      0|          key,
 2917|      0|          key,
 2918|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2919|      0|      return setLocation(
 2920|      0|          startLoc,
 2921|      0|          value,
 2922|      0|          new (context_)
 2923|      0|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2924|      0|    } else {
 2925|      0|      if (lexer_.isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (2925:11): [True: 0, False: 0]
  ------------------
 2926|      0|        error(
 2927|      0|            tok_->getSourceRange(),
 2928|      0|            "newline not allowed after 'async' in a method definition");
 2929|      0|      }
 2930|       |      // This is an async function, parse the key and set `async` to true.
 2931|      0|      async = true;
 2932|      0|      method = true;
 2933|      0|      generator = checkAndEat(TokenKind::star);
 2934|      0|      computed = check(TokenKind::l_square);
 2935|      0|      auto optKey = parsePropertyName();
 2936|      0|      if (!optKey)
  ------------------
  |  Branch (2936:11): [True: 0, False: 0]
  ------------------
 2937|      0|        return None;
 2938|       |
 2939|      0|      key = optKey.getValue();
 2940|      0|    }
 2941|      2|  } else if (check(TokenKind::identifier)) {
  ------------------
  |  Branch (2941:14): [True: 2, False: 0]
  ------------------
 2942|      2|    auto *ident = tok_->getIdentifier();
 2943|      2|    key = setLocation(
 2944|      2|        tok_,
 2945|      2|        tok_,
 2946|      2|        new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2947|      2|    advance();
 2948|       |    // If the next token is "," or "}", this is a shorthand property definition.
 2949|      2|    if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2949:9): [True: 2, False: 0]
  ------------------
 2950|      2|      auto *value = setLocation(
 2951|      2|          key,
 2952|      2|          key,
 2953|      2|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2954|       |
 2955|      2|      return setLocation(
 2956|      2|          startLoc,
 2957|      2|          value,
 2958|      2|          new (context_)
 2959|      2|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2960|      2|    }
 2961|      2|  } else {
 2962|      0|    generator = checkAndEat(TokenKind::star);
 2963|      0|    computed = check(TokenKind::l_square);
 2964|      0|    auto optKey = parsePropertyName();
 2965|      0|    if (!optKey)
  ------------------
  |  Branch (2965:9): [True: 0, False: 0]
  ------------------
 2966|      0|      return None;
 2967|       |
 2968|      0|    key = optKey.getValue();
 2969|      0|  }
 2970|       |
 2971|      0|  ESTree::Node *value;
 2972|      0|  bool shorthand = false;
 2973|       |
 2974|      0|  if (isa<ESTree::IdentifierNode>(key) && check(TokenKind::equal)) {
  ------------------
  |  Branch (2974:7): [True: 0, False: 0]
  |  Branch (2974:43): [True: 0, False: 0]
  ------------------
 2975|       |    // Check for CoverInitializedName: IdentifierReference Initializer
 2976|      0|    auto startLoc = advance().Start;
 2977|      0|    auto optInit = parseAssignmentExpression();
 2978|      0|    if (!optInit)
  ------------------
  |  Branch (2978:9): [True: 0, False: 0]
  ------------------
 2979|      0|      return None;
 2980|       |
 2981|      0|    shorthand = true;
 2982|       |
 2983|      0|    value = setLocation(
 2984|      0|        startLoc,
 2985|      0|        getPrevTokenEndLoc(),
 2986|      0|        new (context_) ESTree::CoverInitializerNode(*optInit));
 2987|      0|  } else if (check(TokenKind::l_paren, TokenKind::less) || async) {
  ------------------
  |  Branch (2987:14): [True: 0, False: 0]
  |  Branch (2987:60): [True: 0, False: 0]
  ------------------
 2988|       |    // Try this branch when we have '(' or '<' to indicate a method
 2989|       |    // or when we know this is async, because async must also indicate a method,
 2990|       |    // and we must avoid parsing ordinary properties from ':'.
 2991|       |
 2992|       |    // Parse the MethodDefinition manually here.
 2993|       |    // Do not use `parseClassElement` because we had to parsePropertyName
 2994|       |    // in this function ourselves and check for SingleNameBindings, which are
 2995|       |    // not parsed with `parsePropertyName`.
 2996|       |    // MethodDefinition:
 2997|       |    // PropertyName "(" UniqueFormalParameters ")" "{" FunctionBody "}"
 2998|       |    //               ^
 2999|      0|    llvh::SaveAndRestore<bool> oldParamYield(paramYield_, generator);
 3000|      0|    llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, async);
 3001|       |
 3002|      0|    method = true;
 3003|       |
 3004|      0|    ESTree::Node *typeParams = nullptr;
 3005|      0|#if HERMES_PARSE_FLOW
 3006|      0|    if (context_.getParseFlow() && check(TokenKind::less)) {
  ------------------
  |  Branch (3006:9): [True: 0, False: 0]
  |  Branch (3006:36): [True: 0, False: 0]
  ------------------
 3007|      0|      auto optTypeParams = parseTypeParamsFlow();
 3008|      0|      if (!optTypeParams)
  ------------------
  |  Branch (3008:11): [True: 0, False: 0]
  ------------------
 3009|      0|        return None;
 3010|      0|      typeParams = *optTypeParams;
 3011|      0|    }
 3012|      0|#endif
 3013|      0|#if HERMES_PARSE_TS
 3014|      0|    if (context_.getParseTS() && check(TokenKind::less)) {
  ------------------
  |  Branch (3014:9): [True: 0, False: 0]
  |  Branch (3014:34): [True: 0, False: 0]
  ------------------
 3015|      0|      auto optTypeParams = parseTSTypeParameters();
 3016|      0|      if (!optTypeParams)
  ------------------
  |  Branch (3016:11): [True: 0, False: 0]
  ------------------
 3017|      0|        return None;
 3018|      0|      typeParams = *optTypeParams;
 3019|      0|    }
 3020|      0|#endif
 3021|       |
 3022|       |    // (
 3023|      0|    if (!need(
  ------------------
  |  Branch (3023:9): [True: 0, False: 0]
  ------------------
 3024|      0|            TokenKind::l_paren,
 3025|      0|            "in method definition",
 3026|      0|            "start of method definition",
 3027|      0|            startLoc))
 3028|      0|      return None;
 3029|       |
 3030|      0|    ESTree::NodeList args{};
 3031|      0|    if (!parseFormalParameters(Param{}, args))
  ------------------
  |  Branch (3031:9): [True: 0, False: 0]
  ------------------
 3032|      0|      return None;
 3033|       |
 3034|      0|    ESTree::Node *returnType = nullptr;
 3035|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 3036|      0|    if (context_.getParseTypes() && check(TokenKind::colon)) {
  ------------------
  |  Branch (3036:9): [True: 0, False: 0]
  |  Branch (3036:37): [True: 0, False: 0]
  ------------------
 3037|      0|      SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 3038|      0|      auto optRet = parseReturnTypeAnnotation(annotStart);
 3039|      0|      if (!optRet)
  ------------------
  |  Branch (3039:11): [True: 0, False: 0]
  ------------------
 3040|      0|        return None;
 3041|      0|      returnType = *optRet;
 3042|      0|    }
 3043|      0|#endif
 3044|       |
 3045|      0|    if (!need(
  ------------------
  |  Branch (3045:9): [True: 0, False: 0]
  ------------------
 3046|      0|            TokenKind::l_brace,
 3047|      0|            "in method definition",
 3048|      0|            "start of method definition",
 3049|      0|            startLoc))
 3050|      0|      return None;
 3051|      0|    auto optBody = parseFunctionBody(
 3052|      0|        ParamReturn,
 3053|      0|        eagerly,
 3054|      0|        oldParamYield.get(),
 3055|      0|        oldParamAwait.get(),
 3056|      0|        JSLexer::AllowRegExp,
 3057|      0|        true);
 3058|      0|    if (!optBody)
  ------------------
  |  Branch (3058:9): [True: 0, False: 0]
  ------------------
 3059|      0|      return None;
 3060|       |
 3061|      0|    auto *funcExpr = new (context_) ESTree::FunctionExpressionNode(
 3062|      0|        nullptr,
 3063|      0|        std::move(args),
 3064|      0|        optBody.getValue(),
 3065|      0|        typeParams,
 3066|      0|        returnType,
 3067|      0|        /* predicate */ nullptr,
 3068|      0|        generator,
 3069|      0|        async);
 3070|      0|    funcExpr->isMethodDefinition = true;
 3071|      0|    setLocation(startLoc, optBody.getValue(), funcExpr);
 3072|       |
 3073|      0|    value = funcExpr;
 3074|      0|  } else {
 3075|      0|    if (!eat(
  ------------------
  |  Branch (3075:9): [True: 0, False: 0]
  ------------------
 3076|      0|            TokenKind::colon,
 3077|      0|            JSLexer::AllowRegExp,
 3078|      0|            "in property initialization",
 3079|      0|            "start of property initialization",
 3080|      0|            startLoc))
 3081|      0|      return None;
 3082|       |
 3083|      0|    auto optValue = parseAssignmentExpression();
 3084|      0|    if (!optValue)
  ------------------
  |  Branch (3084:9): [True: 0, False: 0]
  ------------------
 3085|      0|      return None;
 3086|      0|    value = *optValue;
 3087|      0|  }
 3088|       |
 3089|      0|  return setLocation(
 3090|      0|      startLoc,
 3091|      0|      getPrevTokenEndLoc(),
 3092|      0|      new (context_) ESTree::PropertyNode(
 3093|      0|          key, value, initIdent_, computed, method, shorthand));
 3094|      0|}
_ZN6hermes6parser6detail12JSParserImpl20parseTemplateLiteralENS1_5ParamE:
 3161|   388k|Optional<ESTree::Node *> JSParserImpl::parseTemplateLiteral(Param param) {
 3162|   388k|  assert(checkTemplateLiteral() && "invalid template literal start");
 3163|       |
 3164|   388k|  SMLoc start = tok_->getStartLoc();
 3165|       |
 3166|   388k|  ESTree::NodeList quasis;
 3167|   388k|  ESTree::NodeList expressions;
 3168|       |
 3169|       |  /// Push the current TemplateElement onto quasis and advance the lexer.
 3170|       |  /// \param tail true if pushing the last element.
 3171|       |  /// \return false on failure.
 3172|   388k|  auto pushTemplateElement = [&quasis, &param, this](bool tail) -> bool {
 3173|   388k|    if (tok_->getTemplateLiteralContainsNotEscapes() &&
 3174|   388k|        !param.has(ParamTagged)) {
 3175|   388k|      error(
 3176|   388k|          tok_->getSourceRange(),
 3177|   388k|          "untagged template literal contains invalid escape sequence");
 3178|   388k|      return false;
 3179|   388k|    }
 3180|   388k|    auto *quasi = setLocation(
 3181|   388k|        tok_,
 3182|   388k|        tok_,
 3183|   388k|        new (context_) ESTree::TemplateElementNode(
 3184|   388k|            tail, tok_->getTemplateValue(), tok_->getTemplateRawValue()));
 3185|   388k|    quasis.push_back(*quasi);
 3186|   388k|    return true;
 3187|   388k|  };
 3188|       |
 3189|       |  // TemplateSpans
 3190|   388k|  while (
 3191|  1.09M|      !check(TokenKind::no_substitution_template, TokenKind::template_tail)) {
  ------------------
  |  Branch (3191:7): [True: 703k, False: 388k]
  ------------------
 3192|       |    // TemplateSpans
 3193|       |    // Alternate TemplateMiddle and Expression until TemplateTail.
 3194|   703k|    if (!check(TokenKind::template_head, TokenKind::template_middle)) {
  ------------------
  |  Branch (3194:9): [True: 0, False: 703k]
  ------------------
 3195|      0|      error(tok_->getSourceRange(), "expected template literal");
 3196|      0|      return None;
 3197|      0|    }
 3198|       |
 3199|       |    // First, push the TemplateElement.
 3200|   703k|    if (!pushTemplateElement(false))
  ------------------
  |  Branch (3200:9): [True: 0, False: 703k]
  ------------------
 3201|      0|      return None;
 3202|   703k|    SMLoc subStart = advance().Start;
 3203|       |
 3204|       |    // Parse the next expression and add it to the expressions.
 3205|   703k|    auto optExpr = parseExpression(ParamIn);
 3206|   703k|    if (!optExpr)
  ------------------
  |  Branch (3206:9): [True: 3, False: 703k]
  ------------------
 3207|      3|      return None;
 3208|   703k|    expressions.push_back(*optExpr.getValue());
 3209|       |
 3210|   703k|    if (!check(TokenKind::r_brace)) {
  ------------------
  |  Branch (3210:9): [True: 0, False: 703k]
  ------------------
 3211|      0|      errorExpected(
 3212|      0|          TokenKind::r_brace,
 3213|      0|          "at end of substition in template literal",
 3214|      0|          "start of substitution",
 3215|      0|          subStart);
 3216|      0|      return None;
 3217|      0|    }
 3218|       |
 3219|       |    // The } at the end of the expression must be rescanned as a
 3220|       |    // TemplateMiddle or TemplateTail.
 3221|   703k|    lexer_.rescanRBraceInTemplateLiteral();
 3222|   703k|  }
 3223|       |
 3224|       |  // TemplateTail or NoSubstitutionTemplate
 3225|   388k|  if (!pushTemplateElement(true))
  ------------------
  |  Branch (3225:7): [True: 0, False: 388k]
  ------------------
 3226|      0|    return None;
 3227|       |
 3228|   388k|  return setLocation(
 3229|   388k|      start,
 3230|   388k|      advance().End,
 3231|   388k|      new (context_) ESTree::TemplateLiteralNode(
 3232|   388k|          std::move(quasis), std::move(expressions)));
 3233|   388k|}
_ZN6hermes6parser6detail12JSParserImpl23parseFunctionExpressionEb:
 3236|    168|JSParserImpl::parseFunctionExpression(bool forceEagerly) {
 3237|    168|  auto optRes = parseFunctionHelper(Param{}, false, forceEagerly);
 3238|    168|  if (!optRes)
  ------------------
  |  Branch (3238:7): [True: 5, False: 163]
  ------------------
 3239|      5|    return None;
 3240|    163|  return cast<ESTree::FunctionExpressionNode>(*optRes);
 3241|    168|}
_ZN6hermes6parser6detail12JSParserImpl32parseOptionalExpressionExceptNewENS2_17IsConstructorCallE:
 3244|  8.90M|    IsConstructorCall isConstructorCall) {
 3245|  8.90M|  SMLoc startLoc = tok_->getStartLoc();
 3246|       |
 3247|  8.90M|  ESTree::NodePtr expr;
 3248|  8.90M|  if (check(TokenKind::rw_super)) {
  ------------------
  |  Branch (3248:7): [True: 0, False: 8.90M]
  ------------------
 3249|       |    // SuperProperty can be used the same way as PrimaryExpression, but
 3250|       |    // must not have a TemplateLiteral immediately after the `super` keyword.
 3251|      0|    expr = setLocation(tok_, tok_, new (context_) ESTree::SuperNode());
 3252|      0|    advance();
 3253|      0|    if (!checkN(TokenKind::l_paren, TokenKind::l_square, TokenKind::period)) {
  ------------------
  |  Branch (3253:9): [True: 0, False: 0]
  ------------------
 3254|      0|      errorExpected(
 3255|      0|          {TokenKind::l_paren, TokenKind::l_square, TokenKind::period},
 3256|      0|          "after 'super' keyword",
 3257|      0|          "location of 'super'",
 3258|      0|          startLoc);
 3259|      0|      return None;
 3260|      0|    }
 3261|  8.90M|  } else if (check(TokenKind::rw_import)) {
  ------------------
  |  Branch (3261:14): [True: 0, False: 8.90M]
  ------------------
 3262|      0|    SMRange importRange = advance();
 3263|      0|    if (checkAndEat(TokenKind::period)) {
  ------------------
  |  Branch (3263:9): [True: 0, False: 0]
  ------------------
 3264|       |      // ImportMeta: import . meta
 3265|       |      //                      ^
 3266|      0|      if (!check(metaIdent_)) {
  ------------------
  |  Branch (3266:11): [True: 0, False: 0]
  ------------------
 3267|      0|        error(tok_->getSourceRange(), "'meta' expected in member expression");
 3268|      0|        sm_.note(
 3269|      0|            importRange.Start, "start of member expression", Subsystem::Parser);
 3270|      0|        return None;
 3271|      0|      }
 3272|      0|      auto *meta = setLocation(
 3273|      0|          importRange,
 3274|      0|          importRange,
 3275|      0|          new (context_) ESTree::IdentifierNode(importIdent_, nullptr, false));
 3276|      0|      auto *prop = setLocation(
 3277|      0|          tok_,
 3278|      0|          tok_,
 3279|      0|          new (context_) ESTree::IdentifierNode(metaIdent_, nullptr, false));
 3280|      0|      advance();
 3281|      0|      expr = setLocation(
 3282|      0|          meta,
 3283|      0|          getPrevTokenEndLoc(),
 3284|      0|          new (context_) ESTree::MetaPropertyNode(meta, prop));
 3285|      0|    } else {
 3286|       |      // Guard against parseAssignmentExpression without parsePrimaryExpression.
 3287|      0|      CHECK_RECURSION;
  ------------------
  |  | 1538|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1539|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1540|      0|    return llvh::None;
  ------------------
 3288|       |
 3289|       |      // ImportCall must be a call with an AssignmentExpression as the
 3290|       |      // argument.
 3291|      0|      if (!eat(
  ------------------
  |  Branch (3291:11): [True: 0, False: 0]
  ------------------
 3292|      0|              TokenKind::l_paren,
 3293|      0|              JSLexer::AllowRegExp,
 3294|      0|              "in import call",
 3295|      0|              "location of 'import'",
 3296|      0|              startLoc))
 3297|      0|        return None;
 3298|       |
 3299|      0|      auto optSource = parseAssignmentExpression(ParamIn);
 3300|      0|      if (!optSource)
  ------------------
  |  Branch (3300:11): [True: 0, False: 0]
  ------------------
 3301|      0|        return None;
 3302|      0|      ESTree::Node *source = *optSource;
 3303|       |
 3304|      0|      checkAndEat(TokenKind::comma);
 3305|       |
 3306|      0|      ESTree::Node *attributes = nullptr;
 3307|      0|      if (!check(TokenKind::r_paren)) {
  ------------------
  |  Branch (3307:11): [True: 0, False: 0]
  ------------------
 3308|      0|        auto optAttributes = parseAssignmentExpression();
 3309|      0|        if (!optAttributes)
  ------------------
  |  Branch (3309:13): [True: 0, False: 0]
  ------------------
 3310|      0|          return None;
 3311|      0|        attributes = *optAttributes;
 3312|      0|        checkAndEat(TokenKind::comma);
 3313|      0|      }
 3314|       |
 3315|      0|      SMLoc endLoc = tok_->getEndLoc();
 3316|      0|      if (!eat(
  ------------------
  |  Branch (3316:11): [True: 0, False: 0]
  ------------------
 3317|      0|              TokenKind::r_paren,
 3318|      0|              JSLexer::AllowRegExp,
 3319|      0|              "in import call",
 3320|      0|              "location of 'import'",
 3321|      0|              startLoc))
 3322|      0|        return None;
 3323|       |
 3324|      0|      expr = setLocation(
 3325|      0|          startLoc,
 3326|      0|          endLoc,
 3327|      0|          new (context_) ESTree::ImportExpressionNode(source, attributes));
 3328|      0|    }
 3329|  8.90M|  } else {
 3330|  8.90M|    auto primExpr = parsePrimaryExpression();
 3331|  8.90M|    if (!primExpr)
  ------------------
  |  Branch (3331:9): [True: 1.20k, False: 8.90M]
  ------------------
 3332|  1.20k|      return None;
 3333|  8.90M|    expr = primExpr.getValue();
 3334|  8.90M|  }
 3335|       |
 3336|  8.90M|  return parseOptionalExpressionExceptNew_tail(
 3337|  8.90M|      isConstructorCall, startLoc, expr);
 3338|  8.90M|}
_ZN6hermes6parser6detail12JSParserImpl37parseOptionalExpressionExceptNew_tailENS2_17IsConstructorCallEN4llvh5SMLocEPNS_6ESTree4NodeE:
 3343|  8.90M|    ESTree::Node *expr) {
 3344|  8.90M|  SMLoc objectLoc = startLoc;
 3345|  8.90M|  bool seenOptionalChain = false;
 3346|  8.90M|  llvh::SaveAndRestore<unsigned> savedRecursionDepth{
 3347|  8.90M|      recursionDepth_, recursionDepth_};
 3348|  8.90M|  while (
 3349|  9.00M|      checkN(TokenKind::l_square, TokenKind::period, TokenKind::questiondot) ||
  ------------------
  |  Branch (3349:7): [True: 87.0k, False: 8.91M]
  ------------------
 3350|  9.00M|      checkTemplateLiteral()) {
  ------------------
  |  Branch (3350:7): [True: 5.70k, False: 8.90M]
  ------------------
 3351|  92.7k|    ++recursionDepth_;
 3352|  92.7k|    if (LLVM_UNLIKELY(recursionDepthCheck())) {
  ------------------
  |  |  189|  92.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 92.7k]
  |  |  ------------------
  ------------------
 3353|      0|      return None;
 3354|      0|    }
 3355|  92.7k|    SMLoc nextObjectLoc = tok_->getStartLoc();
 3356|  92.7k|    if (checkN(
  ------------------
  |  Branch (3356:9): [True: 87.0k, False: 5.70k]
  ------------------
 3357|  92.7k|            TokenKind::l_square, TokenKind::period, TokenKind::questiondot)) {
 3358|  87.0k|      if (check(TokenKind::questiondot)) {
  ------------------
  |  Branch (3358:11): [True: 1.91k, False: 85.0k]
  ------------------
 3359|  1.91k|        seenOptionalChain = true;
 3360|  1.91k|        if (isConstructorCall == IsConstructorCall::Yes) {
  ------------------
  |  Branch (3360:13): [True: 0, False: 1.91k]
  ------------------
 3361|       |          // Report the error here, but continue on because we can still parse
 3362|       |          // the rest of the file.
 3363|      0|          error(
 3364|      0|              tok_->getSourceRange(),
 3365|      0|              "Constructor calls may not contain an optional chain");
 3366|      0|        }
 3367|  1.91k|      }
 3368|       |      // MemberExpression [ Expression ]
 3369|       |      // MemberExpression . IdentifierName
 3370|       |      // MemberExpression OptionalChain
 3371|  87.0k|      auto msel =
 3372|  87.0k|          parseMemberSelect(startLoc, objectLoc, expr, seenOptionalChain);
 3373|  87.0k|      if (!msel)
  ------------------
  |  Branch (3373:11): [True: 1, False: 87.0k]
  ------------------
 3374|      1|        return None;
 3375|  87.0k|      objectLoc = nextObjectLoc;
 3376|  87.0k|      expr = msel.getValue();
 3377|  87.0k|    } else {
 3378|  5.70k|      assert(checkTemplateLiteral());
 3379|  5.70k|      if (isa<ESTree::SuperNode>(expr)) {
  ------------------
  |  Branch (3379:11): [True: 0, False: 5.70k]
  ------------------
 3380|      0|        error(
 3381|      0|            expr->getSourceRange(),
 3382|      0|            "invalid use of 'super' as a template literal tag");
 3383|      0|        return None;
 3384|      0|      }
 3385|  5.70k|      if (seenOptionalChain) {
  ------------------
  |  Branch (3385:11): [True: 0, False: 5.70k]
  ------------------
 3386|       |        // This construction is allowed by the grammar but accounted for by
 3387|       |        // static semantics in order to prevent ASI from being used like this:
 3388|       |        // \code
 3389|       |        // a?.b
 3390|       |        // `abc`;
 3391|       |        // \endcode
 3392|      0|        error(
 3393|      0|            tok_->getSourceRange(),
 3394|      0|            "invalid use of tagged template literal in optional chain");
 3395|      0|        sm_.note(expr->getSourceRange(), "location of optional chain");
 3396|      0|      }
 3397|       |      // MemberExpression TemplateLiteral
 3398|  5.70k|      auto optTemplate = parseTemplateLiteral(ParamTagged);
 3399|  5.70k|      if (!optTemplate)
  ------------------
  |  Branch (3399:11): [True: 0, False: 5.70k]
  ------------------
 3400|      0|        return None;
 3401|  5.70k|      expr = setLocation(
 3402|  5.70k|          startLoc,
 3403|  5.70k|          optTemplate.getValue(),
 3404|  5.70k|          new (context_) ESTree::TaggedTemplateExpressionNode(
 3405|  5.70k|              expr, optTemplate.getValue()));
 3406|  5.70k|      objectLoc = nextObjectLoc;
 3407|  5.70k|    }
 3408|  92.7k|  }
 3409|       |
 3410|  8.90M|  return expr;
 3411|  8.90M|}
_ZN6hermes6parser6detail12JSParserImpl14parseArgumentsERN4llvh12simple_ilistINS_6ESTree4NodeEJEEERNS3_5SMLocE:
 3415|  2.96k|    SMLoc &endLoc) {
 3416|  2.96k|  assert(check(TokenKind::l_paren));
 3417|  2.96k|  SMLoc startLoc = advance().Start;
 3418|  2.96k|  if (!check(TokenKind::r_paren)) {
  ------------------
  |  Branch (3418:7): [True: 880, False: 2.08k]
  ------------------
 3419|    880|    for (;;) {
 3420|    880|      SMLoc argStart = tok_->getStartLoc();
 3421|    880|      bool isSpread = checkAndEat(TokenKind::dotdotdot);
 3422|       |
 3423|    880|      auto arg = parseAssignmentExpression();
 3424|    880|      if (!arg)
  ------------------
  |  Branch (3424:11): [True: 876, False: 4]
  ------------------
 3425|    876|        return None;
 3426|       |
 3427|      4|      if (isSpread) {
  ------------------
  |  Branch (3427:11): [True: 0, False: 4]
  ------------------
 3428|      0|        argList.push_back(*setLocation(
 3429|      0|            argStart,
 3430|      0|            getPrevTokenEndLoc(),
 3431|      0|            new (context_) ESTree::SpreadElementNode(arg.getValue())));
 3432|      4|      } else {
 3433|      4|        argList.push_back(*arg.getValue());
 3434|      4|      }
 3435|       |
 3436|      4|      if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (3436:11): [True: 4, False: 0]
  ------------------
 3437|      4|        break;
 3438|       |
 3439|       |      // Check for ",)".
 3440|      0|      if (check(TokenKind::r_paren))
  ------------------
  |  Branch (3440:11): [True: 0, False: 0]
  ------------------
 3441|      0|        break;
 3442|      0|    }
 3443|    880|  }
 3444|  2.08k|  endLoc = tok_->getEndLoc();
 3445|  2.08k|  if (!eat(
  ------------------
  |  Branch (3445:7): [True: 0, False: 2.08k]
  ------------------
 3446|  2.08k|          TokenKind::r_paren,
 3447|  2.08k|          JSLexer::AllowDiv,
 3448|  2.08k|          "at end of function call",
 3449|  2.08k|          "location of '('",
 3450|  2.08k|          startLoc))
 3451|      0|    return None;
 3452|       |
 3453|  2.08k|  return "OK";
 3454|  2.08k|}
_ZN6hermes6parser6detail12JSParserImpl17parseMemberSelectEN4llvh5SMLocES4_PNS_6ESTree4NodeEb:
 3460|  89.2k|    bool seenOptionalChain) {
 3461|  89.2k|  assert(
 3462|  89.2k|      checkN(TokenKind::l_square, TokenKind::period, TokenKind::questiondot));
 3463|  89.2k|  SMLoc puncLoc = tok_->getStartLoc();
 3464|  89.2k|  bool optional = checkAndEat(TokenKind::questiondot);
 3465|  89.2k|  if (checkAndEat(TokenKind::l_square)) {
  ------------------
  |  Branch (3465:7): [True: 2.18k, False: 87.0k]
  ------------------
 3466|       |    // Parsing another Expression directly without going through
 3467|       |    // PrimaryExpression. This can overflow, so check.
 3468|  2.18k|    CHECK_RECURSION;
  ------------------
  |  | 1538|  2.18k|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  2.18k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 2.18k]
  |  |  ------------------
  |  | 1540|  2.18k|    return llvh::None;
  ------------------
 3469|  2.18k|    auto propExpr = parseExpression();
 3470|  2.18k|    if (!propExpr)
  ------------------
  |  Branch (3470:9): [True: 2.04k, False: 143]
  ------------------
 3471|  2.04k|      return None;
 3472|    143|    SMLoc endLoc = tok_->getEndLoc();
 3473|    143|    if (!eat(
  ------------------
  |  Branch (3473:9): [True: 0, False: 143]
  ------------------
 3474|    143|            TokenKind::r_square,
 3475|    143|            JSLexer::AllowDiv,
 3476|    143|            "at end of member expression '[...'",
 3477|    143|            "location iof '['",
 3478|    143|            puncLoc))
 3479|      0|      return None;
 3480|       |
 3481|    143|    if (optional || seenOptionalChain) {
  ------------------
  |  Branch (3481:9): [True: 0, False: 143]
  |  Branch (3481:21): [True: 0, False: 143]
  ------------------
 3482|      0|      return setLocation(
 3483|      0|          startLoc,
 3484|      0|          endLoc,
 3485|      0|          puncLoc,
 3486|      0|          new (context_) ESTree::OptionalMemberExpressionNode(
 3487|      0|              expr, propExpr.getValue(), true, optional));
 3488|      0|    }
 3489|    143|    return setLocation(
 3490|    143|        startLoc,
 3491|    143|        endLoc,
 3492|    143|        puncLoc,
 3493|    143|        new (context_)
 3494|    143|            ESTree::MemberExpressionNode(expr, propExpr.getValue(), true));
 3495|  87.0k|  } else if (
 3496|  87.0k|      checkAndEat(TokenKind::period) ||
  ------------------
  |  Branch (3496:7): [True: 85.0k, False: 1.96k]
  ------------------
 3497|  87.0k|      (optional &&
  ------------------
  |  Branch (3497:8): [True: 1.96k, False: 0]
  ------------------
 3498|  1.96k|       !(check(TokenKind::l_paren) ||
  ------------------
  |  Branch (3498:10): [True: 0, False: 1.96k]
  ------------------
 3499|  87.0k|         (context_.getParseFlow() && check(TokenKind::less))))) {
  ------------------
  |  Branch (3499:11): [True: 0, False: 1.96k]
  |  Branch (3499:38): [True: 0, False: 0]
  ------------------
 3500|  87.0k|    if (!check(TokenKind::identifier, TokenKind::private_identifier) &&
  ------------------
  |  Branch (3500:9): [True: 2.03k, False: 84.9k]
  ------------------
 3501|  87.0k|        !tok_->isResWord()) {
  ------------------
  |  Branch (3501:9): [True: 0, False: 2.03k]
  ------------------
 3502|       |      // Just use the pattern here, even though we know it will fail.
 3503|      0|      if (!need(
  ------------------
  |  Branch (3503:11): [True: 0, False: 0]
  ------------------
 3504|      0|              TokenKind::identifier,
 3505|      0|              "after '.' or '?.' in member expression",
 3506|      0|              "start of member expression",
 3507|      0|              objectLoc))
 3508|      0|        return None;
 3509|      0|    }
 3510|       |
 3511|  87.0k|    ESTree::Node *id = nullptr;
 3512|  87.0k|    if (check(TokenKind::private_identifier)) {
  ------------------
  |  Branch (3512:9): [True: 0, False: 87.0k]
  ------------------
 3513|      0|      auto optId = parsePrivateName();
 3514|      0|      if (!optId)
  ------------------
  |  Branch (3514:11): [True: 0, False: 0]
  ------------------
 3515|      0|        return None;
 3516|      0|      id = *optId;
 3517|  87.0k|    } else {
 3518|  87.0k|      id = setLocation(
 3519|  87.0k|          tok_,
 3520|  87.0k|          tok_,
 3521|  87.0k|          new (context_) ESTree::IdentifierNode(
 3522|  87.0k|              tok_->getResWordOrIdentifier(), nullptr, false));
 3523|  87.0k|      advance(JSLexer::AllowDiv);
 3524|  87.0k|    }
 3525|       |
 3526|  87.0k|    if (optional || seenOptionalChain) {
  ------------------
  |  Branch (3526:9): [True: 1.96k, False: 85.0k]
  |  Branch (3526:21): [True: 50.0k, False: 35.0k]
  ------------------
 3527|  51.9k|      return setLocation(
 3528|  51.9k|          startLoc,
 3529|  51.9k|          id,
 3530|  51.9k|          puncLoc,
 3531|  51.9k|          new (context_)
 3532|  51.9k|              ESTree::OptionalMemberExpressionNode(expr, id, false, optional));
 3533|  51.9k|    }
 3534|  35.0k|    return setLocation(
 3535|  35.0k|        startLoc,
 3536|  35.0k|        id,
 3537|  35.0k|        puncLoc,
 3538|  35.0k|        new (context_) ESTree::MemberExpressionNode(expr, id, false));
 3539|  87.0k|  } else {
 3540|      0|    assert(
 3541|      0|        optional &&
 3542|      0|        (check(TokenKind::l_paren) ||
 3543|      0|         (context_.getParseFlow() && check(TokenKind::less))) &&
 3544|      0|        "must be ?.() at this point");
 3545|       |    // ?. Arguments :
 3546|       |    // ?. ( ArgumentList )
 3547|       |    //      ^
 3548|      0|    auto debugLoc = tok_->getStartLoc();
 3549|       |
 3550|      0|    ESTree::NodePtr typeArgs = nullptr;
 3551|      0|#if HERMES_PARSE_FLOW
 3552|      0|    if (context_.getParseFlow() && check(TokenKind::less)) {
  ------------------
  |  Branch (3552:9): [True: 0, False: 0]
  |  Branch (3552:36): [True: 0, False: 0]
  ------------------
 3553|      0|      auto optTypeArgs = parseTypeArgsFlow();
 3554|      0|      if (!optTypeArgs) {
  ------------------
  |  Branch (3554:11): [True: 0, False: 0]
  ------------------
 3555|      0|        return None;
 3556|      0|      }
 3557|       |
 3558|      0|      typeArgs = *optTypeArgs;
 3559|       |
 3560|      0|      if (!need(
  ------------------
  |  Branch (3560:11): [True: 0, False: 0]
  ------------------
 3561|      0|              TokenKind::l_paren,
 3562|      0|              "after type arguments in optional call",
 3563|      0|              "start of optional call",
 3564|      0|              objectLoc))
 3565|      0|        return None;
 3566|      0|    }
 3567|      0|#endif
 3568|      0|#if HERMES_PARSE_TS
 3569|      0|    if (context_.getParseTS() && check(TokenKind::less)) {
  ------------------
  |  Branch (3569:9): [True: 0, False: 0]
  |  Branch (3569:34): [True: 0, False: 0]
  ------------------
 3570|      0|      auto optTypeArgs = parseTSTypeArguments();
 3571|      0|      if (!optTypeArgs) {
  ------------------
  |  Branch (3571:11): [True: 0, False: 0]
  ------------------
 3572|      0|        return None;
 3573|      0|      }
 3574|       |
 3575|      0|      typeArgs = *optTypeArgs;
 3576|       |
 3577|      0|      if (!need(
  ------------------
  |  Branch (3577:11): [True: 0, False: 0]
  ------------------
 3578|      0|              TokenKind::l_paren,
 3579|      0|              "after type arguments in optional call",
 3580|      0|              "start of optional call",
 3581|      0|              objectLoc))
 3582|      0|        return None;
 3583|      0|    }
 3584|      0|#endif
 3585|       |
 3586|      0|    ESTree::NodeList argList;
 3587|      0|    SMLoc endLoc;
 3588|      0|    if (!parseArguments(argList, endLoc))
  ------------------
  |  Branch (3588:9): [True: 0, False: 0]
  ------------------
 3589|      0|      return None;
 3590|       |
 3591|      0|    return setLocation(
 3592|      0|        startLoc,
 3593|      0|        endLoc,
 3594|      0|        debugLoc,
 3595|      0|        new (context_) ESTree::OptionalCallExpressionNode(
 3596|      0|            expr, typeArgs, std::move(argList), true));
 3597|      0|  }
 3598|       |
 3599|      0|  llvm_unreachable("Invalid token in parseMemberSelect");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 3600|  89.2k|}
_ZN6hermes6parser6detail12JSParserImpl19parseCallExpressionEN4llvh5SMLocEPNS_6ESTree4NodeES7_bb:
 3607|  2.95k|    bool optional) {
 3608|  2.95k|  assert(checkN(
 3609|  2.95k|      TokenKind::l_paren,
 3610|  2.95k|      TokenKind::no_substitution_template,
 3611|  2.95k|      TokenKind::template_head));
 3612|       |
 3613|  2.95k|  SMLoc objectLoc = startLoc;
 3614|       |
 3615|  5.22k|  for (;;) {
 3616|  5.22k|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 3617|  5.22k|    if ((context_.getParseFlowAmbiguous() || context_.getParseTS()) &&
  ------------------
  |  Branch (3617:10): [True: 0, False: 5.22k]
  |  Branch (3617:46): [True: 0, False: 5.22k]
  ------------------
 3618|  5.22k|        !typeArgs && check(TokenKind::less)) {
  ------------------
  |  Branch (3618:9): [True: 0, False: 0]
  |  Branch (3618:22): [True: 0, False: 0]
  ------------------
 3619|      0|      JSLexer::SavePoint savePoint{&lexer_};
 3620|       |      // Each call in a chain may have type arguments.
 3621|       |      // As such, we must attempt to parse them upon encountering '<',
 3622|       |      // but roll back if it just ended up being a comparison operator.
 3623|      0|      SourceErrorManager::SaveAndSuppressMessages suppress{
 3624|      0|          &sm_, Subsystem::Parser};
 3625|      0|      auto optTypeArgs =
 3626|      0|          context_.getParseTS() ? parseTSTypeArguments() : parseTypeArgsFlow();
  ------------------
  |  Branch (3626:11): [True: 0, False: 0]
  ------------------
 3627|      0|      if (optTypeArgs && check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3627:11): [True: 0, False: 0]
  |  Branch (3627:26): [True: 0, False: 0]
  ------------------
 3628|       |        // Call expression with type arguments.
 3629|      0|        typeArgs = *optTypeArgs;
 3630|      0|      } else {
 3631|       |        // Failed to parse a call expression with type arguments,
 3632|       |        // simply roll back and start again.
 3633|      0|        savePoint.restore();
 3634|      0|      }
 3635|      0|    }
 3636|  5.22k|#endif
 3637|  5.22k|    if (check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3637:9): [True: 2.96k, False: 2.26k]
  ------------------
 3638|  2.96k|      auto debugLoc = tok_->getStartLoc();
 3639|  2.96k|      ESTree::NodeList argList;
 3640|  2.96k|      SMLoc endLoc;
 3641|       |
 3642|       |      // parseArguments can result in another call to parseCallExpression
 3643|       |      // without parsing another primary or declaration.
 3644|  2.96k|      CHECK_RECURSION;
  ------------------
  |  | 1538|  2.96k|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  2.96k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 2.96k]
  |  |  ------------------
  |  | 1540|  2.96k|    return llvh::None;
  ------------------
 3645|  2.96k|      if (!parseArguments(argList, endLoc))
  ------------------
  |  Branch (3645:11): [True: 876, False: 2.08k]
  ------------------
 3646|    876|        return None;
 3647|       |
 3648|  2.08k|      if (seenOptionalChain) {
  ------------------
  |  Branch (3648:11): [True: 38, False: 2.04k]
  ------------------
 3649|     38|        expr = setLocation(
 3650|     38|            startLoc,
 3651|     38|            endLoc,
 3652|     38|            debugLoc,
 3653|     38|            new (context_) ESTree::OptionalCallExpressionNode(
 3654|     38|                expr, typeArgs, std::move(argList), optional));
 3655|  2.04k|      } else {
 3656|  2.04k|        expr = setLocation(
 3657|  2.04k|            startLoc,
 3658|  2.04k|            endLoc,
 3659|  2.04k|            debugLoc,
 3660|  2.04k|            new (context_)
 3661|  2.04k|                ESTree::CallExpressionNode(expr, typeArgs, std::move(argList)));
 3662|  2.04k|      }
 3663|       |
 3664|       |      // typeArgs have been used, discard them so the next item in the call
 3665|       |      // chain can populate them if necessary.
 3666|  2.08k|      typeArgs = nullptr;
 3667|  2.26k|    } else if (checkN(
  ------------------
  |  Branch (3667:16): [True: 2.21k, False: 48]
  ------------------
 3668|  2.26k|                   TokenKind::l_square,
 3669|  2.26k|                   TokenKind::period,
 3670|  2.26k|                   TokenKind::questiondot)) {
 3671|  2.21k|      if (check(TokenKind::questiondot)) {
  ------------------
  |  Branch (3671:11): [True: 47, False: 2.16k]
  ------------------
 3672|     47|        seenOptionalChain = true;
 3673|     47|      }
 3674|       |
 3675|  2.21k|      SMLoc nextObjectLoc = tok_->getStartLoc();
 3676|  2.21k|      auto msel =
 3677|  2.21k|          parseMemberSelect(startLoc, objectLoc, expr, seenOptionalChain);
 3678|  2.21k|      if (!msel)
  ------------------
  |  Branch (3678:11): [True: 2.04k, False: 171]
  ------------------
 3679|  2.04k|        return None;
 3680|    171|      objectLoc = nextObjectLoc;
 3681|    171|      expr = msel.getValue();
 3682|    171|    } else if (check(
  ------------------
  |  Branch (3682:16): [True: 14, False: 34]
  ------------------
 3683|     48|                   TokenKind::no_substitution_template,
 3684|     48|                   TokenKind::template_head)) {
 3685|     14|      auto debugLoc = tok_->getStartLoc();
 3686|     14|      auto optTemplate = parseTemplateLiteral(ParamTagged);
 3687|     14|      if (!optTemplate)
  ------------------
  |  Branch (3687:11): [True: 0, False: 14]
  ------------------
 3688|      0|        return None;
 3689|     14|      expr = setLocation(
 3690|     14|          startLoc,
 3691|     14|          optTemplate.getValue(),
 3692|     14|          debugLoc,
 3693|     14|          new (context_) ESTree::TaggedTemplateExpressionNode(
 3694|     14|              expr, optTemplate.getValue()));
 3695|     34|    } else {
 3696|     34|      break;
 3697|     34|    }
 3698|  5.22k|  }
 3699|       |
 3700|     34|  return expr;
 3701|  2.95k|}
_ZN6hermes6parser6detail12JSParserImpl38parseNewExpressionOrOptionalExpressionENS2_17IsConstructorCallE:
 3729|  8.96M|    IsConstructorCall isConstructorCall) {
 3730|  8.96M|  if (!check(TokenKind::rw_new))
  ------------------
  |  Branch (3730:7): [True: 8.90M, False: 50.6k]
  ------------------
 3731|  8.90M|    return parseOptionalExpressionExceptNew(isConstructorCall);
 3732|       |
 3733|  50.6k|  SMRange newRange = advance();
 3734|       |
 3735|  50.6k|  if (checkAndEat(TokenKind::period)) {
  ------------------
  |  Branch (3735:7): [True: 0, False: 50.6k]
  ------------------
 3736|       |    // NewTarget: new . target
 3737|       |    //                  ^
 3738|      0|    if (!check(targetIdent_)) {
  ------------------
  |  Branch (3738:9): [True: 0, False: 0]
  ------------------
 3739|      0|      error(tok_->getSourceRange(), "'target' expected in member expression");
 3740|      0|      sm_.note(newRange.Start, "start of member expression");
 3741|      0|      return None;
 3742|      0|    }
 3743|      0|    auto *meta = setLocation(
 3744|      0|        newRange,
 3745|      0|        newRange,
 3746|      0|        new (context_) ESTree::IdentifierNode(newIdent_, nullptr, false));
 3747|      0|    auto *prop = setLocation(
 3748|      0|        tok_,
 3749|      0|        tok_,
 3750|      0|        new (context_) ESTree::IdentifierNode(targetIdent_, nullptr, false));
 3751|      0|    advance();
 3752|      0|    auto *expr = setLocation(
 3753|      0|        meta, prop, new (context_) ESTree::MetaPropertyNode(meta, prop));
 3754|      0|    return parseOptionalExpressionExceptNew_tail(
 3755|      0|        isConstructorCall, newRange.Start, expr);
 3756|      0|  }
 3757|       |
 3758|   101k|  CHECK_RECURSION;
  ------------------
  |  | 1538|  50.6k|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  50.6k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 50.6k]
  |  |  ------------------
  |  | 1540|  50.6k|    return llvh::None;
  ------------------
 3759|   101k|  auto optExpr = parseNewExpressionOrOptionalExpression(IsConstructorCall::Yes);
 3760|   101k|  if (!optExpr)
  ------------------
  |  Branch (3760:7): [True: 0, False: 50.6k]
  ------------------
 3761|      0|    return None;
 3762|  50.6k|  ESTree::NodePtr expr = optExpr.getValue();
 3763|       |
 3764|  50.6k|  ESTree::Node *typeArgs = nullptr;
 3765|  50.6k|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 3766|  50.6k|  if ((context_.getParseFlowAmbiguous() || context_.getParseTS()) &&
  ------------------
  |  Branch (3766:8): [True: 0, False: 50.6k]
  |  Branch (3766:44): [True: 0, False: 50.6k]
  ------------------
 3767|  50.6k|      check(TokenKind::less)) {
  ------------------
  |  Branch (3767:7): [True: 0, False: 0]
  ------------------
 3768|      0|    JSLexer::SavePoint savePoint{&lexer_};
 3769|       |    // Attempt to parse type args upon encountering '<',
 3770|       |    // but roll back if it just ended up being a comparison operator.
 3771|      0|    SourceErrorManager::SaveAndSuppressMessages suppress{
 3772|      0|        &sm_, Subsystem::Parser};
 3773|      0|    auto optTypeArgs =
 3774|      0|        context_.getParseTS() ? parseTSTypeArguments() : parseTypeArgsFlow();
  ------------------
  |  Branch (3774:9): [True: 0, False: 0]
  ------------------
 3775|      0|    if (optTypeArgs) {
  ------------------
  |  Branch (3775:9): [True: 0, False: 0]
  ------------------
 3776|       |      // New expression with type arguments.
 3777|      0|      typeArgs = *optTypeArgs;
 3778|      0|    } else {
 3779|       |      // Failed to parse a call expression with type arguments,
 3780|       |      // simply roll back and start again.
 3781|      0|      savePoint.restore();
 3782|      0|    }
 3783|      0|  }
 3784|  50.6k|#endif
 3785|       |
 3786|       |  // Do we have arguments to a child MemberExpression? If yes, then it really
 3787|       |  // was a 'new MemberExpression(args)', otherwise it is a NewExpression
 3788|  50.6k|  if (!check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3788:7): [True: 50.6k, False: 0]
  ------------------
 3789|  50.6k|    return setLocation(
 3790|  50.6k|        newRange,
 3791|  50.6k|        getPrevTokenEndLoc(),
 3792|  50.6k|        new (context_)
 3793|  50.6k|            ESTree::NewExpressionNode(expr, typeArgs, ESTree::NodeList{}));
 3794|  50.6k|  }
 3795|       |
 3796|      0|  auto debugLoc = tok_->getStartLoc();
 3797|      0|  ESTree::NodeList argList;
 3798|      0|  SMLoc endLoc;
 3799|      0|  if (!parseArguments(argList, endLoc))
  ------------------
  |  Branch (3799:7): [True: 0, False: 0]
  ------------------
 3800|      0|    return None;
 3801|       |
 3802|      0|  expr = setLocation(
 3803|      0|      newRange,
 3804|      0|      endLoc,
 3805|      0|      debugLoc,
 3806|      0|      new (context_)
 3807|      0|          ESTree::NewExpressionNode(expr, typeArgs, std::move(argList)));
 3808|       |
 3809|      0|  SMLoc objectLoc = newRange.Start;
 3810|      0|  while (
 3811|      0|      checkN(TokenKind::l_square, TokenKind::period, TokenKind::questiondot)) {
  ------------------
  |  Branch (3811:7): [True: 0, False: 0]
  ------------------
 3812|      0|    SMLoc nextObjectLoc = tok_->getStartLoc();
 3813|      0|    auto optMSel = parseMemberSelect(newRange.Start, objectLoc, expr, false);
 3814|      0|    if (!optMSel)
  ------------------
  |  Branch (3814:9): [True: 0, False: 0]
  ------------------
 3815|      0|      return None;
 3816|      0|    objectLoc = nextObjectLoc;
 3817|      0|    expr = optMSel.getValue();
 3818|      0|  }
 3819|       |
 3820|      0|  return expr;
 3821|      0|}
_ZN6hermes6parser6detail12JSParserImpl27parseLeftHandSideExpressionEv:
 3823|  8.90M|Optional<ESTree::Node *> JSParserImpl::parseLeftHandSideExpression() {
 3824|  8.90M|  SMLoc startLoc = tok_->getStartLoc();
 3825|       |
 3826|  8.90M|  auto optExpr = parseNewExpressionOrOptionalExpression(IsConstructorCall::No);
 3827|  8.90M|  if (!optExpr)
  ------------------
  |  Branch (3827:7): [True: 1.20k, False: 8.90M]
  ------------------
 3828|  1.20k|    return None;
 3829|       |
 3830|  8.90M|  return parseLeftHandSideExpressionTail(startLoc, optExpr.getValue());
 3831|  8.90M|}
_ZN6hermes6parser6detail12JSParserImpl31parseLeftHandSideExpressionTailEN4llvh5SMLocEPNS_6ESTree4NodeE:
 3835|  8.90M|    ESTree::Node *expr) {
 3836|  8.90M|  bool optional = checkAndEat(TokenKind::questiondot);
 3837|  8.90M|  bool seenOptionalChain = optional ||
  ------------------
  |  Branch (3837:28): [True: 0, False: 8.90M]
  ------------------
 3838|  8.90M|      (expr->getParens() == 0 &&
  ------------------
  |  Branch (3838:8): [True: 8.90M, False: 163]
  ------------------
 3839|  8.90M|       (llvh::isa<ESTree::OptionalMemberExpressionNode>(expr) ||
  ------------------
  |  Branch (3839:9): [True: 1.46k, False: 8.90M]
  ------------------
 3840|  8.90M|        llvh::isa<ESTree::OptionalCallExpressionNode>(expr)));
  ------------------
  |  Branch (3840:9): [True: 0, False: 8.90M]
  ------------------
 3841|       |
 3842|  8.90M|  ESTree::Node *typeArgs = nullptr;
 3843|  8.90M|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 3844|       |  // If the less than sign is immediately following a question dot then it
 3845|       |  // cannot be a binary expression and is unambiguously Flow type syntax.
 3846|  8.90M|  if (((optional ? context_.getParseFlow()
  ------------------
  |  Branch (3846:8): [True: 0, False: 8.90M]
  |  Branch (3846:9): [True: 0, False: 8.90M]
  ------------------
 3847|  8.90M|                 : context_.getParseFlowAmbiguous()) ||
 3848|  8.90M|       context_.getParseTS()) &&
  ------------------
  |  Branch (3848:8): [True: 0, False: 8.90M]
  ------------------
 3849|  8.90M|      check(TokenKind::less)) {
  ------------------
  |  Branch (3849:7): [True: 0, False: 0]
  ------------------
 3850|      0|    JSLexer::SavePoint savePoint{&lexer_};
 3851|       |    // Suppress messages from the parser while still displaying lexer messages.
 3852|      0|    SourceErrorManager::SaveAndSuppressMessages suppress{
 3853|      0|        &sm_, Subsystem::Parser};
 3854|      0|    auto optTypeArgs =
 3855|      0|        context_.getParseTS() ? parseTSTypeArguments() : parseTypeArgsFlow();
  ------------------
  |  Branch (3855:9): [True: 0, False: 0]
  ------------------
 3856|      0|    if (optTypeArgs && check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3856:9): [True: 0, False: 0]
  |  Branch (3856:24): [True: 0, False: 0]
  ------------------
 3857|       |      // Call expression with type arguments.
 3858|      0|      typeArgs = *optTypeArgs;
 3859|      0|    } else {
 3860|       |      // Failed to parse a call expression with type arguments,
 3861|       |      // simply roll back and start again.
 3862|      0|      savePoint.restore();
 3863|      0|    }
 3864|      0|  }
 3865|  8.90M|#endif
 3866|       |
 3867|       |  // Is this a CallExpression?
 3868|  8.90M|  if (checkN(
  ------------------
  |  Branch (3868:7): [True: 2.95k, False: 8.90M]
  ------------------
 3869|  8.90M|          TokenKind::l_paren,
 3870|  8.90M|          TokenKind::no_substitution_template,
 3871|  8.90M|          TokenKind::template_head)) {
 3872|  2.95k|    auto optCallExpr = parseCallExpression(
 3873|  2.95k|        startLoc, expr, typeArgs, seenOptionalChain, optional);
 3874|  2.95k|    if (!optCallExpr)
  ------------------
  |  Branch (3874:9): [True: 2.91k, False: 34]
  ------------------
 3875|  2.91k|      return None;
 3876|     34|    expr = optCallExpr.getValue();
 3877|     34|  }
 3878|       |
 3879|  8.90M|  return expr;
 3880|  8.90M|}
_ZN6hermes6parser6detail12JSParserImpl22parsePostfixExpressionEv:
 3882|  8.90M|Optional<ESTree::Node *> JSParserImpl::parsePostfixExpression() {
 3883|  8.90M|  SMLoc startLoc = tok_->getStartLoc();
 3884|  8.90M|  auto optLHandExpr = parseLeftHandSideExpression();
 3885|  8.90M|  if (!optLHandExpr)
  ------------------
  |  Branch (3885:7): [True: 4.12k, False: 8.90M]
  ------------------
 3886|  4.12k|    return None;
 3887|       |
 3888|  8.90M|  if (check(TokenKind::plusplus, TokenKind::minusminus) &&
  ------------------
  |  Branch (3888:7): [True: 0, False: 8.90M]
  ------------------
 3889|  8.90M|      !lexer_.isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (3889:7): [True: 0, False: 0]
  ------------------
 3890|      0|    auto *res = setLocation(
 3891|      0|        startLoc,
 3892|      0|        tok_,
 3893|      0|        tok_,
 3894|      0|        new (context_) ESTree::UpdateExpressionNode(
 3895|      0|            getTokenIdent(tok_->getKind()), optLHandExpr.getValue(), false));
 3896|      0|    advance(JSLexer::AllowDiv);
 3897|      0|    return res;
 3898|  8.90M|  } else {
 3899|  8.90M|    return optLHandExpr.getValue();
 3900|  8.90M|  }
 3901|  8.90M|}
_ZN6hermes6parser6detail12JSParserImpl20parseUnaryExpressionEv:
 3903|  8.96M|Optional<ESTree::Node *> JSParserImpl::parseUnaryExpression() {
 3904|  8.96M|  SMLoc startLoc = tok_->getStartLoc();
 3905|       |
 3906|  8.96M|  switch (tok_->getKind()) {
 3907|      0|    case TokenKind::rw_delete:
  ------------------
  |  Branch (3907:5): [True: 0, False: 8.96M]
  ------------------
 3908|      0|    case TokenKind::rw_void:
  ------------------
  |  Branch (3908:5): [True: 0, False: 8.96M]
  ------------------
 3909|     20|    case TokenKind::rw_typeof:
  ------------------
  |  Branch (3909:5): [True: 20, False: 8.96M]
  ------------------
 3910|  1.05k|    case TokenKind::plus:
  ------------------
  |  Branch (3910:5): [True: 1.03k, False: 8.96M]
  ------------------
 3911|  44.6k|    case TokenKind::minus:
  ------------------
  |  Branch (3911:5): [True: 43.6k, False: 8.91M]
  ------------------
 3912|  51.7k|    case TokenKind::tilde:
  ------------------
  |  Branch (3912:5): [True: 7.09k, False: 8.95M]
  ------------------
 3913|  51.8k|    case TokenKind::exclaim: {
  ------------------
  |  Branch (3913:5): [True: 49, False: 8.96M]
  ------------------
 3914|  51.8k|      UniqueString *op = getTokenIdent(tok_->getKind());
 3915|  51.8k|      advance();
 3916|  51.8k|      CHECK_RECURSION;
  ------------------
  |  | 1538|  51.8k|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  51.8k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 51.8k]
  |  |  ------------------
  |  | 1540|  51.8k|    return llvh::None;
  ------------------
 3917|  51.8k|      auto expr = parseUnaryExpression();
 3918|  51.8k|      if (!expr)
  ------------------
  |  Branch (3918:11): [True: 0, False: 51.8k]
  ------------------
 3919|      0|        return None;
 3920|       |
 3921|  51.8k|      if (check(TokenKind::starstar)) {
  ------------------
  |  Branch (3921:11): [True: 0, False: 51.8k]
  ------------------
 3922|       |        // ExponentiationExpression only allows UpdateExpressionNode on the
 3923|       |        // left. The simplest way to enforce that the left operand is not
 3924|       |        // an unparenthesized UnaryExpression is to check here.
 3925|      0|        error(
 3926|      0|            {startLoc, tok_->getEndLoc()},
 3927|      0|            "Unary operator before ** must use parens to disambiguate");
 3928|      0|      }
 3929|       |
 3930|  51.8k|      return setLocation(
 3931|  51.8k|          startLoc,
 3932|  51.8k|          getPrevTokenEndLoc(),
 3933|  51.8k|          new (context_)
 3934|  51.8k|              ESTree::UnaryExpressionNode(op, expr.getValue(), true));
 3935|  51.8k|    }
 3936|       |
 3937|      2|    case TokenKind::plusplus:
  ------------------
  |  Branch (3937:5): [True: 2, False: 8.96M]
  ------------------
 3938|      2|    case TokenKind::minusminus: {
  ------------------
  |  Branch (3938:5): [True: 0, False: 8.96M]
  ------------------
 3939|      2|      UniqueString *op = getTokenIdent(tok_->getKind());
 3940|      2|      advance();
 3941|      2|      CHECK_RECURSION;
  ------------------
  |  | 1538|      2|  TrackRecursion trackRecursion{this}; \
  |  | 1539|      2|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 2]
  |  |  ------------------
  |  | 1540|      2|    return llvh::None;
  ------------------
 3942|      2|      auto expr = parseUnaryExpression();
 3943|      2|      if (!expr)
  ------------------
  |  Branch (3943:11): [True: 0, False: 2]
  ------------------
 3944|      0|        return None;
 3945|       |
 3946|      2|      return setLocation(
 3947|      2|          startLoc,
 3948|      2|          getPrevTokenEndLoc(),
 3949|      2|          new (context_)
 3950|      2|              ESTree::UpdateExpressionNode(op, expr.getValue(), true));
 3951|      2|    }
 3952|       |
 3953|      0|#if HERMES_PARSE_TS
 3954|      0|    case TokenKind::less:
  ------------------
  |  Branch (3954:5): [True: 0, False: 8.96M]
  ------------------
 3955|      0|      if (context_.getParseTS() && !context_.getParseJSX()) {
  ------------------
  |  Branch (3955:11): [True: 0, False: 0]
  |  Branch (3955:36): [True: 0, False: 0]
  ------------------
 3956|       |        // TSTypeAssertions are only parsed if JSX is disabled,
 3957|       |        // so there's no backtracking necessary here.
 3958|       |        // < Type > UnaryExpression
 3959|       |        // ^
 3960|      0|        advance(JSLexer::GrammarContext::Type);
 3961|      0|        auto optType = parseTypeAnnotationTS();
 3962|      0|        if (!optType)
  ------------------
  |  Branch (3962:13): [True: 0, False: 0]
  ------------------
 3963|      0|          return None;
 3964|      0|        if (!eat(
  ------------------
  |  Branch (3964:13): [True: 0, False: 0]
  ------------------
 3965|      0|                TokenKind::greater,
 3966|      0|                JSLexer::GrammarContext::AllowRegExp,
 3967|      0|                "in type assertion",
 3968|      0|                "start of assertion",
 3969|      0|                startLoc))
 3970|      0|          return None;
 3971|      0|        CHECK_RECURSION;
  ------------------
  |  | 1538|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1539|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1540|      0|    return llvh::None;
  ------------------
 3972|      0|        auto optExpr = parseUnaryExpression();
 3973|      0|        if (!optExpr)
  ------------------
  |  Branch (3973:13): [True: 0, False: 0]
  ------------------
 3974|      0|          return None;
 3975|      0|        return setLocation(
 3976|      0|            startLoc,
 3977|      0|            getPrevTokenEndLoc(),
 3978|      0|            new (context_) ESTree::TSTypeAssertionNode(*optType, *optExpr));
 3979|      0|      }
 3980|      0|      break;
 3981|      0|#endif
 3982|       |
 3983|  3.33M|    case TokenKind::identifier:
  ------------------
  |  Branch (3983:5): [True: 3.33M, False: 5.62M]
  ------------------
 3984|  3.33M|      if (check(awaitIdent_) && paramAwait_) {
  ------------------
  |  Branch (3984:11): [True: 0, False: 3.33M]
  |  Branch (3984:33): [True: 0, False: 0]
  ------------------
 3985|      0|        advance();
 3986|      0|        CHECK_RECURSION;
  ------------------
  |  | 1538|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1539|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1540|      0|    return llvh::None;
  ------------------
 3987|      0|        auto optExpr = parseUnaryExpression();
 3988|      0|        if (!optExpr)
  ------------------
  |  Branch (3988:13): [True: 0, False: 0]
  ------------------
 3989|      0|          return None;
 3990|      0|        return setLocation(
 3991|      0|            startLoc,
 3992|      0|            getPrevTokenEndLoc(),
 3993|      0|            new (context_) ESTree::AwaitExpressionNode(optExpr.getValue()));
 3994|      0|      }
 3995|       |      // Default for all other identifiers.
 3996|  3.33M|      break;
 3997|       |
 3998|  5.57M|    default:
  ------------------
  |  Branch (3998:5): [True: 5.57M, False: 3.38M]
  ------------------
 3999|  5.57M|      break;
 4000|  8.96M|  }
 4001|  8.90M|  return parsePostfixExpression();
 4002|  8.96M|}
_ZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS1_5ParamE:
 4053|  6.61M|Optional<ESTree::Node *> JSParserImpl::parseBinaryExpression(Param param) {
 4054|       |  // The stack can never go deeper than the number of precedence levels,
 4055|       |  // unless we have a right-associative operator.
 4056|       |  // We have 10 precedence levels.
 4057|  6.61M|  constexpr unsigned STACK_SIZE = 16;
 4058|       |
 4059|  6.61M|  struct PrecedenceStackEntry {
 4060|       |    /// Left hand side expression.
 4061|  6.61M|    ESTree::NodePtr expr;
 4062|       |    // Operator for this expression.
 4063|  6.61M|    TokenKind opKind;
 4064|       |    // Start location for the left hand side expression.
 4065|  6.61M|    SMLoc exprStartLoc;
 4066|       |
 4067|  6.61M|    PrecedenceStackEntry(
 4068|  6.61M|        ESTree::NodePtr expr,
 4069|  6.61M|        TokenKind opKind,
 4070|  6.61M|        SMLoc exprStartLoc)
 4071|  6.61M|        : expr(expr), opKind(opKind), exprStartLoc(exprStartLoc) {}
 4072|  6.61M|  };
 4073|  6.61M|  llvh::SmallVector<PrecedenceStackEntry, STACK_SIZE> stack{};
 4074|       |
 4075|       |  // True upon encountering a '??' operator.
 4076|  6.61M|  bool hasNullish = false;
 4077|       |  // True upon encountering a '&&' or '||' operator.
 4078|  6.61M|  bool hasBoolean = false;
 4079|       |
 4080|       |  /// Allocate a binary expression node with the specified children and
 4081|       |  /// operator.
 4082|  6.61M|  const auto newBinNode = [this, &hasNullish, &hasBoolean](
 4083|  6.61M|                              ESTree::NodePtr left,
 4084|  6.61M|                              TokenKind opKind,
 4085|  6.61M|                              ESTree::NodePtr right,
 4086|  6.61M|                              SMLoc startLoc,
 4087|  6.61M|                              SMLoc endLoc) -> ESTree::NodePtr {
 4088|  6.61M|    UniqueString *opIdent = getTokenIdent(opKind);
 4089|  6.61M|    if (opKind == TokenKind::ampamp || opKind == TokenKind::pipepipe ||
 4090|  6.61M|        opKind == TokenKind::questionquestion) {
 4091|  6.61M|      if ((hasNullish && opKind != TokenKind::questionquestion) ||
 4092|  6.61M|          (hasBoolean && opKind == TokenKind::questionquestion)) {
 4093|       |        // This error doesn't prevent parsing the rest of the binary expression,
 4094|       |        // because it's only there to avoid confusion from the JS author's
 4095|       |        // perspective. Report the error but continue parsing.
 4096|       |        // The question marks are escaped to avoid triggering a trigraph.
 4097|  6.61M|        error(
 4098|  6.61M|            {left->getStartLoc(), right->getEndLoc()},
 4099|  6.61M|            "Mixing '\?\?' with '&&' or '||' requires parentheses");
 4100|  6.61M|      }
 4101|  6.61M|      if (opKind == TokenKind::questionquestion) {
 4102|  6.61M|        hasNullish = true;
 4103|  6.61M|      } else {
 4104|  6.61M|        hasBoolean = true;
 4105|  6.61M|      }
 4106|  6.61M|      return setLocation(
 4107|  6.61M|          startLoc,
 4108|  6.61M|          endLoc,
 4109|  6.61M|          new (context_) ESTree::LogicalExpressionNode(left, right, opIdent));
 4110|  6.61M|#if HERMES_PARSE_TS || HERMES_PARSE_FLOW
 4111|  6.61M|    } else if (LLVM_UNLIKELY(opKind == TokenKind::as_operator)) {
 4112|  6.61M|      if (context_.getParseTS()) {
 4113|  6.61M|        return setLocation(
 4114|  6.61M|            startLoc,
 4115|  6.61M|            endLoc,
 4116|  6.61M|            new (context_) ESTree::TSAsExpressionNode(left, right));
 4117|  6.61M|      } else {
 4118|  6.61M|        assert(context_.getParseFlow() && "must be parsing types");
 4119|  6.61M|        if (auto *gen =
 4120|  6.61M|                llvh::dyn_cast<ESTree::GenericTypeAnnotationNode>(right);
 4121|  6.61M|            gen && !gen->_typeParameters && gen->getParens() == 0) {
 4122|  6.61M|          if (auto *ident = llvh::dyn_cast<ESTree::IdentifierNode>(gen->_id)) {
 4123|  6.61M|            if (ident->_name == constIdent_ && !ident->_optional &&
 4124|  6.61M|                !ident->_typeAnnotation) {
 4125|       |              // Special case for `x as const`,
 4126|       |              // which only is used when the `const` type has no parens
 4127|       |              // (otherwise, it's just a GenericTypeAnnotationNode).
 4128|  6.61M|              return setLocation(
 4129|  6.61M|                  startLoc,
 4130|  6.61M|                  endLoc,
 4131|  6.61M|                  new (context_) ESTree::AsConstExpressionNode(left));
 4132|  6.61M|            }
 4133|  6.61M|          }
 4134|  6.61M|        }
 4135|  6.61M|        return setLocation(
 4136|  6.61M|            startLoc,
 4137|  6.61M|            endLoc,
 4138|  6.61M|            new (context_) ESTree::AsExpressionNode(left, right));
 4139|  6.61M|      }
 4140|  6.61M|#endif
 4141|  6.61M|    } else {
 4142|  6.61M|      return setLocation(
 4143|  6.61M|          startLoc,
 4144|  6.61M|          endLoc,
 4145|  6.61M|          new (context_) ESTree::BinaryExpressionNode(left, right, opIdent));
 4146|  6.61M|    }
 4147|  6.61M|  };
 4148|       |
 4149|       |  /// Parse a private identifier, which can only be used as LHS in an `in`.
 4150|       |  /// If it's not in a valid position, report an error.
 4151|  6.61M|  const auto consumePrivateIdentifier = [this, &stack]() -> ESTree::Node * {
 4152|  6.61M|    assert(check(TokenKind::private_identifier));
 4153|  6.61M|    ESTree::Node *name = setLocation(
 4154|  6.61M|        tok_,
 4155|  6.61M|        tok_,
 4156|  6.61M|        new (context_) ESTree::PrivateNameNode(setLocation(
 4157|  6.61M|            tok_,
 4158|  6.61M|            tok_,
 4159|  6.61M|            new (context_) ESTree::IdentifierNode(
 4160|  6.61M|                tok_->getPrivateIdentifier(), nullptr, false))));
 4161|  6.61M|    advance(JSLexer::GrammarContext::AllowDiv);
 4162|  6.61M|    unsigned prevPrec = stack.empty() ? 0 : getPrecedence(stack.back().opKind);
 4163|       |    // Check the precedence of the previous operator on the stack if it exists.
 4164|       |    // If prevPrec is higher precedence than `in`, the private name will end
 4165|       |    // up as the RHS in an invalid binary expression, so report an error.
 4166|  6.61M|    if (!check(TokenKind::rw_in) || prevPrec >= getPrecedence(TokenKind::rw_in))
 4167|  6.61M|      error(
 4168|  6.61M|          name->getSourceRange(),
 4169|  6.61M|          "Private name can only be used as left-hand side of `in` expression");
 4170|  6.61M|    return name;
 4171|  6.61M|  };
 4172|       |
 4173|       |  // Decide whether to recognize "in" as a binary operator.
 4174|  6.61M|  const TokenKind exceptKind =
 4175|  6.61M|      !param.has(ParamIn) ? TokenKind::rw_in : TokenKind::none;
  ------------------
  |  Branch (4175:7): [True: 31, False: 6.61M]
  ------------------
 4176|       |
 4177|  6.61M|  SMLoc topExprStartLoc = tok_->getStartLoc();
 4178|  6.61M|  ESTree::Node *topExpr = nullptr;
 4179|  6.61M|  if (LLVM_UNLIKELY(check(TokenKind::private_identifier))) {
  ------------------
  |  |  189|  6.61M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6.61M]
  |  |  ------------------
  ------------------
 4180|      0|    topExpr = consumePrivateIdentifier();
 4181|  6.61M|  } else {
 4182|  6.61M|    auto optExpr = parseUnaryExpression();
 4183|  6.61M|    if (!optExpr)
  ------------------
  |  Branch (4183:9): [True: 4.11k, False: 6.61M]
  ------------------
 4184|  4.11k|      return None;
 4185|  6.61M|    topExpr = optExpr.getValue();
 4186|  6.61M|  }
 4187|  6.61M|  SMLoc topExprEndLoc = getPrevTokenEndLoc();
 4188|  6.61M|  convertIdentOpIfPossible();
 4189|       |
 4190|       |  // While the current token is a binary operator.
 4191|  8.90M|  while (unsigned precedence = getPrecedenceExcept(tok_, exceptKind)) {
  ------------------
  |  Branch (4191:19): [True: 2.29M, False: 6.61M]
  ------------------
 4192|       |    // If the next operator has no greater precedence than the operator on the
 4193|       |    // stack, pop the stack, creating a new binary expression.
 4194|  4.56M|    while (!stack.empty() && precedence <= getPrecedence(stack.back().opKind)) {
  ------------------
  |  Branch (4194:12): [True: 2.60M, False: 1.96M]
  |  Branch (4194:30): [True: 2.27M, False: 331k]
  ------------------
 4195|  2.27M|      if (precedence == getPrecedence(stack.back().opKind) &&
  ------------------
  |  Branch (4195:11): [True: 2.20M, False: 71.8k]
  ------------------
 4196|  2.27M|          !isLeftAssoc(stack.back().opKind)) {
  ------------------
  |  Branch (4196:11): [True: 0, False: 2.20M]
  ------------------
 4197|       |        // If the precedences are equal, then we avoid popping for
 4198|       |        // right-associative operators to allow for the entire right-associative
 4199|       |        // expression to be built from the right.
 4200|      0|        break;
 4201|      0|      }
 4202|  2.27M|      topExpr = newBinNode(
 4203|  2.27M|          stack.back().expr,
 4204|  2.27M|          stack.back().opKind,
 4205|  2.27M|          topExpr,
 4206|  2.27M|          stack.back().exprStartLoc,
 4207|  2.27M|          topExprEndLoc);
 4208|  2.27M|      topExprStartLoc = topExpr->getStartLoc();
 4209|  2.27M|      stack.pop_back();
 4210|  2.27M|    }
 4211|       |
 4212|       |    // The next operator has a higher precedence than the previous one (or there
 4213|       |    // is no previous one). The situation looks something like this:
 4214|       |    //    .... + topExpr * rightExpr ....
 4215|       |    //                     ^
 4216|       |    //                 We are here
 4217|       |    // Push topExpr and the '*', so we can parse rightExpr.
 4218|  2.29M|    stack.emplace_back(topExpr, tok_->getKind(), topExprStartLoc);
 4219|       |
 4220|  2.29M|#if HERMES_PARSE_TS || HERMES_PARSE_FLOW
 4221|  2.29M|    if (LLVM_UNLIKELY(stack.back().opKind == TokenKind::as_operator)) {
  ------------------
  |  |  189|  2.29M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.29M]
  |  |  ------------------
  ------------------
 4222|      0|      advance(JSLexer::GrammarContext::Type);
 4223|      0|      topExprStartLoc = tok_->getStartLoc();
 4224|      0|      auto optRightExpr = parseTypeAnnotation();
 4225|      0|      if (!optRightExpr)
  ------------------
  |  Branch (4225:11): [True: 0, False: 0]
  ------------------
 4226|      0|        return None;
 4227|      0|      topExpr = optRightExpr.getValue();
 4228|      0|    } else
 4229|  2.29M|#endif
 4230|  2.29M|    {
 4231|  2.29M|      advance();
 4232|  2.29M|      topExprStartLoc = tok_->getStartLoc();
 4233|  2.29M|      if (LLVM_UNLIKELY(check(TokenKind::private_identifier))) {
  ------------------
  |  |  189|  2.29M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.29M]
  |  |  ------------------
  ------------------
 4234|      0|        topExpr = consumePrivateIdentifier();
 4235|  2.29M|      } else {
 4236|  2.29M|        auto optRightExpr = parseUnaryExpression();
 4237|  2.29M|        if (!optRightExpr)
  ------------------
  |  Branch (4237:13): [True: 5, False: 2.29M]
  ------------------
 4238|      5|          return None;
 4239|  2.29M|        topExpr = optRightExpr.getValue();
 4240|  2.29M|      }
 4241|  2.29M|    }
 4242|       |
 4243|  2.29M|    topExprEndLoc = getPrevTokenEndLoc();
 4244|  2.29M|    convertIdentOpIfPossible();
 4245|  2.29M|  }
 4246|       |
 4247|       |  // We have consumed all binary operators. Pop the stack, creating expressions.
 4248|  6.62M|  while (!stack.empty()) {
  ------------------
  |  Branch (4248:10): [True: 15.2k, False: 6.61M]
  ------------------
 4249|  15.2k|    topExpr = newBinNode(
 4250|  15.2k|        stack.back().expr,
 4251|  15.2k|        stack.back().opKind,
 4252|  15.2k|        topExpr,
 4253|  15.2k|        stack.back().exprStartLoc,
 4254|  15.2k|        topExprEndLoc);
 4255|  15.2k|    stack.pop_back();
 4256|  15.2k|  }
 4257|       |
 4258|  6.61M|  assert(
 4259|  6.61M|      stack.empty() &&
 4260|  6.61M|      "Stack must be empty when done parsing binary expression");
 4261|       |
 4262|  6.61M|  return topExpr;
 4263|  6.61M|}
_ZN6hermes6parser6detail12JSParserImpl26parseConditionalExpressionENS1_5ParamENS2_20CoverTypedParametersE:
 4267|  6.61M|    CoverTypedParameters coverTypedParameters) {
 4268|  6.61M|  SMLoc startLoc = tok_->getStartLoc();
 4269|  6.61M|  auto optTest = parseBinaryExpression(param);
 4270|  6.61M|  if (!optTest)
  ------------------
  |  Branch (4270:7): [True: 4.12k, False: 6.61M]
  ------------------
 4271|  4.12k|    return None;
 4272|  6.61M|  ESTree::Node *test = *optTest;
 4273|       |
 4274|  6.61M|  if (!check(TokenKind::question)) {
  ------------------
  |  Branch (4274:7): [True: 6.60M, False: 7.33k]
  ------------------
 4275|       |    // No '?', so this isn't a conditional expression.
 4276|       |    // If CoverTypedParameters::Yes, we still need to account for this
 4277|       |    // being formal parameters, so try that.
 4278|       |    // TS doesn't have type casts with this syntax, but we must still
 4279|       |    // cover the typed identifier node for when it turns into an arrow function.
 4280|  6.60M|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 4281|  6.60M|    if (context_.getParseTypes() &&
  ------------------
  |  Branch (4281:9): [True: 0, False: 6.60M]
  ------------------
 4282|  6.60M|        coverTypedParameters == CoverTypedParameters::Yes) {
  ------------------
  |  Branch (4282:9): [True: 0, False: 0]
  ------------------
 4283|      0|      auto optCover = tryParseCoverTypedIdentifierNode(test, false);
 4284|      0|      if (!optCover)
  ------------------
  |  Branch (4284:11): [True: 0, False: 0]
  ------------------
 4285|      0|        return None;
 4286|      0|      if (*optCover)
  ------------------
  |  Branch (4286:11): [True: 0, False: 0]
  ------------------
 4287|      0|        return *optCover;
 4288|      0|    }
 4289|  6.60M|#endif
 4290|       |
 4291|       |    // No CoverTypedParameters found, just return the LHS.
 4292|  6.60M|    return test;
 4293|  6.60M|  }
 4294|       |
 4295|  7.33k|  ESTree::Node *consequent = nullptr;
 4296|  7.33k|  SMRange questionRange = tok_->getSourceRange();
 4297|       |
 4298|  7.33k|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 4299|  7.33k|  if (context_.getParseTypes()) {
  ------------------
  |  Branch (4299:7): [True: 0, False: 7.33k]
  ------------------
 4300|       |    // Save here to save the question mark (we can only save on punctuators).
 4301|       |    // Early returns will happen if we find anything that leads to
 4302|       |    // short-circuiting out of the traditional conditional expression.
 4303|      0|    JSLexer::SavePoint savePoint{&lexer_};
 4304|      0|    advance();
 4305|       |
 4306|       |    // If CoverTypedParameters::Yes, we still need to account for this
 4307|       |    // being formal parameters, so try that,
 4308|       |    // in which case the '?' was part of an optional parameter, not a
 4309|       |    // conditional expression.
 4310|      0|    if (coverTypedParameters == CoverTypedParameters::Yes) {
  ------------------
  |  Branch (4310:9): [True: 0, False: 0]
  ------------------
 4311|      0|      auto optCover = tryParseCoverTypedIdentifierNode(test, true);
 4312|      0|      if (!optCover)
  ------------------
  |  Branch (4312:11): [True: 0, False: 0]
  ------------------
 4313|      0|        return None;
 4314|      0|      if (*optCover)
  ------------------
  |  Branch (4314:11): [True: 0, False: 0]
  ------------------
 4315|      0|        return *optCover;
 4316|      0|    }
 4317|       |
 4318|       |    // It is also possible to have a '?' without ':' but not be a conditional
 4319|       |    // expression, in the case of typed arrow parameters that didn't have a type
 4320|       |    // annotation. For example:
 4321|       |    // (foo?) => 1
 4322|       |    //      ^
 4323|       |    // The tokens which can come here are limited to ',', '=', and ')'.
 4324|      0|    if (coverTypedParameters == CoverTypedParameters::Yes &&
  ------------------
  |  Branch (4324:9): [True: 0, False: 0]
  ------------------
 4325|      0|        checkN(TokenKind::comma, TokenKind::r_paren, TokenKind::equal)) {
  ------------------
  |  Branch (4325:9): [True: 0, False: 0]
  ------------------
 4326|      0|      return setLocation(
 4327|      0|          startLoc,
 4328|      0|          questionRange,
 4329|      0|          new (context_) ESTree::CoverTypedIdentifierNode(test, nullptr, true));
 4330|      0|    }
 4331|       |
 4332|       |    // Now we're in the real backtracking stage.
 4333|       |    // First, parse with AllowTypedArrowFunction::Yes to allow for the
 4334|       |    // possibility of a concise arrow function with return types. However, we
 4335|       |    // want to avoid the possibility of eating the ':' that we'll need for the
 4336|       |    // conditional expression's alternate. For example:
 4337|       |    // a ? b1 => (c1) : b2 => (c2)
 4338|       |    // We want to account for b2 incorrectly being parsed as the returnType
 4339|       |    // of an arrow function returned by the arrow function with param b1.
 4340|       |    // Thus, after parsing with AllowTypedArrowFunction::Yes, we check to
 4341|       |    // see if there is a ':' afterwards. If there isn't, failure is assured,
 4342|       |    // so we restore to the '?' and try again below, with
 4343|       |    // AllowTypedArrowFunction::No.
 4344|      0|    SourceErrorManager::SaveAndSuppressMessages suppress{
 4345|      0|        &sm_, Subsystem::Parser};
 4346|      0|    CHECK_RECURSION;
  ------------------
  |  | 1538|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1539|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1540|      0|    return llvh::None;
  ------------------
 4347|      0|    auto optConsequent = parseAssignmentExpression(
 4348|      0|        ParamIn, AllowTypedArrowFunction::Yes, CoverTypedParameters::No);
 4349|      0|    if (optConsequent && check(TokenKind::colon)) {
  ------------------
  |  Branch (4349:9): [True: 0, False: 0]
  |  Branch (4349:26): [True: 0, False: 0]
  ------------------
 4350|      0|      consequent = *optConsequent;
 4351|      0|    } else {
 4352|       |      // Parsing with typed arrow functions failed because we don't have a :,
 4353|       |      // so reset and try again.
 4354|      0|      savePoint.restore();
 4355|      0|    }
 4356|      0|  }
 4357|  7.33k|#endif
 4358|       |
 4359|       |  // Calls to parseAssignmentExpression may recursively invoke
 4360|       |  // parseConditionalExpression.
 4361|  14.6k|  CHECK_RECURSION;
  ------------------
  |  | 1538|  7.33k|  TrackRecursion trackRecursion{this}; \
  |  | 1539|  7.33k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 7.33k]
  |  |  ------------------
  |  | 1540|  7.33k|    return llvh::None;
  ------------------
 4362|       |
 4363|       |  // Only try with AllowTypedArrowFunction::No if we haven't already set
 4364|       |  // up the consequent using AllowTypedArrowFunction::Yes.
 4365|  14.6k|  if (!consequent) {
  ------------------
  |  Branch (4365:7): [True: 7.33k, False: 0]
  ------------------
 4366|       |    // Consume the '?' (either for the first time or after savePoint.restore()).
 4367|  7.33k|    advance();
 4368|  7.33k|    auto optConsequent = parseAssignmentExpression(
 4369|  7.33k|        ParamIn, AllowTypedArrowFunction::No, CoverTypedParameters::No);
 4370|  7.33k|    if (!optConsequent)
  ------------------
  |  Branch (4370:9): [True: 0, False: 7.33k]
  ------------------
 4371|      0|      return None;
 4372|  7.33k|    consequent = *optConsequent;
 4373|  7.33k|  }
 4374|       |
 4375|  7.33k|  if (!eat(
  ------------------
  |  Branch (4375:7): [True: 0, False: 7.33k]
  ------------------
 4376|  7.33k|          TokenKind::colon,
 4377|  7.33k|          JSLexer::AllowRegExp,
 4378|  7.33k|          "in conditional expression after '... ? ...'",
 4379|  7.33k|          "location of '?'",
 4380|  7.33k|          questionRange.Start))
 4381|      0|    return None;
 4382|       |
 4383|  7.33k|  auto optAlternate = parseAssignmentExpression(
 4384|  7.33k|      param, AllowTypedArrowFunction::Yes, CoverTypedParameters::No);
 4385|  7.33k|  if (!optAlternate)
  ------------------
  |  Branch (4385:7): [True: 0, False: 7.33k]
  ------------------
 4386|      0|    return None;
 4387|  7.33k|  ESTree::Node *alternate = *optAlternate;
 4388|       |
 4389|  7.33k|  return setLocation(
 4390|  7.33k|      startLoc,
 4391|  7.33k|      getPrevTokenEndLoc(),
 4392|  7.33k|      new (context_)
 4393|  7.33k|          ESTree::ConditionalExpressionNode(test, alternate, consequent));
 4394|  7.33k|}
_ZN6hermes6parser6detail12JSParserImpl22reparseArrowParametersEPNS_6ESTree4NodeEbRN4llvh12simple_ilistIS4_JEEERb:
 5254|   206k|    bool &isAsync) {
 5255|       |  // Empty argument list "()".
 5256|   206k|  if (node->getParens() == 0 && isa<ESTree::CoverEmptyArgsNode>(node))
  ------------------
  |  Branch (5256:7): [True: 206k, False: 0]
  |  Branch (5256:33): [True: 0, False: 206k]
  ------------------
 5257|      0|    return true;
 5258|       |
 5259|       |  // A single identifier without parens.
 5260|   206k|  if (node->getParens() == 0 && isa<ESTree::IdentifierNode>(node)) {
  ------------------
  |  Branch (5260:7): [True: 206k, False: 0]
  |  Branch (5260:33): [True: 206k, False: 0]
  ------------------
 5261|   206k|    paramList.push_back(*node);
 5262|   206k|    return validateBindingIdentifier(
 5263|   206k|        Param{},
 5264|   206k|        node->getSourceRange(),
 5265|   206k|        cast<ESTree::IdentifierNode>(node)->_name,
 5266|   206k|        TokenKind::identifier);
 5267|   206k|  }
 5268|       |
 5269|      0|  ESTree::NodeList nodeList{};
 5270|       |
 5271|      0|  if (auto *callNode = dyn_cast<ESTree::CallExpressionNode>(node)) {
  ------------------
  |  Branch (5271:13): [True: 0, False: 0]
  ------------------
 5272|       |    // Async function parameters look like call expressions. For example:
 5273|       |    // async(x,y)
 5274|       |    // It must have no surrounding parens and the name must be 'async'.
 5275|       |    // It must also not already be `async`, because the CallExpression
 5276|       |    // determines whether it is `async`.
 5277|       |    // It must not have a newline between 'async' and the parameters.
 5278|       |    // Set `isAsync = true` to indicate that this was async.
 5279|      0|    auto *callee = dyn_cast<ESTree::IdentifierNode>(callNode->_callee);
 5280|      0|    if (!isAsync && callNode->getParens() == 0 && callee &&
  ------------------
  |  Branch (5280:9): [True: 0, False: 0]
  |  Branch (5280:21): [True: 0, False: 0]
  |  Branch (5280:51): [True: 0, False: 0]
  ------------------
 5281|      0|        callee->_name == asyncIdent_ && !hasNewLine) {
  ------------------
  |  Branch (5281:9): [True: 0, False: 0]
  |  Branch (5281:41): [True: 0, False: 0]
  ------------------
 5282|      0|      nodeList = std::move(callNode->_arguments);
 5283|      0|      isAsync = true;
 5284|      0|    } else {
 5285|      0|      error(node->getSourceRange(), "invalid arrow function parameter list");
 5286|      0|      return false;
 5287|      0|    }
 5288|      0|  } else {
 5289|      0|    if (node->getParens() != 1) {
  ------------------
  |  Branch (5289:9): [True: 0, False: 0]
  ------------------
 5290|      0|      error(node->getSourceRange(), "invalid arrow function parameter list");
 5291|      0|      return false;
 5292|      0|    }
 5293|       |
 5294|      0|    if (auto *seqNode = dyn_cast<ESTree::SequenceExpressionNode>(node)) {
  ------------------
  |  Branch (5294:15): [True: 0, False: 0]
  ------------------
 5295|      0|      nodeList = std::move(seqNode->_expressions);
 5296|      0|    } else {
 5297|      0|      node->clearParens();
 5298|      0|      nodeList.push_back(*node);
 5299|      0|    }
 5300|      0|  }
 5301|       |
 5302|      0|  llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, paramAwait_ || isAsync);
  ------------------
  |  Branch (5302:57): [True: 0, False: 0]
  |  Branch (5302:72): [True: 0, False: 0]
  ------------------
 5303|       |
 5304|       |  // If the node has 0 parentheses, return true, otherwise print an error and
 5305|       |  // return false.
 5306|      0|  auto checkParens = [this](ESTree::Node *n) {
 5307|      0|    if (n->getParens() == 0)
 5308|      0|      return true;
 5309|       |
 5310|      0|    error(n->getSourceRange(), "parentheses are not allowed around parameters");
 5311|      0|    return false;
 5312|      0|  };
 5313|       |
 5314|      0|  for (auto it = nodeList.begin(), e = nodeList.end(); it != e;) {
  ------------------
  |  Branch (5314:56): [True: 0, False: 0]
  ------------------
 5315|      0|    auto *expr = &*it;
 5316|      0|    it = nodeList.erase(it);
 5317|       |
 5318|      0|    if (!checkParens(expr))
  ------------------
  |  Branch (5318:9): [True: 0, False: 0]
  ------------------
 5319|      0|      continue;
 5320|       |
 5321|      0|    if (auto *CRE = dyn_cast<ESTree::CoverRestElementNode>(expr)) {
  ------------------
  |  Branch (5321:15): [True: 0, False: 0]
  ------------------
 5322|      0|      if (it != e)
  ------------------
  |  Branch (5322:11): [True: 0, False: 0]
  ------------------
 5323|      0|        error(expr->getSourceRange(), "rest parameter must be last");
 5324|      0|      else
 5325|      0|        paramList.push_back(*CRE->_rest);
 5326|      0|      continue;
 5327|      0|    }
 5328|       |
 5329|      0|    if (auto *spread = dyn_cast<ESTree::SpreadElementNode>(expr)) {
  ------------------
  |  Branch (5329:15): [True: 0, False: 0]
  ------------------
 5330|       |      // async arrow heads are initially parsed as CallExpression,
 5331|       |      // which means that Rest elements are parsed as SpreadElement.
 5332|      0|      if (it != e)
  ------------------
  |  Branch (5332:11): [True: 0, False: 0]
  ------------------
 5333|      0|        error(expr->getSourceRange(), "rest parameter must be last");
 5334|      0|      else
 5335|      0|        paramList.push_back(*new (context_)
 5336|      0|                                ESTree::RestElementNode(spread->_argument));
 5337|      0|      continue;
 5338|      0|    }
 5339|       |
 5340|      0|    if (isa<ESTree::CoverTrailingCommaNode>(expr)) {
  ------------------
  |  Branch (5340:9): [True: 0, False: 0]
  ------------------
 5341|      0|      assert(
 5342|      0|          it == e &&
 5343|      0|          "CoverTrailingCommaNode should have been only parsed last");
 5344|       |      // Just skip it.
 5345|      0|      continue;
 5346|      0|    }
 5347|       |
 5348|      0|    ESTree::AssignmentExpressionNode *asn = nullptr;
 5349|      0|    ESTree::Node *init = nullptr;
 5350|       |
 5351|       |    // If we encounter an initializer, unpack it.
 5352|      0|    if ((asn = dyn_cast<ESTree::AssignmentExpressionNode>(expr))) {
  ------------------
  |  Branch (5352:9): [True: 0, False: 0]
  ------------------
 5353|      0|      if (asn->_operator == getTokenIdent(TokenKind::equal)) {
  ------------------
  |  Branch (5353:11): [True: 0, False: 0]
  ------------------
 5354|      0|        expr = asn->_left;
 5355|      0|        init = asn->_right;
 5356|       |
 5357|      0|        if (!checkParens(expr))
  ------------------
  |  Branch (5357:13): [True: 0, False: 0]
  ------------------
 5358|      0|          continue;
 5359|      0|      }
 5360|      0|    }
 5361|       |
 5362|      0|    auto optParam = reparseAssignmentPattern(expr, true);
 5363|      0|    if (!optParam)
  ------------------
  |  Branch (5363:9): [True: 0, False: 0]
  ------------------
 5364|      0|      continue;
 5365|      0|    expr = *optParam;
 5366|       |
 5367|      0|    if (init) {
  ------------------
  |  Branch (5367:9): [True: 0, False: 0]
  ------------------
 5368|      0|      expr = setLocation(
 5369|      0|          asn, asn, new (context_) ESTree::AssignmentPatternNode(expr, init));
 5370|      0|    }
 5371|       |
 5372|      0|    if (auto *ident = dyn_cast<ESTree::IdentifierNode>(expr)) {
  ------------------
  |  Branch (5372:15): [True: 0, False: 0]
  ------------------
 5373|      0|      validateBindingIdentifier(
 5374|      0|          Param{},
 5375|      0|          ident->getSourceRange(),
 5376|      0|          ident->_name,
 5377|      0|          TokenKind::identifier);
 5378|      0|    }
 5379|       |
 5380|      0|    paramList.push_back(*expr);
 5381|      0|  }
 5382|       |
 5383|      0|  return true;
 5384|      0|}
_ZN6hermes6parser6detail12JSParserImpl28parseArrowFunctionExpressionENS1_5ParamEPNS_6ESTree4NodeEbS6_S6_S6_N4llvh5SMLocENS2_23AllowTypedArrowFunctionEb:
 5395|   206k|    bool forceAsync) {
 5396|       |  // ArrowFunction : ArrowParameters [no line terminator] => ConciseBody.
 5397|   206k|  assert(
 5398|   206k|      check(TokenKind::equalgreater) && !lexer_.isNewLineBeforeCurrentToken() &&
 5399|   206k|      "ArrowFunctionExpression expects [no new line] '=>'");
 5400|       |
 5401|   206k|  llvh::SaveAndRestore<bool> argsParamAwait(paramAwait_, forceAsync);
 5402|       |
 5403|   206k|  if (!eat(
  ------------------
  |  Branch (5403:7): [True: 0, False: 206k]
  ------------------
 5404|   206k|          TokenKind::equalgreater,
 5405|   206k|          JSLexer::GrammarContext::AllowRegExp,
 5406|   206k|          "in arrow function expression",
 5407|   206k|          "start of arrow function",
 5408|   206k|          startLoc))
 5409|      0|    return None;
 5410|       |
 5411|   206k|  bool isAsync = forceAsync;
 5412|   206k|  ESTree::NodeList paramList;
 5413|   206k|  if (!reparseArrowParameters(leftExpr, hasNewLine, paramList, isAsync))
  ------------------
  |  Branch (5413:7): [True: 0, False: 206k]
  ------------------
 5414|      0|    return None;
 5415|       |
 5416|   206k|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
 5417|   206k|  ESTree::Node *body;
 5418|   206k|  bool expression;
 5419|       |
 5420|   206k|  llvh::SaveAndRestore<bool> oldParamYield(paramYield_, false);
 5421|   206k|  llvh::SaveAndRestore<bool> bodyParamAwait(paramAwait_, isAsync);
 5422|   206k|  if (check(TokenKind::l_brace)) {
  ------------------
  |  Branch (5422:7): [True: 0, False: 206k]
  ------------------
 5423|      0|    auto optBody = parseFunctionBody(
 5424|      0|        Param{},
 5425|      0|        true,
 5426|      0|        oldParamYield.get(),
 5427|      0|        argsParamAwait.get(),
 5428|      0|        JSLexer::AllowDiv,
 5429|      0|        true);
 5430|      0|    if (!optBody)
  ------------------
  |  Branch (5430:9): [True: 0, False: 0]
  ------------------
 5431|      0|      return None;
 5432|      0|    body = *optBody;
 5433|      0|    expression = false;
 5434|   206k|  } else {
 5435|       |    // It's possible to recurse onto parseAssignmentExpression directly
 5436|       |    // and get stuck without a depth check if we don't have one here.
 5437|   206k|    CHECK_RECURSION;
  ------------------
  |  | 1538|   206k|  TrackRecursion trackRecursion{this}; \
  |  | 1539|   206k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1539:7): [True: 0, False: 206k]
  |  |  ------------------
  |  | 1540|   206k|    return llvh::None;
  ------------------
 5438|   206k|    auto optConcise = parseAssignmentExpression(
 5439|   206k|        param.get(ParamIn),
 5440|   206k|        allowTypedArrowFunction,
 5441|   206k|        CoverTypedParameters::No,
 5442|   206k|        nullptr);
 5443|   206k|    if (!optConcise)
  ------------------
  |  Branch (5443:9): [True: 0, False: 206k]
  ------------------
 5444|      0|      return None;
 5445|   206k|    body = *optConcise;
 5446|   206k|    expression = true;
 5447|   206k|  }
 5448|       |
 5449|   206k|  auto *arrow = new (context_) ESTree::ArrowFunctionExpressionNode(
 5450|   206k|      nullptr,
 5451|   206k|      std::move(paramList),
 5452|   206k|      body,
 5453|   206k|      typeParams,
 5454|   206k|      returnType,
 5455|   206k|      predicate,
 5456|   206k|      expression,
 5457|   206k|      isAsync);
 5458|       |
 5459|   206k|  return setLocation(startLoc, getPrevTokenEndLoc(), arrow);
 5460|   206k|}
_ZN6hermes6parser6detail12JSParserImpl24reparseAssignmentPatternEPNS_6ESTree4NodeEb:
 5464|  44.7k|    bool inDecl) {
 5465|  44.7k|  if (!node->getParens()) {
  ------------------
  |  Branch (5465:7): [True: 44.7k, False: 0]
  ------------------
 5466|  44.7k|    if (auto *AEN = dyn_cast<ESTree::ArrayExpressionNode>(node)) {
  ------------------
  |  Branch (5466:15): [True: 44.7k, False: 2]
  ------------------
 5467|  44.7k|      return reparseArrayAsignmentPattern(AEN, inDecl);
 5468|  44.7k|    }
 5469|      2|    if (auto *OEN = dyn_cast<ESTree::ObjectExpressionNode>(node)) {
  ------------------
  |  Branch (5469:15): [True: 0, False: 2]
  ------------------
 5470|      0|      return reparseObjectAssignmentPattern(OEN, inDecl);
 5471|      0|    }
 5472|      2|    if (auto *ident = dyn_cast<ESTree::IdentifierNode>(node)) {
  ------------------
  |  Branch (5472:15): [True: 1, False: 1]
  ------------------
 5473|       |      // Validate in this function to avoid validating in each branch of
 5474|       |      // the conditions within the other reparse functions.
 5475|       |      // Validation does not prevent progress of the parse here, so we can
 5476|       |      // return node regardless of whether we failed to validate.
 5477|      1|      validateBindingIdentifier(
 5478|      1|          Param{},
 5479|      1|          ident->getSourceRange(),
 5480|      1|          ident->_name,
 5481|      1|          TokenKind::identifier);
 5482|      1|      return node;
 5483|      1|    }
 5484|      1|    if (isa<ESTree::PatternNode>(node)) {
  ------------------
  |  Branch (5484:9): [True: 0, False: 1]
  ------------------
 5485|       |      // Pattern nodes validate their binding identifiers when they are
 5486|       |      // initially parsed, no work to do here.
 5487|      0|      return node;
 5488|      0|    }
 5489|      1|#if HERMES_PARSE_FLOW
 5490|      1|    if (auto *cover = dyn_cast<ESTree::CoverTypedIdentifierNode>(node)) {
  ------------------
  |  Branch (5490:15): [True: 0, False: 1]
  ------------------
 5491|      0|      auto optAssn = reparseAssignmentPattern(cover->_left, inDecl);
 5492|       |      // type may be nullptr, but the patterns may have null typeAnnotation.
 5493|      0|      auto *type = cover->_right;
 5494|      0|      if (!optAssn)
  ------------------
  |  Branch (5494:11): [True: 0, False: 0]
  ------------------
 5495|      0|        return None;
 5496|      0|      if (auto *apn = dyn_cast<ESTree::ArrayPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5496:17): [True: 0, False: 0]
  ------------------
 5497|      0|        apn->_typeAnnotation = type;
 5498|      0|        return setLocation(cover, cover, apn);
 5499|      0|      }
 5500|      0|      if (auto *opn = dyn_cast<ESTree::ObjectPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5500:17): [True: 0, False: 0]
  ------------------
 5501|      0|        opn->_typeAnnotation = type;
 5502|      0|        return setLocation(cover, cover, opn);
 5503|      0|      }
 5504|      0|      if (auto *id = dyn_cast<ESTree::IdentifierNode>(*optAssn)) {
  ------------------
  |  Branch (5504:17): [True: 0, False: 0]
  ------------------
 5505|      0|        id->_typeAnnotation = type;
 5506|      0|        id->_optional = cover->_optional;
 5507|      0|        return setLocation(cover, cover, id);
 5508|      0|      }
 5509|      0|    }
 5510|      1|    if (auto *typecast = dyn_cast<ESTree::TypeCastExpressionNode>(node)) {
  ------------------
  |  Branch (5510:15): [True: 0, False: 1]
  ------------------
 5511|      0|      auto optAssn = reparseAssignmentPattern(typecast->_expression, inDecl);
 5512|      0|      auto *type = typecast->_typeAnnotation;
 5513|      0|      if (!optAssn)
  ------------------
  |  Branch (5513:11): [True: 0, False: 0]
  ------------------
 5514|      0|        return None;
 5515|      0|      if (auto *apn = dyn_cast<ESTree::ArrayPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5515:17): [True: 0, False: 0]
  ------------------
 5516|      0|        apn->_typeAnnotation = type;
 5517|      0|        return setLocation(apn, type, apn);
 5518|      0|      }
 5519|      0|      if (auto *opn = dyn_cast<ESTree::ObjectPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5519:17): [True: 0, False: 0]
  ------------------
 5520|      0|        opn->_typeAnnotation = type;
 5521|      0|        return setLocation(opn, type, opn);
 5522|      0|      }
 5523|      0|      if (auto *id = dyn_cast<ESTree::IdentifierNode>(*optAssn)) {
  ------------------
  |  Branch (5523:17): [True: 0, False: 0]
  ------------------
 5524|      0|        id->_typeAnnotation = type;
 5525|      0|        return setLocation(id, type, id);
 5526|      0|      }
 5527|      0|    }
 5528|      1|#endif
 5529|      1|  }
 5530|       |
 5531|      1|  if (inDecl) {
  ------------------
  |  Branch (5531:7): [True: 0, False: 1]
  ------------------
 5532|      0|    error(node->getSourceRange(), "identifier or pattern expected");
 5533|      0|    return None;
 5534|      0|  }
 5535|       |
 5536|      1|  return node;
 5537|      1|}
_ZN6hermes6parser6detail12JSParserImpl28reparseArrayAsignmentPatternEPNS_6ESTree19ArrayExpressionNodeEb:
 5541|  44.7k|    bool inDecl) {
 5542|  44.7k|  ESTree::NodeList elements{};
 5543|       |
 5544|  85.4k|  for (auto it = AEN->_elements.begin(), e = AEN->_elements.end(); it != e;) {
  ------------------
  |  Branch (5544:68): [True: 40.6k, False: 44.7k]
  ------------------
 5545|  40.6k|    ESTree::Node *elem = &*it++;
 5546|  40.6k|    AEN->_elements.remove(*elem);
 5547|       |
 5548|       |    // Every element in the array assignment pattern is optional,
 5549|       |    // because we can parse the Elision production.
 5550|  40.6k|    if (isa<ESTree::EmptyNode>(elem)) {
  ------------------
  |  Branch (5550:9): [True: 0, False: 40.6k]
  ------------------
 5551|      0|      elements.push_back(*elem);
 5552|      0|      continue;
 5553|      0|    }
 5554|       |
 5555|  40.6k|    if (auto *spread = dyn_cast<ESTree::SpreadElementNode>(elem)) {
  ------------------
  |  Branch (5555:15): [True: 0, False: 40.6k]
  ------------------
 5556|      0|      if (it != e || AEN->_trailingComma) {
  ------------------
  |  Branch (5556:11): [True: 0, False: 0]
  |  Branch (5556:22): [True: 0, False: 0]
  ------------------
 5557|      0|        error(spread->getSourceRange(), "rest element must be last");
 5558|      0|        continue;
 5559|      0|      }
 5560|       |
 5561|      0|      auto optSubPattern = reparseAssignmentPattern(spread->_argument, inDecl);
 5562|      0|      if (!optSubPattern)
  ------------------
  |  Branch (5562:11): [True: 0, False: 0]
  ------------------
 5563|      0|        continue;
 5564|      0|      elem = setLocation(
 5565|      0|          spread,
 5566|      0|          spread,
 5567|      0|          new (context_) ESTree::RestElementNode(*optSubPattern));
 5568|  40.6k|    } else {
 5569|  40.6k|      ESTree::AssignmentExpressionNode *asn = nullptr;
 5570|  40.6k|      ESTree::Node *init = nullptr;
 5571|       |
 5572|       |      // If we encounter an initializer, unpack it.
 5573|  40.6k|      if (!elem->getParens()) {
  ------------------
  |  Branch (5573:11): [True: 40.6k, False: 0]
  ------------------
 5574|  40.6k|        if ((asn = dyn_cast<ESTree::AssignmentExpressionNode>(elem))) {
  ------------------
  |  Branch (5574:13): [True: 0, False: 40.6k]
  ------------------
 5575|      0|          if (asn->_operator == getTokenIdent(TokenKind::equal)) {
  ------------------
  |  Branch (5575:15): [True: 0, False: 0]
  ------------------
 5576|      0|            elem = asn->_left;
 5577|      0|            init = asn->_right;
 5578|      0|          }
 5579|      0|        }
 5580|  40.6k|      }
 5581|       |
 5582|       |      // Reparse {...} or [...]
 5583|  40.6k|      auto optSubPattern = reparseAssignmentPattern(elem, inDecl);
 5584|  40.6k|      if (!optSubPattern)
  ------------------
  |  Branch (5584:11): [True: 0, False: 40.6k]
  ------------------
 5585|      0|        continue;
 5586|  40.6k|      elem = *optSubPattern;
 5587|       |
 5588|  40.6k|      if (init) {
  ------------------
  |  Branch (5588:11): [True: 0, False: 40.6k]
  ------------------
 5589|      0|        elem = setLocation(
 5590|      0|            asn, asn, new (context_) ESTree::AssignmentPatternNode(elem, init));
 5591|      0|      }
 5592|  40.6k|    }
 5593|       |
 5594|  40.6k|    elements.push_back(*elem);
 5595|  40.6k|  }
 5596|       |
 5597|  44.7k|  return setLocation(
 5598|  44.7k|      AEN->getStartLoc(),
 5599|  44.7k|      AEN->getEndLoc(),
 5600|  44.7k|      new (context_) ESTree::ArrayPatternNode(std::move(elements), nullptr));
 5601|  44.7k|}
_ZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS1_5ParamENS2_23AllowTypedArrowFunctionENS2_20CoverTypedParametersEPNS_6ESTree4NodeE:
 5785|  6.60M|    ESTree::Node *typeParams) {
 5786|  6.60M|  struct State {
 5787|  6.60M|    SMLoc leftStartLoc = {};
 5788|  6.60M|    Optional<ESTree::Node *> optLeftExpr = llvh::None;
 5789|  6.60M|    bool hasNewLine = false;
 5790|  6.60M|    UniqueString *op = nullptr;
 5791|  6.60M|    SMLoc debugLoc = {};
 5792|       |
 5793|  6.60M|    explicit State() {}
 5794|  6.60M|  };
 5795|       |
 5796|  6.60M|  auto parseHelper = [this](
 5797|  6.60M|                         State &state,
 5798|  6.60M|                         Param param,
 5799|  6.60M|                         AllowTypedArrowFunction allowTypedArrowFunction,
 5800|  6.60M|                         CoverTypedParameters coverTypedParameters,
 5801|  6.60M|                         ESTree::Node *typeParams) -> Optional<ESTree::Node *> {
 5802|       |    // Check for yield, which may be lexed as a reserved word, but only in
 5803|       |    // strict mode.
 5804|  6.60M|    if (paramYield_ && check(TokenKind::rw_yield, TokenKind::identifier) &&
 5805|  6.60M|        tok_->getResWordOrIdentifier() == yieldIdent_) {
 5806|  6.60M|      auto optYieldExpr = parseYieldExpression(param.get(ParamIn));
 5807|  6.60M|      if (!optYieldExpr)
 5808|  6.60M|        return None;
 5809|  6.60M|      ESTree::YieldExpressionNode *yieldExpr = *optYieldExpr;
 5810|  6.60M|      if (yieldExpr->_argument && !checkEndAssignmentExpression()) {
 5811|  6.60M|        error(tok_->getStartLoc(), "unexpected token after yield expression");
 5812|  6.60M|        return None;
 5813|  6.60M|      }
 5814|  6.60M|      return yieldExpr;
 5815|  6.60M|    }
 5816|       |
 5817|  6.60M|    SMLoc startLoc = tok_->getStartLoc();
 5818|  6.60M|    bool forceAsync = false;
 5819|  6.60M|    if (check(asyncIdent_)) {
 5820|  6.60M|      OptValue<TokenKind> optNext = lexer_.lookahead1(TokenKind::identifier);
 5821|  6.60M|      if (optNext.hasValue() && *optNext == TokenKind::identifier) {
 5822|  6.60M|        forceAsync = true;
 5823|  6.60M|      }
 5824|  6.60M|#if HERMES_PARSE_FLOW
 5825|  6.60M|      if (context_.getParseFlow() && optNext.hasValue() &&
 5826|  6.60M|          (*optNext == TokenKind::less || *optNext == TokenKind::l_paren)) {
 5827|  6.60M|        auto optAsyncArrow = tryParseTypedAsyncArrowFunction(param);
 5828|  6.60M|        if (optAsyncArrow.hasValue()) {
 5829|  6.60M|          return *optAsyncArrow;
 5830|  6.60M|        }
 5831|  6.60M|      }
 5832|  6.60M|#endif
 5833|  6.60M|    }
 5834|       |
 5835|  6.60M|#if HERMES_PARSE_FLOW
 5836|  6.60M|    if (context_.getParseFlow() &&
 5837|  6.60M|        allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
 5838|  6.60M|        !typeParams && check(TokenKind::less)) {
 5839|  6.60M|      JSLexer::SavePoint savePoint{&lexer_};
 5840|       |      // Suppress messages from the parser while still displaying lexer
 5841|       |      // messages.
 5842|  6.60M|      CollectMessagesRAII collect{&sm_, true};
 5843|       |      // Do as the flow parser does due to JSX ambiguities.
 5844|       |      // First we try and parse as an assignment expression disallowing
 5845|       |      // typed arrow functions. If that fails, then try again while allowing
 5846|       |      // typed arrow functions and attach the type parameters after the fact.
 5847|  6.60M|      auto optAssign = parseAssignmentExpression(
 5848|  6.60M|          param,
 5849|  6.60M|          AllowTypedArrowFunction::No,
 5850|  6.60M|          CoverTypedParameters::No,
 5851|  6.60M|          nullptr);
 5852|  6.60M|      if (optAssign) {
 5853|       |        // That worked, so just return it directly.
 5854|  6.60M|        collect.setDiscardMessages(false);
 5855|  6.60M|        return *optAssign;
 5856|  6.60M|      } else {
 5857|       |        // Consume the type parameters and try again.
 5858|  6.60M|        savePoint.restore();
 5859|  6.60M|        auto optTypeParams = parseTypeParamsFlow();
 5860|       |        // Type parameters must be followed by a '(' to be meaningful.
 5861|  6.60M|        if (optTypeParams && check(TokenKind::l_paren)) {
 5862|  6.60M|          typeParams = *optTypeParams;
 5863|  6.60M|          optAssign = parseAssignmentExpression(
 5864|  6.60M|              param,
 5865|  6.60M|              AllowTypedArrowFunction::Yes,
 5866|  6.60M|              CoverTypedParameters::No,
 5867|  6.60M|              typeParams);
 5868|  6.60M|          if (optAssign) {
 5869|       |            // We've got the arrow function now, return it directly.
 5870|  6.60M|            return *optAssign;
 5871|  6.60M|          } else {
 5872|       |            // That's everything we can try.
 5873|  6.60M|            error(
 5874|  6.60M|                typeParams->getSourceRange(),
 5875|  6.60M|                "type parameters must be used in an arrow function expression");
 5876|  6.60M|            return None;
 5877|  6.60M|          }
 5878|  6.60M|        } else {
 5879|       |          // Invalid type params, and also invalid JSX. Bail.
 5880|  6.60M|          savePoint.restore();
 5881|  6.60M|        }
 5882|  6.60M|      }
 5883|  6.60M|    }
 5884|  6.60M|#endif
 5885|       |
 5886|  6.60M|    state.leftStartLoc = tok_->getStartLoc();
 5887|  6.60M|    state.hasNewLine = lexer_.isNewLineBeforeCurrentToken();
 5888|  6.60M|    state.optLeftExpr = parseConditionalExpression(param, coverTypedParameters);
 5889|  6.60M|    if (!state.optLeftExpr)
 5890|  6.60M|      return None;
 5891|       |
 5892|  6.60M|    ESTree::Node *returnType = nullptr;
 5893|  6.60M|    ESTree::Node *predicate = nullptr;
 5894|  6.60M|#if HERMES_PARSE_FLOW
 5895|  6.60M|    if (context_.getParseFlow()) {
 5896|  6.60M|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
 5897|  6.60M|          ((*state.optLeftExpr)->getParens() != 0 ||
 5898|  6.60M|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
 5899|  6.60M|          check(TokenKind::colon)) {
 5900|  6.60M|        JSLexer::SavePoint savePoint{&lexer_};
 5901|       |        // Defer our decision on whether to show or suppress messages for this
 5902|       |        // next section.
 5903|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5904|       |        // start parsing JSX children inside tags, instead of function type
 5905|       |        // parameters. We need to suppress lexer messages because the lexing
 5906|       |        // rules inside JSX are quite different from JS/Flow. For example: x ?
 5907|       |        // (1) : <tag>#{foo}</tag>;
 5908|       |        //         ^
 5909|       |        // and
 5910|       |        // x ? (1) : <tag>"</tag>;
 5911|       |        //         ^
 5912|       |        // must be able to handle the lexer errors that would occur if we lexed
 5913|       |        // the inside of the JSX tags as JS.
 5914|  6.60M|        CollectMessagesRAII collect{&sm_, true};
 5915|  6.60M|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5916|  6.60M|        bool startsWithPredicate = check(checksIdent_);
 5917|  6.60M|        auto optType = startsWithPredicate
 5918|  6.60M|            ? llvh::None
 5919|  6.60M|            : parseReturnTypeAnnotationFlow(
 5920|  6.60M|                  annotStart, AllowAnonFunctionType::No);
 5921|  6.60M|        if (optType)
 5922|  6.60M|          returnType = *optType;
 5923|  6.60M|        if (optType || startsWithPredicate) {
 5924|  6.60M|          if (check(TokenKind::equalgreater)) {
 5925|  6.60M|            assert(
 5926|  6.60M|                !startsWithPredicate && "no returnType if startsWithPredicate");
 5927|       |            // Done parsing the return type and predicate.
 5928|       |            // Successful parse, show any messages that the lexer emitted.
 5929|  6.60M|            collect.setDiscardMessages(false);
 5930|  6.60M|          } else if (check(checksIdent_)) {
 5931|  6.60M|            auto optPred = parsePredicateFlow();
 5932|  6.60M|            if (optPred && check(TokenKind::equalgreater)) {
 5933|       |              // Done parsing the return type and predicate.
 5934|  6.60M|              predicate = *optPred;
 5935|       |              // Successful parse, show any messages that the lexer emitted.
 5936|  6.60M|              collect.setDiscardMessages(false);
 5937|  6.60M|            } else {
 5938|  6.60M|              savePoint.restore();
 5939|  6.60M|            }
 5940|  6.60M|          } else {
 5941|  6.60M|            savePoint.restore();
 5942|  6.60M|          }
 5943|  6.60M|        } else {
 5944|  6.60M|          savePoint.restore();
 5945|  6.60M|        }
 5946|  6.60M|      }
 5947|  6.60M|    }
 5948|  6.60M|#endif
 5949|       |
 5950|  6.60M|#if HERMES_PARSE_TS
 5951|  6.60M|    if (context_.getParseTS()) {
 5952|       |      // Separate logic for TS parsing here, because the semantics don't
 5953|       |      // require as much complexity as Flow due to a lack of predicates.
 5954|  6.60M|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
 5955|  6.60M|          ((*state.optLeftExpr)->getParens() != 0 ||
 5956|  6.60M|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
 5957|  6.60M|          check(TokenKind::colon)) {
 5958|  6.60M|        JSLexer::SavePoint savePoint{&lexer_};
 5959|       |        // Defer our decision on whether to show or suppress messages for this
 5960|       |        // next section.
 5961|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5962|       |        // start parsing JSX children inside tags, instead of function type
 5963|       |        // parameters. We need to suppress lexer messages because the lexing
 5964|       |        // rules inside JSX are quite different from TS. For example: x ? (1) :
 5965|       |        // <tag>#{foo}</tag>;
 5966|       |        //         ^
 5967|       |        // and
 5968|       |        // x ? (1) : <tag>"</tag>;
 5969|       |        //         ^
 5970|       |        // must be able to handle the lexer errors that would occur if we lexed
 5971|       |        // the inside of the JSX tags as JS.
 5972|  6.60M|        CollectMessagesRAII collect{&sm_, true};
 5973|  6.60M|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5974|  6.60M|        auto optType = parseTypeAnnotationTS(annotStart);
 5975|  6.60M|        if (optType)
 5976|  6.60M|          returnType = *optType;
 5977|  6.60M|        if (optType) {
 5978|  6.60M|          if (check(TokenKind::equalgreater)) {
 5979|       |            // Done parsing the return type.
 5980|       |            // Successful parse, show any messages that the lexer emitted.
 5981|  6.60M|            collect.setDiscardMessages(false);
 5982|  6.60M|          } else {
 5983|  6.60M|            savePoint.restore();
 5984|  6.60M|          }
 5985|  6.60M|        } else {
 5986|  6.60M|          savePoint.restore();
 5987|  6.60M|        }
 5988|  6.60M|      }
 5989|  6.60M|    }
 5990|       |
 5991|  6.60M|#endif
 5992|       |
 5993|       |    // Check for ArrowFunction.
 5994|       |    //   ArrowFunction : ArrowParameters [no line terminator] => ConciseBody.
 5995|       |    //   AsyncArrowFunction :
 5996|       |    //   async [no line terminator] ArrowParameters [no line terminator] =>
 5997|       |    //   ConciseBody.
 5998|  6.60M|    if (check(TokenKind::equalgreater) &&
 5999|  6.60M|        !lexer_.isNewLineBeforeCurrentToken()) {
 6000|  6.60M|      return parseArrowFunctionExpression(
 6001|  6.60M|          param,
 6002|  6.60M|          *state.optLeftExpr,
 6003|  6.60M|          state.hasNewLine,
 6004|  6.60M|          typeParams,
 6005|  6.60M|          returnType,
 6006|  6.60M|          predicate,
 6007|  6.60M|          typeParams ? typeParams->getStartLoc() : startLoc,
 6008|  6.60M|          allowTypedArrowFunction,
 6009|  6.60M|          forceAsync);
 6010|  6.60M|    }
 6011|       |
 6012|  6.60M|#if HERMES_PARSE_FLOW
 6013|  6.60M|    if (typeParams) {
 6014|  6.60M|      errorExpected(
 6015|  6.60M|          TokenKind::equalgreater,
 6016|  6.60M|          "in generic arrow function",
 6017|  6.60M|          "start of function",
 6018|  6.60M|          typeParams->getStartLoc());
 6019|  6.60M|      return None;
 6020|  6.60M|    }
 6021|  6.60M|#endif
 6022|       |
 6023|  6.60M|    if (!checkAssign())
 6024|  6.60M|      return *state.optLeftExpr;
 6025|       |
 6026|       |    // Check for destructuring assignment.
 6027|  6.60M|    if (check(TokenKind::equal) &&
 6028|  6.60M|        (isa<ESTree::ArrayExpressionNode>(*state.optLeftExpr) ||
 6029|  6.60M|         isa<ESTree::ObjectExpressionNode>(*state.optLeftExpr))) {
 6030|  6.60M|      state.optLeftExpr = reparseAssignmentPattern(*state.optLeftExpr, false);
 6031|  6.60M|      if (!state.optLeftExpr)
 6032|  6.60M|        return None;
 6033|  6.60M|    }
 6034|       |
 6035|  6.60M|    state.op = getTokenIdent(tok_->getKind());
 6036|  6.60M|    state.debugLoc = advance().Start;
 6037|  6.60M|    return nullptr;
 6038|  6.60M|  };
 6039|       |
 6040|  6.60M|  llvh::SmallVector<State, 2> stack;
 6041|       |
 6042|  6.60M|  stack.emplace_back();
 6043|  6.60M|  auto optRes = parseHelper(
 6044|  6.60M|      stack.back(),
 6045|  6.60M|      param,
 6046|  6.60M|      allowTypedArrowFunction,
 6047|  6.60M|      coverTypedParameters,
 6048|  6.60M|      typeParams);
 6049|       |
 6050|  6.61M|  for (;;) {
 6051|  6.61M|    if (!optRes)
  ------------------
  |  Branch (6051:9): [True: 4.12k, False: 6.61M]
  ------------------
 6052|  4.12k|      return None;
 6053|  6.61M|    if (!stack.back().op) {
  ------------------
  |  Branch (6053:9): [True: 6.60M, False: 9.27k]
  ------------------
 6054|  6.60M|      stack.pop_back();
 6055|  6.60M|      break;
 6056|  6.60M|    }
 6057|  9.27k|    if (stack.size() > ESTree::MAX_NESTED_ASSIGNMENTS) {
  ------------------
  |  Branch (6057:9): [True: 0, False: 9.27k]
  ------------------
 6058|      0|      recursionDepthExceeded();
 6059|      0|      return None;
 6060|      0|    }
 6061|  9.27k|    stack.emplace_back();
 6062|  9.27k|    optRes = parseHelper(
 6063|  9.27k|        stack.back(),
 6064|  9.27k|        param,
 6065|  9.27k|        AllowTypedArrowFunction::Yes,
 6066|  9.27k|        CoverTypedParameters::No,
 6067|  9.27k|        nullptr);
 6068|  9.27k|  }
 6069|       |
 6070|  6.60M|  assert(optRes.getValue() != nullptr);
 6071|       |
 6072|  6.61M|  while (!stack.empty()) {
  ------------------
  |  Branch (6072:10): [True: 9.27k, False: 6.60M]
  ------------------
 6073|  9.27k|    if (!checkEndAssignmentExpression()) {
  ------------------
  |  Branch (6073:9): [True: 2, False: 9.27k]
  ------------------
 6074|       |      // Note: We don't assert the valid end of an AssignmentExpression here
 6075|       |      // because we do not know yet whether the entire file is well-formed.
 6076|       |      // This check errors here to ensure that we still catch missing elements
 6077|       |      // in `checkEndAssignmentExpression` while allowing us to avoid actually
 6078|       |      // asserting and crashing.
 6079|      2|      error(
 6080|      2|          tok_->getStartLoc(), "unexpected token after assignment expression");
 6081|      2|      return None;
 6082|      2|    }
 6083|  9.27k|    auto &top = stack.back();
 6084|  9.27k|    optRes = setLocation(
 6085|  9.27k|        top.leftStartLoc,
 6086|  9.27k|        getPrevTokenEndLoc(),
 6087|  9.27k|        top.debugLoc,
 6088|  9.27k|        new (context_) ESTree::AssignmentExpressionNode(
 6089|  9.27k|            top.op, top.optLeftExpr.getValue(), optRes.getValue()));
 6090|  9.27k|    stack.pop_back();
 6091|  9.27k|  }
 6092|       |
 6093|  6.60M|  return optRes.getValue();
 6094|  6.60M|}
_ZN6hermes6parser6detail12JSParserImpl15parseExpressionENS1_5ParamENS2_20CoverTypedParametersE:
 6098|  1.91M|    CoverTypedParameters coverTypedParameters) {
 6099|  1.91M|  SMLoc startLoc = tok_->getStartLoc();
 6100|  1.91M|  auto optExpr = parseAssignmentExpression(
 6101|  1.91M|      param, AllowTypedArrowFunction::Yes, coverTypedParameters, nullptr);
 6102|  1.91M|  if (!optExpr)
  ------------------
  |  Branch (6102:7): [True: 3.24k, False: 1.91M]
  ------------------
 6103|  3.24k|    return None;
 6104|       |
 6105|  1.91M|  if (!check(TokenKind::comma))
  ------------------
  |  Branch (6105:7): [True: 1.91M, False: 402]
  ------------------
 6106|  1.91M|    return optExpr.getValue();
 6107|       |
 6108|    402|  ESTree::NodeList exprList;
 6109|    402|  exprList.push_back(*optExpr.getValue());
 6110|       |
 6111|  1.95M|  while (check(TokenKind::comma)) {
  ------------------
  |  Branch (6111:10): [True: 1.95M, False: 400]
  ------------------
 6112|       |    // Eat the ",".
 6113|  1.95M|    auto commaRng = advance();
 6114|       |
 6115|       |    // CoverParenthesizedExpressionAndArrowParameterList: (Expression ,)
 6116|  1.95M|    if (check(TokenKind::r_paren)) {
  ------------------
  |  Branch (6116:9): [True: 0, False: 1.95M]
  ------------------
 6117|      0|      auto *coverNode = setLocation(
 6118|      0|          commaRng,
 6119|      0|          tok_->getStartLoc(),
 6120|      0|          new (context_) ESTree::CoverTrailingCommaNode());
 6121|      0|      exprList.push_back(*coverNode);
 6122|      0|      break;
 6123|      0|    }
 6124|       |
 6125|  1.95M|    ESTree::Node *expr2;
 6126|       |
 6127|  1.95M|    if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (6127:9): [True: 0, False: 1.95M]
  ------------------
 6128|      0|      auto optRest = parseBindingRestElement(param);
 6129|      0|      if (!optRest)
  ------------------
  |  Branch (6129:11): [True: 0, False: 0]
  ------------------
 6130|      0|        return None;
 6131|      0|      expr2 = setLocation(
 6132|      0|          *optRest,
 6133|      0|          *optRest,
 6134|      0|          new (context_) ESTree::CoverRestElementNode(*optRest));
 6135|  1.95M|    } else {
 6136|  1.95M|      auto optExpr2 = parseAssignmentExpression(param);
 6137|  1.95M|      if (!optExpr2)
  ------------------
  |  Branch (6137:11): [True: 2, False: 1.95M]
  ------------------
 6138|      2|        return None;
 6139|  1.95M|      expr2 = *optExpr2;
 6140|  1.95M|    }
 6141|       |
 6142|  1.95M|    exprList.push_back(*expr2);
 6143|  1.95M|  }
 6144|       |
 6145|    400|  return setLocation(
 6146|    400|      startLoc,
 6147|    400|      getPrevTokenEndLoc(),
 6148|    400|      new (context_) ESTree::SequenceExpressionNode(std::move(exprList)));
 6149|    402|}
_ZN6hermes6parser6detail12JSParserImpl14parseDirectiveEv:
 6973|     14|ESTree::ExpressionStatementNode *JSParserImpl::parseDirective() {
 6974|       |  // Is the current token a directive?
 6975|     14|  if (!lexer_.isCurrentTokenADirective())
  ------------------
  |  Branch (6975:7): [True: 10, False: 4]
  ------------------
 6976|     10|    return nullptr;
 6977|       |
 6978|       |  // Allocate a StringLiteralNode for the directive.
 6979|      4|  auto *strLit = setLocation(
 6980|      4|      tok_,
 6981|      4|      tok_,
 6982|      4|      new (context_) ESTree::StringLiteralNode(tok_->getStringLiteral()));
 6983|      4|  auto endLoc = tok_->getEndLoc();
 6984|       |
 6985|       |  // Actually process the directive. Note that we want to do that before we
 6986|       |  // have consumed any more tokens - strictness can affect the interpretation
 6987|       |  // of tokens.
 6988|      4|  processDirective(strLit->_value);
 6989|       |
 6990|      4|  advance(JSLexer::AllowDiv);
 6991|       |
 6992|       |  // Consume the optional semicolon.
 6993|      4|  if (check(TokenKind::semi))
  ------------------
  |  Branch (6993:7): [True: 0, False: 4]
  ------------------
 6994|      0|    endLoc = advance().End;
 6995|       |
 6996|       |  // Allocate an ExpressionStatementNode for the directive.
 6997|      4|  return setLocation(
 6998|      4|      strLit,
 6999|      4|      endLoc,
 7000|      4|      new (context_) ESTree::ExpressionStatementNode(strLit, strLit->_value));
 7001|     14|}
_ZN6hermes6parser6detail12JSParserImpl14preParseBufferERNS_7ContextEj:
 7027|    244|    uint32_t bufferId) {
 7028|    244|  PerfSection preparsing("Pre-Parsing JavaScript");
 7029|    244|  auto preParser = std::make_shared<PreParser>(context, bufferId);
 7030|    244|  auto result = preParser->parser.parse();
 7031|    244|  if (!result.hasValue())
  ------------------
  |  Branch (7031:7): [True: 41, False: 203]
  ------------------
 7032|     41|    return nullptr;
 7033|       |
 7034|       |  // Return a pointer only to JSParserImpl, while aliasing and maintaining
 7035|       |  // ownership of the entire PreParser object.
 7036|    203|  return std::shared_ptr<JSParserImpl>(preParser, &preParser->parser);
 7037|    244|}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl20parseTemplateLiteralENS1_5ParamEENK3$_0clEb:
 3172|  1.09M|  auto pushTemplateElement = [&quasis, &param, this](bool tail) -> bool {
 3173|  1.09M|    if (tok_->getTemplateLiteralContainsNotEscapes() &&
  ------------------
  |  Branch (3173:9): [True: 162, False: 1.09M]
  ------------------
 3174|  1.09M|        !param.has(ParamTagged)) {
  ------------------
  |  Branch (3174:9): [True: 0, False: 162]
  ------------------
 3175|      0|      error(
 3176|      0|          tok_->getSourceRange(),
 3177|      0|          "untagged template literal contains invalid escape sequence");
 3178|      0|      return false;
 3179|      0|    }
 3180|  1.09M|    auto *quasi = setLocation(
 3181|  1.09M|        tok_,
 3182|  1.09M|        tok_,
 3183|  1.09M|        new (context_) ESTree::TemplateElementNode(
 3184|  1.09M|            tail, tok_->getTemplateValue(), tok_->getTemplateRawValue()));
 3185|  1.09M|    quasis.push_back(*quasi);
 3186|  1.09M|    return true;
 3187|  1.09M|  };
_ZN6hermes6parser6detail12JSParserImpl24convertIdentOpIfPossibleEv:
 4043|  8.90M|inline void JSParserImpl::convertIdentOpIfPossible() {
 4044|  8.90M|#if HERMES_PARSE_TS || HERMES_PARSE_FLOW
 4045|  8.90M|  if (LLVM_UNLIKELY(tok_->getKind() == TokenKind::identifier) &&
  ------------------
  |  |  189|  17.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 207k, False: 8.69M]
  |  |  ------------------
  ------------------
 4046|  8.90M|      context_.getParseTypes()) {
  ------------------
  |  Branch (4046:7): [True: 0, False: 207k]
  ------------------
 4047|      0|    if (tok_->getIdentifier() == asIdent_)
  ------------------
  |  Branch (4047:9): [True: 0, False: 0]
  ------------------
 4048|      0|      lexer_.convertCurTokenToIdentOp(TokenKind::as_operator);
 4049|      0|  }
 4050|  8.90M|#endif
 4051|  8.90M|};
JSParserImpl.cpp:_ZN6hermes6parser6detail12_GLOBAL__N_119getPrecedenceExceptEPKNS0_5TokenENS0_9TokenKindE:
 4037|  8.90M|inline unsigned getPrecedenceExcept(const Token *token, TokenKind except) {
 4038|  8.90M|  const TokenKind kind = token->getKind();
 4039|  8.90M|  return LLVM_LIKELY(kind != except) ? getPrecedence(kind) : 0;
  ------------------
  |  |  188|  8.90M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 8.90M, False: 31]
  |  |  ------------------
  ------------------
 4040|  8.90M|}
JSParserImpl.cpp:_ZN6hermes6parser6detail12_GLOBAL__N_113getPrecedenceENS0_9TokenKindE:
 4009|  13.7M|inline unsigned getPrecedence(TokenKind kind) {
 4010|       |  // Record the precedence of all binary operators.
 4011|  13.7M|  static const unsigned precedence[] = {
 4012|  13.7M|#define TOK(...) 0,
 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
 4014|  13.7M|#define IDENT_OP(name, str, precedence) precedence,
 4015|       |
 4016|       |// There are two reserved words that are binary operators.
 4017|  13.7M|#define RESWORD(name)                                       \
 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
 4020|  13.7M|       ? 8                                                  \
 4021|  13.7M|       : 0),
 4022|  13.7M|#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|  13.7M|#ifndef PUNCTUATOR
  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |   18|  13.7M|#endif
  |  |   19|       |
  |  |   20|  13.7M|#ifndef PUNCTUATOR_FLOW
  |  |   21|  13.7M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |   22|  13.7M|#endif
  |  |   23|       |
  |  |   24|       |#ifndef BINOP
  |  |   25|       |#define BINOP(name, str, precedence) PUNCTUATOR(name, str)
  |  |   26|       |#endif
  |  |   27|       |
  |  |   28|  13.7M|#ifndef TEMPLATE
  |  |   29|  13.7M|#define TEMPLATE(name, str) TOK(name, str)
  |  |   30|  13.7M|#endif
  |  |   31|       |
  |  |   32|       |#ifndef IDENT_OP
  |  |   33|       |#define IDENT_OP(name, str, precedence) TOK(name, str)
  |  |   34|       |#endif
  |  |   35|       |
  |  |   36|  13.7M|#ifndef RANGE_MARKER
  |  |   37|  13.7M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |   38|  13.7M|#endif
  |  |   39|       |
  |  |   40|       |// clang-format off
  |  |   41|       |
  |  |   42|  13.7M|TOK(none, "<none>")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |   43|  13.7M|TOK(identifier, "identifier")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |   44|  13.7M|TOK(private_identifier, "private identifier")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |   45|       |
  |  |   46|  13.7M|RANGE_MARKER(_first_resword)
  |  |  ------------------
  |  |  |  |   37|  13.7M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   47|  13.7M|RESWORD(function)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   48|  13.7M|RESWORD(for)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   49|  13.7M|RESWORD(if)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   50|  13.7M|RESWORD(in)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   51|  13.7M|RESWORD(var)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   52|  13.7M|RESWORD(break)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   53|  13.7M|RESWORD(continue)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   54|  13.7M|RESWORD(return)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   55|  13.7M|RESWORD(switch)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   56|  13.7M|RESWORD(this)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   57|       |
  |  |   58|  13.7M|RESWORD(true)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   59|  13.7M|RESWORD(false)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   60|  13.7M|RESWORD(null)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   61|  13.7M|RESWORD(case)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   62|  13.7M|RESWORD(catch)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   63|  13.7M|RESWORD(const)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   64|  13.7M|RESWORD(debugger)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   65|  13.7M|RESWORD(default)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   66|  13.7M|RESWORD(delete)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   67|  13.7M|RESWORD(do)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   68|  13.7M|RESWORD(else)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   69|  13.7M|RESWORD(finally)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   70|  13.7M|RESWORD(instanceof)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   71|  13.7M|RESWORD(new)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   72|  13.7M|RESWORD(throw)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   73|  13.7M|RESWORD(try)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   74|  13.7M|RESWORD(typeof)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   75|  13.7M|RESWORD(void)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   76|  13.7M|RESWORD(while)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   77|  13.7M|RESWORD(with)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   78|       |
  |  |   79|  13.7M|RESWORD(export)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   80|  13.7M|RESWORD(import)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   81|       |
  |  |   82|  13.7M|RESWORD(class)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   83|  13.7M|RESWORD(static)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   84|  13.7M|RESWORD(extends)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   85|  13.7M|RESWORD(super)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   86|       |
  |  |   87|       |// Future reserved words
  |  |   88|  13.7M|RESWORD(enum)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   89|       |
  |  |   90|       |// Strict mode future reserved words
  |  |   91|  13.7M|RESWORD(implements)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   92|  13.7M|RESWORD(interface)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   93|  13.7M|RESWORD(package)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   94|  13.7M|RESWORD(private)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   95|  13.7M|RESWORD(protected)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   96|  13.7M|RESWORD(public)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   97|  13.7M|RESWORD(yield)
  |  |  ------------------
  |  |  |  | 4018|  13.7M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4018:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4019|  13.7M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (4019:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 4020|  13.7M|       ? 8                                                  \
  |  |  |  | 4021|  13.7M|       : 0),
  |  |  ------------------
  |  |   98|  13.7M|RANGE_MARKER(_last_resword)
  |  |  ------------------
  |  |  |  |   37|  13.7M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   99|       |
  |  |  100|  13.7M|PUNCTUATOR(l_brace,             "{")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  101|  13.7M|PUNCTUATOR_FLOW(l_bracepipe,    "{|")
  |  |  ------------------
  |  |  |  |   21|  13.7M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  102|  13.7M|PUNCTUATOR(r_brace,             "}")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  103|  13.7M|PUNCTUATOR_FLOW(piper_brace,    "|}")
  |  |  ------------------
  |  |  |  |   21|  13.7M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  104|  13.7M|PUNCTUATOR(l_paren,             "(")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  105|  13.7M|PUNCTUATOR(r_paren,             ")")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  106|  13.7M|PUNCTUATOR(l_square,            "[")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  13.7M|PUNCTUATOR(r_square,            "]")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  108|  13.7M|PUNCTUATOR(period,              ".")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  109|  13.7M|PUNCTUATOR(questiondot,         "?.")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|  13.7M|PUNCTUATOR(dotdotdot,           "...")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  111|  13.7M|PUNCTUATOR(semi,                ";")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|  13.7M|PUNCTUATOR(comma,               ",")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|  13.7M|PUNCTUATOR(plusplus,            "++")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  114|  13.7M|PUNCTUATOR(minusminus,          "--")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  115|  13.7M|RANGE_MARKER(_first_binary)
  |  |  ------------------
  |  |  |  |   37|  13.7M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  116|  13.7M|BINOP(     starstar,            "**",  12)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  117|  13.7M|BINOP(     star,                "*",   11)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  118|  13.7M|BINOP(     percent,             "%",   11)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  119|  13.7M|BINOP(     slash,               "/",   11)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  120|  13.7M|BINOP(     plus,                "+",   10)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  121|  13.7M|BINOP(     minus,               "-",   10)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  122|  13.7M|BINOP(     lessless,            "<<",   9)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  123|  13.7M|BINOP(     greatergreater,      ">>",   9)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  124|  13.7M|BINOP(     greatergreatergreater,">>>", 9)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  125|  13.7M|BINOP(     less,                "<",    8)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  126|  13.7M|BINOP(     greater,             ">",    8)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  127|  13.7M|BINOP(     lessequal,           "<=",   8)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  128|  13.7M|BINOP(     greaterequal,        ">=",   8)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  129|  13.7M|BINOP(     equalequal,          "==",   7)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  130|  13.7M|BINOP(     exclaimequal,        "!=",   7)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  131|  13.7M|BINOP(     equalequalequal,     "===",  7)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  132|  13.7M|BINOP(     exclaimequalequal,   "!==",  7)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  133|  13.7M|BINOP(     amp,                 "&",    6)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  134|  13.7M|BINOP(     caret,               "^",    5)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  135|  13.7M|BINOP(     pipe,                "|",    4)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  136|  13.7M|BINOP(     ampamp,              "&&",   3)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  137|  13.7M|BINOP(     pipepipe,            "||",   2)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  138|  13.7M|BINOP(     questionquestion,    "??",   1)
  |  |  ------------------
  |  |  |  | 4013|  13.7M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  139|  13.7M|RANGE_MARKER(_last_binary)
  |  |  ------------------
  |  |  |  |   37|  13.7M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  140|  13.7M|PUNCTUATOR(exclaim,             "!")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|  13.7M|PUNCTUATOR(tilde,               "~")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  142|  13.7M|PUNCTUATOR(question,            "?")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  143|  13.7M|PUNCTUATOR(colon,               ":")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  13.7M|PUNCTUATOR(equal,               "=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|  13.7M|PUNCTUATOR(plusequal,           "+=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  146|  13.7M|PUNCTUATOR(minusequal,          "-=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|  13.7M|PUNCTUATOR(starequal,           "*=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|  13.7M|PUNCTUATOR(starstarequal,       "**=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|  13.7M|PUNCTUATOR(percentequal,        "%=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|  13.7M|PUNCTUATOR(slashequal,          "/=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|  13.7M|PUNCTUATOR(lesslessequal,       "<<=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  152|  13.7M|PUNCTUATOR(greatergreaterequal, ">>=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|  13.7M|PUNCTUATOR(greatergreatergreaterequal, ">>>=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  154|  13.7M|PUNCTUATOR(ampequal,            "&=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  155|  13.7M|PUNCTUATOR(pipeequal,           "|=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|  13.7M|PUNCTUATOR(ampampequal,         "&&=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  157|  13.7M|PUNCTUATOR(pipepipeequal,       "||=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  158|  13.7M|PUNCTUATOR(questionquestionequal, "\?\?=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  159|  13.7M|PUNCTUATOR(caretequal,          "^=")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|  13.7M|PUNCTUATOR(equalgreater,        "=>")
  |  |  ------------------
  |  |  |  |   17|  13.7M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  161|       |
  |  |  162|  13.7M|IDENT_OP(as_operator,           "as",   8)
  |  |  ------------------
  |  |  |  | 4014|  13.7M|#define IDENT_OP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  163|       |
  |  |  164|  13.7M|TOK(numeric_literal, "number")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |  165|  13.7M|TOK(string_literal, "string")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |  166|  13.7M|TOK(regexp_literal, "regexp")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |  167|  13.7M|TOK(jsx_text, "JSX text")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |  168|  13.7M|TOK(bigint_literal, "bigint")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |  169|       |
  |  |  170|  13.7M|TEMPLATE(no_substitution_template, "template literal")
  |  |  ------------------
  |  |  |  |   29|  13.7M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  171|  13.7M|TEMPLATE(template_head, "template literal start")
  |  |  ------------------
  |  |  |  |   29|  13.7M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  13.7M|TEMPLATE(template_middle, "template literal resume")
  |  |  ------------------
  |  |  |  |   29|  13.7M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  173|  13.7M|TEMPLATE(template_tail, "template literal end")
  |  |  ------------------
  |  |  |  |   29|  13.7M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  174|       |
  |  |  175|  13.7M|TOK(eof, "<eof>")
  |  |  ------------------
  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  ------------------
  |  |  176|  13.7M|RANGE_MARKER(_last_token)
  |  |  ------------------
  |  |  |  |   37|  13.7M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 4012|  13.7M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  177|       |
  |  |  178|  13.7M|#undef TOK
  |  |  179|  13.7M|#undef RESWORD
  |  |  180|  13.7M|#undef PUNCTUATOR
  |  |  181|  13.7M|#undef PUNCTUATOR_FLOW
  |  |  182|  13.7M|#undef BINOP
  |  |  183|  13.7M|#undef TEMPLATE
  |  |  184|  13.7M|#undef IDENT_OP
  |  |  185|  13.7M|#undef RANGE_MARKER
  ------------------
 4023|  13.7M|  };
 4024|       |
 4025|  13.7M|  return precedence[static_cast<unsigned>(kind)];
 4026|  13.7M|}
JSParserImpl.cpp:_ZN6hermes6parser6detail12_GLOBAL__N_111isLeftAssocENS0_9TokenKindE:
 4029|  2.20M|inline bool isLeftAssoc(TokenKind kind) {
 4030|  2.20M|  return kind != TokenKind::starstar;
 4031|  2.20M|}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS1_5ParamEENK3$_0clEPNS_6ESTree4NodeENS0_9TokenKindES7_N4llvh5SMLocESA_:
 4087|  2.29M|                              SMLoc endLoc) -> ESTree::NodePtr {
 4088|  2.29M|    UniqueString *opIdent = getTokenIdent(opKind);
 4089|  2.29M|    if (opKind == TokenKind::ampamp || opKind == TokenKind::pipepipe ||
  ------------------
  |  Branch (4089:9): [True: 32.6k, False: 2.25M]
  |  Branch (4089:40): [True: 38.0k, False: 2.22M]
  ------------------
 4090|  2.29M|        opKind == TokenKind::questionquestion) {
  ------------------
  |  Branch (4090:9): [True: 0, False: 2.22M]
  ------------------
 4091|  70.7k|      if ((hasNullish && opKind != TokenKind::questionquestion) ||
  ------------------
  |  Branch (4091:12): [True: 0, False: 70.7k]
  |  Branch (4091:26): [True: 0, False: 0]
  ------------------
 4092|  70.7k|          (hasBoolean && opKind == TokenKind::questionquestion)) {
  ------------------
  |  Branch (4092:12): [True: 69.7k, False: 931]
  |  Branch (4092:26): [True: 0, False: 69.7k]
  ------------------
 4093|       |        // This error doesn't prevent parsing the rest of the binary expression,
 4094|       |        // because it's only there to avoid confusion from the JS author's
 4095|       |        // perspective. Report the error but continue parsing.
 4096|       |        // The question marks are escaped to avoid triggering a trigraph.
 4097|      0|        error(
 4098|      0|            {left->getStartLoc(), right->getEndLoc()},
 4099|      0|            "Mixing '\?\?' with '&&' or '||' requires parentheses");
 4100|      0|      }
 4101|  70.7k|      if (opKind == TokenKind::questionquestion) {
  ------------------
  |  Branch (4101:11): [True: 0, False: 70.7k]
  ------------------
 4102|      0|        hasNullish = true;
 4103|  70.7k|      } else {
 4104|  70.7k|        hasBoolean = true;
 4105|  70.7k|      }
 4106|  70.7k|      return setLocation(
 4107|  70.7k|          startLoc,
 4108|  70.7k|          endLoc,
 4109|  70.7k|          new (context_) ESTree::LogicalExpressionNode(left, right, opIdent));
 4110|  70.7k|#if HERMES_PARSE_TS || HERMES_PARSE_FLOW
 4111|  2.22M|    } else if (LLVM_UNLIKELY(opKind == TokenKind::as_operator)) {
  ------------------
  |  |  189|  2.22M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.22M]
  |  |  ------------------
  ------------------
 4112|      0|      if (context_.getParseTS()) {
  ------------------
  |  Branch (4112:11): [True: 0, False: 0]
  ------------------
 4113|      0|        return setLocation(
 4114|      0|            startLoc,
 4115|      0|            endLoc,
 4116|      0|            new (context_) ESTree::TSAsExpressionNode(left, right));
 4117|      0|      } else {
 4118|      0|        assert(context_.getParseFlow() && "must be parsing types");
 4119|      0|        if (auto *gen =
 4120|      0|                llvh::dyn_cast<ESTree::GenericTypeAnnotationNode>(right);
 4121|      0|            gen && !gen->_typeParameters && gen->getParens() == 0) {
  ------------------
  |  Branch (4121:13): [True: 0, False: 0]
  |  Branch (4121:20): [True: 0, False: 0]
  |  Branch (4121:45): [True: 0, False: 0]
  ------------------
 4122|      0|          if (auto *ident = llvh::dyn_cast<ESTree::IdentifierNode>(gen->_id)) {
  ------------------
  |  Branch (4122:21): [True: 0, False: 0]
  ------------------
 4123|      0|            if (ident->_name == constIdent_ && !ident->_optional &&
  ------------------
  |  Branch (4123:17): [True: 0, False: 0]
  |  Branch (4123:48): [True: 0, False: 0]
  ------------------
 4124|      0|                !ident->_typeAnnotation) {
  ------------------
  |  Branch (4124:17): [True: 0, False: 0]
  ------------------
 4125|       |              // Special case for `x as const`,
 4126|       |              // which only is used when the `const` type has no parens
 4127|       |              // (otherwise, it's just a GenericTypeAnnotationNode).
 4128|      0|              return setLocation(
 4129|      0|                  startLoc,
 4130|      0|                  endLoc,
 4131|      0|                  new (context_) ESTree::AsConstExpressionNode(left));
 4132|      0|            }
 4133|      0|          }
 4134|      0|        }
 4135|      0|        return setLocation(
 4136|      0|            startLoc,
 4137|      0|            endLoc,
 4138|      0|            new (context_) ESTree::AsExpressionNode(left, right));
 4139|      0|      }
 4140|      0|#endif
 4141|  2.22M|    } else {
 4142|  2.22M|      return setLocation(
 4143|  2.22M|          startLoc,
 4144|  2.22M|          endLoc,
 4145|  2.22M|          new (context_) ESTree::BinaryExpressionNode(left, right, opIdent));
 4146|  2.22M|    }
 4147|  2.29M|  };
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS1_5ParamENS2_23AllowTypedArrowFunctionENS2_20CoverTypedParametersEPNS_6ESTree4NodeEENK3$_0clERZNS2_25parseAssignmentExpressionES3_S4_S5_S8_E5StateS3_S4_S5_S8_:
 5801|  6.61M|                         ESTree::Node *typeParams) -> Optional<ESTree::Node *> {
 5802|       |    // Check for yield, which may be lexed as a reserved word, but only in
 5803|       |    // strict mode.
 5804|  6.61M|    if (paramYield_ && check(TokenKind::rw_yield, TokenKind::identifier) &&
  ------------------
  |  Branch (5804:9): [True: 0, False: 6.61M]
  |  Branch (5804:24): [True: 0, False: 0]
  ------------------
 5805|  6.61M|        tok_->getResWordOrIdentifier() == yieldIdent_) {
  ------------------
  |  Branch (5805:9): [True: 0, False: 0]
  ------------------
 5806|      0|      auto optYieldExpr = parseYieldExpression(param.get(ParamIn));
 5807|      0|      if (!optYieldExpr)
  ------------------
  |  Branch (5807:11): [True: 0, False: 0]
  ------------------
 5808|      0|        return None;
 5809|      0|      ESTree::YieldExpressionNode *yieldExpr = *optYieldExpr;
 5810|      0|      if (yieldExpr->_argument && !checkEndAssignmentExpression()) {
  ------------------
  |  Branch (5810:11): [True: 0, False: 0]
  |  Branch (5810:35): [True: 0, False: 0]
  ------------------
 5811|      0|        error(tok_->getStartLoc(), "unexpected token after yield expression");
 5812|      0|        return None;
 5813|      0|      }
 5814|      0|      return yieldExpr;
 5815|      0|    }
 5816|       |
 5817|  6.61M|    SMLoc startLoc = tok_->getStartLoc();
 5818|  6.61M|    bool forceAsync = false;
 5819|  6.61M|    if (check(asyncIdent_)) {
  ------------------
  |  Branch (5819:9): [True: 125, False: 6.61M]
  ------------------
 5820|    125|      OptValue<TokenKind> optNext = lexer_.lookahead1(TokenKind::identifier);
 5821|    125|      if (optNext.hasValue() && *optNext == TokenKind::identifier) {
  ------------------
  |  Branch (5821:11): [True: 1, False: 124]
  |  Branch (5821:33): [True: 0, False: 1]
  ------------------
 5822|      0|        forceAsync = true;
 5823|      0|      }
 5824|    125|#if HERMES_PARSE_FLOW
 5825|    125|      if (context_.getParseFlow() && optNext.hasValue() &&
  ------------------
  |  Branch (5825:11): [True: 0, False: 125]
  |  Branch (5825:38): [True: 0, False: 0]
  ------------------
 5826|    125|          (*optNext == TokenKind::less || *optNext == TokenKind::l_paren)) {
  ------------------
  |  Branch (5826:12): [True: 0, False: 0]
  |  Branch (5826:43): [True: 0, False: 0]
  ------------------
 5827|      0|        auto optAsyncArrow = tryParseTypedAsyncArrowFunction(param);
 5828|      0|        if (optAsyncArrow.hasValue()) {
  ------------------
  |  Branch (5828:13): [True: 0, False: 0]
  ------------------
 5829|      0|          return *optAsyncArrow;
 5830|      0|        }
 5831|      0|      }
 5832|    125|#endif
 5833|    125|    }
 5834|       |
 5835|  6.61M|#if HERMES_PARSE_FLOW
 5836|  6.61M|    if (context_.getParseFlow() &&
  ------------------
  |  Branch (5836:9): [True: 0, False: 6.61M]
  ------------------
 5837|  6.61M|        allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
  ------------------
  |  Branch (5837:9): [True: 0, False: 0]
  ------------------
 5838|  6.61M|        !typeParams && check(TokenKind::less)) {
  ------------------
  |  Branch (5838:9): [True: 0, False: 0]
  |  Branch (5838:24): [True: 0, False: 0]
  ------------------
 5839|      0|      JSLexer::SavePoint savePoint{&lexer_};
 5840|       |      // Suppress messages from the parser while still displaying lexer
 5841|       |      // messages.
 5842|      0|      CollectMessagesRAII collect{&sm_, true};
 5843|       |      // Do as the flow parser does due to JSX ambiguities.
 5844|       |      // First we try and parse as an assignment expression disallowing
 5845|       |      // typed arrow functions. If that fails, then try again while allowing
 5846|       |      // typed arrow functions and attach the type parameters after the fact.
 5847|      0|      auto optAssign = parseAssignmentExpression(
 5848|      0|          param,
 5849|      0|          AllowTypedArrowFunction::No,
 5850|      0|          CoverTypedParameters::No,
 5851|      0|          nullptr);
 5852|      0|      if (optAssign) {
  ------------------
  |  Branch (5852:11): [True: 0, False: 0]
  ------------------
 5853|       |        // That worked, so just return it directly.
 5854|      0|        collect.setDiscardMessages(false);
 5855|      0|        return *optAssign;
 5856|      0|      } else {
 5857|       |        // Consume the type parameters and try again.
 5858|      0|        savePoint.restore();
 5859|      0|        auto optTypeParams = parseTypeParamsFlow();
 5860|       |        // Type parameters must be followed by a '(' to be meaningful.
 5861|      0|        if (optTypeParams && check(TokenKind::l_paren)) {
  ------------------
  |  Branch (5861:13): [True: 0, False: 0]
  |  Branch (5861:30): [True: 0, False: 0]
  ------------------
 5862|      0|          typeParams = *optTypeParams;
 5863|      0|          optAssign = parseAssignmentExpression(
 5864|      0|              param,
 5865|      0|              AllowTypedArrowFunction::Yes,
 5866|      0|              CoverTypedParameters::No,
 5867|      0|              typeParams);
 5868|      0|          if (optAssign) {
  ------------------
  |  Branch (5868:15): [True: 0, False: 0]
  ------------------
 5869|       |            // We've got the arrow function now, return it directly.
 5870|      0|            return *optAssign;
 5871|      0|          } else {
 5872|       |            // That's everything we can try.
 5873|      0|            error(
 5874|      0|                typeParams->getSourceRange(),
 5875|      0|                "type parameters must be used in an arrow function expression");
 5876|      0|            return None;
 5877|      0|          }
 5878|      0|        } else {
 5879|       |          // Invalid type params, and also invalid JSX. Bail.
 5880|      0|          savePoint.restore();
 5881|      0|        }
 5882|      0|      }
 5883|      0|    }
 5884|  6.61M|#endif
 5885|       |
 5886|  6.61M|    state.leftStartLoc = tok_->getStartLoc();
 5887|  6.61M|    state.hasNewLine = lexer_.isNewLineBeforeCurrentToken();
 5888|  6.61M|    state.optLeftExpr = parseConditionalExpression(param, coverTypedParameters);
 5889|  6.61M|    if (!state.optLeftExpr)
  ------------------
  |  Branch (5889:9): [True: 4.12k, False: 6.61M]
  ------------------
 5890|  4.12k|      return None;
 5891|       |
 5892|  6.61M|    ESTree::Node *returnType = nullptr;
 5893|  6.61M|    ESTree::Node *predicate = nullptr;
 5894|  6.61M|#if HERMES_PARSE_FLOW
 5895|  6.61M|    if (context_.getParseFlow()) {
  ------------------
  |  Branch (5895:9): [True: 0, False: 6.61M]
  ------------------
 5896|      0|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
  ------------------
  |  Branch (5896:11): [True: 0, False: 0]
  ------------------
 5897|      0|          ((*state.optLeftExpr)->getParens() != 0 ||
  ------------------
  |  Branch (5897:12): [True: 0, False: 0]
  ------------------
 5898|      0|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
  ------------------
  |  Branch (5898:12): [True: 0, False: 0]
  ------------------
 5899|      0|          check(TokenKind::colon)) {
  ------------------
  |  Branch (5899:11): [True: 0, False: 0]
  ------------------
 5900|      0|        JSLexer::SavePoint savePoint{&lexer_};
 5901|       |        // Defer our decision on whether to show or suppress messages for this
 5902|       |        // next section.
 5903|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5904|       |        // start parsing JSX children inside tags, instead of function type
 5905|       |        // parameters. We need to suppress lexer messages because the lexing
 5906|       |        // rules inside JSX are quite different from JS/Flow. For example: x ?
 5907|       |        // (1) : <tag>#{foo}</tag>;
 5908|       |        //         ^
 5909|       |        // and
 5910|       |        // x ? (1) : <tag>"</tag>;
 5911|       |        //         ^
 5912|       |        // must be able to handle the lexer errors that would occur if we lexed
 5913|       |        // the inside of the JSX tags as JS.
 5914|      0|        CollectMessagesRAII collect{&sm_, true};
 5915|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5916|      0|        bool startsWithPredicate = check(checksIdent_);
 5917|      0|        auto optType = startsWithPredicate
  ------------------
  |  Branch (5917:24): [True: 0, False: 0]
  ------------------
 5918|      0|            ? llvh::None
 5919|      0|            : parseReturnTypeAnnotationFlow(
 5920|      0|                  annotStart, AllowAnonFunctionType::No);
 5921|      0|        if (optType)
  ------------------
  |  Branch (5921:13): [True: 0, False: 0]
  ------------------
 5922|      0|          returnType = *optType;
 5923|      0|        if (optType || startsWithPredicate) {
  ------------------
  |  Branch (5923:13): [True: 0, False: 0]
  |  Branch (5923:24): [True: 0, False: 0]
  ------------------
 5924|      0|          if (check(TokenKind::equalgreater)) {
  ------------------
  |  Branch (5924:15): [True: 0, False: 0]
  ------------------
 5925|      0|            assert(
 5926|      0|                !startsWithPredicate && "no returnType if startsWithPredicate");
 5927|       |            // Done parsing the return type and predicate.
 5928|       |            // Successful parse, show any messages that the lexer emitted.
 5929|      0|            collect.setDiscardMessages(false);
 5930|      0|          } else if (check(checksIdent_)) {
  ------------------
  |  Branch (5930:22): [True: 0, False: 0]
  ------------------
 5931|      0|            auto optPred = parsePredicateFlow();
 5932|      0|            if (optPred && check(TokenKind::equalgreater)) {
  ------------------
  |  Branch (5932:17): [True: 0, False: 0]
  |  Branch (5932:28): [True: 0, False: 0]
  ------------------
 5933|       |              // Done parsing the return type and predicate.
 5934|      0|              predicate = *optPred;
 5935|       |              // Successful parse, show any messages that the lexer emitted.
 5936|      0|              collect.setDiscardMessages(false);
 5937|      0|            } else {
 5938|      0|              savePoint.restore();
 5939|      0|            }
 5940|      0|          } else {
 5941|      0|            savePoint.restore();
 5942|      0|          }
 5943|      0|        } else {
 5944|      0|          savePoint.restore();
 5945|      0|        }
 5946|      0|      }
 5947|      0|    }
 5948|  6.61M|#endif
 5949|       |
 5950|  6.61M|#if HERMES_PARSE_TS
 5951|  6.61M|    if (context_.getParseTS()) {
  ------------------
  |  Branch (5951:9): [True: 0, False: 6.61M]
  ------------------
 5952|       |      // Separate logic for TS parsing here, because the semantics don't
 5953|       |      // require as much complexity as Flow due to a lack of predicates.
 5954|      0|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
  ------------------
  |  Branch (5954:11): [True: 0, False: 0]
  ------------------
 5955|      0|          ((*state.optLeftExpr)->getParens() != 0 ||
  ------------------
  |  Branch (5955:12): [True: 0, False: 0]
  ------------------
 5956|      0|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
  ------------------
  |  Branch (5956:12): [True: 0, False: 0]
  ------------------
 5957|      0|          check(TokenKind::colon)) {
  ------------------
  |  Branch (5957:11): [True: 0, False: 0]
  ------------------
 5958|      0|        JSLexer::SavePoint savePoint{&lexer_};
 5959|       |        // Defer our decision on whether to show or suppress messages for this
 5960|       |        // next section.
 5961|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5962|       |        // start parsing JSX children inside tags, instead of function type
 5963|       |        // parameters. We need to suppress lexer messages because the lexing
 5964|       |        // rules inside JSX are quite different from TS. For example: x ? (1) :
 5965|       |        // <tag>#{foo}</tag>;
 5966|       |        //         ^
 5967|       |        // and
 5968|       |        // x ? (1) : <tag>"</tag>;
 5969|       |        //         ^
 5970|       |        // must be able to handle the lexer errors that would occur if we lexed
 5971|       |        // the inside of the JSX tags as JS.
 5972|      0|        CollectMessagesRAII collect{&sm_, true};
 5973|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5974|      0|        auto optType = parseTypeAnnotationTS(annotStart);
 5975|      0|        if (optType)
  ------------------
  |  Branch (5975:13): [True: 0, False: 0]
  ------------------
 5976|      0|          returnType = *optType;
 5977|      0|        if (optType) {
  ------------------
  |  Branch (5977:13): [True: 0, False: 0]
  ------------------
 5978|      0|          if (check(TokenKind::equalgreater)) {
  ------------------
  |  Branch (5978:15): [True: 0, False: 0]
  ------------------
 5979|       |            // Done parsing the return type.
 5980|       |            // Successful parse, show any messages that the lexer emitted.
 5981|      0|            collect.setDiscardMessages(false);
 5982|      0|          } else {
 5983|      0|            savePoint.restore();
 5984|      0|          }
 5985|      0|        } else {
 5986|      0|          savePoint.restore();
 5987|      0|        }
 5988|      0|      }
 5989|      0|    }
 5990|       |
 5991|  6.61M|#endif
 5992|       |
 5993|       |    // Check for ArrowFunction.
 5994|       |    //   ArrowFunction : ArrowParameters [no line terminator] => ConciseBody.
 5995|       |    //   AsyncArrowFunction :
 5996|       |    //   async [no line terminator] ArrowParameters [no line terminator] =>
 5997|       |    //   ConciseBody.
 5998|  6.61M|    if (check(TokenKind::equalgreater) &&
  ------------------
  |  Branch (5998:9): [True: 206k, False: 6.40M]
  ------------------
 5999|  6.61M|        !lexer_.isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (5999:9): [True: 206k, False: 0]
  ------------------
 6000|   206k|      return parseArrowFunctionExpression(
 6001|   206k|          param,
 6002|   206k|          *state.optLeftExpr,
 6003|   206k|          state.hasNewLine,
 6004|   206k|          typeParams,
 6005|   206k|          returnType,
 6006|   206k|          predicate,
 6007|   206k|          typeParams ? typeParams->getStartLoc() : startLoc,
  ------------------
  |  Branch (6007:11): [True: 0, False: 206k]
  ------------------
 6008|   206k|          allowTypedArrowFunction,
 6009|   206k|          forceAsync);
 6010|   206k|    }
 6011|       |
 6012|  6.40M|#if HERMES_PARSE_FLOW
 6013|  6.40M|    if (typeParams) {
  ------------------
  |  Branch (6013:9): [True: 0, False: 6.40M]
  ------------------
 6014|      0|      errorExpected(
 6015|      0|          TokenKind::equalgreater,
 6016|      0|          "in generic arrow function",
 6017|      0|          "start of function",
 6018|      0|          typeParams->getStartLoc());
 6019|      0|      return None;
 6020|      0|    }
 6021|  6.40M|#endif
 6022|       |
 6023|  6.40M|    if (!checkAssign())
  ------------------
  |  Branch (6023:9): [True: 6.39M, False: 9.27k]
  ------------------
 6024|  6.39M|      return *state.optLeftExpr;
 6025|       |
 6026|       |    // Check for destructuring assignment.
 6027|  9.27k|    if (check(TokenKind::equal) &&
  ------------------
  |  Branch (6027:9): [True: 9.14k, False: 127]
  ------------------
 6028|  9.27k|        (isa<ESTree::ArrayExpressionNode>(*state.optLeftExpr) ||
  ------------------
  |  Branch (6028:10): [True: 4.18k, False: 4.96k]
  ------------------
 6029|  9.14k|         isa<ESTree::ObjectExpressionNode>(*state.optLeftExpr))) {
  ------------------
  |  Branch (6029:10): [True: 0, False: 4.96k]
  ------------------
 6030|  4.18k|      state.optLeftExpr = reparseAssignmentPattern(*state.optLeftExpr, false);
 6031|  4.18k|      if (!state.optLeftExpr)
  ------------------
  |  Branch (6031:11): [True: 0, False: 4.18k]
  ------------------
 6032|      0|        return None;
 6033|  4.18k|    }
 6034|       |
 6035|  9.27k|    state.op = getTokenIdent(tok_->getKind());
 6036|  9.27k|    state.debugLoc = advance().Start;
 6037|  9.27k|    return nullptr;
 6038|  9.27k|  };
_ZN6hermes6parser6detail12JSParserImpl18parseStatementListIJEEEN4llvh8OptionalIbEENS1_5ParamENS0_9TokenKindEbNS2_17AllowImportExportERNS4_12simple_ilistINS_6ESTree4NodeEJEEEDpT_:
  916|  6.13k|    Tail... otherUntil) {
  917|  6.13k|  if (parseDirectives) {
  ------------------
  |  Branch (917:7): [True: 6.13k, False: 2]
  ------------------
  918|  6.13k|    ESTree::ExpressionStatementNode *dirStmt;
  919|  6.14k|    while (check(TokenKind::string_literal) &&
  ------------------
  |  Branch (919:12): [True: 14, False: 6.12k]
  ------------------
  920|  6.14k|           (dirStmt = parseDirective()) != nullptr) {
  ------------------
  |  Branch (920:12): [True: 4, False: 10]
  ------------------
  921|      4|      stmtList.push_back(*dirStmt);
  922|      4|    }
  923|  6.13k|  }
  924|       |
  925|   745k|  while (!check(TokenKind::eof) && !checkN(until, otherUntil...)) {
  ------------------
  |  Branch (925:10): [True: 744k, False: 581]
  |  Branch (925:36): [True: 739k, False: 5.52k]
  ------------------
  926|   739k|    if (!parseStatementListItem(param, allowImportExport, stmtList)) {
  ------------------
  |  Branch (926:9): [True: 35, False: 739k]
  ------------------
  927|     35|      return None;
  928|     35|    }
  929|   739k|  }
  930|       |
  931|  6.10k|  return true;
  932|  6.13k|}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS1_5ParamEEN20PrecedenceStackEntryC2EPNS_6ESTree4NodeENS0_9TokenKindEN4llvh5SMLocE:
 4071|  2.29M|        : expr(expr), opKind(opKind), exprStartLoc(exprStartLoc) {}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS1_5ParamENS2_23AllowTypedArrowFunctionENS2_20CoverTypedParametersEPNS_6ESTree4NodeEEN5StateC2Ev:
 5793|  6.61M|    explicit State() {}
JSParserImpl.cpp:_ZN6hermes6parser6detail12_GLOBAL__N_19PreParserC2ERNS_7ContextEj:
 7020|    244|      : scope_(context.getAllocator()), parser(context, bufferId, PreParse) {}

_ZNK6hermes6parser6detail12JSParserImpl12isStrictModeEv:
  110|   428k|  bool isStrictMode() const {
  111|   428k|    return lexer_.isStrictMode();
  112|   428k|  }
_ZN6hermes6parser6detail12JSParserImpl13setStrictModeEb:
  114|   212k|  void setStrictMode(bool mode) {
  115|   212k|    lexer_.setStrictMode(mode);
  116|   212k|  }
_ZNK6hermes6parser6detail12JSParserImpl19getUseStaticBuiltinEv:
  153|    204|  bool getUseStaticBuiltin() const {
  154|    204|    return useStaticBuiltin_;
  155|    204|  }
_ZN6hermes6parser6detail5ParamC2Ev:
   41|   619k|  constexpr Param() : flags_(0) {}
_ZN6hermes6parser6detail5ParamC2Ej:
   42|  2.64M|  constexpr explicit Param(unsigned f) : flags_(f) {}
_ZNK6hermes6parser6detail5Param3hasES2_:
   52|  6.62M|  bool has(Param p) const {
   53|  6.62M|    return flags_ & p.flags_;
   54|  6.62M|  }
_ZNK6hermes6parser6detail5Param3getES2_:
   63|  2.64M|  constexpr Param get(Param p) const {
   64|  2.64M|    return Param{flags_ & p.flags_};
   65|  2.64M|  }
_ZN6hermes6parser6detail12JSParserImpl17getSeenDirectivesEv:
  118|   425k|  llvh::SmallVector<UniqueString *, 1> &getSeenDirectives() {
  119|   425k|    return seenDirectives_;
  120|   425k|  }
_ZNK6hermes6parser6detail12JSParserImpl13getTokenIdentENS0_9TokenKindE:
  330|  2.35M|  UniqueString *getTokenIdent(TokenKind kind) const {
  331|  2.35M|    return tokenIdent_[(unsigned)kind];
  332|  2.35M|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocEPKNS0_5TokenE:
  359|  19.3M|  static SMLoc getStartLoc(const Token *tok) {
  360|  19.3M|    return tok->getStartLoc();
  361|  19.3M|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocEPKNS_6ESTree4NodeE:
  362|   984k|  static SMLoc getStartLoc(const ESTree::Node *from) {
  363|   984k|    return from->getStartLoc();
  364|   984k|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocEN4llvh5SMLocE:
  365|  7.75M|  static SMLoc getStartLoc(SMLoc loc) {
  366|  7.75M|    return loc;
  367|  7.75M|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocERKN4llvh7SMRangeE:
  368|   119k|  static SMLoc getStartLoc(const SMRange &rng) {
  369|   119k|    return rng.Start;
  370|   119k|  }
_ZN6hermes6parser6detail12JSParserImpl9getEndLocEPKNS0_5TokenE:
  372|  9.67M|  static SMLoc getEndLoc(const Token *tok) {
  373|  9.67M|    return tok->getEndLoc();
  374|  9.67M|  }
_ZN6hermes6parser6detail12JSParserImpl9getEndLocEPKNS_6ESTree4NodeE:
  375|   590k|  static SMLoc getEndLoc(const ESTree::Node *from) {
  376|   590k|    return from->getEndLoc();
  377|   590k|  }
_ZN6hermes6parser6detail12JSParserImpl9getEndLocEN4llvh5SMLocE:
  378|  3.83M|  static SMLoc getEndLoc(SMLoc loc) {
  379|  3.83M|    return loc;
  380|  3.83M|  }
_ZNK6hermes6parser6detail12JSParserImpl18getPrevTokenEndLocEv:
  385|  9.96M|  SMLoc getPrevTokenEndLoc() const {
  386|  9.96M|    return lexer_.getPrevTokenEndLoc();
  387|  9.96M|  }
_ZN6hermes6parser6detail12JSParserImpl7advanceENS0_7JSLexer14GrammarContextE:
  393|  17.9M|      JSLexer::GrammarContext grammarContext = JSLexer::AllowRegExp) {
  394|  17.9M|    SMRange loc = tok_->getSourceRange();
  395|  17.9M|    tok_ = lexer_.advance(grammarContext);
  396|  17.9M|    return loc;
  397|  17.9M|  }
_ZN6hermes6parser6detail12JSParserImpl13errorExpectedENS0_9TokenKindEPKcS5_N4llvh5SMLocE:
  419|     11|      SMLoc whatLoc) {
  420|     11|    errorExpected(ArrayRef<TokenKind>(k1), where, what, whatLoc);
  421|     11|  }
_ZN6hermes6parser6detail12JSParserImpl5errorEN4llvh5SMLocERKNS3_5TwineE:
  441|     18|  void error(SMLoc loc, const llvh::Twine &message) {
  442|     18|    sm_.error(loc, message, Subsystem::Parser);
  443|     18|  }
_ZNK6hermes6parser6detail12JSParserImpl5checkENS0_9TokenKindE:
  488|   231M|  bool check(TokenKind kind) const {
  489|   231M|    return tok_->getKind() == kind;
  490|   231M|  }
_ZNK6hermes6parser6detail12JSParserImpl5checkEPNS_12UniqueStringE:
  492|  20.5M|  bool check(UniqueString *ident) const {
  493|  20.5M|    return tok_->getKind() == TokenKind::identifier &&
  ------------------
  |  Branch (493:12): [True: 15.2M, False: 5.28M]
  ------------------
  494|  20.5M|        tok_->getIdentifier() == ident;
  ------------------
  |  Branch (494:9): [True: 1.07k, False: 15.2M]
  ------------------
  495|  20.5M|  }
_ZNK6hermes6parser6detail12JSParserImpl5checkENS0_9TokenKindES3_:
  498|  20.0M|  bool check(TokenKind kind1, TokenKind kind2) const {
  499|  20.0M|    return tok_->getKind() == kind1 || tok_->getKind() == kind2;
  ------------------
  |  Branch (499:12): [True: 873k, False: 19.2M]
  |  Branch (499:40): [True: 703k, False: 18.5M]
  ------------------
  500|  20.0M|  }
_ZN6hermes6parser6detail12JSParserImpl16checkDeclarationEv:
  517|   744k|  bool checkDeclaration() {
  518|   744k|    if (checkN(
  ------------------
  |  Branch (518:9): [True: 10.8k, False: 733k]
  ------------------
  519|   744k|            TokenKind::rw_function, TokenKind::rw_const, TokenKind::rw_class) ||
  520|   744k|        (check(asyncIdent_) && checkAsyncFunction())) {
  ------------------
  |  Branch (520:10): [True: 125, False: 733k]
  |  Branch (520:32): [True: 0, False: 125]
  ------------------
  521|  10.8k|      return true;
  522|  10.8k|    }
  523|       |
  524|   733k|    if (check(letIdent_)) {
  ------------------
  |  Branch (524:9): [True: 100, False: 733k]
  ------------------
  525|    100|      if (isStrictMode()) {
  ------------------
  |  Branch (525:11): [True: 0, False: 100]
  ------------------
  526|      0|        return true;
  527|      0|      }
  528|       |      // In loose mode, 'let' requires more work to check.
  529|       |      // let Identifier
  530|       |      // let [
  531|       |      // let {
  532|       |      // are all starts of 'let' declarations.
  533|       |      // But 'let' can also be an Identifier in loose mode.
  534|    100|      return lexer_.isLetFollowedByDeclStart();
  535|    100|    }
  536|       |
  537|   733k|#if HERMES_PARSE_FLOW
  538|   733k|    if (context_.getParseFlow()) {
  ------------------
  |  Branch (538:9): [True: 0, False: 733k]
  ------------------
  539|      0|      if (context_.getParseFlowComponentSyntax() &&
  ------------------
  |  Branch (539:11): [True: 0, False: 0]
  ------------------
  540|      0|          checkComponentDeclarationFlow()) {
  ------------------
  |  Branch (540:11): [True: 0, False: 0]
  ------------------
  541|      0|        return true;
  542|      0|      }
  543|      0|      if (context_.getParseFlowComponentSyntax() &&
  ------------------
  |  Branch (543:11): [True: 0, False: 0]
  ------------------
  544|      0|          checkHookDeclarationFlow()) {
  ------------------
  |  Branch (544:11): [True: 0, False: 0]
  ------------------
  545|      0|        return true;
  546|      0|      }
  547|      0|      if (check(opaqueIdent_)) {
  ------------------
  |  Branch (547:11): [True: 0, False: 0]
  ------------------
  548|      0|        auto optNext = lexer_.lookahead1(llvh::None);
  549|      0|        return optNext.hasValue() && (*optNext == TokenKind::identifier);
  ------------------
  |  Branch (549:16): [True: 0, False: 0]
  |  Branch (549:38): [True: 0, False: 0]
  ------------------
  550|      0|      }
  551|      0|      if (checkN(typeIdent_, interfaceIdent_)) {
  ------------------
  |  Branch (551:11): [True: 0, False: 0]
  ------------------
  552|      0|        auto optNext = lexer_.lookahead1(llvh::None);
  553|      0|        return optNext.hasValue() && *optNext == TokenKind::identifier;
  ------------------
  |  Branch (553:16): [True: 0, False: 0]
  |  Branch (553:38): [True: 0, False: 0]
  ------------------
  554|      0|      }
  555|      0|      if (check(TokenKind::rw_interface)) {
  ------------------
  |  Branch (555:11): [True: 0, False: 0]
  ------------------
  556|      0|        return true;
  557|      0|      }
  558|      0|      if (check(TokenKind::rw_enum)) {
  ------------------
  |  Branch (558:11): [True: 0, False: 0]
  ------------------
  559|      0|        return true;
  560|      0|      }
  561|      0|    }
  562|   733k|#endif
  563|       |
  564|   733k|#if HERMES_PARSE_TS
  565|   733k|    if (context_.getParseTS()) {
  ------------------
  |  Branch (565:9): [True: 0, False: 733k]
  ------------------
  566|      0|      if (checkN(typeIdent_, interfaceIdent_, namespaceIdent_)) {
  ------------------
  |  Branch (566:11): [True: 0, False: 0]
  ------------------
  567|      0|        auto optNext = lexer_.lookahead1(llvh::None);
  568|      0|        return optNext.hasValue() && *optNext == TokenKind::identifier;
  ------------------
  |  Branch (568:16): [True: 0, False: 0]
  |  Branch (568:38): [True: 0, False: 0]
  ------------------
  569|      0|      }
  570|      0|      if (check(TokenKind::rw_interface)) {
  ------------------
  |  Branch (570:11): [True: 0, False: 0]
  ------------------
  571|      0|        return true;
  572|      0|      }
  573|      0|      if (check(TokenKind::rw_enum)) {
  ------------------
  |  Branch (573:11): [True: 0, False: 0]
  ------------------
  574|      0|        return true;
  575|      0|      }
  576|      0|    }
  577|   733k|#endif
  578|       |
  579|   733k|    return false;
  580|   733k|  }
_ZNK6hermes6parser6detail12JSParserImpl20checkTemplateLiteralEv:
  599|  9.30M|  bool checkTemplateLiteral() const {
  600|  9.30M|    return check(TokenKind::no_substitution_template, TokenKind::template_head);
  601|  9.30M|  }
_ZN6hermes6parser6detail12JSParserImpl19recursionDepthCheckEv:
  634|  10.5M|  inline bool recursionDepthCheck() {
  635|  10.5M|    if (LLVM_LIKELY(recursionDepth_ < MAX_RECURSION_DEPTH)) {
  ------------------
  |  |  188|  10.5M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 10.5M, False: 4]
  |  |  ------------------
  ------------------
  636|  10.5M|      return false;
  637|  10.5M|    }
  638|      4|    return recursionDepthExceeded();
  639|  10.5M|  }
_ZN6hermes6parser6detail12JSParserImpl31SaveStrictModeAndSeenDirectivesC2EPS2_:
 1511|   212k|        : parser_(parser),
 1512|   212k|          oldStrictMode_(parser->isStrictMode()),
 1513|   212k|          oldSeenDirectiveSize_(parser->getSeenDirectives().size()) {}
_ZN6hermes6parser6detail12JSParserImpl31SaveStrictModeAndSeenDirectivesD2Ev:
 1514|   212k|    ~SaveStrictModeAndSeenDirectives() {
 1515|   212k|      parser_->setStrictMode(oldStrictMode_);
 1516|   212k|      parser_->getSeenDirectives().resize(oldSeenDirectiveSize_);
 1517|   212k|    }
_ZN6hermes6parser6detail12JSParserImpl14TrackRecursionC2EPS2_:
 1525|  10.4M|    TrackRecursion(JSParserImpl *parser) : parser_(parser) {
 1526|  10.4M|      ++parser_->recursionDepth_;
 1527|  10.4M|    }
_ZN6hermes6parser6detail12JSParserImpl14TrackRecursionD2Ev:
 1528|  10.4M|    ~TrackRecursion() {
 1529|  10.4M|      --parser_->recursionDepth_;
 1530|  10.4M|    }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_EEEbT_DpT0_:
  509|  26.4M|  inline bool checkN(Head h, Tail... tail) const {
  510|  26.4M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 21.3k, False: 26.4M]
  |  Branch (510:24): [True: 261k, False: 26.1M]
  ------------------
  511|  26.4M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_EEEbT_DpT0_:
  509|  26.4M|  inline bool checkN(Head h, Tail... tail) const {
  510|  26.4M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 255k, False: 26.1M]
  |  Branch (510:24): [True: 5.86k, False: 26.1M]
  ------------------
  511|  26.4M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEEEbT_:
  503|  26.9M|  inline bool checkN(T t) const {
  504|  26.9M|    return check(t);
  505|  26.9M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNIPNS_12UniqueStringEEEbT_:
  503|     83|  inline bool checkN(T t) const {
  504|     83|    return check(t);
  505|     83|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19TemplateElementNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|  1.09M|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  1.09M|    node->setStartLoc(getStartLoc(start));
  340|  1.09M|    node->setEndLoc(getEndLoc(end));
  341|  1.09M|    node->setDebugLoc(getStartLoc(start));
  342|  1.09M|    return node;
  343|  1.09M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree21LogicalExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  70.7k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  70.7k|    node->setStartLoc(getStartLoc(start));
  340|  70.7k|    node->setEndLoc(getEndLoc(end));
  341|  70.7k|    node->setDebugLoc(getStartLoc(start));
  342|  70.7k|    return node;
  343|  70.7k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20BinaryExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  2.22M|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  2.22M|    node->setStartLoc(getStartLoc(start));
  340|  2.22M|    node->setEndLoc(getEndLoc(end));
  341|  2.22M|    node->setDebugLoc(getStartLoc(start));
  342|  2.22M|    return node;
  343|  2.22M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_EEEbT_DpT0_:
  509|  6.40M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.40M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 133, False: 6.40M]
  |  Branch (510:24): [True: 221, False: 6.40M]
  ------------------
  511|  6.40M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.40M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.40M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 9.14k, False: 6.39M]
  |  Branch (510:24): [True: 127, False: 6.39M]
  ------------------
  511|  6.40M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.39M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.39M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.39M]
  |  Branch (510:24): [True: 127, False: 6.39M]
  ------------------
  511|  6.39M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.39M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.39M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.39M]
  |  Branch (510:24): [True: 127, False: 6.39M]
  ------------------
  511|  6.39M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.39M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.39M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.39M]
  |  Branch (510:24): [True: 127, False: 6.39M]
  ------------------
  511|  6.39M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.39M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.39M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 3, False: 6.39M]
  |  Branch (510:24): [True: 124, False: 6.39M]
  ------------------
  511|  6.39M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.39M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.39M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.39M]
  |  Branch (510:24): [True: 124, False: 6.39M]
  ------------------
  511|  6.39M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.39M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.39M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.39M]
  |  Branch (510:24): [True: 124, False: 6.39M]
  ------------------
  511|  6.39M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.39M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.39M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.39M]
  |  Branch (510:24): [True: 124, False: 6.39M]
  ------------------
  511|  6.39M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.40M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.40M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.40M]
  |  Branch (510:24): [True: 358, False: 6.40M]
  ------------------
  511|  6.40M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.40M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.40M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.40M]
  |  Branch (510:24): [True: 358, False: 6.40M]
  ------------------
  511|  6.40M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree11ProgramNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|    581|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|    581|    node->setStartLoc(getStartLoc(start));
  340|    581|    node->setEndLoc(getEndLoc(end));
  341|    581|    node->setDebugLoc(getStartLoc(start));
  342|    581|    return node;
  343|    581|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree16FunctionLikeNodeEN4llvh5SMLocEPNS4_18BlockStatementNodeEEEPT_T0_T1_SB_:
  338|  5.60k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  5.60k|    node->setStartLoc(getStartLoc(start));
  340|  5.60k|    node->setEndLoc(getEndLoc(end));
  341|  5.60k|    node->setDebugLoc(getStartLoc(start));
  342|  5.60k|    return node;
  343|  5.60k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18BlockStatementNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|     81|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|     81|    node->setStartLoc(getStartLoc(start));
  340|     81|    node->setEndLoc(getEndLoc(end));
  341|     81|    node->setDebugLoc(getStartLoc(start));
  342|     81|    return node;
  343|     81|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJPNS_12UniqueStringEEEEbT_DpT0_:
  509|    114|  inline bool checkN(Head h, Tail... tail) const {
  510|    114|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 31, False: 83]
  |  Branch (510:24): [True: 50, False: 33]
  ------------------
  511|    114|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18BlockStatementNodeEN4llvh5SMLocEPKNS0_5TokenEEEPT_T0_T1_SC_:
  338|  5.52k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  5.52k|    node->setStartLoc(getStartLoc(start));
  340|  5.52k|    node->setEndLoc(getEndLoc(end));
  341|  5.52k|    node->setDebugLoc(getStartLoc(start));
  342|  5.52k|    return node;
  343|  5.52k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree14IdentifierNodeEN4llvh7SMRangeENS6_5SMLocEEEPT_T0_T1_SA_:
  338|  9.33k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  9.33k|    node->setStartLoc(getStartLoc(start));
  340|  9.33k|    node->setEndLoc(getEndLoc(end));
  341|  9.33k|    node->setDebugLoc(getStartLoc(start));
  342|  9.33k|    return node;
  343|  9.33k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree23VariableDeclarationNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  3.89k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  3.89k|    node->setStartLoc(getStartLoc(start));
  340|  3.89k|    node->setEndLoc(getEndLoc(end));
  341|  3.89k|    node->setDebugLoc(getStartLoc(start));
  342|  3.89k|    return node;
  343|  3.89k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree14IdentifierNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|  3.42M|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  3.42M|    node->setStartLoc(getStartLoc(start));
  340|  3.42M|    node->setEndLoc(getEndLoc(end));
  341|  3.42M|    node->setDebugLoc(getStartLoc(start));
  342|  3.42M|    return node;
  343|  3.42M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree22VariableDeclaratorNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  3.89k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  3.89k|    node->setStartLoc(getStartLoc(start));
  340|  3.89k|    node->setEndLoc(getEndLoc(end));
  341|  3.89k|    node->setDebugLoc(getStartLoc(start));
  342|  3.89k|    return node;
  343|  3.89k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree9EmptyNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|     82|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|     82|    node->setStartLoc(getStartLoc(start));
  340|     82|    node->setEndLoc(getEndLoc(end));
  341|     82|    node->setDebugLoc(getStartLoc(start));
  342|     82|    return node;
  343|     82|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree16ArrayPatternNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  44.7k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  44.7k|    node->setStartLoc(getStartLoc(start));
  340|  44.7k|    node->setEndLoc(getEndLoc(end));
  341|  44.7k|    node->setDebugLoc(getStartLoc(start));
  342|  44.7k|    return node;
  343|  44.7k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18EmptyStatementNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|  10.6k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  10.6k|    node->setStartLoc(getStartLoc(start));
  340|  10.6k|    node->setEndLoc(getEndLoc(end));
  341|  10.6k|    node->setDebugLoc(getStartLoc(start));
  342|  10.6k|    return node;
  343|  10.6k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20LabeledStatementNodeEPNS4_14IdentifierNodeEPNS4_4NodeEEEPT_T0_T1_SB_:
  338|   492k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|   492k|    node->setStartLoc(getStartLoc(start));
  340|   492k|    node->setEndLoc(getEndLoc(end));
  341|   492k|    node->setDebugLoc(getStartLoc(start));
  342|   492k|    return node;
  343|   492k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree23ExpressionStatementNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|   719k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|   719k|    node->setStartLoc(getStartLoc(start));
  340|   719k|    node->setEndLoc(getEndLoc(end));
  341|   719k|    node->setDebugLoc(getStartLoc(start));
  342|   719k|    return node;
  343|   719k|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_PNS_12UniqueStringEEEEbT_DpT0_:
  509|     32|  inline bool checkN(Head h, Tail... tail) const {
  510|     32|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 32]
  |  Branch (510:24): [True: 0, False: 32]
  ------------------
  511|     32|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree4NodeEN4llvh5SMLocEPS5_EEPT_T0_T1_SA_:
  338|     31|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|     31|    node->setStartLoc(getStartLoc(start));
  340|     31|    node->setEndLoc(getEndLoc(end));
  341|     31|    node->setDebugLoc(getStartLoc(start));
  342|     31|    return node;
  343|     31|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18BreakStatementNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|      1|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|      1|    node->setStartLoc(getStartLoc(start));
  340|      1|    node->setEndLoc(getEndLoc(end));
  341|      1|    node->setDebugLoc(getStartLoc(start));
  342|      1|    return node;
  343|      1|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18ThisExpressionNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|      4|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|      4|    node->setStartLoc(getStartLoc(start));
  340|      4|    node->setEndLoc(getEndLoc(end));
  341|      4|    node->setDebugLoc(getStartLoc(start));
  342|      4|    return node;
  343|      4|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18NumericLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|  5.13M|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  5.13M|    node->setStartLoc(getStartLoc(start));
  340|  5.13M|    node->setEndLoc(getEndLoc(end));
  341|  5.13M|    node->setDebugLoc(getStartLoc(start));
  342|  5.13M|    return node;
  343|  5.13M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree17BigIntLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|     54|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|     54|    node->setStartLoc(getStartLoc(start));
  340|     54|    node->setEndLoc(getEndLoc(end));
  341|     54|    node->setDebugLoc(getStartLoc(start));
  342|     54|    return node;
  343|     54|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree17StringLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|     49|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|     49|    node->setStartLoc(getStartLoc(start));
  340|     49|    node->setEndLoc(getEndLoc(end));
  341|     49|    node->setDebugLoc(getStartLoc(start));
  342|     49|    return node;
  343|     49|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree17RegExpLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  338|    240|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|    240|    node->setStartLoc(getStartLoc(start));
  340|    240|    node->setEndLoc(getEndLoc(end));
  341|    240|    node->setDebugLoc(getStartLoc(start));
  342|    240|    return node;
  343|    240|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18CoverEmptyArgsNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|    292|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|    292|    node->setStartLoc(getStartLoc(start));
  340|    292|    node->setEndLoc(getEndLoc(end));
  341|    292|    node->setDebugLoc(getStartLoc(start));
  342|    292|    return node;
  343|    292|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19ArrayExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  45.0k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  45.0k|    node->setStartLoc(getStartLoc(start));
  340|  45.0k|    node->setEndLoc(getEndLoc(end));
  341|  45.0k|    node->setDebugLoc(getStartLoc(start));
  342|  45.0k|    return node;
  343|  45.0k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20ObjectExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|      4|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|      4|    node->setStartLoc(getStartLoc(start));
  340|      4|    node->setEndLoc(getEndLoc(end));
  341|      4|    node->setDebugLoc(getStartLoc(start));
  342|      4|    return node;
  343|      4|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree14IdentifierNodeEPNS4_4NodeES7_EEPT_T0_T1_S9_:
  338|      2|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|      2|    node->setStartLoc(getStartLoc(start));
  340|      2|    node->setEndLoc(getEndLoc(end));
  341|      2|    node->setDebugLoc(getStartLoc(start));
  342|      2|    return node;
  343|      2|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree12PropertyNodeEN4llvh5SMLocEPNS4_14IdentifierNodeEEEPT_T0_T1_SB_:
  338|      2|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|      2|    node->setStartLoc(getStartLoc(start));
  340|      2|    node->setEndLoc(getEndLoc(end));
  341|      2|    node->setDebugLoc(getStartLoc(start));
  342|      2|    return node;
  343|      2|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19TemplateLiteralNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|   388k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|   388k|    node->setStartLoc(getStartLoc(start));
  340|   388k|    node->setEndLoc(getEndLoc(end));
  341|   388k|    node->setDebugLoc(getStartLoc(start));
  342|   388k|    return node;
  343|   388k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree28TaggedTemplateExpressionNodeEN4llvh5SMLocEPNS4_4NodeEEEPT_T0_T1_SB_:
  338|  5.70k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  5.70k|    node->setStartLoc(getStartLoc(start));
  340|  5.70k|    node->setEndLoc(getEndLoc(end));
  341|  5.70k|    node->setDebugLoc(getStartLoc(start));
  342|  5.70k|    return node;
  343|  5.70k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20MemberExpressionNodeEN4llvh5SMLocES7_S7_EEPT_T0_T1_T2_S9_:
  347|    143|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  348|    143|    node->setStartLoc(getStartLoc(start));
  349|    143|    node->setEndLoc(getEndLoc(end));
  350|    143|    node->setDebugLoc(getStartLoc(debugLoc));
  351|    143|    return node;
  352|    143|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree28OptionalMemberExpressionNodeEN4llvh5SMLocEPNS4_4NodeES7_EEPT_T0_T1_T2_SB_:
  347|  51.9k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  348|  51.9k|    node->setStartLoc(getStartLoc(start));
  349|  51.9k|    node->setEndLoc(getEndLoc(end));
  350|  51.9k|    node->setDebugLoc(getStartLoc(debugLoc));
  351|  51.9k|    return node;
  352|  51.9k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20MemberExpressionNodeEN4llvh5SMLocEPNS4_4NodeES7_EEPT_T0_T1_T2_SB_:
  347|  35.0k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  348|  35.0k|    node->setStartLoc(getStartLoc(start));
  349|  35.0k|    node->setEndLoc(getEndLoc(end));
  350|  35.0k|    node->setDebugLoc(getStartLoc(debugLoc));
  351|  35.0k|    return node;
  352|  35.0k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree26OptionalCallExpressionNodeEN4llvh5SMLocES7_S7_EEPT_T0_T1_T2_S9_:
  347|     38|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  348|     38|    node->setStartLoc(getStartLoc(start));
  349|     38|    node->setEndLoc(getEndLoc(end));
  350|     38|    node->setDebugLoc(getStartLoc(debugLoc));
  351|     38|    return node;
  352|     38|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18CallExpressionNodeEN4llvh5SMLocES7_S7_EEPT_T0_T1_T2_S9_:
  347|  2.04k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  348|  2.04k|    node->setStartLoc(getStartLoc(start));
  349|  2.04k|    node->setEndLoc(getEndLoc(end));
  350|  2.04k|    node->setDebugLoc(getStartLoc(debugLoc));
  351|  2.04k|    return node;
  352|  2.04k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree28TaggedTemplateExpressionNodeEN4llvh5SMLocEPNS4_4NodeES7_EEPT_T0_T1_T2_SB_:
  347|     14|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  348|     14|    node->setStartLoc(getStartLoc(start));
  349|     14|    node->setEndLoc(getEndLoc(end));
  350|     14|    node->setDebugLoc(getStartLoc(debugLoc));
  351|     14|    return node;
  352|     14|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree17NewExpressionNodeEN4llvh7SMRangeENS6_5SMLocEEEPT_T0_T1_SA_:
  338|  50.6k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  50.6k|    node->setStartLoc(getStartLoc(start));
  340|  50.6k|    node->setEndLoc(getEndLoc(end));
  341|  50.6k|    node->setDebugLoc(getStartLoc(start));
  342|  50.6k|    return node;
  343|  50.6k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19UnaryExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  51.8k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  51.8k|    node->setStartLoc(getStartLoc(start));
  340|  51.8k|    node->setEndLoc(getEndLoc(end));
  341|  51.8k|    node->setDebugLoc(getStartLoc(start));
  342|  51.8k|    return node;
  343|  51.8k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20UpdateExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|      2|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|      2|    node->setStartLoc(getStartLoc(start));
  340|      2|    node->setEndLoc(getEndLoc(end));
  341|      2|    node->setDebugLoc(getStartLoc(start));
  342|      2|    return node;
  343|      2|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree25ConditionalExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|  7.33k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|  7.33k|    node->setStartLoc(getStartLoc(start));
  340|  7.33k|    node->setEndLoc(getEndLoc(end));
  341|  7.33k|    node->setDebugLoc(getStartLoc(start));
  342|  7.33k|    return node;
  343|  7.33k|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.40M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.40M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 4, False: 6.40M]
  |  Branch (510:24): [True: 354, False: 6.40M]
  ------------------
  511|  6.40M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_EEEbT_DpT0_:
  509|  6.40M|  inline bool checkN(Head h, Tail... tail) const {
  510|  6.40M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (510:12): [True: 0, False: 6.40M]
  |  Branch (510:24): [True: 354, False: 6.40M]
  ------------------
  511|  6.40M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree27ArrowFunctionExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|   206k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|   206k|    node->setStartLoc(getStartLoc(start));
  340|   206k|    node->setEndLoc(getEndLoc(end));
  341|   206k|    node->setDebugLoc(getStartLoc(start));
  342|   206k|    return node;
  343|   206k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree24AssignmentExpressionNodeEN4llvh5SMLocES7_S7_EEPT_T0_T1_T2_S9_:
  347|  9.27k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  348|  9.27k|    node->setStartLoc(getStartLoc(start));
  349|  9.27k|    node->setEndLoc(getEndLoc(end));
  350|  9.27k|    node->setDebugLoc(getStartLoc(debugLoc));
  351|  9.27k|    return node;
  352|  9.27k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree22SequenceExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  338|    400|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|    400|    node->setStartLoc(getStartLoc(start));
  340|    400|    node->setEndLoc(getEndLoc(end));
  341|    400|    node->setDebugLoc(getStartLoc(start));
  342|    400|    return node;
  343|    400|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree23ExpressionStatementNodeEPNS4_17StringLiteralNodeEN4llvh5SMLocEEEPT_T0_T1_SB_:
  338|      4|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  339|      4|    node->setStartLoc(getStartLoc(start));
  340|      4|    node->setEndLoc(getEndLoc(end));
  341|      4|    node->setDebugLoc(getStartLoc(start));
  342|      4|    return node;
  343|      4|  }

_ZN6hermes19isUnicodeOnlyLetterEj:
   38|  16.2k|bool isUnicodeOnlyLetter(uint32_t cp) {
   39|       |  // "any character in the Unicode categories “Uppercase letter (Lu)”,
   40|       |  // “Lowercase letter (Ll)”, “Titlecase letter (Lt)”, “Modifier letter (Lm)”,
   41|       |  // “Other letter (Lo)”, or “Letter number (Nl)”".
   42|       |  // ASCII characters are not "UnicodeOnly" and so we return false.
   43|  16.2k|  if (cp <= 0x7F)
  ------------------
  |  Branch (43:7): [True: 4, False: 16.2k]
  ------------------
   44|      4|    return false;
   45|       |
   46|  16.2k|  return lookup(UNICODE_LETTERS, cp);
   47|  16.2k|}
_ZN6hermes18isUnicodeOnlySpaceEj:
   50|     88|bool isUnicodeOnlySpace(uint32_t cp) {
   51|       |  // "Other category “Zs”: Any other Unicode “space separator”"
   52|       |  // Exclude ASCII.
   53|     88|  if (cp <= 0x7F)
  ------------------
  |  Branch (53:7): [True: 4, False: 84]
  ------------------
   54|      4|    return false;
   55|       |
   56|     84|  switch (cp) {
   57|      0|    case 0xa0:
  ------------------
  |  Branch (57:5): [True: 0, False: 84]
  ------------------
   58|      0|    case 0x1680:
  ------------------
  |  Branch (58:5): [True: 0, False: 84]
  ------------------
   59|      0|    case 0x2000:
  ------------------
  |  Branch (59:5): [True: 0, False: 84]
  ------------------
   60|     59|    case 0x2001:
  ------------------
  |  Branch (60:5): [True: 59, False: 25]
  ------------------
   61|     59|    case 0x2002:
  ------------------
  |  Branch (61:5): [True: 0, False: 84]
  ------------------
   62|     59|    case 0x2003:
  ------------------
  |  Branch (62:5): [True: 0, False: 84]
  ------------------
   63|     59|    case 0x2004:
  ------------------
  |  Branch (63:5): [True: 0, False: 84]
  ------------------
   64|     59|    case 0x2005:
  ------------------
  |  Branch (64:5): [True: 0, False: 84]
  ------------------
   65|     59|    case 0x2006:
  ------------------
  |  Branch (65:5): [True: 0, False: 84]
  ------------------
   66|     59|    case 0x2007:
  ------------------
  |  Branch (66:5): [True: 0, False: 84]
  ------------------
   67|     59|    case 0x2008:
  ------------------
  |  Branch (67:5): [True: 0, False: 84]
  ------------------
   68|     79|    case 0x2009:
  ------------------
  |  Branch (68:5): [True: 20, False: 64]
  ------------------
   69|     79|    case 0x200a:
  ------------------
  |  Branch (69:5): [True: 0, False: 84]
  ------------------
   70|     79|    case 0x202f:
  ------------------
  |  Branch (70:5): [True: 0, False: 84]
  ------------------
   71|     81|    case 0x205f:
  ------------------
  |  Branch (71:5): [True: 2, False: 82]
  ------------------
   72|     81|    case 0x3000:
  ------------------
  |  Branch (72:5): [True: 0, False: 84]
  ------------------
   73|     81|      return true;
   74|      3|    default:
  ------------------
  |  Branch (74:5): [True: 3, False: 81]
  ------------------
   75|      3|      return false;
   76|     84|  }
   77|     84|}
_ZN6hermes22isUnicodeCombiningMarkEj:
   79|     26|bool isUnicodeCombiningMark(uint32_t cp) {
   80|       |  // "any character in the Unicode categories “Non-spacing mark (Mn)” or
   81|       |  // “Combining spacing mark (Mc)”"
   82|     26|  return lookup(UNICODE_COMBINING_MARK, cp);
   83|     26|}
_ZN6hermes14isUnicodeDigitEj:
   85|     21|bool isUnicodeDigit(uint32_t cp) {
   86|       |  // "any character in the Unicode category “Decimal number (Nd)”"
   87|       |  // 0-9 is the common case.
   88|     21|  return (cp >= '0' && cp <= '9') || lookup(UNICODE_DIGIT, cp);
  ------------------
  |  Branch (88:11): [True: 21, False: 0]
  |  Branch (88:24): [True: 0, False: 21]
  |  Branch (88:38): [True: 0, False: 21]
  ------------------
   89|     21|};
_ZN6hermes29isUnicodeConnectorPunctuationEj:
   91|     21|bool isUnicodeConnectorPunctuation(uint32_t cp) {
   92|       |  // "any character in the Unicode category “Connector punctuation (Pc)"
   93|       |  // _ is the common case.
   94|     21|  return cp == '_' || lookup(UNICODE_CONNECTOR_PUNCTUATION, cp);
  ------------------
  |  Branch (94:10): [True: 0, False: 21]
  |  Branch (94:23): [True: 0, False: 21]
  ------------------
   95|     21|}
_ZN6hermes25makeCanonicallyEquivalentERKNS_12CodePointSetEb:
  186|     53|CodePointSet makeCanonicallyEquivalent(const CodePointSet &set, bool unicode) {
  187|       |  // Canonicalize all characters in the set, and then find all characters which
  188|       |  // canonicalize to some element in the set.
  189|     53|  CodePointSet canonicalized = set;
  190|    372|  for (const auto &range : set.ranges()) {
  ------------------
  |  Branch (190:26): [True: 372, False: 53]
  ------------------
  191|    372|    canonicalizeRange(range, &canonicalized, unicode);
  192|    372|  }
  193|       |
  194|     53|  CodePointSet result = canonicalized;
  195|    438|  for (const auto &range : canonicalized.ranges()) {
  ------------------
  |  Branch (195:26): [True: 438, False: 53]
  ------------------
  196|    438|    addPrecanonicalCharacters(range, &result, unicode);
  197|    438|  }
  198|     53|  return result;
  199|     53|}
_ZN6hermes12canonicalizeEjb:
  201|     38|uint32_t canonicalize(uint32_t cp, bool unicode) {
  202|     38|  const auto start =
  203|     38|      unicode ? std::begin(UNICODE_FOLDS) : std::begin(LEGACY_CANONS);
  ------------------
  |  Branch (203:7): [True: 0, False: 38]
  ------------------
  204|     38|  const auto end = unicode ? std::end(UNICODE_FOLDS) : std::end(LEGACY_CANONS);
  ------------------
  |  Branch (204:20): [True: 0, False: 38]
  ------------------
  205|     38|  auto where = std::lower_bound(start, end, cp);
  206|     38|  if (where != end && where->start <= cp && cp < where->start + where->count) {
  ------------------
  |  Branch (206:7): [True: 38, False: 0]
  |  Branch (206:23): [True: 2, False: 36]
  |  Branch (206:45): [True: 2, False: 0]
  ------------------
  207|      2|    return applyTransform(*where, cp);
  208|     36|  } else {
  209|       |    // No transform for this character, so it canonicalizes to itself.
  210|     36|    return cp;
  211|     36|  }
  212|     38|}
CharacterProperties.cpp:_ZN6hermesL17canonicalizeRangeENS_14CodePointRangeEPNS_12CodePointSetEb:
  156|    372|canonicalizeRange(CodePointRange range, CodePointSet *receiver, bool unicode) {
  157|    372|  assert(range.length > 0 && "Range should never be empty");
  158|       |
  159|       |  /// Find the first transform that contains or starts after our range.
  160|    372|  const auto start =
  161|    372|      unicode ? std::begin(UNICODE_FOLDS) : std::begin(LEGACY_CANONS);
  ------------------
  |  Branch (161:7): [True: 0, False: 372]
  ------------------
  162|    372|  const auto end = unicode ? std::end(UNICODE_FOLDS) : std::end(LEGACY_CANONS);
  ------------------
  |  Branch (162:20): [True: 0, False: 372]
  ------------------
  163|    372|  auto transform = std::lower_bound(start, end, range.first);
  164|       |
  165|    372|  uint32_t curcp = range.first;
  166|    372|  uint32_t endcp = range.end();
  167|    744|  while (curcp < endcp && transform != end) {
  ------------------
  |  Branch (167:10): [True: 372, False: 372]
  |  Branch (167:27): [True: 372, False: 0]
  ------------------
  168|    372|    uint32_t transformEnd = transform->start + transform->count;
  169|    372|    assert(transformEnd > curcp && "transform should end after our current cp");
  170|    372|    if (transform->start > curcp) {
  ------------------
  |  Branch (170:9): [True: 236, False: 136]
  ------------------
  171|       |      // Our transform started after the current value, so skip to the
  172|       |      // transform.
  173|    236|      curcp = transform->start;
  174|    236|    } else {
  175|       |      // Apply this transform for the code points that are in the transform and
  176|       |      // also in our range.
  177|    310|      for (; curcp < transformEnd && curcp < endcp; curcp++) {
  ------------------
  |  Branch (177:14): [True: 266, False: 44]
  |  Branch (177:38): [True: 174, False: 92]
  ------------------
  178|    174|        receiver->add(applyTransform(*transform, curcp));
  179|    174|      }
  180|       |      // We have now exhausted this transform; go to the next one.
  181|    136|      ++transform;
  182|    136|    }
  183|    372|  }
  184|    372|}
CharacterProperties.cpp:_ZN6hermesL25addPrecanonicalCharactersENS_14CodePointRangeEPNS_12CodePointSetEb:
  123|    438|    bool unicode) {
  124|    438|  if (range.length == 0)
  ------------------
  |  Branch (124:7): [True: 0, False: 438]
  ------------------
  125|      0|    return;
  126|       |  // TODO: if range is ASCII and unicode is not set, we can stop the search
  127|       |  // after the ASCII part as nothing outside ASCII can canonicalize to an ASCII
  128|       |  // character.
  129|    438|  const auto start =
  130|    438|      unicode ? std::begin(UNICODE_FOLDS) : std::begin(LEGACY_CANONS);
  ------------------
  |  Branch (130:7): [True: 0, False: 438]
  ------------------
  131|    438|  const auto end = unicode ? std::end(UNICODE_FOLDS) : std::end(LEGACY_CANONS);
  ------------------
  |  Branch (131:20): [True: 0, False: 438]
  ------------------
  132|  77.0k|  for (auto iter = start; iter != end; ++iter) {
  ------------------
  |  Branch (132:27): [True: 76.6k, False: 438]
  ------------------
  133|  76.6k|    const UnicodeTransformRange &transform = *iter;
  134|       |    // Get the range of transformed-from and transformed-to characters.
  135|  76.6k|    CodePointRange fromRange{transform.start, transform.count};
  136|  76.6k|    CodePointRange toRange = fromRange;
  137|  76.6k|    toRange.first += transform.delta;
  138|       |
  139|       |    // See if some character in our range will be transformed-to.
  140|  76.6k|    if (!range.overlaps(toRange))
  ------------------
  |  Branch (140:9): [True: 76.4k, False: 160]
  ------------------
  141|  76.4k|      continue;
  142|       |
  143|       |    // Looks like it. Add everything.
  144|  4.31k|    for (uint32_t cp = fromRange.first; cp < fromRange.end(); cp++) {
  ------------------
  |  Branch (144:41): [True: 4.15k, False: 160]
  ------------------
  145|  4.15k|      uint32_t tcp = applyTransform(transform, cp);
  146|  4.15k|      if (tcp != cp && range.first <= tcp && tcp < range.end()) {
  ------------------
  |  Branch (146:11): [True: 4.15k, False: 0]
  |  Branch (146:24): [True: 1.88k, False: 2.27k]
  |  Branch (146:46): [True: 202, False: 1.68k]
  ------------------
  147|    202|        receiver->add(cp);
  148|    202|      }
  149|  4.15k|    }
  150|    160|  }
  151|    438|}
CharacterProperties.cpp:_ZN6hermesL14applyTransformERKNS_21UnicodeTransformRangeEj:
   97|  4.33k|static uint32_t applyTransform(const UnicodeTransformRange &r, uint32_t cp) {
   98|  4.33k|  assert(
   99|  4.33k|      r.start <= cp && cp < r.start + r.count &&
  100|  4.33k|      "range does not contain this cp");
  101|  4.33k|  assert(cp <= INT32_MAX && "cp is too big");
  102|       |  // Check if our code point has a mod of 0.
  103|  4.33k|  if ((cp - r.start) % r.modulo == 0) {
  ------------------
  |  Branch (103:7): [True: 4.32k, False: 2]
  ------------------
  104|  4.32k|    int32_t cps = static_cast<int32_t>(cp) + r.delta;
  105|  4.32k|    assert(cps >= 0 && "delta underflowed");
  106|  4.32k|    return static_cast<uint32_t>(cps);
  107|  4.32k|  }
  108|      2|  return cp;
  109|  4.33k|}
_ZN6hermes6lookupIA362_NS_12UnicodeRangeEEEbRKT_j:
   33|  16.2k|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   34|  16.2k|  return std::binary_search(
   35|  16.2k|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   36|  16.2k|}
CharacterProperties.cpp:_ZNK6hermes12_GLOBAL__N_116UnicodeRangeCompclENS_12UnicodeRangeEj:
   23|   146k|  bool operator()(UnicodeRange p, uint32_t s) const {
   24|   146k|    return p.second < s;
   25|   146k|  }
CharacterProperties.cpp:_ZNK6hermes12_GLOBAL__N_116UnicodeRangeCompclEjNS_12UnicodeRangeE:
   26|  16.2k|  bool operator()(uint32_t s, UnicodeRange p) const {
   27|  16.2k|    return s < p.first;
   28|  16.2k|  }
_ZN6hermes6lookupIA254_NS_12UnicodeRangeEEEbRKT_j:
   33|     26|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   34|     26|  return std::binary_search(
   35|     26|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   36|     26|}
_ZN6hermes6lookupIA63_NS_12UnicodeRangeEEEbRKT_j:
   33|     21|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   34|     21|  return std::binary_search(
   35|     21|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   36|     21|}
_ZN6hermes6lookupIA6_NS_12UnicodeRangeEEEbRKT_j:
   33|     21|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   34|     21|  return std::binary_search(
   35|     21|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   36|     21|}
CharacterProperties.cpp:_ZN6hermesltERKNS_21UnicodeTransformRangeEj:
  114|  3.26k|static bool operator<(const UnicodeTransformRange &m, uint32_t cp) {
  115|  3.26k|  return m.start + m.count <= cp;
  116|  3.26k|}

_ZN6hermes5regex18searchWithBytecodeEN4llvh8ArrayRefIhEEPKDsjjPNSt3__16vectorINS0_13CapturedRangeENS6_9allocatorIS8_EEEENS0_9constants13MatchFlagTypeENS_18StackOverflowGuardE:
 1601|     86|    StackOverflowGuard guard) {
 1602|     86|  return searchWithBytecodeImpl<char16_t, UTF16RegexTraits>(
 1603|     86|      bytecode, first, start, length, m, matchFlags, guard);
 1604|     86|}
_ZN6hermes5regex22searchWithBytecodeImplIDsNS0_16UTF16RegexTraitsEEENS0_18MatchRuntimeResultEN4llvh8ArrayRefIhEEPKT_jjPNSt3__16vectorINS0_13CapturedRangeENSA_9allocatorISC_EEEENS0_9constants13MatchFlagTypeENS_18StackOverflowGuardE:
 1542|     86|    StackOverflowGuard guard) {
 1543|     86|  assert(
 1544|     86|      bytecode.size() >= sizeof(RegexBytecodeHeader) && "Bytecode too small");
 1545|     86|  auto header = reinterpret_cast<const RegexBytecodeHeader *>(bytecode.data());
 1546|       |
 1547|       |  // Check for match impossibility before doing anything else.
 1548|     86|  Cursor<Traits> cursor{
 1549|     86|      first, first + start, first + length, true /* forwards */};
 1550|     86|  if (!cursor.satisfiesConstraints(matchFlags, header->constraints))
  ------------------
  |  Branch (1550:7): [True: 0, False: 86]
  ------------------
 1551|      0|    return MatchRuntimeResult::NoMatch;
 1552|       |
 1553|     86|  auto markedCount = header->markedCount;
 1554|     86|  auto loopCount = header->loopCount;
 1555|       |
 1556|     86|  Context<Traits> ctx(
 1557|     86|      bytecode,
 1558|     86|      matchFlags,
 1559|     86|      SyntaxFlags::fromByte(header->syntaxFlags),
 1560|     86|      first,
 1561|     86|      first + length,
 1562|     86|      header->markedCount,
 1563|     86|      header->loopCount,
 1564|     86|      guard);
 1565|     86|  State<Traits> state{cursor, markedCount, loopCount};
 1566|       |
 1567|       |  // We check only one location if either the regex pattern constrains us to, or
 1568|       |  // the flags request it (via the sticky flag 'y').
 1569|     86|  bool onlyAtStart = (header->constraints & MatchConstraintAnchoredAtStart) ||
  ------------------
  |  Branch (1569:22): [True: 86, False: 0]
  ------------------
 1570|     86|      (matchFlags & constants::matchOnlyAtStart);
  ------------------
  |  Branch (1570:7): [True: 0, False: 0]
  ------------------
 1571|       |
 1572|     86|  auto res = ctx.match(&state, onlyAtStart);
 1573|     86|  if (!res) {
  ------------------
  |  Branch (1573:7): [True: 0, False: 86]
  ------------------
 1574|      0|    assert(res.getStatus() == ExecutionStatus::STACK_OVERFLOW);
 1575|      0|    return MatchRuntimeResult::StackOverflow;
 1576|      0|  }
 1577|     86|  if (const CharT *matchStartLoc = res.getValue()) {
  ------------------
  |  Branch (1577:20): [True: 0, False: 86]
  ------------------
 1578|       |    // Match succeeded. Return captured ranges. The first range is the total
 1579|       |    // match, followed by any capture groups.
 1580|      0|    if (m != nullptr) {
  ------------------
  |  Branch (1580:9): [True: 0, False: 0]
  ------------------
 1581|      0|      uint32_t totalStart = static_cast<uint32_t>(matchStartLoc - first);
 1582|      0|      uint32_t totalEnd =
 1583|      0|          static_cast<uint32_t>(state.cursor_.currentPointer() - first);
 1584|      0|      m->clear();
 1585|      0|      m->push_back(CapturedRange{totalStart, totalEnd});
 1586|      0|      std::copy_n(
 1587|      0|          state.capturedRanges_.begin(), markedCount, std::back_inserter(*m));
 1588|      0|    }
 1589|      0|    return MatchRuntimeResult::Match;
 1590|      0|  }
 1591|     86|  return MatchRuntimeResult::NoMatch;
 1592|     86|}
_ZN6hermes5regex6CursorINS0_16UTF16RegexTraitsEEC2EPKDsS5_S5_b:
  116|     86|      : first_(first),
  117|     86|        last_(last),
  118|     86|        current_(current),
  119|     86|        end_(forwards ? last : first),
  ------------------
  |  Branch (119:14): [True: 86, False: 0]
  ------------------
  120|     86|        forwards_(forwards) {
  121|     86|    assert(first_ <= last_ && "first and last out of order");
  122|     86|    assert(
  123|     86|        first_ <= current_ && current <= last_ &&
  124|     86|        "current pointer not in range");
  125|     86|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE20satisfiesConstraintsENS0_9constants13MatchFlagTypeEh:
  222|     86|      MatchConstraintSet constraints) const {
  223|     86|    if ((constraints & MatchConstraintNonASCII) &&
  ------------------
  |  Branch (223:9): [True: 0, False: 86]
  ------------------
  224|     86|        (flags & constants::matchInputAllAscii))
  ------------------
  |  Branch (224:9): [True: 0, False: 0]
  ------------------
  225|      0|      return false;
  226|     86|    if ((constraints & MatchConstraintAnchoredAtStart) && current_ != first_)
  ------------------
  |  Branch (226:9): [True: 86, False: 0]
  |  Branch (226:59): [True: 0, False: 86]
  ------------------
  227|      0|      return false;
  228|     86|    return true;
  229|     86|  }
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEEC2EN4llvh8ArrayRefIhEENS0_9constants13MatchFlagTypeENS0_11SyntaxFlagsEPKDsSB_jjNS_18StackOverflowGuardE:
  418|     86|      : bytecodeStream_(bytecodeStream),
  419|     86|        flags_(flags),
  420|     86|        syntaxFlags_(syntaxFlags),
  421|     86|        first_(first),
  422|     86|        last_(last),
  423|     86|        markedCount_(markedCount),
  424|     86|        loopCount_(loopCount),
  425|     86|        overflowGuard_(guard) {}
_ZN6hermes5regex5StateINS0_16UTF16RegexTraitsEEC2ENS0_6CursorIS2_EEjj:
  561|     86|      : cursor_(cursor),
  562|     86|        capturedRanges_(markedCount, {kNotMatched, kNotMatched}),
  563|     86|        loopDatas_(loopCount, {0, 0}) {}
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE5matchEPNS0_5StateIS2_EEb:
  971|     86|    -> ExecutorResult<const CodeUnit *> {
  972|     86|  using State = State<Traits>;
  973|     86|  BacktrackStack backtrackStack;
  974|       |
  975|       |  // We'll refer to the cursor often.
  976|     86|  Cursor<Traits> &c = s->cursor_;
  977|       |
  978|       |  // Pull out the instruction portion of the bytecode, following the header.
  979|     86|  const uint8_t *const bytecode = &bytecodeStream_[sizeof(RegexBytecodeHeader)];
  980|       |
  981|       |  // Save the incoming IP in case we have to loop.
  982|     86|  const auto startIp = s->ip_;
  983|       |
  984|     86|  const CodeUnit *const startLoc = c.currentPointer();
  985|       |
  986|       |  // Use offsetFromRight() instead of remaining() here so that the length passed
  987|       |  // to advanceStringIndex is accurate even when the cursor is going backwards.
  988|     86|  const size_t charsToRight = c.offsetFromRight();
  989|       |
  990|       |  // Decide how many locations we'll need to check.
  991|       |  // Note that we do want to check the empty range at the end, so add one to
  992|       |  // charsToRight.
  993|     86|  const size_t locsToCheckCount = onlyAtStart ? 1 : 1 + charsToRight;
  ------------------
  |  Branch (993:35): [True: 86, False: 0]
  ------------------
  994|       |
  995|       |  // If we are tracking backwards, we should only ever have one potential match
  996|       |  // location. This is because advanceStringIndex only ever tracks forwards.
  997|     86|  assert(
  998|     86|      (c.forwards() || locsToCheckCount == 1) &&
  999|     86|      "Can only check one location when cursor is backwards");
 1000|       |
 1001|       |#ifndef HERMES_CHECK_NATIVE_STACK
 1002|       |  ++overflowGuard_.callDepth;
 1003|       |  auto decrement =
 1004|       |      llvh::make_scope_exit([this] { --overflowGuard_.callDepth; });
 1005|       |#endif
 1006|       |
 1007|       |  // Make sure we are not exceeding the set limit of the amount of times we can
 1008|       |  // recurse.
 1009|     86|  if (overflowGuard_.isOverflowing()) {
  ------------------
  |  Branch (1009:7): [True: 0, False: 86]
  ------------------
 1010|      0|    return ExecutionStatus::STACK_OVERFLOW;
 1011|      0|  }
 1012|       |
 1013|       |  // Macro used when a state fails to match.
 1014|     86|#define BACKTRACK()                            \
 1015|     86|  do {                                         \
 1016|     86|    auto btRes = backtrack(backtrackStack, s); \
 1017|     86|    if (LLVM_UNLIKELY(!btRes))                 \
 1018|     86|      return btRes.getStatus();                \
 1019|     86|    if (*btRes)                                \
 1020|     86|      goto backtrackingSucceeded;              \
 1021|     86|    goto backtrackingExhausted;                \
 1022|     86|  } while (0)
 1023|       |
 1024|    172|  for (size_t locIndex = 0; locIndex < locsToCheckCount;
  ------------------
  |  Branch (1024:29): [True: 86, False: 86]
  ------------------
 1025|     86|       locIndex = advanceStringIndex(startLoc, locIndex, charsToRight)) {
 1026|     86|    const CodeUnit *potentialMatchLocation = startLoc + locIndex;
 1027|     86|    c.setCurrentPointer(potentialMatchLocation);
 1028|     86|    s->ip_ = startIp;
 1029|    122|  backtrackingSucceeded:
 1030|    294|    for (;;) {
 1031|    294|      const Insn *base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1032|    294|      switch (base->opcode) {
  ------------------
  |  Branch (1032:15): [True: 0, False: 294]
  ------------------
 1033|      0|        case Opcode::Goal:
  ------------------
  |  Branch (1033:9): [True: 0, False: 294]
  ------------------
 1034|      0|          return potentialMatchLocation;
 1035|       |
 1036|     86|        case Opcode::LeftAnchor:
  ------------------
  |  Branch (1036:9): [True: 86, False: 208]
  ------------------
 1037|     86|          if (!matchesLeftAnchor(*this, *s))
  ------------------
  |  Branch (1037:15): [True: 0, False: 86]
  ------------------
 1038|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1039|     86|          s->ip_ += sizeof(LeftAnchorInsn);
 1040|     86|          break;
 1041|       |
 1042|      0|        case Opcode::RightAnchor:
  ------------------
  |  Branch (1042:9): [True: 0, False: 294]
  ------------------
 1043|      0|          if (!matchesRightAnchor(*this, *s))
  ------------------
  |  Branch (1043:15): [True: 0, False: 0]
  ------------------
 1044|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1045|      0|          s->ip_ += sizeof(RightAnchorInsn);
 1046|      0|          break;
 1047|       |
 1048|      0|        case Opcode::MatchAny:
  ------------------
  |  Branch (1048:9): [True: 0, False: 294]
  ------------------
 1049|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1049:15): [True: 0, False: 0]
  ------------------
 1050|      0|              !matchWidth1<Width1Opcode::MatchAny>(base, c.consume()))
  ------------------
  |  Branch (1050:15): [True: 0, False: 0]
  ------------------
 1051|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1052|      0|          s->ip_ += sizeof(MatchAnyInsn);
 1053|      0|          break;
 1054|       |
 1055|      0|        case Opcode::U16MatchAny:
  ------------------
  |  Branch (1055:9): [True: 0, False: 294]
  ------------------
 1056|      0|          if (c.atEnd())
  ------------------
  |  Branch (1056:15): [True: 0, False: 0]
  ------------------
 1057|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1058|      0|          c.consumeUTF16();
 1059|      0|          s->ip_ += sizeof(U16MatchAnyInsn);
 1060|      0|          break;
 1061|       |
 1062|      0|        case Opcode::MatchAnyButNewline:
  ------------------
  |  Branch (1062:9): [True: 0, False: 294]
  ------------------
 1063|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1063:15): [True: 0, False: 0]
  ------------------
 1064|      0|              !matchWidth1<Width1Opcode::MatchAnyButNewline>(base, c.consume()))
  ------------------
  |  Branch (1064:15): [True: 0, False: 0]
  ------------------
 1065|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1066|      0|          s->ip_ += sizeof(MatchAnyButNewlineInsn);
 1067|      0|          break;
 1068|       |
 1069|      0|        case Opcode::U16MatchAnyButNewline:
  ------------------
  |  Branch (1069:9): [True: 0, False: 294]
  ------------------
 1070|      0|          if (c.atEnd() || isLineTerminator(c.consumeUTF16()))
  ------------------
  |  Branch (1070:15): [True: 0, False: 0]
  |  Branch (1070:28): [True: 0, False: 0]
  ------------------
 1071|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1072|      0|          s->ip_ += sizeof(U16MatchAnyButNewlineInsn);
 1073|      0|          break;
 1074|       |
 1075|      0|        case Opcode::MatchChar8: {
  ------------------
  |  Branch (1075:9): [True: 0, False: 294]
  ------------------
 1076|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1076:15): [True: 0, False: 0]
  ------------------
 1077|      0|              !matchWidth1<Width1Opcode::MatchChar8>(base, c.consume()))
  ------------------
  |  Branch (1077:15): [True: 0, False: 0]
  ------------------
 1078|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1079|      0|          s->ip_ += sizeof(MatchChar8Insn);
 1080|      0|          break;
 1081|      0|        }
 1082|       |
 1083|      0|        case Opcode::MatchChar16: {
  ------------------
  |  Branch (1083:9): [True: 0, False: 294]
  ------------------
 1084|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1084:15): [True: 0, False: 0]
  ------------------
 1085|      0|              !matchWidth1<Width1Opcode::MatchChar16>(base, c.consume()))
  ------------------
  |  Branch (1085:15): [True: 0, False: 0]
  ------------------
 1086|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1087|      0|          s->ip_ += sizeof(MatchChar16Insn);
 1088|      0|          break;
 1089|      0|        }
 1090|       |
 1091|      0|        case Opcode::U16MatchChar32: {
  ------------------
  |  Branch (1091:9): [True: 0, False: 294]
  ------------------
 1092|      0|          const auto *insn = llvh::cast<U16MatchChar32Insn>(base);
 1093|      0|          if (c.atEnd() || c.consumeUTF16() != (CodePoint)insn->c)
  ------------------
  |  Branch (1093:15): [True: 0, False: 0]
  |  Branch (1093:28): [True: 0, False: 0]
  ------------------
 1094|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1095|      0|          s->ip_ += sizeof(U16MatchChar32Insn);
 1096|      0|          break;
 1097|      0|        }
 1098|       |
 1099|      0|        case Opcode::MatchCharICase8: {
  ------------------
  |  Branch (1099:9): [True: 0, False: 294]
  ------------------
 1100|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1100:15): [True: 0, False: 0]
  ------------------
 1101|      0|              !matchWidth1<Width1Opcode::MatchCharICase8>(base, c.consume()))
  ------------------
  |  Branch (1101:15): [True: 0, False: 0]
  ------------------
 1102|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1103|      0|          s->ip_ += sizeof(MatchCharICase8Insn);
 1104|      0|          break;
 1105|      0|        }
 1106|       |
 1107|      0|        case Opcode::MatchCharICase16: {
  ------------------
  |  Branch (1107:9): [True: 0, False: 294]
  ------------------
 1108|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1108:15): [True: 0, False: 0]
  ------------------
 1109|      0|              !matchWidth1<Width1Opcode::MatchCharICase16>(base, c.consume()))
  ------------------
  |  Branch (1109:15): [True: 0, False: 0]
  ------------------
 1110|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1111|      0|          s->ip_ += sizeof(MatchCharICase16Insn);
 1112|      0|          break;
 1113|      0|        }
 1114|       |
 1115|      0|        case Opcode::U16MatchCharICase32: {
  ------------------
  |  Branch (1115:9): [True: 0, False: 294]
  ------------------
 1116|      0|          const auto *insn = llvh::cast<U16MatchCharICase32Insn>(base);
 1117|      0|          bool matched = false;
 1118|      0|          if (!c.atEnd()) {
  ------------------
  |  Branch (1118:15): [True: 0, False: 0]
  ------------------
 1119|      0|            CodePoint cp = c.consumeUTF16();
 1120|      0|            matched =
 1121|      0|                (cp == (CodePoint)insn->c ||
  ------------------
  |  Branch (1121:18): [True: 0, False: 0]
  ------------------
 1122|      0|                 traits_.canonicalize(cp, true) == (CodePoint)insn->c);
  ------------------
  |  Branch (1122:18): [True: 0, False: 0]
  ------------------
 1123|      0|          }
 1124|      0|          if (!matched)
  ------------------
  |  Branch (1124:15): [True: 0, False: 0]
  ------------------
 1125|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1126|      0|          s->ip_ += sizeof(U16MatchCharICase32Insn);
 1127|      0|          break;
 1128|      0|        }
 1129|       |
 1130|    122|        case Opcode::MatchNChar8: {
  ------------------
  |  Branch (1130:9): [True: 122, False: 172]
  ------------------
 1131|    122|          const auto *insn = llvh::cast<MatchNChar8Insn>(base);
 1132|    122|          if (c.remaining() < insn->charCount || !matchesNChar8(insn, *s))
  ------------------
  |  Branch (1132:15): [True: 1, False: 121]
  |  Branch (1132:50): [True: 121, False: 0]
  ------------------
 1133|    122|            BACKTRACK();
  ------------------
  |  | 1015|    122|  do {                                         \
  |  | 1016|    122|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|    122|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|    122|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 122]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|    122|      return btRes.getStatus();                \
  |  | 1019|    122|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 36, False: 86]
  |  |  ------------------
  |  | 1020|    122|      goto backtrackingSucceeded;              \
  |  | 1021|    122|    goto backtrackingExhausted;                \
  |  | 1022|    122|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1134|      0|          s->ip_ += insn->totalWidth();
 1135|      0|          break;
 1136|    122|        }
 1137|       |
 1138|      0|        case Opcode::MatchNCharICase8: {
  ------------------
  |  Branch (1138:9): [True: 0, False: 294]
  ------------------
 1139|      0|          const auto *insn = llvh::cast<MatchNCharICase8Insn>(base);
 1140|      0|          if (c.remaining() < insn->charCount || !matchesNCharICase8(insn, *s))
  ------------------
  |  Branch (1140:15): [True: 0, False: 0]
  |  Branch (1140:50): [True: 0, False: 0]
  ------------------
 1141|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1142|      0|          s->ip_ += insn->totalWidth();
 1143|      0|          break;
 1144|      0|        }
 1145|       |
 1146|      0|        case Opcode::Alternation: {
  ------------------
  |  Branch (1146:9): [True: 0, False: 294]
  ------------------
 1147|       |          // We have an alternation. Determine which of our first and second
 1148|       |          // branches are viable. If both are, we have to split our state.
 1149|      0|          const AlternationInsn *alt = llvh::cast<AlternationInsn>(base);
 1150|      0|          bool primaryViable =
 1151|      0|              c.satisfiesConstraints(flags_, alt->primaryConstraints);
 1152|      0|          bool secondaryViable =
 1153|      0|              c.satisfiesConstraints(flags_, alt->secondaryConstraints);
 1154|      0|          if (primaryViable && secondaryViable) {
  ------------------
  |  Branch (1154:15): [True: 0, False: 0]
  |  Branch (1154:32): [True: 0, False: 0]
  ------------------
 1155|       |            // We need to explore both branches. Explore the primary branch
 1156|       |            // first, backtrack to the secondary one.
 1157|      0|            s->ip_ += sizeof(AlternationInsn);
 1158|      0|            auto res = pushBacktrack(
 1159|      0|                backtrackStack,
 1160|      0|                BacktrackInsn::makeSetPosition(
 1161|      0|                    alt->secondaryBranch, c.currentPointer()));
 1162|      0|            if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1162:17): [True: 0, False: 0]
  ------------------
 1163|      0|              return res;
 1164|      0|            }
 1165|      0|          } else if (primaryViable) {
  ------------------
  |  Branch (1165:22): [True: 0, False: 0]
  ------------------
 1166|      0|            s->ip_ += sizeof(AlternationInsn);
 1167|      0|          } else if (secondaryViable) {
  ------------------
  |  Branch (1167:22): [True: 0, False: 0]
  ------------------
 1168|      0|            s->ip_ = alt->secondaryBranch;
 1169|      0|          } else {
 1170|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1171|      0|          }
 1172|      0|          break;
 1173|      0|        }
 1174|       |
 1175|      0|        case Opcode::Jump32:
  ------------------
  |  Branch (1175:9): [True: 0, False: 294]
  ------------------
 1176|      0|          s->ip_ = llvh::cast<Jump32Insn>(base)->target;
 1177|      0|          break;
 1178|       |
 1179|      0|        case Opcode::Bracket: {
  ------------------
  |  Branch (1179:9): [True: 0, False: 294]
  ------------------
 1180|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1180:15): [True: 0, False: 0]
  ------------------
 1181|      0|              !matchWidth1<Width1Opcode::Bracket>(base, c.consume()))
  ------------------
  |  Branch (1181:15): [True: 0, False: 0]
  ------------------
 1182|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1183|      0|          s->ip_ += llvh::cast<BracketInsn>(base)->totalWidth();
 1184|      0|          break;
 1185|      0|        }
 1186|       |
 1187|      0|        case Opcode::U16Bracket: {
  ------------------
  |  Branch (1187:9): [True: 0, False: 294]
  ------------------
 1188|      0|          const U16BracketInsn *insn = llvh::cast<U16BracketInsn>(base);
 1189|       |          // U16BracketInsn is followed by a list of BracketRange32s.
 1190|      0|          const BracketRange32 *ranges =
 1191|      0|              reinterpret_cast<const BracketRange32 *>(insn + 1);
 1192|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1192:15): [True: 0, False: 0]
  ------------------
 1193|      0|              !bracketMatchesChar<Traits>(
  ------------------
  |  Branch (1193:15): [True: 0, False: 0]
  ------------------
 1194|      0|                  *this, insn, ranges, c.consumeUTF16()))
 1195|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1196|      0|          s->ip_ += insn->totalWidth();
 1197|      0|          break;
 1198|      0|        }
 1199|       |
 1200|      0|        case Opcode::WordBoundary: {
  ------------------
  |  Branch (1200:9): [True: 0, False: 294]
  ------------------
 1201|      0|          const WordBoundaryInsn *insn = llvh::cast<WordBoundaryInsn>(base);
 1202|      0|          const auto *charPointer = c.currentPointer();
 1203|       |
 1204|      0|          bool prevIsWordchar = false;
 1205|      0|          if (!c.atLeft())
  ------------------
  |  Branch (1205:15): [True: 0, False: 0]
  ------------------
 1206|      0|            prevIsWordchar = traits_.characterHasType(
 1207|      0|                charPointer[-1], CharacterClass::Words);
 1208|       |
 1209|      0|          bool currentIsWordchar = false;
 1210|      0|          if (!c.atRight())
  ------------------
  |  Branch (1210:15): [True: 0, False: 0]
  ------------------
 1211|      0|            currentIsWordchar =
 1212|      0|                traits_.characterHasType(charPointer[0], CharacterClass::Words);
 1213|       |
 1214|      0|          bool isWordBoundary = (prevIsWordchar != currentIsWordchar);
 1215|      0|          if (isWordBoundary ^ insn->invert)
  ------------------
  |  Branch (1215:15): [True: 0, False: 0]
  ------------------
 1216|      0|            s->ip_ += sizeof(WordBoundaryInsn);
 1217|      0|          else
 1218|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1219|      0|          break;
 1220|      0|        }
 1221|       |
 1222|      0|        case Opcode::BeginMarkedSubexpression: {
  ------------------
  |  Branch (1222:9): [True: 0, False: 294]
  ------------------
 1223|      0|          const auto *insn = llvh::cast<BeginMarkedSubexpressionInsn>(base);
 1224|      0|          auto res = pushBacktrack(
 1225|      0|              backtrackStack,
 1226|      0|              BacktrackInsn::makeSetCaptureGroup(
 1227|      0|                  insn->mexp, {kNotMatched, kNotMatched}));
 1228|      0|          if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1228:15): [True: 0, False: 0]
  ------------------
 1229|      0|            return res;
 1230|      0|          }
 1231|       |          // When tracking backwards (in a lookbehind assertion) we traverse our
 1232|       |          // input backwards, so set the end before the start.
 1233|      0|          auto &range = s->getCapturedRange(insn->mexp);
 1234|      0|          if (c.forwards()) {
  ------------------
  |  Branch (1234:15): [True: 0, False: 0]
  ------------------
 1235|      0|            range.start = c.offsetFromLeft();
 1236|      0|          } else {
 1237|      0|            range.end = c.offsetFromLeft();
 1238|      0|          }
 1239|      0|          s->ip_ += sizeof(BeginMarkedSubexpressionInsn);
 1240|      0|          break;
 1241|      0|        }
 1242|       |
 1243|      0|        case Opcode::EndMarkedSubexpression: {
  ------------------
  |  Branch (1243:9): [True: 0, False: 294]
  ------------------
 1244|      0|          const auto *insn = llvh::cast<EndMarkedSubexpressionInsn>(base);
 1245|      0|          auto &range = s->getCapturedRange(insn->mexp);
 1246|      0|          if (c.forwards()) {
  ------------------
  |  Branch (1246:15): [True: 0, False: 0]
  ------------------
 1247|      0|            assert(
 1248|      0|                range.start != kNotMatched && "Capture group was not entered");
 1249|      0|            range.end = c.offsetFromLeft();
 1250|      0|          } else {
 1251|      0|            assert(range.end != kNotMatched && "Capture group was not entered");
 1252|      0|            range.start = c.offsetFromLeft();
 1253|      0|          }
 1254|      0|          assert(range.start <= range.end && "Captured range end before start");
 1255|      0|          s->ip_ += sizeof(EndMarkedSubexpressionInsn);
 1256|      0|          break;
 1257|      0|        }
 1258|       |
 1259|       |        // ES10 21.2.2.9.1
 1260|      0|        case Opcode::BackRef: {
  ------------------
  |  Branch (1260:9): [True: 0, False: 294]
  ------------------
 1261|      0|          const auto insn = llvh::cast<BackRefInsn>(base);
 1262|       |          // a. Let cap be x's captures List.
 1263|       |          // b. Let s be cap[n].
 1264|      0|          CapturedRange cr = s->getCapturedRange(insn->mexp);
 1265|       |
 1266|       |          // c. If s is undefined, return c(x).
 1267|       |          // Note we have to check both cr.start and cr.end here. If we are
 1268|       |          // currently in the middle of matching a capture group (going either
 1269|       |          // forwards or backwards) we should just return success.
 1270|      0|          if (cr.start == kNotMatched || cr.end == kNotMatched) {
  ------------------
  |  Branch (1270:15): [True: 0, False: 0]
  |  Branch (1270:42): [True: 0, False: 0]
  ------------------
 1271|       |            // Backreferences to a capture group that did not match always
 1272|       |            // succeed (ES10 21.2.2.9)
 1273|      0|            s->ip_ += sizeof(BackRefInsn);
 1274|      0|            break;
 1275|      0|          }
 1276|       |
 1277|       |          // TODO: this can be optimized by hoisting the branches out of the
 1278|       |          // loop.
 1279|      0|          bool icase = syntaxFlags_.ignoreCase;
 1280|      0|          bool unicode = syntaxFlags_.unicode;
 1281|      0|          auto capturedStart = first_ + cr.start;
 1282|      0|          auto capturedEnd = first_ + cr.end;
 1283|      0|          Cursor<Traits> cursor2(
 1284|      0|              capturedStart,
 1285|      0|              c.forwards() ? capturedStart : capturedEnd,
  ------------------
  |  Branch (1285:15): [True: 0, False: 0]
  ------------------
 1286|      0|              capturedEnd,
 1287|      0|              c.forwards());
 1288|      0|          Cursor<Traits> cursor1 = c;
 1289|      0|          bool matched = true;
 1290|      0|          while (matched && !cursor2.atEnd()) {
  ------------------
  |  Branch (1290:18): [True: 0, False: 0]
  |  Branch (1290:29): [True: 0, False: 0]
  ------------------
 1291|      0|            if (cursor1.atEnd()) {
  ------------------
  |  Branch (1291:17): [True: 0, False: 0]
  ------------------
 1292|      0|              matched = false;
 1293|      0|            } else if (!icase) {
  ------------------
  |  Branch (1293:24): [True: 0, False: 0]
  ------------------
 1294|       |              // Direct comparison. Here we don't need to decode surrogate
 1295|       |              // pairs.
 1296|      0|              matched = (cursor1.consume() == cursor2.consume());
 1297|      0|            } else if (!unicode) {
  ------------------
  |  Branch (1297:24): [True: 0, False: 0]
  ------------------
 1298|       |              // Case-insensitive non-Unicode comparison, no decoding of
 1299|       |              // surrogate pairs.
 1300|      0|              auto c1 = cursor1.consume();
 1301|      0|              auto c2 = cursor2.consume();
 1302|      0|              matched =
 1303|      0|                  (c1 == c2 ||
  ------------------
  |  Branch (1303:20): [True: 0, False: 0]
  ------------------
 1304|      0|                   traits_.canonicalize(c1, unicode) ==
  ------------------
  |  Branch (1304:20): [True: 0, False: 0]
  ------------------
 1305|      0|                       traits_.canonicalize(c2, unicode));
 1306|      0|            } else {
 1307|       |              // Unicode: we do need to decode surrogate pairs.
 1308|      0|              auto cp1 = cursor1.consumeUTF16();
 1309|      0|              auto cp2 = cursor2.consumeUTF16();
 1310|      0|              matched =
 1311|      0|                  (cp1 == cp2 ||
  ------------------
  |  Branch (1311:20): [True: 0, False: 0]
  ------------------
 1312|      0|                   traits_.canonicalize(cp1, unicode) ==
  ------------------
  |  Branch (1312:20): [True: 0, False: 0]
  ------------------
 1313|      0|                       traits_.canonicalize(cp2, unicode));
 1314|      0|            }
 1315|      0|          }
 1316|      0|          if (!matched) {
  ------------------
  |  Branch (1316:15): [True: 0, False: 0]
  ------------------
 1317|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1318|      0|          }
 1319|      0|          s->ip_ += sizeof(BackRefInsn);
 1320|      0|          c.setCurrentPointer(cursor1.currentPointer());
 1321|      0|          break;
 1322|      0|        }
 1323|       |
 1324|      0|        case Opcode::Lookaround: {
  ------------------
  |  Branch (1324:9): [True: 0, False: 294]
  ------------------
 1325|      0|          const LookaroundInsn *insn = llvh::cast<LookaroundInsn>(base);
 1326|      0|          bool matched = false;
 1327|      0|          if (c.satisfiesConstraints(flags_, insn->constraints)) {
  ------------------
  |  Branch (1327:15): [True: 0, False: 0]
  ------------------
 1328|       |            // Copy the state. This is because if the match fails (or if we are
 1329|       |            // inverted) we need to restore its capture groups.
 1330|      0|            State savedState{*s};
 1331|       |
 1332|       |            // Set the direction of the cursor.
 1333|      0|            c.setForwards(insn->forwards);
 1334|       |
 1335|       |            // Invoke match() recursively with our expression.
 1336|       |            // Save and restore the position because lookaheads do not consume
 1337|       |            // anything.
 1338|      0|            s->ip_ += sizeof(LookaroundInsn);
 1339|      0|            auto match = this->match(s, true /* onlyAtStart */);
 1340|       |            // If the match errored out due to stack overflow, then we need to
 1341|       |            // return an error here as well.
 1342|      0|            if (LLVM_UNLIKELY(!match)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1343|      0|              return match.getStatus();
 1344|      0|            }
 1345|       |            // We got a match if the value is non-null.
 1346|      0|            matched = match.getValue() != nullptr;
 1347|      0|            c.setCurrentPointer(savedState.cursor_.currentPointer());
 1348|      0|            c.setForwards(savedState.cursor_.forwards());
 1349|       |
 1350|       |            // Restore capture groups unless we are a positive lookaround that
 1351|       |            // successfully matched. If we are a successfully matching positive
 1352|       |            // lookaround, set up backtracking to reset the capture groups. Note
 1353|       |            // we never backtrack INTO a successfully matched lookahead:
 1354|       |            // once a lookahead finds a match it forgets all other ways it could
 1355|       |            // have matched. (ES 5.1 15.10.2.8 Note 2).
 1356|      0|            if (matched && !insn->invert) {
  ------------------
  |  Branch (1356:17): [True: 0, False: 0]
  |  Branch (1356:28): [True: 0, False: 0]
  ------------------
 1357|       |              // Backtrack capture groups in the lookahead expression.
 1358|      0|              for (uint32_t i = insn->mexpBegin, e = insn->mexpEnd; i < e;
  ------------------
  |  Branch (1358:69): [True: 0, False: 0]
  ------------------
 1359|      0|                   i++) {
 1360|      0|                CapturedRange cr = savedState.getCapturedRange(i);
 1361|      0|                auto res = pushBacktrack(
 1362|      0|                    backtrackStack, BacktrackInsn::makeSetCaptureGroup(i, cr));
 1363|      0|                if (res != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1363:21): [True: 0, False: 0]
  ------------------
 1364|      0|                  return res;
 1365|      0|              }
 1366|      0|            } else {
 1367|       |              // Restore the saved state.
 1368|      0|              *s = std::move(savedState);
 1369|      0|            }
 1370|      0|          }
 1371|       |
 1372|       |          // 'matched' tells us whether the enclosed assertion expression
 1373|       |          // matched the input. This instruction matched the input if it is a
 1374|       |          // positive assertion (invert == false) and the expression matched,
 1375|       |          // or a negative assertion (invert == true) and the expression did
 1376|       |          // not match. Hence xor with invert.
 1377|      0|          if (matched ^ insn->invert)
  ------------------
  |  Branch (1377:15): [True: 0, False: 0]
  ------------------
 1378|      0|            s->ip_ = insn->continuation;
 1379|      0|          else
 1380|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1381|      0|          break;
 1382|      0|        }
 1383|       |
 1384|      0|        case Opcode::BeginLoop: {
  ------------------
  |  Branch (1384:9): [True: 0, False: 294]
  ------------------
 1385|       |          // Here we are entering a loop from outside, not jumping back into
 1386|       |          // it.
 1387|      0|          const BeginLoopInsn *loop = llvh::cast<BeginLoopInsn>(base);
 1388|      0|          s->getLoop(loop->loopId).iterations = 0;
 1389|       |          // Check to see if the loop body is viable. If not, and the loop has
 1390|       |          // a nonzero minimum iteration, then we know we won't match and we
 1391|       |          // can reject the state. If it does have a minimum iteration, we can
 1392|       |          // just skip to the not-taken target. Note that this is a static
 1393|       |          // property of the loop so we don't need to check it on every
 1394|       |          // iteration, only the first one.
 1395|      0|          if (!c.satisfiesConstraints(flags_, loop->loopeeConstraints)) {
  ------------------
  |  Branch (1395:15): [True: 0, False: 0]
  ------------------
 1396|      0|            if (loop->min > 0) {
  ------------------
  |  Branch (1396:17): [True: 0, False: 0]
  ------------------
 1397|      0|              BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1398|      0|            } else {
 1399|      0|              s->ip_ = loop->notTakenTarget;
 1400|      0|              break;
 1401|      0|            }
 1402|      0|          }
 1403|      0|          goto runLoop;
 1404|      0|        }
 1405|       |
 1406|      0|        case Opcode::EndLoop:
  ------------------
  |  Branch (1406:9): [True: 0, False: 294]
  ------------------
 1407|       |          // This is reached after the body of a loop finishes executing.
 1408|       |          // Move the IP to the loop and run it again immediately.
 1409|      0|          s->ip_ = llvh::cast<EndLoopInsn>(base)->target;
 1410|      0|          base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1411|       |          // Note fall through.
 1412|       |
 1413|      0|        runLoop: {
 1414|      0|          const BeginLoopInsn *loop = llvh::cast<BeginLoopInsn>(base);
 1415|      0|          auto &loopData = s->getLoop(loop->loopId);
 1416|      0|          uint32_t iteration = loopData.iterations;
 1417|       |
 1418|      0|          const uint32_t loopTakenIp = s->ip_ + sizeof(BeginLoopInsn);
 1419|       |
 1420|      0|          assert(loop->min <= loop->max && "Inconsistent loop bounds");
 1421|       |
 1422|       |          // Check to see if we have looped more than the minimum number of
 1423|       |          // iterations, and if so, whether the subexpression we looped over
 1424|       |          // matched an empty string. ES6 21.2.2.5.1 Note 4: "once the
 1425|       |          // minimum number of repetitions has been satisfied, any more
 1426|       |          // expansions of Atom that match the empty character sequence are
 1427|       |          // not considered for further repetitions."
 1428|      0|          if (iteration > loop->min &&
  ------------------
  |  Branch (1428:15): [True: 0, False: 0]
  ------------------
 1429|      0|              loopData.entryPosition == c.offsetFromLeft())
  ------------------
  |  Branch (1429:15): [True: 0, False: 0]
  ------------------
 1430|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1431|       |
 1432|      0|          if (iteration < loop->min) {
  ------------------
  |  Branch (1432:15): [True: 0, False: 0]
  ------------------
 1433|      0|            auto res = prepareToEnterLoopBody(s, loop, backtrackStack);
 1434|      0|            if (res != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1434:17): [True: 0, False: 0]
  ------------------
 1435|      0|              return res;
 1436|      0|            s->ip_ = loopTakenIp;
 1437|      0|          } else if (iteration == loop->max) {
  ------------------
  |  Branch (1437:22): [True: 0, False: 0]
  ------------------
 1438|      0|            s->ip_ = loop->notTakenTarget;
 1439|      0|          } else {
 1440|       |            // We are within the target iteration range, figure out whether we
 1441|       |            // should continue or exit.
 1442|      0|            assert(iteration >= loop->min && iteration < loop->max);
 1443|      0|            if (!loop->greedy) {
  ------------------
  |  Branch (1443:17): [True: 0, False: 0]
  ------------------
 1444|       |              // Backtrack by entering this non-greedy loop.
 1445|      0|              loopData.entryPosition = c.offsetFromLeft();
 1446|      0|              auto res = pushBacktrack(
 1447|      0|                  backtrackStack,
 1448|      0|                  BacktrackInsn::makeEnterNonGreedyLoop(
 1449|      0|                      loop, loopTakenIp, loopData));
 1450|      0|              if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1450:19): [True: 0, False: 0]
  ------------------
 1451|      0|                return res;
 1452|      0|              }
 1453|      0|              s->ip_ = loop->notTakenTarget;
 1454|      0|            } else {
 1455|       |              // Backtrack by exiting this greedy loop.
 1456|      0|              auto pushRes = pushBacktrack(
 1457|      0|                  backtrackStack,
 1458|      0|                  BacktrackInsn::makeSetPosition(
 1459|      0|                      loop->notTakenTarget, c.currentPointer()));
 1460|      0|              if (pushRes != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1460:19): [True: 0, False: 0]
  ------------------
 1461|      0|                return pushRes;
 1462|       |
 1463|      0|              auto prepRes = prepareToEnterLoopBody(s, loop, backtrackStack);
 1464|      0|              if (prepRes != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1464:19): [True: 0, False: 0]
  ------------------
 1465|      0|                return prepRes;
 1466|      0|              s->ip_ = loopTakenIp;
 1467|      0|            }
 1468|      0|          }
 1469|      0|          break;
 1470|      0|        }
 1471|       |
 1472|      0|        case Opcode::BeginSimpleLoop: {
  ------------------
  |  Branch (1472:9): [True: 0, False: 294]
  ------------------
 1473|       |          // Here we are entering a simple loop from outside,
 1474|       |          // not jumping back into it.
 1475|      0|          const BeginSimpleLoopInsn *loop =
 1476|      0|              llvh::cast<BeginSimpleLoopInsn>(base);
 1477|       |
 1478|      0|          if (!c.satisfiesConstraints(flags_, loop->loopeeConstraints)) {
  ------------------
  |  Branch (1478:15): [True: 0, False: 0]
  ------------------
 1479|      0|            s->ip_ = loop->notTakenTarget;
 1480|      0|            break;
 1481|      0|          }
 1482|       |
 1483|      0|          goto runSimpleLoop;
 1484|      0|        }
 1485|       |
 1486|      0|        case Opcode::EndSimpleLoop:
  ------------------
  |  Branch (1486:9): [True: 0, False: 294]
  ------------------
 1487|      0|          s->ip_ = llvh::cast<EndSimpleLoopInsn>(base)->target;
 1488|      0|          base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1489|       |          // Note: fall-through.
 1490|       |
 1491|      0|        runSimpleLoop: {
 1492|      0|          const BeginSimpleLoopInsn *loop =
 1493|      0|              llvh::cast<BeginSimpleLoopInsn>(base);
 1494|       |          // Since this is a simple loop, we'll always need to explore both
 1495|       |          // exiting the loop at this point and continuing to loop.
 1496|       |          // Note simple loops are always greedy.
 1497|      0|          auto res = pushBacktrack(
 1498|      0|              backtrackStack,
 1499|      0|              BacktrackInsn::makeSetPosition(
 1500|      0|                  loop->notTakenTarget, c.currentPointer()));
 1501|      0|          if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1501:15): [True: 0, False: 0]
  ------------------
 1502|      0|            return res;
 1503|      0|          }
 1504|      0|          s->ip_ += sizeof(BeginSimpleLoopInsn);
 1505|      0|          break;
 1506|      0|        }
 1507|       |
 1508|     86|        case Opcode::Width1Loop: {
  ------------------
  |  Branch (1508:9): [True: 86, False: 208]
  ------------------
 1509|     86|          const Width1LoopInsn *loop = llvh::cast<Width1LoopInsn>(base);
 1510|     86|          auto matchRes = matchWidth1Loop(loop, s, backtrackStack);
 1511|     86|          if (LLVM_UNLIKELY(!matchRes))
  ------------------
  |  |  189|     86|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 86]
  |  |  ------------------
  ------------------
 1512|      0|            return matchRes.getStatus();
 1513|     86|          if (!*matchRes)
  ------------------
  |  Branch (1513:15): [True: 0, False: 86]
  ------------------
 1514|      0|            BACKTRACK();
  ------------------
  |  | 1015|      0|  do {                                         \
  |  | 1016|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  | 1017|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1018|      0|      return btRes.getStatus();                \
  |  | 1019|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (1019:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1020|      0|      goto backtrackingSucceeded;              \
  |  | 1021|      0|    goto backtrackingExhausted;                \
  |  | 1022|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1022:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1515|     86|          break;
 1516|     86|        }
 1517|    294|      }
 1518|    294|    }
 1519|       |  // The search failed at this location.
 1520|     86|  backtrackingExhausted:
 1521|     86|    continue;
 1522|    122|  }
 1523|     86|#undef BACKTRACK
 1524|       |  // The match failed.
 1525|     86|  return nullptr;
 1526|     86|}
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE15offsetFromRightEv:
  159|     86|  uint32_t offsetFromRight() const {
  160|     86|    return last_ - current_;
  161|     86|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE8forwardsEv:
  128|    244|  bool forwards() const {
  129|    244|    return forwards_;
  130|    244|  }
_ZN6hermes5regex6CursorINS0_16UTF16RegexTraitsEE17setCurrentPointerEPKDs:
  188|    208|  void setCurrentPointer(const CodeUnit *current) {
  189|    208|    assert(first_ <= current && current <= last_ && "Current not in range");
  190|    208|    current_ = current;
  191|    208|  }
_ZN6hermes5regex14ExecutorResultIPKDsEC2ERKS3_:
   43|     86|      : status_(ExecutionStatus::RETURNED), value_(v) {}
_ZN6hermes5regex17matchesLeftAnchorINS0_16UTF16RegexTraitsEEEbRNS0_7ContextIT_EERNS0_5StateIS4_EE:
  578|     86|bool matchesLeftAnchor(Context<Traits> &ctx, State<Traits> &s) {
  579|     86|  bool matchesAnchor = false;
  580|     86|  const Cursor<Traits> &c = s.cursor_;
  581|     86|  if (c.atLeft()) {
  ------------------
  |  Branch (581:7): [True: 86, False: 0]
  ------------------
  582|       |    // Beginning of text.
  583|     86|    matchesAnchor = true;
  584|     86|  } else if (
  585|      0|      (ctx.syntaxFlags_.multiline) && !c.atLeft() &&
  ------------------
  |  Branch (585:7): [True: 0, False: 0]
  |  Branch (585:39): [True: 0, False: 0]
  ------------------
  586|      0|      isLineTerminator(c.currentPointer()[-1])) {
  ------------------
  |  Branch (586:7): [True: 0, False: 0]
  ------------------
  587|       |    // Multiline and after line terminator.
  588|      0|    matchesAnchor = true;
  589|      0|  }
  590|     86|  return matchesAnchor;
  591|     86|}
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE9backtrackERN4llvh11SmallVectorINS3_13BacktrackInsnELj64EEEPNS0_5StateIS2_EE:
  725|    122|    State<Traits> *s) {
  726|    158|  while (!bts.empty()) {
  ------------------
  |  Branch (726:10): [True: 72, False: 86]
  ------------------
  727|     72|    BacktrackInsn &binsn = bts.back();
  728|     72|    switch (binsn.op) {
  ------------------
  |  Branch (728:13): [True: 0, False: 72]
  ------------------
  729|      0|      case BacktrackOp::SetCaptureGroup:
  ------------------
  |  Branch (729:7): [True: 0, False: 72]
  ------------------
  730|      0|        s->getCapturedRange(binsn.setCaptureGroup.mexp) =
  731|      0|            binsn.setCaptureGroup.range;
  732|      0|        bts.pop_back();
  733|      0|        break;
  734|       |
  735|      0|      case BacktrackOp::SetLoopData:
  ------------------
  |  Branch (735:7): [True: 0, False: 72]
  ------------------
  736|      0|        s->getLoop(binsn.setLoopData.loopId) = binsn.setLoopData.loopData;
  737|      0|        bts.pop_back();
  738|      0|        break;
  739|       |
  740|      0|      case BacktrackOp::SetPosition:
  ------------------
  |  Branch (740:7): [True: 0, False: 72]
  ------------------
  741|      0|        s->cursor_.setCurrentPointer(binsn.setPosition.value);
  742|      0|        s->ip_ = binsn.setPosition.ip;
  743|      0|        bts.pop_back();
  744|      0|        return true;
  745|       |
  746|      0|      case BacktrackOp::EnterNonGreedyLoop: {
  ------------------
  |  Branch (746:7): [True: 0, False: 72]
  ------------------
  747|      0|        auto fields = binsn.enterNonGreedyLoop;
  748|      0|        bts.pop_back();
  749|      0|        auto res = performEnterNonGreedyLoop(
  750|      0|            s, fields.loopInsn, fields.bodyIp, fields.loopData, bts);
  751|      0|        if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (751:13): [True: 0, False: 0]
  ------------------
  752|      0|          return res;
  753|      0|        }
  754|      0|        return true;
  755|      0|      }
  756|       |
  757|     72|      case BacktrackOp::GreedyWidth1Loop:
  ------------------
  |  Branch (757:7): [True: 72, False: 0]
  ------------------
  758|     72|      case BacktrackOp::NongreedyWidth1Loop: {
  ------------------
  |  Branch (758:7): [True: 0, False: 72]
  ------------------
  759|       |        // In both of these instructions, we have a range [min, max] containing
  760|       |        // possible match locations, and the match failed at the max location
  761|       |        // (if we are greedy) or the min location (nongreedy). Backtrack by
  762|       |        // decrementing the max (incrementing the min) if we are greedy
  763|       |        // (nongreedy), setting the IP to that location, and jumping to the loop
  764|       |        // exit. Note that if we are tracking backwards (lookbehind assertion)
  765|       |        // our maximum is before our minimum, so we have to reverse the
  766|       |        // direction of increment/decrement.
  767|     72|        bool forwards = s->cursor_.forwards();
  768|     72|        assert(
  769|     72|            (forwards ? binsn.width1Loop.min <= binsn.width1Loop.max
  770|     72|                      : binsn.width1Loop.min >= binsn.width1Loop.max) &&
  771|     72|            "Loop min should be <= max (or >= max if backwards)");
  772|     72|        if (binsn.width1Loop.min == binsn.width1Loop.max) {
  ------------------
  |  Branch (772:13): [True: 36, False: 36]
  ------------------
  773|       |          // We have backtracked as far as possible. Give up.
  774|     36|          bts.pop_back();
  775|     36|          break;
  776|     36|        }
  777|     36|        if (binsn.op == BacktrackOp::GreedyWidth1Loop) {
  ------------------
  |  Branch (777:13): [True: 36, False: 0]
  ------------------
  778|     36|          binsn.width1Loop.max += forwards ? -1 : 1;
  ------------------
  |  Branch (778:35): [True: 36, False: 0]
  ------------------
  779|     36|          s->cursor_.setCurrentPointer(binsn.width1Loop.max);
  780|     36|        } else {
  781|      0|          binsn.width1Loop.min += forwards ? 1 : -1;
  ------------------
  |  Branch (781:35): [True: 0, False: 0]
  ------------------
  782|      0|          s->cursor_.setCurrentPointer(binsn.width1Loop.min);
  783|      0|        }
  784|     36|        s->ip_ = binsn.width1Loop.continuation;
  785|     36|        return true;
  786|     72|      }
  787|     72|    }
  788|     72|  }
  789|       |  // Exhausted the backtracking stack.
  790|     86|  return false;
  791|    122|}
_ZN6hermes5regex14ExecutorResultIbEC2ERKb:
   43|    208|      : status_(ExecutionStatus::RETURNED), value_(v) {}
_ZNK6hermes5regex14ExecutorResultIbEcvbEv:
   57|    208|  explicit operator bool() const {
   58|    208|    return hasValue();
   59|    208|  }
_ZNK6hermes5regex14ExecutorResultIbE8hasValueEv:
   53|    208|  bool hasValue() const {
   54|    208|    return status_ == ExecutionStatus::RETURNED;
   55|    208|  }
_ZNK6hermes5regex14ExecutorResultIbE9getStatusEv:
   66|    208|  ExecutionStatus getStatus() const {
   67|    208|    return status_;
   68|    208|  }
_ZNK6hermes5regex14ExecutorResultIbEdeEv:
   49|    208|  const T &operator*() const {
   50|    208|    return getValue();
   51|    208|  }
_ZNK6hermes5regex14ExecutorResultIbE8getValueEv:
   61|    208|  const T &getValue() const {
   62|    208|    assert(getStatus() == ExecutionStatus::RETURNED);
   63|    208|    return *reinterpret_cast<const T *>(&value_);
   64|    208|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE5atEndEv:
  144|    243|  bool atEnd() const {
  145|    243|    return current_ == end_;
  146|    243|  }
_ZN6hermes5regex6CursorINS0_16UTF16RegexTraitsEE7consumeEv:
  194|    243|  CodeUnit consume() {
  195|    243|    CodeUnit result = current();
  196|    243|    current_ += forwards_ ? 1 : -1;
  ------------------
  |  Branch (196:17): [True: 243, False: 0]
  ------------------
  197|    243|    return result;
  198|    243|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE7currentEv:
  176|    243|  CodeUnit current() const {
  177|       |    // Access the character at index 0 if forwards, -1 if backwards.
  178|    243|    assert(!atEnd() && "Cursor is at end");
  179|    243|    return current_[(int)forwards_ - 1];
  180|    243|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE9remainingEv:
  139|    208|  uint32_t remaining() const {
  140|    208|    return forwards_ ? last_ - current_ : current_ - first_;
  ------------------
  |  Branch (140:12): [True: 208, False: 0]
  ------------------
  141|    208|  }
_ZN6hermes5regex13matchesNChar8INS0_16UTF16RegexTraitsEEEbPKNS0_15MatchNChar8InsnERNS0_5StateIT_EE:
  611|    121|bool matchesNChar8(const MatchNChar8Insn *insn, State<Traits> &s) {
  612|    121|  Cursor<Traits> &c = s.cursor_;
  613|    121|  auto insnCharPtr = reinterpret_cast<const char *>(insn + 1);
  614|    121|  auto charCount = insn->charCount;
  615|    121|  for (int idx = 0; idx < charCount; idx++) {
  ------------------
  |  Branch (615:21): [True: 121, False: 0]
  ------------------
  616|    121|    if (c.consume() != insnCharPtr[idx]) {
  ------------------
  |  Branch (616:9): [True: 121, False: 0]
  ------------------
  617|    121|      return false;
  618|    121|    }
  619|    121|  }
  620|      0|  return true;
  621|    121|}
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE13pushBacktrackERN4llvh11SmallVectorINS3_13BacktrackInsnELj64EEES6_:
  458|     36|  ExecutionStatus pushBacktrack(BacktrackStack &bts, BacktrackInsn insn) {
  459|     36|    bts.push_back(insn);
  460|     36|    if (LLVM_UNLIKELY(bts.size() > kMaxBacktrackDepth) ||
  ------------------
  |  |  189|     72|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 36]
  |  |  ------------------
  ------------------
  461|     36|        LLVM_UNLIKELY(backtracksRemaining_ == 0)) {
  ------------------
  |  |  189|     36|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 36]
  |  |  ------------------
  ------------------
  462|      0|      return ExecutionStatus::STACK_OVERFLOW;
  463|      0|    }
  464|     36|    backtracksRemaining_--;
  465|     36|    return ExecutionStatus::RETURNED;
  466|     36|  }
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE13BacktrackInsnC2ENS3_11BacktrackOpE:
  327|     36|    /* implicit */ BacktrackInsn(BacktrackOp op) : op(op) {}
_ZNK6hermes5regex7ContextINS0_16UTF16RegexTraitsEE11matchWidth1ILNS0_12Width1OpcodeE17EEEbPKNS0_4InsnEDs:
  795|    122|bool Context<Traits>::matchWidth1(const Insn *base, CodeUnit c) const {
  796|       |  // Note this switch should resolve at compile time.
  797|    122|  assert(
  798|    122|      base->opcode == static_cast<Opcode>(w1opcode) &&
  799|    122|      "Instruction has wrong opcode");
  800|    122|  switch (w1opcode) {
  ------------------
  |  Branch (800:11): [Folded - Ignored]
  ------------------
  801|      0|    case Width1Opcode::MatchChar8: {
  ------------------
  |  Branch (801:5): [True: 0, False: 122]
  ------------------
  802|      0|      const auto *insn = llvh::cast<MatchChar8Insn>(base);
  803|      0|      return c == insn->c;
  804|      0|    }
  805|       |
  806|      0|    case Width1Opcode::MatchChar16: {
  ------------------
  |  Branch (806:5): [True: 0, False: 122]
  ------------------
  807|      0|      const auto *insn = llvh::cast<MatchChar16Insn>(base);
  808|      0|      return c == insn->c;
  809|      0|    }
  810|       |
  811|      0|    case Width1Opcode::MatchCharICase8: {
  ------------------
  |  Branch (811:5): [True: 0, False: 122]
  ------------------
  812|      0|      const auto *insn = llvh::cast<MatchCharICase8Insn>(base);
  813|      0|      return c == (CodePoint)insn->c ||
  ------------------
  |  Branch (813:14): [True: 0, False: 0]
  ------------------
  814|      0|          (CodePoint)traits_.canonicalize(c, syntaxFlags_.unicode) ==
  ------------------
  |  Branch (814:11): [True: 0, False: 0]
  ------------------
  815|      0|          (CodePoint)insn->c;
  816|      0|    }
  817|       |
  818|      0|    case Width1Opcode::MatchCharICase16: {
  ------------------
  |  Branch (818:5): [True: 0, False: 122]
  ------------------
  819|      0|      const auto *insn = llvh::cast<MatchCharICase16Insn>(base);
  820|      0|      return c == insn->c ||
  ------------------
  |  Branch (820:14): [True: 0, False: 0]
  ------------------
  821|      0|          (char32_t)traits_.canonicalize(c, syntaxFlags_.unicode) ==
  ------------------
  |  Branch (821:11): [True: 0, False: 0]
  ------------------
  822|      0|          (char32_t)insn->c;
  823|      0|    }
  824|       |
  825|      0|    case Width1Opcode::MatchAny:
  ------------------
  |  Branch (825:5): [True: 0, False: 122]
  ------------------
  826|      0|      return true;
  827|       |
  828|      0|    case Width1Opcode::MatchAnyButNewline:
  ------------------
  |  Branch (828:5): [True: 0, False: 122]
  ------------------
  829|      0|      return !isLineTerminator(c);
  830|       |
  831|    122|    case Width1Opcode::Bracket: {
  ------------------
  |  Branch (831:5): [True: 122, False: 0]
  ------------------
  832|       |      // BracketInsn is followed by a list of BracketRange32s.
  833|    122|      assert(
  834|    122|          !(syntaxFlags_.unicode) &&
  835|    122|          "Unicode should not be set for Width 1 brackets");
  836|    122|      const BracketInsn *insn = llvh::cast<BracketInsn>(base);
  837|    122|      const BracketRange32 *ranges =
  838|    122|          reinterpret_cast<const BracketRange32 *>(insn + 1);
  839|    122|      return bracketMatchesChar<Traits>(*this, insn, ranges, c);
  840|    122|    }
  841|    122|  }
  842|      0|  llvm_unreachable("Invalid width 1 opcode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  843|    122|}
_ZN6hermes5regex18bracketMatchesCharINS0_16UTF16RegexTraitsEEEbRKNS0_7ContextIT_EEPKNS0_11BracketInsnEPKNS0_14BracketRange32ENS4_9CodePointE:
  650|    122|    typename Traits::CodePoint ch) {
  651|    122|  const auto &traits = ctx.traits_;
  652|       |  // Note that if the bracket is negated /[^abc]/, we want to return true if we
  653|       |  // do not match, false if we do. Implement this by xor with the negate flag.
  654|       |
  655|       |  // Check character classes.
  656|       |  // Note we don't have to canonicalize here, because canonicalization does not
  657|       |  // affect which character class a character is in (i.e. a character doesn't
  658|       |  // become a digit after uppercasing).
  659|    122|  if (insn->positiveCharClasses || insn->negativeCharClasses) {
  ------------------
  |  Branch (659:7): [True: 122, False: 0]
  |  Branch (659:36): [True: 0, False: 0]
  ------------------
  660|    122|    for (auto charClass :
  ------------------
  |  Branch (660:25): [True: 330, False: 86]
  ------------------
  661|    122|         {CharacterClass::Digits,
  662|    122|          CharacterClass::Spaces,
  663|    330|          CharacterClass::Words}) {
  664|    330|      if ((insn->positiveCharClasses & charClass) &&
  ------------------
  |  Branch (664:11): [True: 122, False: 208]
  ------------------
  665|    330|          traits.characterHasType(ch, charClass))
  ------------------
  |  Branch (665:11): [True: 36, False: 86]
  ------------------
  666|     36|        return true ^ insn->negate;
  667|    294|      if ((insn->negativeCharClasses & charClass) &&
  ------------------
  |  Branch (667:11): [True: 0, False: 294]
  ------------------
  668|    294|          !traits.characterHasType(ch, charClass))
  ------------------
  |  Branch (668:11): [True: 0, False: 0]
  ------------------
  669|      0|        return true ^ insn->negate;
  670|    294|    }
  671|    122|  }
  672|       |
  673|     86|  bool contained =
  674|     86|      traits.rangesContain(llvh::makeArrayRef(ranges, insn->rangeCount), ch);
  675|     86|  return contained ^ insn->negate;
  676|    122|}
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE6atLeftEv:
  165|     86|  bool atLeft() const {
  166|     86|    return current_ == first_;
  167|     86|  }
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE15matchWidth1LoopEPKNS0_14Width1LoopInsnEPNS0_5StateIS2_EERN4llvh11SmallVectorINS3_13BacktrackInsnELj64EEE:
  863|     86|    BacktrackStack &bts) {
  864|       |  // Note we copy the cursor here.
  865|     86|  Cursor<Traits> c = s->cursor_;
  866|     86|  uint32_t matched = 0, minMatch = insn->min, maxMatch = insn->max;
  867|       |
  868|       |  // Limit our max to the smaller of the maximum in the loop and number of
  869|       |  // number of characters remaining. This allows us to avoid having to test for
  870|       |  // end of input in the loop body.
  871|     86|  maxMatch = std::min(c.remaining(), maxMatch);
  872|       |
  873|       |  // The loop body follows the loop instruction.
  874|     86|  const Insn *body = static_cast<const Insn *>(&insn[1]);
  875|       |
  876|       |  // Match as far as we can up to maxMatch. Note we do this even if the loop is
  877|       |  // non-greedy: we compute how far we might conceivably have to backtrack
  878|       |  // (except in non-greedy loops we're "backtracking" by moving forwards).
  879|     86|  using W1 = Width1Opcode;
  880|     86|  switch (static_cast<Width1Opcode>(body->opcode)) {
  ------------------
  |  Branch (880:11): [True: 0, False: 86]
  ------------------
  881|      0|    case W1::MatchChar8:
  ------------------
  |  Branch (881:5): [True: 0, False: 86]
  ------------------
  882|      0|      matched = matchWidth1LoopBody<W1::MatchChar8>(body, c, maxMatch);
  883|      0|      break;
  884|      0|    case W1::MatchChar16:
  ------------------
  |  Branch (884:5): [True: 0, False: 86]
  ------------------
  885|      0|      matched = matchWidth1LoopBody<W1::MatchChar16>(body, c, maxMatch);
  886|      0|      break;
  887|      0|    case W1::MatchCharICase8:
  ------------------
  |  Branch (887:5): [True: 0, False: 86]
  ------------------
  888|      0|      matched = matchWidth1LoopBody<W1::MatchCharICase8>(body, c, maxMatch);
  889|      0|      break;
  890|      0|    case W1::MatchCharICase16:
  ------------------
  |  Branch (890:5): [True: 0, False: 86]
  ------------------
  891|      0|      matched = matchWidth1LoopBody<W1::MatchCharICase16>(body, c, maxMatch);
  892|      0|      break;
  893|      0|    case W1::MatchAny:
  ------------------
  |  Branch (893:5): [True: 0, False: 86]
  ------------------
  894|      0|      matched = matchWidth1LoopBody<W1::MatchAny>(body, c, maxMatch);
  895|      0|      break;
  896|      0|    case W1::MatchAnyButNewline:
  ------------------
  |  Branch (896:5): [True: 0, False: 86]
  ------------------
  897|      0|      matched = matchWidth1LoopBody<W1::MatchAnyButNewline>(body, c, maxMatch);
  898|      0|      break;
  899|     86|    case W1::Bracket:
  ------------------
  |  Branch (899:5): [True: 86, False: 0]
  ------------------
  900|     86|      matched = matchWidth1LoopBody<W1::Bracket>(body, c, maxMatch);
  901|     86|      break;
  902|     86|  }
  903|       |
  904|       |  // If we iterated less than the minimum, we failed to match.
  905|     86|  if (matched < minMatch) {
  ------------------
  |  Branch (905:7): [True: 0, False: 86]
  ------------------
  906|      0|    return false;
  907|      0|  }
  908|     86|  assert(
  909|     86|      minMatch <= matched && matched <= maxMatch &&
  910|     86|      "matched should be between min and max match count");
  911|       |
  912|       |  // Now we know the valid match range.
  913|       |  // Compute the beginning and end pointers in this range.
  914|     86|  bool forwards = s->cursor_.forwards();
  915|     86|  const CodeUnit *pos = s->cursor_.currentPointer();
  916|     86|  const CodeUnit *minPos = forwards ? pos + minMatch : pos - minMatch;
  ------------------
  |  Branch (916:28): [True: 86, False: 0]
  ------------------
  917|     86|  const CodeUnit *maxPos = forwards ? pos + matched : pos - matched;
  ------------------
  |  Branch (917:28): [True: 86, False: 0]
  ------------------
  918|       |
  919|       |  // If min == max (e.g. /a{3}/) then no backtracking is possible. If min < max,
  920|       |  // backtracking is possible and we need to add a backtracking instruction.
  921|     86|  if (minMatch < matched) {
  ------------------
  |  Branch (921:7): [True: 36, False: 50]
  ------------------
  922|     36|    BacktrackInsn backtrack{
  923|     36|        insn->greedy ? BacktrackOp::GreedyWidth1Loop
  ------------------
  |  Branch (923:9): [True: 36, False: 0]
  ------------------
  924|     36|                     : BacktrackOp::NongreedyWidth1Loop};
  925|     36|    backtrack.width1Loop.continuation = insn->notTakenTarget;
  926|     36|    backtrack.width1Loop.min = minPos;
  927|     36|    backtrack.width1Loop.max = maxPos;
  928|     36|    auto res = pushBacktrack(bts, backtrack);
  929|     36|    if (res != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (929:9): [True: 0, False: 36]
  ------------------
  930|      0|      return res;
  931|     36|  }
  932|       |  // Set the state's current position to either the minimum or maximum location,
  933|       |  // and point it to the exit of the loop.
  934|     86|  s->cursor_.setCurrentPointer(insn->greedy ? maxPos : minPos);
  ------------------
  |  Branch (934:32): [True: 86, False: 0]
  ------------------
  935|     86|  s->ip_ = insn->notTakenTarget;
  936|     86|  return true;
  937|     86|}
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE19matchWidth1LoopBodyILNS0_12Width1OpcodeE17EEEjPKNS0_4InsnENS0_6CursorIS2_EEj:
  850|     86|    uint32_t max) {
  851|     86|  uint32_t iters = 0;
  852|    122|  for (; iters < max; iters++) {
  ------------------
  |  Branch (852:10): [True: 122, False: 0]
  ------------------
  853|    122|    if (!matchWidth1<w1opcode>(insn, c.consume()))
  ------------------
  |  Branch (853:9): [True: 86, False: 36]
  ------------------
  854|     86|      break;
  855|    122|  }
  856|     86|  return iters;
  857|     86|}
_ZNK6hermes5regex7ContextINS0_16UTF16RegexTraitsEE18advanceStringIndexEPKDsmm:
  945|     86|    size_t length) const {
  946|     86|  if (sizeof(CodeUnit) == 1) {
  ------------------
  |  Branch (946:7): [Folded - Ignored]
  ------------------
  947|       |    // The input string is ASCII and therefore cannot have surrogate pairs.
  948|      0|    return index + 1;
  949|      0|  }
  950|       |  // "If unicode is false, return index+1."
  951|       |  // "If index+1 >= length, return index+1."
  952|     86|  if (LLVM_LIKELY(!(syntaxFlags_.unicode)) || (index + 1 >= length))
  ------------------
  |  |  188|    172|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 86, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (952:47): [True: 0, False: 0]
  ------------------
  953|     86|    return index + 1;
  954|       |
  955|       |  // Let first be the code unit value at index index in S
  956|       |  // If first < 0xD800 or first > 0xDBFF, return index+1
  957|       |  // Let second be the code unit value at index index+1 in S.
  958|       |  // If second < 0xDC00 or second > 0xDFFF, return index+1.
  959|      0|  CodeUnit first = start[index];
  960|      0|  CodeUnit second = start[index + 1];
  961|      0|  if (LLVM_LIKELY(!isHighSurrogate(first)) ||
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  962|      0|      LLVM_LIKELY(!isLowSurrogate(second))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  963|      0|    return index + 1;
  964|      0|  }
  965|       |  // Return index+2.
  966|      0|  return index + 2;
  967|      0|}
_ZNK6hermes5regex14ExecutorResultIPKDsEcvbEv:
   57|     86|  explicit operator bool() const {
   58|     86|    return hasValue();
   59|     86|  }
_ZNK6hermes5regex14ExecutorResultIPKDsE8hasValueEv:
   53|     86|  bool hasValue() const {
   54|     86|    return status_ == ExecutionStatus::RETURNED;
   55|     86|  }
_ZNK6hermes5regex14ExecutorResultIPKDsE9getStatusEv:
   66|     86|  ExecutionStatus getStatus() const {
   67|     86|    return status_;
   68|     86|  }
_ZNK6hermes5regex14ExecutorResultIPKDsE8getValueEv:
   61|     86|  const T &getValue() const {
   62|     86|    assert(getStatus() == ExecutionStatus::RETURNED);
   63|     86|    return *reinterpret_cast<const T *>(&value_);
   64|     86|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE14currentPointerEv:
  183|    172|  const CodeUnit *currentPointer() const {
  184|    172|    return current_;
  185|    172|  }

_ZN6hermes5regex10parseRegexINS0_5RegexINS0_16UTF16RegexTraitsEEEEENS0_9constants9ErrorTypeEPKDsS8_PT_NS0_11SyntaxFlagsEjbPj:
 1358|    122|    uint32_t *outMaxBackRef) {
 1359|    122|  Parser<Receiver, const char16_t *> parser(
 1360|    122|      receiver, start, end, flags, backRefLimit, hasNamedGroups);
 1361|    122|  auto result = parser.performParse();
 1362|    122|  *outMaxBackRef = parser.maxBackRef();
 1363|    122|  return result;
 1364|    122|}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsEC2EPS4_S6_S6_NS0_11SyntaxFlagsEjb:
 1330|    122|      : re_(re),
 1331|    122|        current_(start),
 1332|    122|        end_(end),
 1333|    122|        flags_(flags),
 1334|    122|        backRefLimit_(backRefLimit),
 1335|    122|        hasNamedGroups_(hasNamedGroups) {}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE12performParseEv:
 1337|    122|  constants::ErrorType performParse() {
 1338|    122|    consumeDisjunction();
 1339|    122|    assert(
 1340|    122|        current_ == end_ && "We should always consume all input even on error");
 1341|    122|    return error_;
 1342|    122|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE18consumeDisjunctionEv:
  360|    122|  void consumeDisjunction() {
  361|    122|    Node *const firstNode = re_->currentNode();
  362|    122|    ParseStack stack;
  363|       |
  364|  64.8k|    while (current_ != end_) {
  ------------------
  |  Branch (364:12): [True: 64.7k, False: 122]
  ------------------
  365|  64.7k|      switch (*current_) {
  ------------------
  |  Branch (365:15): [True: 120, False: 64.6k]
  ------------------
  366|  61.4k|        case '|': {
  ------------------
  |  Branch (366:9): [True: 61.4k, False: 3.32k]
  ------------------
  367|  61.4k|          consume('|');
  368|  61.4k|          auto *splicePoint =
  369|  61.4k|              stack.empty() ? firstNode : stack.back().splicePoint;
  ------------------
  |  Branch (369:15): [True: 4, False: 61.4k]
  ------------------
  370|  61.4k|          auto nodes = re_->spliceOut(splicePoint);
  371|  61.4k|          if (stack.empty() ||
  ------------------
  |  Branch (371:15): [True: 4, False: 61.4k]
  ------------------
  372|  61.4k|              stack.back().type != ParseStackElement::Alternation) {
  ------------------
  |  Branch (372:15): [True: 0, False: 61.4k]
  ------------------
  373|       |            // Open a new alternation
  374|      4|            openAlternation(stack);
  375|      4|          }
  376|  61.4k|          stack.back().alternatives.push_back(std::move(nodes));
  377|  61.4k|          break;
  378|      0|        }
  379|       |
  380|  1.60k|        case '(': {
  ------------------
  |  Branch (380:9): [True: 1.60k, False: 63.1k]
  ------------------
  381|       |          // Open a new group of the right type.
  382|  1.60k|          if (tryConsume("(?=")) {
  ------------------
  |  Branch (382:15): [True: 0, False: 1.60k]
  ------------------
  383|       |            // Positive lookahead, negate = false, forwards = true
  384|      0|            openLookaround(stack, false, true);
  385|  1.60k|          } else if (tryConsume("(?!")) {
  ------------------
  |  Branch (385:22): [True: 0, False: 1.60k]
  ------------------
  386|       |            // Negative lookahead, negate = true, forwards = true
  387|      0|            openLookaround(stack, true, true);
  388|  1.60k|          } else if (tryConsume("(?<=")) {
  ------------------
  |  Branch (388:22): [True: 0, False: 1.60k]
  ------------------
  389|       |            // Positive lookbehind, negate = false, forwards = false
  390|      0|            openLookaround(stack, false, false);
  391|  1.60k|          } else if (tryConsume("(?<!")) {
  ------------------
  |  Branch (391:22): [True: 0, False: 1.60k]
  ------------------
  392|       |            // Negative lookbehind, negate = true, forwards = false
  393|      0|            openLookaround(stack, true, false);
  394|  1.60k|          } else if (tryConsume("(?<")) {
  ------------------
  |  Branch (394:22): [True: 0, False: 1.60k]
  ------------------
  395|      0|            openNamedCapturingGroup(stack);
  396|  1.60k|          } else if (tryConsume("(?:")) {
  ------------------
  |  Branch (396:22): [True: 0, False: 1.60k]
  ------------------
  397|      0|            openNonCapturingGroup(stack);
  398|  1.60k|          } else {
  399|  1.60k|            consume('(');
  400|  1.60k|            openCapturingGroup(stack);
  401|  1.60k|          }
  402|  1.60k|          break;
  403|      0|        }
  404|       |
  405|  1.60k|        case ')': {
  ------------------
  |  Branch (405:9): [True: 1.60k, False: 63.1k]
  ------------------
  406|       |          // Close any in-flight alternation and pop a group stack
  407|       |          // element.
  408|  1.60k|          consume(')');
  409|  1.60k|          closeAlternation(stack);
  410|  1.60k|          if (stack.empty()) {
  ------------------
  |  Branch (410:15): [True: 0, False: 1.60k]
  ------------------
  411|      0|            setError(constants::ErrorType::UnbalancedParenthesis);
  412|      0|            return;
  413|      0|          }
  414|  1.60k|          closeGroup(stack);
  415|  1.60k|          break;
  416|  1.60k|        }
  417|  64.7k|      }
  418|  64.7k|      consumeTerm();
  419|  64.7k|    }
  420|       |
  421|    122|    assert(current_ == end_ && "Should have consumed all input");
  422|    122|    closeAlternation(stack);
  423|    122|    if (!stack.empty()) {
  ------------------
  |  Branch (423:9): [True: 0, False: 122]
  ------------------
  424|      0|      setError(constants::ErrorType::UnbalancedParenthesis);
  425|      0|    }
  426|    122|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE7consumeEDs:
  125|  1.05M|  CharT consume(CharT c) {
  126|  1.05M|    assert(check(c) && "Could not consume char");
  127|  1.05M|    current_++;
  128|  1.05M|    return c;
  129|  1.05M|  }
_ZNK6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE5checkEDs:
  155|  1.06M|  bool check(CharT c) const {
  156|  1.06M|    return current_ != end_ && *current_ == c;
  ------------------
  |  Branch (156:12): [True: 1.06M, False: 0]
  |  Branch (156:32): [True: 1.05M, False: 14.4k]
  ------------------
  157|  1.06M|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE15openAlternationERN4llvh11SmallVectorINS7_17ParseStackElementELj4EEE:
  229|      4|  void openAlternation(ParseStack &stack) {
  230|       |    // Should never have two adjacent alternations on the stack
  231|      4|    assert(
  232|      4|        stack.empty() || stack.back().type != ParseStackElement::Alternation);
  233|      4|    ParseStackElement elem(ParseStackElement::Alternation);
  234|      4|    elem.splicePoint = re_->currentNode();
  235|      4|    stack.push_back(std::move(elem));
  236|      4|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE17ParseStackElementC2ENS8_4TypeE:
  223|  1.60k|    explicit ParseStackElement(Type type) : type(type) {}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE10tryConsumeEPKc:
  133|  9.62k|  bool tryConsume(const char *seq) {
  134|  9.62k|    auto cursor = current_;
  135|  19.2k|    for (size_t i = 0; seq[i]; i++) {
  ------------------
  |  Branch (135:24): [True: 19.2k, False: 0]
  ------------------
  136|  19.2k|      if (cursor == end_ || *cursor != seq[i])
  ------------------
  |  Branch (136:11): [True: 0, False: 19.2k]
  |  Branch (136:29): [True: 9.62k, False: 9.62k]
  ------------------
  137|  9.62k|        return false;
  138|  9.62k|      ++cursor;
  139|  9.62k|    }
  140|      0|    current_ = cursor;
  141|      0|    return true;
  142|  9.62k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE17prepareQuantifierEv:
  100|  1.03M|  Quantifier prepareQuantifier() {
  101|  1.03M|    Quantifier q;
  102|  1.03M|    q.startMarkedSubexprs_ = re_->markedCount();
  103|  1.03M|    q.quantifiedNodeStart_ = re_->currentNode();
  104|  1.03M|    return q;
  105|  1.03M|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE19tryConsumeGroupNameERN4llvh11SmallVectorIDsLj5EEE:
  577|      3|  bool tryConsumeGroupName(GroupName &identifierName) {
  578|      3|    bool firstChar = true;
  579|     11|    for (;;) {
  580|     11|      if (current_ == end_) {
  ------------------
  |  Branch (580:11): [True: 0, False: 11]
  ------------------
  581|      0|        return false;
  582|      0|      }
  583|     11|      const CharT c = *current_;
  584|     11|      switch (c) {
  585|      3|        case '>':
  ------------------
  |  Branch (585:9): [True: 3, False: 8]
  ------------------
  586|      3|          if (identifierName.size() == 0) {
  ------------------
  |  Branch (586:15): [True: 0, False: 3]
  ------------------
  587|      0|            return false;
  588|      0|          }
  589|      3|          consume('>');
  590|      3|          return true;
  591|      8|        default: {
  ------------------
  |  Branch (591:9): [True: 8, False: 3]
  ------------------
  592|      8|          if (firstChar) {
  ------------------
  |  Branch (592:15): [True: 3, False: 5]
  ------------------
  593|      3|            bool matchedIdentifierStart =
  594|      3|                tryConsumeRegExpIdentifier(identifierName, isUnicodeIDStart);
  595|      3|            if (!matchedIdentifierStart) {
  ------------------
  |  Branch (595:17): [True: 0, False: 3]
  ------------------
  596|      0|              return false;
  597|      0|            }
  598|      5|          } else {
  599|      5|            bool matchedIdentifierPart =
  600|      5|                tryConsumeRegExpIdentifier(identifierName, isUnicodeIDContinue);
  601|      5|            if (!matchedIdentifierPart) {
  ------------------
  |  Branch (601:17): [True: 0, False: 5]
  ------------------
  602|      0|              return false;
  603|      0|            }
  604|      5|          }
  605|      8|        }
  606|     11|      }
  607|      8|      firstChar = false;
  608|      8|    }
  609|      3|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE26tryConsumeRegExpIdentifierERN4llvh11SmallVectorIDsLj5EEEPFbjE:
  617|      8|      bool (*lambdaPredicate)(uint32_t)) {
  618|      8|    auto c = *current_;
  619|      8|    if (lambdaPredicate(c)) {
  ------------------
  |  Branch (619:9): [True: 8, False: 0]
  ------------------
  620|      8|      consume(c);
  621|      8|      identifierName.push_back(c);
  622|      8|      return true;
  623|      8|    }
  624|      0|    auto saved = current_;
  625|      0|    if (tryConsume("\\") && check('u')) {
  ------------------
  |  Branch (625:9): [True: 0, False: 0]
  |  Branch (625:29): [True: 0, False: 0]
  ------------------
  626|      0|      if (auto cp = tryConsumeUnicodeEscapeSequence(true)) {
  ------------------
  |  Branch (626:16): [True: 0, False: 0]
  ------------------
  627|      0|        if (!lambdaPredicate(*cp)) {
  ------------------
  |  Branch (627:13): [True: 0, False: 0]
  ------------------
  628|      0|          return false;
  629|      0|        }
  630|      0|        writeCodePointToUTF16(*cp, identifierName);
  631|      0|        return true;
  632|      0|      }
  633|      0|      saved = current_;
  634|      0|    }
  635|      0|    if (tryConsumeAndAppendSurrogatePair(identifierName, lambdaPredicate)) {
  ------------------
  |  Branch (635:9): [True: 0, False: 0]
  ------------------
  636|      0|      return true;
  637|      0|    }
  638|      0|    return false;
  639|      0|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE19tryConsumeHexDigitsEj:
  962|     43|  Optional<CodePoint> tryConsumeHexDigits(uint32_t count) {
  963|     43|    auto hexDigitValue = [](CharT c) -> Optional<uint32_t> {
  964|     43|      if ('0' <= c && c <= '9')
  965|     43|        return c - '0';
  966|     43|      if ('a' <= c && c <= 'f')
  967|     43|        return c - 'a' + 10;
  968|     43|      if ('A' <= c && c <= 'F')
  969|     43|        return c - 'A' + 10;
  970|     43|      return llvh::None;
  971|     43|    };
  972|       |
  973|     43|    auto saved = current_;
  974|     43|    uint32_t result = 0;
  975|    107|    for (uint32_t i = 0; i < count; i++) {
  ------------------
  |  Branch (975:26): [True: 75, False: 32]
  ------------------
  976|     75|      if (auto c = consumeCharIf(hexDigitValue)) {
  ------------------
  |  Branch (976:16): [True: 64, False: 11]
  ------------------
  977|     64|        result = result * 16 + *hexDigitValue(*c);
  978|     64|      } else {
  979|     11|        current_ = saved;
  980|     11|        return llvh::None;
  981|     11|      }
  982|     75|    }
  983|     32|    return result;
  984|     43|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE13consumeCharIfIZNS7_19tryConsumeHexDigitsEjEUlDsE_EEN4llvh8OptionalIDsEERKT_:
  163|     75|  Optional<CharT> consumeCharIf(const Pred &pred) {
  164|     75|    if (current_ != end_ && pred(*current_)) {
  ------------------
  |  Branch (164:9): [True: 75, False: 0]
  |  Branch (164:9): [True: 64, False: 11]
  |  Branch (164:29): [True: 64, False: 11]
  ------------------
  165|     64|      CharT c = *current_;
  166|     64|      consume(c);
  167|     64|      return c;
  168|     64|    }
  169|     11|    return llvh::None;
  170|     75|  }
_ZZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE19tryConsumeHexDigitsEjENKUlDsE_clEDs:
  963|    139|    auto hexDigitValue = [](CharT c) -> Optional<uint32_t> {
  964|    139|      if ('0' <= c && c <= '9')
  ------------------
  |  Branch (964:11): [True: 128, False: 11]
  |  Branch (964:23): [True: 0, False: 128]
  ------------------
  965|      0|        return c - '0';
  966|    139|      if ('a' <= c && c <= 'f')
  ------------------
  |  Branch (966:11): [True: 64, False: 75]
  |  Branch (966:23): [True: 64, False: 0]
  ------------------
  967|     64|        return c - 'a' + 10;
  968|     75|      if ('A' <= c && c <= 'F')
  ------------------
  |  Branch (968:11): [True: 64, False: 11]
  |  Branch (968:23): [True: 64, False: 0]
  ------------------
  969|     64|        return c - 'A' + 10;
  970|     11|      return llvh::None;
  971|     75|    };
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE10tryConsumeEDs:
  146|  15.3k|  bool tryConsume(CharT c) {
  147|  15.3k|    if (!check(c))
  ------------------
  |  Branch (147:9): [True: 14.4k, False: 883]
  ------------------
  148|  14.4k|      return false;
  149|    883|    consume(c);
  150|    883|    return true;
  151|  15.3k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE13consumeCharIfIFbjEEEN4llvh8OptionalIDsEERKT_:
  163|   311k|  Optional<CharT> consumeCharIf(const Pred &pred) {
  164|   311k|    if (current_ != end_ && pred(*current_)) {
  ------------------
  |  Branch (164:9): [True: 311k, False: 0]
  |  Branch (164:29): [True: 0, False: 311k]
  ------------------
  165|      0|      CharT c = *current_;
  166|      0|      consume(c);
  167|      0|      return c;
  168|      0|    }
  169|   311k|    return llvh::None;
  170|   311k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE18openCapturingGroupERN4llvh11SmallVectorINS7_17ParseStackElementELj4EEE:
  250|  1.60k|  void openCapturingGroup(ParseStack &stack) {
  251|  1.60k|    ParseStackElement elem(ParseStackElement::CapturingGroup);
  252|       |    // Quantifier must be prepared before incrementing the marked counter
  253|       |    // because the newly opened capture group is the first one being quantified
  254|       |    // by it.
  255|  1.60k|    elem.quant = prepareQuantifier();
  256|  1.60k|    if (LLVM_UNLIKELY(re_->markedCount() >= constants::kMaxCaptureGroupCount)) {
  ------------------
  |  |  189|  1.60k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.60k]
  |  |  ------------------
  ------------------
  257|      0|      setError(constants::ErrorType::PatternExceedsParseLimits);
  258|      0|      return;
  259|      0|    }
  260|  1.60k|    elem.mexp = re_->incrementMarkedCount();
  261|  1.60k|    elem.splicePoint = re_->currentNode();
  262|  1.60k|    stack.push_back(std::move(elem));
  263|  1.60k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE16closeAlternationERN4llvh11SmallVectorINS7_17ParseStackElementELj4EEE:
  239|  1.72k|  void closeAlternation(ParseStack &stack) {
  240|  1.72k|    if (!stack.empty() && stack.back().type == ParseStackElement::Alternation) {
  ------------------
  |  Branch (240:9): [True: 1.60k, False: 118]
  |  Branch (240:27): [True: 4, False: 1.60k]
  ------------------
  241|      4|      auto alternatives = std::move(stack.back().alternatives);
  242|      4|      auto last = re_->spliceOut(stack.back().splicePoint);
  243|      4|      stack.pop_back();
  244|      4|      alternatives.push_back(std::move(last));
  245|      4|      re_->pushAlternation(std::move(alternatives));
  246|      4|    }
  247|  1.72k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE10closeGroupERN4llvh11SmallVectorINS7_17ParseStackElementELj4EEE:
  315|  1.60k|  void closeGroup(ParseStack &stack) {
  316|  1.60k|    assert(!stack.empty() && "Stack must not be empty");
  317|  1.60k|    ParseStackElement elem = std::move(stack.back());
  318|  1.60k|    stack.pop_back();
  319|  1.60k|    bool quantifierAllowed = true;
  320|  1.60k|    switch (elem.type) {
  ------------------
  |  Branch (320:13): [True: 0, False: 1.60k]
  ------------------
  321|      0|      case ParseStackElement::Alternation:
  ------------------
  |  Branch (321:7): [True: 0, False: 1.60k]
  ------------------
  322|      0|        llvm_unreachable("Alternations must be popped via closeAlternation()");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  323|      0|        break;
  324|       |
  325|      0|      case ParseStackElement::NamedCapturingGroup:
  ------------------
  |  Branch (325:7): [True: 0, False: 1.60k]
  ------------------
  326|  1.60k|      case ParseStackElement::CapturingGroup:
  ------------------
  |  Branch (326:7): [True: 1.60k, False: 0]
  ------------------
  327|  1.60k|        re_->pushMarkedSubexpression(
  328|  1.60k|            re_->spliceOut(elem.splicePoint), elem.mexp);
  329|  1.60k|        break;
  330|       |
  331|      0|      case ParseStackElement::NonCapturingGroup:
  ------------------
  |  Branch (331:7): [True: 0, False: 1.60k]
  ------------------
  332|      0|        break;
  333|       |
  334|      0|      case ParseStackElement::LookAround: {
  ------------------
  |  Branch (334:7): [True: 0, False: 1.60k]
  ------------------
  335|      0|        bool negate = elem.negateLookaround;
  336|      0|        bool forwards = elem.forwardLookaround;
  337|       |        // ES11 Annex B.1.4 extends RegExp to allow quantifiers for
  338|       |        // lookaheads when unicode is disabled.
  339|      0|        quantifierAllowed = !(flags_.unicode) && forwards;
  ------------------
  |  Branch (339:29): [True: 0, False: 0]
  |  Branch (339:50): [True: 0, False: 0]
  ------------------
  340|      0|        auto mexpStart = elem.mexp;
  341|      0|        auto mexpEnd = re_->markedCount();
  342|      0|        auto expr = re_->spliceOut(elem.splicePoint);
  343|      0|        re_->pushLookaround(
  344|      0|            std::move(expr), mexpStart, mexpEnd, negate, forwards);
  345|      0|        break;
  346|      0|      }
  347|  1.60k|    }
  348|       |
  349|       |    // If the group is followed by a quantifier, then quantify it.
  350|  1.60k|    if (tryConsumeQuantifier(&elem.quant)) {
  ------------------
  |  Branch (350:9): [True: 0, False: 1.60k]
  ------------------
  351|      0|      if (!quantifierAllowed) {
  ------------------
  |  Branch (351:11): [True: 0, False: 0]
  ------------------
  352|      0|        setError(constants::ErrorType::InvalidRepeat);
  353|      0|        return;
  354|      0|      }
  355|      0|      applyQuantifier(elem.quant);
  356|      0|    }
  357|  1.60k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE20tryConsumeQuantifierEPNS7_10QuantifierE:
  656|   973k|  bool tryConsumeQuantifier(Quantifier *quantifier) {
  657|   973k|    if (!tryConsumeQuantifierPrefix(quantifier)) {
  ------------------
  |  Branch (657:9): [True: 962k, False: 10.5k]
  ------------------
  658|   962k|      return false;
  659|   962k|    }
  660|  10.5k|    quantifier->greedy_ = !tryConsume('?');
  661|  10.5k|    return true;
  662|   973k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE26tryConsumeQuantifierPrefixEPNS7_10QuantifierE:
  665|   973k|  bool tryConsumeQuantifierPrefix(Quantifier *quantifier) {
  666|   973k|    if (current_ == end_) {
  ------------------
  |  Branch (666:9): [True: 122, False: 973k]
  ------------------
  667|    122|      return false;
  668|    122|    }
  669|   973k|    constexpr uint32_t uintmax = std::numeric_limits<uint32_t>::max();
  670|   973k|    switch (*current_) {
  671|    296|      case '*':
  ------------------
  |  Branch (671:7): [True: 296, False: 973k]
  ------------------
  672|    296|        consume('*');
  673|    296|        quantifier->min_ = 0;
  674|    296|        quantifier->max_ = uintmax;
  675|    296|        return true;
  676|       |
  677|      4|      case '+':
  ------------------
  |  Branch (677:7): [True: 4, False: 973k]
  ------------------
  678|      4|        consume('+');
  679|      4|        quantifier->min_ = 1;
  680|      4|        quantifier->max_ = uintmax;
  681|      4|        return true;
  682|       |
  683|  10.2k|      case '?':
  ------------------
  |  Branch (683:7): [True: 10.2k, False: 963k]
  ------------------
  684|  10.2k|        consume('?');
  685|  10.2k|        quantifier->min_ = 0;
  686|  10.2k|        quantifier->max_ = 1;
  687|  10.2k|        return true;
  688|       |
  689|      8|      case '{': {
  ------------------
  |  Branch (689:7): [True: 8, False: 973k]
  ------------------
  690|      8|        auto saved = current_;
  691|      8|        consume('{');
  692|      8|        if (auto v1 = tryConsumeDecimalIntegerLiteral()) {
  ------------------
  |  Branch (692:18): [True: 2, False: 6]
  ------------------
  693|      2|          quantifier->min_ = *v1;
  694|      2|          if (!tryConsume(',')) {
  ------------------
  |  Branch (694:15): [True: 0, False: 2]
  ------------------
  695|       |            // Like {3}
  696|      0|            quantifier->max_ = *v1;
  697|      2|          } else if (auto v2 = tryConsumeDecimalIntegerLiteral()) {
  ------------------
  |  Branch (697:27): [True: 2, False: 0]
  ------------------
  698|       |            // Like {3,5}
  699|      2|            quantifier->max_ = *v2;
  700|      2|          } else {
  701|       |            // Like {3,}
  702|      0|            quantifier->max_ = uintmax;
  703|      0|          }
  704|      2|          if (tryConsume('}')) {
  ------------------
  |  Branch (704:15): [True: 0, False: 2]
  ------------------
  705|      0|            return true;
  706|      0|          }
  707|      2|        }
  708|      8|        current_ = saved;
  709|      8|        return false;
  710|      8|      }
  711|       |
  712|   962k|      default:
  ------------------
  |  Branch (712:7): [True: 962k, False: 10.5k]
  ------------------
  713|   962k|        return false;
  714|   973k|    }
  715|   973k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE31tryConsumeDecimalIntegerLiteralEv:
  954|     10|  Optional<CodePoint> tryConsumeDecimalIntegerLiteral() {
  955|     10|    if (current_ != end_ && '0' <= *current_ && *current_ <= '9')
  ------------------
  |  Branch (955:9): [True: 10, False: 0]
  |  Branch (955:29): [True: 6, False: 4]
  |  Branch (955:49): [True: 4, False: 2]
  ------------------
  956|      4|      return consumeDecimalIntegerLiteral();
  957|      6|    return llvh::None;
  958|     10|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE28consumeDecimalIntegerLiteralEv:
  936|    142|  CodePoint consumeDecimalIntegerLiteral() {
  937|    142|    auto decimalDigit = [](CharT c) { return '0' <= c && c <= '9'; };
  938|    142|    assert(
  939|    142|        current_ != end_ && decimalDigit(*current_) &&
  940|    142|        "Not a decimal integer literal");
  941|       |    // Note that 'max' is a 64 bit value, but contains the max of u32.
  942|    142|    const uint64_t u32max = std::numeric_limits<uint32_t>::max();
  943|    142|    uint64_t bigResult = 0;
  944|    296|    while (auto digit = consumeCharIf(decimalDigit)) {
  ------------------
  |  Branch (944:17): [True: 154, False: 142]
  ------------------
  945|    154|      bigResult = bigResult * 10 + (*digit - '0');
  946|    154|      if (bigResult > u32max) {
  ------------------
  |  Branch (946:11): [True: 0, False: 154]
  ------------------
  947|      0|        bigResult = u32max;
  948|      0|      }
  949|    154|    }
  950|    142|    return static_cast<uint32_t>(bigResult);
  951|    142|  }
_ZZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE28consumeDecimalIntegerLiteralEvENKUlDsE_clEDs:
  937|    438|    auto decimalDigit = [](CharT c) { return '0' <= c && c <= '9'; };
  ------------------
  |  Branch (937:46): [True: 300, False: 138]
  |  Branch (937:58): [True: 296, False: 4]
  ------------------
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE13consumeCharIfIZNS7_28consumeDecimalIntegerLiteralEvEUlDsE_EEN4llvh8OptionalIDsEERKT_:
  163|    296|  Optional<CharT> consumeCharIf(const Pred &pred) {
  164|    296|    if (current_ != end_ && pred(*current_)) {
  ------------------
  |  Branch (164:9): [True: 296, False: 0]
  |  Branch (164:29): [True: 154, False: 142]
  ------------------
  165|    154|      CharT c = *current_;
  166|    154|      consume(c);
  167|    154|      return c;
  168|    154|    }
  169|    142|    return llvh::None;
  170|    296|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE15applyQuantifierERKNS7_10QuantifierE:
  109|  10.5k|  void applyQuantifier(const Quantifier &quant) {
  110|  10.5k|    if (quant.min_ > quant.max_) {
  ------------------
  |  Branch (110:9): [True: 0, False: 10.5k]
  ------------------
  111|      0|      setError(constants::ErrorType::BraceRange);
  112|      0|      return;
  113|      0|    }
  114|  10.5k|    auto quantifiedExpression = re_->spliceOut(quant.quantifiedNodeStart_);
  115|  10.5k|    re_->pushLoop(
  116|  10.5k|        quant.min_,
  117|  10.5k|        quant.max_,
  118|  10.5k|        std::move(quantifiedExpression),
  119|  10.5k|        quant.startMarkedSubexprs_,
  120|  10.5k|        quant.greedy_);
  121|  10.5k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE11consumeTermEv:
  429|  64.7k|  void consumeTerm() {
  430|  1.03M|    while (current_ != end_) {
  ------------------
  |  Branch (430:12): [True: 1.03M, False: 122]
  ------------------
  431|  1.03M|      Quantifier quant = prepareQuantifier();
  432|  1.03M|      bool quantifierAllowed = true;
  433|  1.03M|      const CharT c = *current_;
  434|  1.03M|      switch (c) {
  435|     49|        case '^':
  ------------------
  |  Branch (435:9): [True: 49, False: 1.03M]
  ------------------
  436|     49|          re_->pushLeftAnchor();
  437|     49|          consume('^');
  438|     49|          quantifierAllowed = false;
  439|     49|          break;
  440|       |
  441|     15|        case '$':
  ------------------
  |  Branch (441:9): [True: 15, False: 1.03M]
  ------------------
  442|     15|          re_->pushRightAnchor();
  443|     15|          consume('$');
  444|     15|          quantifierAllowed = false;
  445|     15|          break;
  446|       |
  447|  1.02k|        case '\\': {
  ------------------
  |  Branch (447:9): [True: 1.02k, False: 1.03M]
  ------------------
  448|  1.02k|          consume('\\');
  449|       |          // This may be an ES6 21.2.2.6 Assertion (\b or \B) or an AtomeEscape.
  450|  1.02k|          if (current_ == end_) {
  ------------------
  |  Branch (450:15): [True: 0, False: 1.02k]
  ------------------
  451|      0|            setError(constants::ErrorType::EscapeIncomplete);
  452|      0|            return;
  453|  1.02k|          } else if (*current_ == 'b' || *current_ == 'B') {
  ------------------
  |  Branch (453:22): [True: 368, False: 652]
  |  Branch (453:42): [True: 0, False: 652]
  ------------------
  454|    368|            re_->pushWordBoundary(*current_ == 'B' /* invert */);
  455|    368|            consume(*current_);
  456|    368|            quantifierAllowed = false;
  457|    652|          } else {
  458|    652|            consumeAtomEscape();
  459|    652|          }
  460|  1.02k|          break;
  461|  1.02k|        }
  462|       |
  463|  28.7k|        case '.': {
  ------------------
  |  Branch (463:9): [True: 28.7k, False: 1.00M]
  ------------------
  464|  28.7k|          consume('.');
  465|  28.7k|          re_->pushMatchAny();
  466|  28.7k|          break;
  467|  1.02k|        }
  468|       |
  469|    850|        case '[': {
  ------------------
  |  Branch (469:9): [True: 850, False: 1.03M]
  ------------------
  470|    850|          consumeCharacterClass();
  471|    850|          break;
  472|  1.02k|        }
  473|       |
  474|      0|        case '*':
  ------------------
  |  Branch (474:9): [True: 0, False: 1.03M]
  ------------------
  475|      0|        case '+':
  ------------------
  |  Branch (475:9): [True: 0, False: 1.03M]
  ------------------
  476|      0|        case '?': {
  ------------------
  |  Branch (476:9): [True: 0, False: 1.03M]
  ------------------
  477|      0|          setError(constants::ErrorType::InvalidRepeat);
  478|      0|          return;
  479|      0|        }
  480|       |
  481|      5|        case '{': {
  ------------------
  |  Branch (481:9): [True: 5, False: 1.03M]
  ------------------
  482|       |          // Under Unicode, this is always an error.
  483|       |          // Without Unicode, it is an error if it is a valid quantifier.
  484|       |          // (extension from ES11 Annex B.1.4)
  485|      5|          Quantifier tmp;
  486|      5|          if (tryConsumeQuantifier(&tmp)) {
  ------------------
  |  Branch (486:15): [True: 0, False: 5]
  ------------------
  487|      0|            setError(constants::ErrorType::InvalidRepeat);
  488|      0|            return;
  489|      5|          } else if (flags_.unicode) {
  ------------------
  |  Branch (489:22): [True: 0, False: 5]
  ------------------
  490|      0|            setError(constants::ErrorType::InvalidQuantifierBracket);
  491|      0|            return;
  492|      0|          }
  493|      5|          re_->pushChar(consume('{'));
  494|      5|          break;
  495|      5|        }
  496|       |
  497|  61.4k|        case '|':
  ------------------
  |  Branch (497:9): [True: 61.4k, False: 975k]
  ------------------
  498|  63.0k|        case '(':
  ------------------
  |  Branch (498:9): [True: 1.60k, False: 1.03M]
  ------------------
  499|  64.6k|        case ')': {
  ------------------
  |  Branch (499:9): [True: 1.60k, False: 1.03M]
  ------------------
  500|       |          // This is a new alternation, or the beginning or end of a group or
  501|       |          // assertion. Transfer control back to consumeDisjunction() so it can
  502|       |          // act on it.
  503|  64.6k|          return;
  504|  63.0k|        }
  505|       |
  506|      2|        case '}':
  ------------------
  |  Branch (506:9): [True: 2, False: 1.03M]
  ------------------
  507|    168|        case ']': {
  ------------------
  |  Branch (507:9): [True: 166, False: 1.03M]
  ------------------
  508|       |          // These syntax characters are allowed as atoms in
  509|       |          // ExtendedPatternCharacter production of ES9 Annex B 1.4.
  510|       |          // However they are disallowed under Unicode, where Annex B does not
  511|       |          // apply.
  512|    168|          if (flags_.unicode) {
  ------------------
  |  Branch (512:15): [True: 0, False: 168]
  ------------------
  513|      0|            setError(
  514|      0|                c == '}' ? constants::ErrorType::InvalidQuantifierBracket
  ------------------
  |  Branch (514:17): [True: 0, False: 0]
  ------------------
  515|      0|                         : constants::ErrorType::UnbalancedBracket);
  516|      0|            return;
  517|      0|          }
  518|    168|        }
  519|    168|          [[fallthrough]];
  520|       |
  521|   941k|        default: {
  ------------------
  |  Branch (521:9): [True: 940k, False: 95.5k]
  ------------------
  522|       |          // Ordinary character or surrogate pair.
  523|   941k|          if (auto cp = tryConsumeSurrogatePair()) {
  ------------------
  |  Branch (523:20): [True: 0, False: 941k]
  ------------------
  524|      0|            re_->pushChar(*cp);
  525|   941k|          } else {
  526|   941k|            re_->pushChar(consume(c));
  527|   941k|          }
  528|   941k|          break;
  529|    168|        }
  530|  1.03M|      }
  531|       |
  532|       |      // We just parsed one term. Try parsing a quantifier.
  533|   971k|      if (tryConsumeQuantifier(&quant)) {
  ------------------
  |  Branch (533:11): [True: 10.5k, False: 961k]
  ------------------
  534|  10.5k|        if (!quantifierAllowed) {
  ------------------
  |  Branch (534:13): [True: 0, False: 10.5k]
  ------------------
  535|      0|          setError(constants::ErrorType::InvalidRepeat);
  536|      0|          return;
  537|      0|        }
  538|  10.5k|        applyQuantifier(quant);
  539|  10.5k|      }
  540|   971k|    }
  541|  64.7k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE17consumeAtomEscapeEv:
 1204|    652|  void consumeAtomEscape() {
 1205|    652|    if (current_ == end_) {
  ------------------
  |  Branch (1205:9): [True: 0, False: 652]
  ------------------
 1206|      0|      setError(constants::ErrorType::EscapeIncomplete);
 1207|      0|      return;
 1208|      0|    }
 1209|       |
 1210|    652|    CharT c = *current_;
 1211|    652|    switch (c) {
 1212|      0|      case 'd':
  ------------------
  |  Branch (1212:7): [True: 0, False: 652]
  ------------------
 1213|      1|      case 'D':
  ------------------
  |  Branch (1213:7): [True: 1, False: 651]
  ------------------
 1214|      1|        consume(c);
 1215|      1|        re_->pushCharClass({CharacterClass::Digits, c == 'D' /* invert */});
 1216|      1|        break;
 1217|       |
 1218|      3|      case 's':
  ------------------
  |  Branch (1218:7): [True: 3, False: 649]
  ------------------
 1219|      3|      case 'S':
  ------------------
  |  Branch (1219:7): [True: 0, False: 652]
  ------------------
 1220|      3|        consume(c);
 1221|      3|        re_->pushCharClass({CharacterClass::Spaces, c == 'S' /* invert */});
 1222|      3|        break;
 1223|       |
 1224|      0|      case 'w':
  ------------------
  |  Branch (1224:7): [True: 0, False: 652]
  ------------------
 1225|      0|      case 'W':
  ------------------
  |  Branch (1225:7): [True: 0, False: 652]
  ------------------
 1226|      0|        consume(c);
 1227|      0|        re_->pushCharClass({CharacterClass::Words, c == 'W' /* invert */});
 1228|      0|        break;
 1229|       |
 1230|      0|#ifdef HERMES_ENABLE_UNICODE_REGEXP_PROPERTY_ESCAPES
 1231|      0|      case 'p':
  ------------------
  |  Branch (1231:7): [True: 0, False: 652]
  ------------------
 1232|      0|      case 'P': {
  ------------------
  |  Branch (1232:7): [True: 0, False: 652]
  ------------------
 1233|      0|        if (flags_.unicode) {
  ------------------
  |  Branch (1233:13): [True: 0, False: 0]
  ------------------
 1234|      0|          consume(c);
 1235|      0|          std::string propertyName;
 1236|      0|          std::string propertyValue;
 1237|      0|          if (!tryConsume('{') ||
  ------------------
  |  Branch (1237:15): [True: 0, False: 0]
  ------------------
 1238|      0|              !tryConsumeUnicodePropertyValueExpression(
  ------------------
  |  Branch (1238:15): [True: 0, False: 0]
  ------------------
 1239|      0|                  propertyName, propertyValue)) {
 1240|      0|            setError(constants::ErrorType::InvalidPropertyName);
 1241|      0|            return;
 1242|      0|          }
 1243|      0|          auto bracket = re_->startBracketList(c == 'P' /* invert */);
 1244|      0|          auto codePointRanges =
 1245|      0|              unicodePropertyRanges(propertyName, propertyValue);
 1246|      0|          if (codePointRanges.empty()) {
  ------------------
  |  Branch (1246:15): [True: 0, False: 0]
  ------------------
 1247|      0|            setError(constants::ErrorType::InvalidPropertyName);
 1248|      0|            return;
 1249|      0|          }
 1250|      0|          bracket->addCodePointRanges(codePointRanges);
 1251|      0|          break;
 1252|      0|        } else {
 1253|       |          // When not in Unicode mode, this is just a regular `p` or `P`
 1254|       |          // (unnecessary) escape.
 1255|      0|          re_->pushChar(consumeCharacterEscape());
 1256|      0|        }
 1257|      0|        break;
 1258|      0|      }
 1259|      0|#endif
 1260|       |
 1261|       |        // Note backreferences may NOT begin with 0.
 1262|      0|      case '1':
  ------------------
  |  Branch (1262:7): [True: 0, False: 652]
  ------------------
 1263|     26|      case '2':
  ------------------
  |  Branch (1263:7): [True: 26, False: 626]
  ------------------
 1264|     28|      case '3':
  ------------------
  |  Branch (1264:7): [True: 2, False: 650]
  ------------------
 1265|     39|      case '4':
  ------------------
  |  Branch (1265:7): [True: 11, False: 641]
  ------------------
 1266|     39|      case '5':
  ------------------
  |  Branch (1266:7): [True: 0, False: 652]
  ------------------
 1267|     40|      case '6':
  ------------------
  |  Branch (1267:7): [True: 1, False: 651]
  ------------------
 1268|     40|      case '7':
  ------------------
  |  Branch (1268:7): [True: 0, False: 652]
  ------------------
 1269|    138|      case '8':
  ------------------
  |  Branch (1269:7): [True: 98, False: 554]
  ------------------
 1270|    138|      case '9': {
  ------------------
  |  Branch (1270:7): [True: 0, False: 652]
  ------------------
 1271|       |        // In Unicode mode, this is always a backreference.
 1272|       |        // In non-unicode mode, this is a backreference if its value does not
 1273|       |        // exceed the number of capture groups. Otherwise it is an octal escape
 1274|       |        // if its value is octal. Otherwise it is IdentityEscape.
 1275|    138|        auto saved = current_;
 1276|    138|        uint32_t decimal = consumeDecimalIntegerLiteral();
 1277|    138|        bool unicode = flags_.unicode;
 1278|    138|        if (unicode || decimal <= backRefLimit_) {
  ------------------
  |  Branch (1278:13): [True: 0, False: 138]
  |  Branch (1278:24): [True: 136, False: 2]
  ------------------
 1279|       |          // Backreference.
 1280|    136|          maxBackRef_ = std::max(maxBackRef_, decimal);
 1281|       |          // Subtract 1 so the marked subexpression index starts at zero, to
 1282|       |          // line up with other instructions.
 1283|    136|          re_->pushBackRef(decimal - 1);
 1284|    136|        } else if (c < '8' && !unicode) {
  ------------------
  |  Branch (1284:20): [True: 2, False: 0]
  |  Branch (1284:31): [True: 2, False: 0]
  ------------------
 1285|       |          // Octal.
 1286|      2|          current_ = saved;
 1287|      2|          re_->pushChar(consumeLegacyOctalEscapeSequence());
 1288|      2|        } else {
 1289|       |          // IdentityEscape.
 1290|      0|          current_ = saved;
 1291|      0|          re_->pushChar(identityEscape(consume(c)));
 1292|      0|        }
 1293|    138|        break;
 1294|    138|      }
 1295|       |
 1296|      3|      case 'k': {
  ------------------
  |  Branch (1296:7): [True: 3, False: 649]
  ------------------
 1297|      3|        if (flags_.unicode || hasNamedGroups_) {
  ------------------
  |  Branch (1297:13): [True: 3, False: 0]
  |  Branch (1297:31): [True: 0, False: 0]
  ------------------
 1298|      3|          consume('k');
 1299|      3|          GroupName refIdentifer;
 1300|      3|          if (!tryConsume('<') || !tryConsumeGroupName(refIdentifer)) {
  ------------------
  |  Branch (1300:15): [True: 0, False: 3]
  |  Branch (1300:35): [True: 0, False: 3]
  ------------------
 1301|      0|            setError(constants::ErrorType::InvalidNamedReference);
 1302|      0|            return;
 1303|      0|          }
 1304|      3|          re_->pushNamedBackRef(std::move(refIdentifer));
 1305|      3|          break;
 1306|      3|        }
 1307|      0|        re_->sawNamedBackrefBeforeGroup();
 1308|       |        // If we are not in unicode and we don't have named groups, then fall
 1309|       |        // through and we will consume the k as an identity escape.
 1310|      0|        [[fallthrough]];
 1311|      0|      }
 1312|    507|      default: {
  ------------------
  |  Branch (1312:7): [True: 507, False: 145]
  ------------------
 1313|    507|        re_->pushChar(consumeCharacterEscape());
 1314|    507|        break;
 1315|      0|      }
 1316|    652|    }
 1317|    652|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE22consumeCharacterEscapeEv:
  991|    558|  CodePoint consumeCharacterEscape() {
  992|    558|    if (current_ == end_) {
  ------------------
  |  Branch (992:9): [True: 0, False: 558]
  ------------------
  993|      0|      setError(constants::ErrorType::EscapeIncomplete);
  994|      0|      return 0;
  995|      0|    }
  996|    558|    const CharT c = *current_;
  997|    558|    switch (c) {
  998|      0|      case 'f':
  ------------------
  |  Branch (998:7): [True: 0, False: 558]
  ------------------
  999|      0|        consume('f');
 1000|      0|        return 0xC;
 1001|      1|      case 'n':
  ------------------
  |  Branch (1001:7): [True: 1, False: 557]
  ------------------
 1002|      1|        consume('n');
 1003|      1|        return 0xA;
 1004|      0|      case 'r':
  ------------------
  |  Branch (1004:7): [True: 0, False: 558]
  ------------------
 1005|      0|        consume('r');
 1006|      0|        return 0xD;
 1007|    113|      case 't':
  ------------------
  |  Branch (1007:7): [True: 113, False: 445]
  ------------------
 1008|    113|        consume('t');
 1009|    113|        return 0x9;
 1010|      0|      case 'v':
  ------------------
  |  Branch (1010:7): [True: 0, False: 558]
  ------------------
 1011|      0|        consume('v');
 1012|      0|        return 0xB;
 1013|       |
 1014|      0|      case 'c': {
  ------------------
  |  Branch (1014:7): [True: 0, False: 558]
  ------------------
 1015|      0|        consume('c');
 1016|      0|        auto isControlLetter = [](CharT c) {
 1017|      0|          return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
 1018|      0|        };
 1019|      0|        if (auto cc = consumeCharIf(isControlLetter)) {
  ------------------
  |  Branch (1019:18): [True: 0, False: 0]
  ------------------
 1020|      0|          return *cc % 32;
 1021|      0|        } else {
 1022|      0|          return identityEscape('c');
 1023|      0|        }
 1024|      0|      }
 1025|       |
 1026|      0|      case '0': {
  ------------------
  |  Branch (1026:7): [True: 0, False: 558]
  ------------------
 1027|       |        // CharacterEscape :: "0 [lookahead != DecimalDigit]"
 1028|      0|        auto saved = current_;
 1029|      0|        consume('0');
 1030|      0|        if (current_ == end_ || !('0' <= *current_ && *current_ <= '9')) {
  ------------------
  |  Branch (1030:13): [True: 0, False: 0]
  |  Branch (1030:35): [True: 0, False: 0]
  |  Branch (1030:55): [True: 0, False: 0]
  ------------------
 1031|      0|          return '\0';
 1032|      0|        } else {
 1033|      0|          current_ = saved;
 1034|      0|          return consumeLegacyOctalEscapeSequence();
 1035|      0|        }
 1036|      0|      }
 1037|       |
 1038|     20|      case '1':
  ------------------
  |  Branch (1038:7): [True: 20, False: 538]
  ------------------
 1039|     20|      case '2':
  ------------------
  |  Branch (1039:7): [True: 0, False: 558]
  ------------------
 1040|     22|      case '3':
  ------------------
  |  Branch (1040:7): [True: 2, False: 556]
  ------------------
 1041|     22|      case '4':
  ------------------
  |  Branch (1041:7): [True: 0, False: 558]
  ------------------
 1042|     22|      case '5':
  ------------------
  |  Branch (1042:7): [True: 0, False: 558]
  ------------------
 1043|     24|      case '6':
  ------------------
  |  Branch (1043:7): [True: 2, False: 556]
  ------------------
 1044|     24|      case '7': {
  ------------------
  |  Branch (1044:7): [True: 0, False: 558]
  ------------------
 1045|     24|        return consumeLegacyOctalEscapeSequence();
 1046|     24|      }
 1047|       |
 1048|      0|      case 'u': {
  ------------------
  |  Branch (1048:7): [True: 0, False: 558]
  ------------------
 1049|      0|        if (auto ret = tryConsumeUnicodeEscapeSequence()) {
  ------------------
  |  Branch (1049:18): [True: 0, False: 0]
  ------------------
 1050|      0|          return *ret;
 1051|      0|        } else {
 1052|       |          // IdentityEscape
 1053|      0|          return identityEscape(consume(c));
 1054|      0|        }
 1055|      0|      }
 1056|       |
 1057|     43|      case 'x': {
  ------------------
  |  Branch (1057:7): [True: 43, False: 515]
  ------------------
 1058|     43|        consume(c);
 1059|     43|        if (auto ret = tryConsumeHexDigits(2)) {
  ------------------
  |  Branch (1059:18): [True: 32, False: 11]
  ------------------
 1060|     32|          return *ret;
 1061|     32|        } else {
 1062|       |          // Not followed by sufficient hex digits.
 1063|       |          // Note this is not an error; for example /\x1Z/ matches "x1Z" via
 1064|       |          // IdentityEscape.
 1065|     11|          return identityEscape(c);
 1066|     11|        }
 1067|     43|      }
 1068|       |
 1069|    377|      default: {
  ------------------
  |  Branch (1069:7): [True: 377, False: 181]
  ------------------
 1070|       |        // IdentityEscape
 1071|    377|        return identityEscape(consume(c));
 1072|     43|      }
 1073|    558|    }
 1074|    558|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE32consumeLegacyOctalEscapeSequenceEv:
  905|     26|  CodePoint consumeLegacyOctalEscapeSequence() {
  906|       |    // LegacyOctalEscapeSequence:
  907|       |    //   OctalDigit [lookahead not OctalDigit]
  908|       |    //   ZeroToThree OctalDigit [lookahead not OctalDigit]
  909|       |    //   FourToSeven OctalDigit
  910|       |    //   ZeroToThree OctalDigit OctalDigit
  911|       |    // We implement this more directly.
  912|       |    // Note this is forbidden in Unicode.
  913|     26|    if (flags_.unicode) {
  ------------------
  |  Branch (913:9): [True: 0, False: 26]
  ------------------
  914|      0|      setError(constants::ErrorType::EscapeInvalid);
  915|      0|      return 0;
  916|      0|    }
  917|     26|    auto isOctalDigit = [](CharT c) { return '0' <= c && c <= '7'; };
  918|     26|    assert(
  919|     26|        current_ != end_ && isOctalDigit(*current_) &&
  920|     26|        "Should have leading octal digit");
  921|     26|    auto d1 = *current_++;
  922|     26|    auto d2 = consumeCharIf(isOctalDigit);
  923|     26|    auto d3 = (d1 <= '3' ? consumeCharIf(isOctalDigit) : llvh::None);
  ------------------
  |  Branch (923:16): [True: 24, False: 2]
  ------------------
  924|       |
  925|     26|    char16_t result = d1 - '0';
  926|     26|    if (d2)
  ------------------
  |  Branch (926:9): [True: 6, False: 20]
  ------------------
  927|      6|      result = result * 8 + (*d2 - '0');
  928|     26|    if (d3)
  ------------------
  |  Branch (928:9): [True: 4, False: 22]
  ------------------
  929|      4|      result = result * 8 + (*d3 - '0');
  930|     26|    return result;
  931|     26|  }
_ZZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE32consumeLegacyOctalEscapeSequenceEvENKUlDsE_clEDs:
  917|     76|    auto isOctalDigit = [](CharT c) { return '0' <= c && c <= '7'; };
  ------------------
  |  Branch (917:46): [True: 76, False: 0]
  |  Branch (917:58): [True: 36, False: 40]
  ------------------
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE13consumeCharIfIZNS7_32consumeLegacyOctalEscapeSequenceEvEUlDsE_EEN4llvh8OptionalIDsEERKT_:
  163|     50|  Optional<CharT> consumeCharIf(const Pred &pred) {
  164|     50|    if (current_ != end_ && pred(*current_)) {
  ------------------
  |  Branch (164:9): [True: 50, False: 0]
  |  Branch (164:29): [True: 10, False: 40]
  ------------------
  165|     10|      CharT c = *current_;
  166|     10|      consume(c);
  167|     10|      return c;
  168|     10|    }
  169|     40|    return llvh::None;
  170|     50|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE14identityEscapeEDs:
 1077|    388|  CodePoint identityEscape(CharT c) {
 1078|       |    // In Unicode regexps, only syntax characters and '/' may be escaped.
 1079|    388|    if (flags_.unicode) {
  ------------------
  |  Branch (1079:9): [True: 0, False: 388]
  ------------------
 1080|      0|      if (c == 0 || c > 127 || !strchr("^$\\.*+?()[]{}|/", c)) {
  ------------------
  |  Branch (1080:11): [True: 0, False: 0]
  |  Branch (1080:21): [True: 0, False: 0]
  |  Branch (1080:32): [True: 0, False: 0]
  ------------------
 1081|      0|        setError(constants::ErrorType::EscapeInvalid);
 1082|      0|      }
 1083|      0|    }
 1084|       |    // TODO: disallow "UnicodeIDContinue".
 1085|    388|    return c;
 1086|    388|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE21consumeCharacterClassEv:
  718|    850|  void consumeCharacterClass() {
  719|    850|    consume('[');
  720|    850|    bool unicode = flags_.unicode;
  721|    850|    bool negate = tryConsume('^');
  722|    850|    auto bracket = re_->startBracketList(negate);
  723|       |
  724|       |    // Helper to add a ClassAtom to our bracket.
  725|    850|    auto addClassAtom = [&bracket](const ClassAtom &atom) {
  726|    850|      if (atom.charClass) {
  727|    850|        bracket->addClass(*atom.charClass);
  728|    850|      } else if (atom.codePointRanges) {
  729|    850|        bracket->addCodePointRanges(
  730|    850|            atom.codePointRanges->rangeArray, atom.codePointRanges->inverted_);
  731|    850|      } else {
  732|    850|        bracket->addChar(atom.codePoint);
  733|    850|      }
  734|    850|      return true;
  735|    850|    };
  736|       |
  737|  2.42k|    for (;;) {
  738|  2.42k|      if (current_ == end_) {
  ------------------
  |  Branch (738:11): [True: 0, False: 2.42k]
  ------------------
  739|      0|        setError(constants::ErrorType::UnbalancedBracket);
  740|      0|        return;
  741|      0|      }
  742|       |
  743|  2.42k|      if (tryConsume(']')) {
  ------------------
  |  Branch (743:11): [True: 850, False: 1.57k]
  ------------------
  744|       |        // End of bracket.
  745|    850|        return;
  746|    850|      }
  747|       |
  748|       |      // Parse a code point or character class.
  749|  1.57k|      Optional<ClassAtom> first = tryConsumeBracketClassAtom();
  750|  1.57k|      if (!first)
  ------------------
  |  Branch (750:11): [True: 0, False: 1.57k]
  ------------------
  751|      0|        continue;
  752|       |
  753|       |      // See if we have a dash.
  754|  1.57k|      if (!tryConsume('-')) {
  ------------------
  |  Branch (754:11): [True: 1.57k, False: 0]
  ------------------
  755|  1.57k|        if (!addClassAtom(*first)) {
  ------------------
  |  Branch (755:13): [True: 0, False: 1.57k]
  ------------------
  756|      0|          return;
  757|      0|        }
  758|  1.57k|        continue;
  759|  1.57k|      }
  760|       |
  761|       |      // We have a dash; we may have a range.
  762|      0|      Optional<ClassAtom> second = tryConsumeBracketClassAtom();
  763|      0|      if (!second) {
  ------------------
  |  Branch (763:11): [True: 0, False: 0]
  ------------------
  764|       |        // No second atom. For example: [a-].
  765|      0|        addClassAtom(*first);
  766|      0|        addClassAtom(ClassAtom('-'));
  767|      0|        continue;
  768|      0|      }
  769|       |
  770|       |      // We have a range like [a-z].
  771|      0|      if (unicode &&
  ------------------
  |  Branch (771:11): [True: 0, False: 0]
  ------------------
  772|      0|          (first->codePointRanges || second->codePointRanges ||
  ------------------
  |  Branch (772:12): [True: 0, False: 0]
  |  Branch (772:38): [True: 0, False: 0]
  ------------------
  773|      0|           first->charClass || second->charClass)) {
  ------------------
  |  Branch (773:12): [True: 0, False: 0]
  |  Branch (773:32): [True: 0, False: 0]
  ------------------
  774|       |        // Unicode mode does not allow ranges with properties or character
  775|       |        // classes: [\d-z] is invalid, so is [\p{Number}-z]
  776|      0|        setError(constants::ErrorType::CharacterRange);
  777|      0|        return;
  778|      0|      }
  779|       |
  780|      0|      if (first->charClass || second->charClass) {
  ------------------
  |  Branch (780:11): [True: 0, False: 0]
  |  Branch (780:31): [True: 0, False: 0]
  ------------------
  781|       |        // The non-unicode path just pretends the range doesn't exist.
  782|       |        // /[\d-A]/ is the same as /[\dA-]/.
  783|       |        // Note we still have to process all three characters. For
  784|       |        // example:
  785|       |        // [\d-a-z] contains the atoms \d, -, a, -, z.
  786|       |        // It does NOT contain the range a-z.
  787|      0|        addClassAtom(*first);
  788|      0|        addClassAtom(ClassAtom('-'));
  789|      0|        addClassAtom(*second);
  790|      0|        continue;
  791|      0|      }
  792|       |
  793|       |      // Here we know it's a real range: [a-z] and not [\d-f].
  794|       |      // However it could be out of order: [z-a]
  795|       |      // ES6 21.2.2.15.1 "If i > j, throw a SyntaxError exception"
  796|      0|      if (first->codePoint > second->codePoint) {
  ------------------
  |  Branch (796:11): [True: 0, False: 0]
  ------------------
  797|      0|        setError(constants::ErrorType::CharacterRange);
  798|      0|        return;
  799|      0|      }
  800|       |      // This range has been validated.
  801|      0|      bracket->addRange(first->codePoint, second->codePoint);
  802|      0|    }
  803|    850|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE26tryConsumeBracketClassAtomEv:
  805|  1.57k|  Optional<ClassAtom> tryConsumeBracketClassAtom() {
  806|  1.57k|    if (current_ == end_) {
  ------------------
  |  Branch (806:9): [True: 0, False: 1.57k]
  ------------------
  807|      0|      return llvh::None;
  808|      0|    }
  809|  1.57k|    CharT c = *current_;
  810|  1.57k|    switch (c) {
  811|      0|      case ']': {
  ------------------
  |  Branch (811:7): [True: 0, False: 1.57k]
  ------------------
  812|       |        // End of bracket. Note we don't consume it here.
  813|      0|        return llvh::None;
  814|      0|      }
  815|       |
  816|     51|      case '\\': {
  ------------------
  |  Branch (816:7): [True: 51, False: 1.52k]
  ------------------
  817|     51|        consume('\\');
  818|     51|        if (current_ == end_) {
  ------------------
  |  Branch (818:13): [True: 0, False: 51]
  ------------------
  819|      0|          setError(constants::ErrorType::EscapeIncomplete);
  820|      0|          return llvh::None;
  821|      0|        }
  822|     51|        CharT ec = *current_;
  823|     51|        switch (ec) {
  824|       |            /// ES6 21.2.2.12 CharacterClassEscape.
  825|       |            /// Note this is used inside brackets only, like /[\d]/.
  826|      0|          case 'd':
  ------------------
  |  Branch (826:11): [True: 0, False: 51]
  ------------------
  827|      0|          case 'D': {
  ------------------
  |  Branch (827:11): [True: 0, False: 51]
  ------------------
  828|      0|            consume(ec);
  829|      0|            return ClassAtom(CharacterClass::Digits, ec == 'D' /* invert */);
  830|      0|          }
  831|      0|          case 's':
  ------------------
  |  Branch (831:11): [True: 0, False: 51]
  ------------------
  832|      0|          case 'S': {
  ------------------
  |  Branch (832:11): [True: 0, False: 51]
  ------------------
  833|      0|            consume(ec);
  834|      0|            return ClassAtom(CharacterClass::Spaces, ec == 'S' /* invert */);
  835|      0|          }
  836|      0|          case 'w':
  ------------------
  |  Branch (836:11): [True: 0, False: 51]
  ------------------
  837|      0|          case 'W': {
  ------------------
  |  Branch (837:11): [True: 0, False: 51]
  ------------------
  838|      0|            consume(ec);
  839|      0|            return ClassAtom(CharacterClass::Words, ec == 'W' /* invert */);
  840|      0|          }
  841|       |
  842|      0|#ifdef HERMES_ENABLE_UNICODE_REGEXP_PROPERTY_ESCAPES
  843|      0|          case 'p':
  ------------------
  |  Branch (843:11): [True: 0, False: 51]
  ------------------
  844|      0|          case 'P': {
  ------------------
  |  Branch (844:11): [True: 0, False: 51]
  ------------------
  845|      0|            if (flags_.unicode) {
  ------------------
  |  Branch (845:17): [True: 0, False: 0]
  ------------------
  846|      0|              consume(ec);
  847|      0|              std::string propertyName;
  848|      0|              std::string propertyValue;
  849|      0|              if (!tryConsume('{') ||
  ------------------
  |  Branch (849:19): [True: 0, False: 0]
  ------------------
  850|      0|                  !tryConsumeUnicodePropertyValueExpression(
  ------------------
  |  Branch (850:19): [True: 0, False: 0]
  ------------------
  851|      0|                      propertyName, propertyValue)) {
  852|      0|                setError(constants::ErrorType::InvalidPropertyName);
  853|      0|                return llvh::None;
  854|      0|              }
  855|       |
  856|      0|              auto codePointRanges =
  857|      0|                  unicodePropertyRanges(propertyName, propertyValue);
  858|      0|              if (codePointRanges.empty()) {
  ------------------
  |  Branch (858:19): [True: 0, False: 0]
  ------------------
  859|      0|                setError(constants::ErrorType::InvalidPropertyName);
  860|      0|                return llvh::None;
  861|      0|              }
  862|      0|              return ClassAtom(codePointRanges, ec == 'P' /* invert */);
  863|      0|            } else {
  864|       |              // When not in Unicode mode, this is just a regular `p` or `P`
  865|       |              // (unnecessary) escape.
  866|      0|              return ClassAtom(consumeCharacterEscape());
  867|      0|            }
  868|      0|          }
  869|      0|#endif
  870|       |
  871|      0|          case 'b': {
  ------------------
  |  Branch (871:11): [True: 0, False: 51]
  ------------------
  872|       |            // "Return the CharSet containing the single character <BS>
  873|       |            // U+0008 (BACKSPACE)"
  874|      0|            consume('b');
  875|      0|            return ClassAtom(0x08);
  876|      0|          }
  877|       |
  878|      0|          case '-':
  ------------------
  |  Branch (878:11): [True: 0, False: 51]
  ------------------
  879|       |            // ES6 21.2.1 ClassEscape: \- escapes -, in Unicode expressions
  880|       |            // only.
  881|      0|            if ((flags_.unicode) && tryConsume('-')) {
  ------------------
  |  Branch (881:17): [True: 0, False: 0]
  |  Branch (881:37): [True: 0, False: 0]
  ------------------
  882|      0|              return ClassAtom('-');
  883|      0|            }
  884|      0|            [[fallthrough]];
  885|       |
  886|     51|          default: {
  ------------------
  |  Branch (886:11): [True: 51, False: 0]
  ------------------
  887|     51|            return ClassAtom(consumeCharacterEscape());
  888|      0|          }
  889|     51|        }
  890|     51|      }
  891|       |
  892|  1.52k|      default: {
  ------------------
  |  Branch (892:7): [True: 1.52k, False: 51]
  ------------------
  893|       |        // Ordinary character or surrogate pair.
  894|  1.52k|        if (auto cp = tryConsumeSurrogatePair()) {
  ------------------
  |  Branch (894:18): [True: 0, False: 1.52k]
  ------------------
  895|      0|          return ClassAtom(*cp);
  896|  1.52k|        } else {
  897|  1.52k|          return ClassAtom(consume(c));
  898|  1.52k|        }
  899|  1.52k|      }
  900|  1.57k|    }
  901|  1.57k|  }
_ZZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE21consumeCharacterClassEvENKUlRKNS7_9ClassAtomEE_clESA_:
  725|  1.57k|    auto addClassAtom = [&bracket](const ClassAtom &atom) {
  726|  1.57k|      if (atom.charClass) {
  ------------------
  |  Branch (726:11): [True: 0, False: 1.57k]
  ------------------
  727|      0|        bracket->addClass(*atom.charClass);
  728|  1.57k|      } else if (atom.codePointRanges) {
  ------------------
  |  Branch (728:18): [True: 0, False: 1.57k]
  ------------------
  729|      0|        bracket->addCodePointRanges(
  730|      0|            atom.codePointRanges->rangeArray, atom.codePointRanges->inverted_);
  731|  1.57k|      } else {
  732|  1.57k|        bracket->addChar(atom.codePoint);
  733|  1.57k|      }
  734|  1.57k|      return true;
  735|  1.57k|    };
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE9ClassAtomC2Ej:
   38|  1.57k|    explicit ClassAtom(CodePoint cp) : codePoint(cp) {}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE23tryConsumeSurrogatePairEv:
  544|   942k|  Optional<CodePoint> tryConsumeSurrogatePair() {
  545|   942k|    if (!(flags_.unicode))
  ------------------
  |  Branch (545:9): [True: 787k, False: 155k]
  ------------------
  546|   787k|      return llvh::None;
  547|   155k|    auto saved = current_;
  548|   155k|    auto hi = consumeCharIf(isHighSurrogate);
  549|   155k|    auto lo = consumeCharIf(isLowSurrogate);
  550|   155k|    if (hi && lo) {
  ------------------
  |  Branch (550:9): [True: 0, False: 155k]
  |  Branch (550:15): [True: 0, False: 0]
  ------------------
  551|      0|      return utf16SurrogatePairToCodePoint(*hi, *lo);
  552|      0|    }
  553|   155k|    current_ = saved;
  554|   155k|    return llvh::None;
  555|   155k|  }
_ZNK6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE10maxBackRefEv:
 1345|    122|  uint32_t maxBackRef() const {
 1346|    122|    return maxBackRef_;
 1347|    122|  }

_ZN6hermes14CompiledRegExpC2EOS0_:
  316|    167|CompiledRegExp::CompiledRegExp(CompiledRegExp &&) = default;
_ZN6hermes14CompiledRegExpD2Ev:
  318|    286|CompiledRegExp::~CompiledRegExp() {}
_ZN6hermes14CompiledRegExpC2ENSt3__16vectorIhNS1_9allocatorIhEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS3_IcEEEESA_ONS1_5dequeIN4llvh11SmallVectorIDsLj5EEENS3_ISE_EEEEONSC_8DenseMapINSC_8ArrayRefIDsEEjNSC_12DenseMapInfoISK_EENSC_6detail12DenseMapPairISK_jEEEE:
  325|    119|    : bytecode_(std::move(bytecode)),
  326|    119|      pattern_(std::move(pattern)),
  327|    119|      flags_(std::move(flags)),
  328|    119|      orderedGroupNames_(std::move(orderedGroupNames)),
  329|    119|      mapping_(std::move(mapping)) {}
_ZN6hermes14CompiledRegExp10tryCompileEN4llvh9StringRefES2_PS2_:
  334|    120|    llvh::StringRef *outError) {
  335|    120|  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|    120|  llvh::SmallVector<char16_t, 16> re16;
  340|    120|  convertUTF8WithSurrogatesToUTF16(
  341|    120|      std::back_inserter(re16), pattern.begin(), pattern.end());
  342|       |
  343|    120|  llvh::SmallVector<char16_t, 6> flags16;
  344|    120|  convertUTF8WithSurrogatesToUTF16(
  345|    120|      std::back_inserter(flags16), flags.begin(), flags.end());
  346|       |  // Build and compile the regexp.
  347|    120|  auto re = regex::Regex<regex::UTF16RegexTraits>(re16, flags16);
  348|    120|  if (!re.valid()) {
  ------------------
  |  Branch (348:7): [True: 1, False: 119]
  ------------------
  349|      1|    if (outError)
  ------------------
  |  Branch (349:9): [True: 1, False: 0]
  ------------------
  350|      1|      *outError = messageForError(re.getError());
  351|      1|    return llvh::None;
  352|      1|  }
  353|    119|  return CompiledRegExp(
  354|    119|      re.compile(),
  355|    119|      pattern,
  356|    119|      flags,
  357|    119|      re.acquireOrderedGroupNames(),
  358|    119|      re.acquireGroupNamesMapping());
  359|    120|}
_ZNK6hermes14CompiledRegExp11getBytecodeEv:
  361|     96|llvh::ArrayRef<uint8_t> CompiledRegExp::getBytecode() const {
  362|     96|  return bytecode_;
  363|     96|}
_ZNK6hermes19UniquingRegExpTable12getEntryListEv:
  365|    196|std::vector<RegExpTableEntry> UniquingRegExpTable::getEntryList() const {
  366|    196|  std::vector<RegExpTableEntry> result;
  367|    196|  result.reserve(regexps_.size());
  368|    196|  uint32_t offset = 0;
  369|    196|  for (const auto &re : regexps_) {
  ------------------
  |  Branch (369:23): [True: 48, False: 196]
  ------------------
  370|     48|    uint32_t size = re->getBytecode().size();
  371|     48|    result.push_back(RegExpTableEntry{offset, size});
  372|     48|    offset += size;
  373|     48|  }
  374|    196|  return result;
  375|    196|}
_ZNK6hermes19UniquingRegExpTable17getBytecodeBufferEv:
  377|    196|RegExpBytecode UniquingRegExpTable::getBytecodeBuffer() const {
  378|    196|  RegExpBytecode result;
  379|    196|  for (const auto &re : regexps_) {
  ------------------
  |  Branch (379:23): [True: 48, False: 196]
  ------------------
  380|     48|    auto bytecode = re->getBytecode();
  381|     48|    result.insert(result.end(), bytecode.begin(), bytecode.end());
  382|     48|  }
  383|    196|  return result;
  384|    196|}

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

_ZN6hermes6bigint17dropExtraSignBitsEN4llvh8ArrayRefIhEE:
   31|  1.17M|llvh::ArrayRef<uint8_t> dropExtraSignBits(llvh::ArrayRef<uint8_t> src) {
   32|  1.17M|  if (src.empty()) {
  ------------------
  |  Branch (32:7): [True: 0, False: 1.17M]
  ------------------
   33|       |    // return an empty array ref.
   34|      0|    return src;
   35|      0|  }
   36|       |
   37|  1.17M|  const uint8_t drop = getSignExtValue<uint8_t>(src.back());
   38|       |
   39|       |  // Iterate over all bytes in src, in reverse order, and drop everything that
   40|       |  // can be inferred with a sign-extension from the previous byte. For example,
   41|       |  //
   42|       |  // src = { 0x00, 0x00, 0x00, 0xff }
   43|       |  //
   44|       |  // results in { 0x00, 0xff } so that sign extension results in the original
   45|       |  // sequence being reconstructed.
   46|       |
   47|  1.17M|  auto previousSrc = src;
   48|  10.1M|  while (!src.empty() && src.back() == drop) {
  ------------------
  |  Branch (48:10): [True: 9.37M, False: 781k]
  |  Branch (48:26): [True: 8.98M, False: 390k]
  ------------------
   49|  8.98M|    previousSrc = src;
   50|  8.98M|    src = src.drop_back();
   51|  8.98M|  }
   52|       |
   53|       |  // Invariants:
   54|       |  //
   55|       |  //  * previousSrc.size() > 0
   56|       |  //  * previousSrc == src -> no bytes dropped from src
   57|       |  //  * previousSrc != src -> previousSrc.back() == drop
   58|       |  //  * src.empty() -> original src = {drop, drop, drop, ..., drop, drop} and
   59|       |  //                   previousSrc[0] == drop
   60|       |  //
   61|       |  // The return value should be
   62|       |  //  * {} iff src.empty and drop == 0x00; or
   63|       |  //  * {0xff} iff src.empty and drop == 0xff; or
   64|       |  //  * src iff getSignExtValue(src.back()) == drop; and
   65|       |  //  * previousSrc otherwise
   66|       |  //
   67|       |  // which can be expressed as
   68|       |  //  * src iff src.empty and drop == 0x00; or
   69|       |  //  * previousSrc iff src.empty and drop == 0xff; or
   70|       |  //  * src iff getSignExtValue(src.back()) == drop; and
   71|       |  //  * previousSrc otherwise
   72|       |  //
   73|       |  // By defining
   74|       |  //   lastChar = src.empty ? 0 : src.back,
   75|       |  //
   76|       |  // the return value can be expressed as
   77|       |  //  * src iff getSignExtValue(lastChar) == drop; and
   78|       |  //  * previousSrc otherwise
   79|  1.17M|  const uint8_t lastChar = src.empty() ? 0u : src.back();
  ------------------
  |  Branch (79:28): [True: 781k, False: 390k]
  ------------------
   80|       |
   81|  1.17M|  return getSignExtValue<uint8_t>(lastChar) == drop ? src : previousSrc;
  ------------------
  |  Branch (81:10): [True: 1.17M, False: 0]
  ------------------
   82|  1.17M|}
_ZN6hermes6bigint13initWithBytesENS0_16MutableBigIntRefEN4llvh8ArrayRefIhEE:
  114|   390k|    llvh::ArrayRef<uint8_t> data) {
  115|   390k|  const uint32_t dstSizeInBytes = dst.numDigits * BigIntDigitSizeInBytes;
  116|       |
  117|   390k|  assert(dst.digits != nullptr && "buffer can't be nullptr");
  118|       |
  119|   390k|  if (dstSizeInBytes < data.size()) {
  ------------------
  |  Branch (119:7): [True: 0, False: 390k]
  ------------------
  120|       |    // clear numDigits in the response (i.e., sanitizing the output).
  121|      0|    dst.numDigits = 0;
  122|      0|    return OperationStatus::DEST_TOO_SMALL;
  123|      0|  }
  124|       |
  125|   390k|  const size_t dataSizeInBytes = data.size();
  126|       |
  127|   390k|  if (dataSizeInBytes == 0) {
  ------------------
  |  Branch (127:7): [True: 0, False: 390k]
  ------------------
  128|       |    // data is empty, so don't bother copying it to dst; simply return 0n.
  129|      0|    dst.numDigits = 0;
  130|      0|    return OperationStatus::RETURNED;
  131|      0|  }
  132|       |
  133|       |  // Get a uint8_t* to dst so we can do pointer arithmetic.
  134|   390k|  auto *ptr = reinterpret_cast<uint8_t *>(dst.digits);
  135|       |
  136|       |  // Copy bytes first; dataSizeInBytes may not be a multiple of
  137|       |  // BigIntDigitSizeInBytes.
  138|   390k|  memcpy(ptr, data.data(), dataSizeInBytes);
  139|       |
  140|       |  // Now sign-extend to a length that's multiple of DigitType size. Note that
  141|       |  // dataSizeInBytes is not zero (otherwise the function would have returned)
  142|       |  // by now.
  143|   390k|  const uint32_t numBytesToSet = dstSizeInBytes - dataSizeInBytes;
  144|   390k|  const uint8_t signExtValue =
  145|   390k|      getSignExtValue<uint8_t>(ptr[dataSizeInBytes - 1]);
  146|       |
  147|   390k|  memset(ptr + dataSizeInBytes, signExtValue, numBytesToSet);
  148|       |
  149|   390k|  ensureCanonicalResult(dst);
  150|   390k|  return OperationStatus::RETURNED;
  151|   390k|}
_ZN6hermes6bigint10isNegativeENS0_18ImmutableBigIntRefE:
  153|  2.34M|bool isNegative(ImmutableBigIntRef src) {
  154|  2.34M|  return src.numDigits > 0 &&
  ------------------
  |  Branch (154:10): [True: 1.56M, False: 781k]
  ------------------
  155|  2.34M|      static_cast<SignedBigIntDigitType>(src.digits[src.numDigits - 1]) < 0;
  ------------------
  |  Branch (155:7): [True: 1, False: 1.56M]
  ------------------
  156|  2.34M|}
_ZN6hermes6bigint12ParsedBigInt28parsedBigIntFromNumericValueEN4llvh9StringRefEPNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
 1030|      5|    std::string *outError) {
 1031|      5|  std::optional<ParsedBigInt> ret;
 1032|      5|  if (auto maybeBytes = parsedBigIntFrom<NumericValueParser>(input, outError)) {
  ------------------
  |  Branch (1032:12): [True: 5, False: 0]
  ------------------
 1033|      5|    ret = ParsedBigInt(std::move(*maybeBytes));
 1034|      5|  }
 1035|       |
 1036|      5|  return ret;
 1037|      5|}
_ZN6hermes6bigint8toStringENS0_18ImmutableBigIntRefEh:
 1039|   781k|std::string toString(ImmutableBigIntRef src, uint8_t radix) {
 1040|   781k|  assert(radix >= 2 && radix <= 36);
 1041|       |
 1042|   781k|  if (compare(src, 0) == 0) {
  ------------------
  |  Branch (1042:7): [True: 0, False: 781k]
  ------------------
 1043|      0|    return "0";
 1044|      0|  }
 1045|       |
 1046|   781k|  const unsigned numBits = src.numDigits * BigIntDigitSizeInBytes * 8;
 1047|   781k|  const bool sign = isNegative(src);
 1048|   781k|  llvh::APInt tmp(numBits, llvh::makeArrayRef(src.digits, src.numDigits));
 1049|       |
 1050|   781k|  if (sign) {
  ------------------
  |  Branch (1050:7): [True: 0, False: 781k]
  ------------------
 1051|       |    // negate negative numbers, and then add a "-" to the output.
 1052|      0|    tmp.negate();
 1053|      0|  }
 1054|       |
 1055|   781k|  std::string digits;
 1056|       |
 1057|       |  // avoid trashing the heap by pre-allocating the largest possible string
 1058|       |  // returned by this function. The "1" below is to account for a possible "-"
 1059|       |  // sign.
 1060|   781k|  digits.reserve(1 + src.numDigits * maxCharsPerDigitInRadix(radix));
 1061|  1.56M|  do {
 1062|  1.56M|    llvh::APInt quoc;
 1063|  1.56M|    uint64_t rem;
 1064|  1.56M|    llvh::APInt::udivrem(tmp, static_cast<uint64_t>(radix), quoc, rem);
 1065|       |
 1066|  1.56M|    if (rem < 10) {
  ------------------
  |  Branch (1066:9): [True: 1.56M, False: 0]
  ------------------
 1067|  1.56M|      digits.push_back('0' + rem);
 1068|  1.56M|    } else {
 1069|      0|      digits.push_back('a' + rem - 10);
 1070|      0|    }
 1071|       |
 1072|  1.56M|    tmp = std::move(quoc);
 1073|  1.56M|  } while (tmp != 0);
  ------------------
  |  Branch (1073:12): [True: 781k, False: 781k]
  ------------------
 1074|       |
 1075|   781k|  if (sign) {
  ------------------
  |  Branch (1075:7): [True: 0, False: 781k]
  ------------------
 1076|      0|    digits.push_back('-');
 1077|      0|  }
 1078|       |
 1079|   781k|  std::reverse(digits.begin(), digits.end());
 1080|   781k|  return digits;
 1081|   781k|}
_ZN6hermes6bigint7compareENS0_18ImmutableBigIntRefES1_:
 1101|   781k|int compare(ImmutableBigIntRef lhs, ImmutableBigIntRef rhs) {
 1102|   781k|  const int kLhsGreater = 1;
 1103|   781k|  const int kRhsGreater = -kLhsGreater;
 1104|       |
 1105|   781k|  const bool lhsSign = isNegative(lhs);
 1106|   781k|  const bool rhsSign = isNegative(rhs);
 1107|       |
 1108|       |  // Different signs:
 1109|       |  //   1) lhsSign => !rhsSign => lhs < rhs; or
 1110|       |  //   2) !lhsSign => rhsSign => lhs > rhs
 1111|   781k|  if (lhsSign != rhsSign) {
  ------------------
  |  Branch (1111:7): [True: 0, False: 781k]
  ------------------
 1112|      0|    return lhsSign ? kRhsGreater : kLhsGreater;
  ------------------
  |  Branch (1112:12): [True: 0, False: 0]
  ------------------
 1113|      0|  }
 1114|       |
 1115|   781k|  int result;
 1116|       |
 1117|   781k|  if (lhs.numDigits == rhs.numDigits) {
  ------------------
  |  Branch (1117:7): [True: 0, False: 781k]
  ------------------
 1118|       |    // Defer to APInt's comparison routine.
 1119|      0|    result = llvh::APInt::tcCompare(lhs.digits, rhs.digits, lhs.numDigits);
 1120|   781k|  } else {
 1121|       |    // bigints are always created using their compact representation, thus
 1122|       |    // their sizes (in number of digits) can be used to compare them, with
 1123|       |    // the bigint that has more digits being greater/less (depending on
 1124|       |    // their sign).
 1125|   781k|    if (lhsSign) {
  ------------------
  |  Branch (1125:9): [True: 0, False: 781k]
  ------------------
 1126|       |      // negative numbers -- the one with fewer digits is the greater.
 1127|      0|      result = lhs.numDigits < rhs.numDigits ? kLhsGreater : kRhsGreater;
  ------------------
  |  Branch (1127:16): [True: 0, False: 0]
  ------------------
 1128|   781k|    } else {
 1129|       |      // positive numbers -- the one with most digits is the greater.
 1130|   781k|      result = lhs.numDigits < rhs.numDigits ? kRhsGreater : kLhsGreater;
  ------------------
  |  Branch (1130:16): [True: 0, False: 781k]
  ------------------
 1131|   781k|    }
 1132|   781k|  }
 1133|       |
 1134|   781k|  return result;
 1135|   781k|}
_ZN6hermes6bigint7compareENS0_18ImmutableBigIntRefEl:
 1161|   781k|int compare(ImmutableBigIntRef lhs, SignedBigIntDigitType rhs) {
 1162|       |  // wrapping rhs in a ImmutableBigIntRef is safe -- rhs outlives the temporary.
 1163|   781k|  return compare(lhs, makeImmutableRefFromSignedDigit(rhs));
 1164|   781k|}
_ZN6hermes6bigint20unaryMinusResultSizeENS0_18ImmutableBigIntRefE:
 1375|      1|uint32_t unaryMinusResultSize(ImmutableBigIntRef src) {
 1376|       |  // negating a non-negative number requires at most the same number of digits,
 1377|       |  // but it could require less; negating a negative number could require an
 1378|       |  // extra digit to hold the sign bit(s). Specifically, negating
 1379|       |  //
 1380|       |  // 0x8000000000000000n (which is a negative number)
 1381|       |  //
 1382|       |  // requires an extra digit:
 1383|       |  //
 1384|       |  // 0x0000000000000000 0x8000000000000000n
 1385|      1|  return !isNegative(src) ? src.numDigits : src.numDigits + 1;
  ------------------
  |  Branch (1385:10): [True: 1, False: 0]
  ------------------
 1386|      1|}
_ZN6hermes6bigint10unaryMinusENS0_16MutableBigIntRefENS0_18ImmutableBigIntRefE:
 1388|      1|OperationStatus unaryMinus(MutableBigIntRef dst, ImmutableBigIntRef src) {
 1389|      1|  auto res = initNonCanonicalWithReadOnlyBigInt(dst, src);
 1390|      1|  if (LLVM_UNLIKELY(res != OperationStatus::RETURNED)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 1391|      0|    return res;
 1392|      0|  }
 1393|       |
 1394|      1|  llvh::APInt::tcNegate(dst.digits, dst.numDigits);
 1395|      1|  ensureCanonicalResult(dst);
 1396|       |
 1397|      1|  assert(
 1398|      1|      ((isNegative(ImmutableBigIntRef{dst.digits, dst.numDigits}) !=
 1399|      1|        isNegative(src)) ||
 1400|      1|       compare(src, 0) == 0) &&
 1401|      1|      "unaryMinus overflow");
 1402|      1|  return OperationStatus::RETURNED;
 1403|      1|}
_ZNK6hermes6bigint19UniquingBigIntTable12getEntryListEv:
 2372|    196|std::vector<BigIntTableEntry> UniquingBigIntTable::getEntryList() const {
 2373|    196|  std::vector<BigIntTableEntry> result;
 2374|    196|  result.reserve(bigints_.size());
 2375|    196|  uint32_t offset = 0;
 2376|    196|  for (const ParsedBigInt &bigint : bigints_) {
  ------------------
  |  Branch (2376:35): [True: 5, False: 196]
  ------------------
 2377|      5|    const uint32_t size = bigint.getBytes().size();
 2378|      5|    result.push_back(BigIntTableEntry{offset, size});
 2379|      5|    offset += size;
 2380|      5|  }
 2381|    196|  return result;
 2382|    196|}
_ZNK6hermes6bigint19UniquingBigIntTable15getDigitsBufferEv:
 2384|    196|BigIntBytes UniquingBigIntTable::getDigitsBuffer() const {
 2385|    196|  BigIntBytes result;
 2386|    196|  for (const ParsedBigInt &bigint : bigints_) {
  ------------------
  |  Branch (2386:35): [True: 5, False: 196]
  ------------------
 2387|      5|    auto bytes = bigint.getBytes();
 2388|      5|    result.insert(result.end(), bytes.begin(), bytes.end());
 2389|      5|  }
 2390|    196|  return result;
 2391|    196|}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_121ensureCanonicalResultERNS0_16MutableBigIntRefE:
   86|  1.17M|void ensureCanonicalResult(MutableBigIntRef &dst) {
   87|  1.17M|  auto ptr = reinterpret_cast<uint8_t *>(dst.digits);
   88|  1.17M|  const uint32_t sizeInBytes = dst.numDigits * BigIntDigitSizeInBytes;
   89|       |
   90|  1.17M|  llvh::ArrayRef<uint8_t> compactView =
   91|  1.17M|      dropExtraSignBits(llvh::makeArrayRef(ptr, sizeInBytes));
   92|  1.17M|  dst.numDigits = numDigitsForSizeInBytes(compactView.size());
   93|  1.17M|}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_131makeImmutableRefFromSignedDigitERl:
 1148|   781k|    SignedBigIntDigitType &digit) {
 1149|       |  // Initially the bigint has 1 digit...
 1150|   781k|  uint32_t numDigits = 1;
 1151|   781k|  MutableBigIntRef mr{reinterpret_cast<BigIntDigitType *>(&digit), numDigits};
 1152|       |  // make sure mr is canonicalized, otherwise comparisons may fail -- they
 1153|       |  // assume all inputs to be canonical. This will happen when digit is 0.
 1154|   781k|  ensureCanonicalResult(mr);
 1155|       |  // Return a canonical, immutable bigint ref.
 1156|   781k|  return ImmutableBigIntRef{
 1157|   781k|      reinterpret_cast<BigIntDigitType *>(&digit), numDigits};
 1158|   781k|}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_134initNonCanonicalWithReadOnlyBigIntERNS0_16MutableBigIntRefERKNS0_18ImmutableBigIntRefE:
  204|      1|    const ImmutableBigIntRef &src) {
  205|       |  // ensure dst is large enough
  206|      1|  if (dst.numDigits < src.numDigits) {
  ------------------
  |  Branch (206:7): [True: 0, False: 1]
  ------------------
  207|      0|    return OperationStatus::DEST_TOO_SMALL;
  208|      0|  }
  209|       |
  210|       |  // now copy src digits to dst.
  211|      1|  const uint32_t digitsToCopy = src.numDigits;
  212|      1|  const uint32_t bytesToCopy = digitsToCopy * BigIntDigitSizeInBytes;
  213|      1|  memcpy(dst.digits, src.digits, bytesToCopy);
  214|       |
  215|       |  // and finally size-extend dst to its size.
  216|      1|  const uint32_t digitsToSet = dst.numDigits - digitsToCopy;
  217|      1|  const uint32_t bytesToSet = digitsToSet * BigIntDigitSizeInBytes;
  218|      1|  const BigIntDigitType signExtValue = getBigIntRefSignExtValue(src);
  219|      1|  memset(dst.digits + digitsToCopy, signExtValue, bytesToSet);
  220|       |
  221|      1|  return OperationStatus::RETURNED;
  222|      1|}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_124getBigIntRefSignExtValueINS0_18ImmutableBigIntRefEEEmRKT_:
  194|      1|BigIntDigitType getBigIntRefSignExtValue(const AnyBigIntRef &src) {
  195|      1|  return src.numDigits == 0
  ------------------
  |  Branch (195:10): [True: 0, False: 1]
  ------------------
  196|      1|      ? static_cast<BigIntDigitType>(0)
  197|      1|      : getSignExtValue<BigIntDigitType>(src.digits[src.numDigits - 1]);
  198|      1|}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_113getDigitsWithINS1_18NumericValueParserEN4llvh9StringRefEEENSt3__18optionalINS6_12basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEET0_RhRNS0_10ParsedSignEPSD_:
  933|      5|    std::string *outError) {
  934|      5|  std::string bigintDigits;
  935|      5|  std::optional<std::string> ret;
  936|      5|  if (ParserT{src, radix, bigintDigits, sign, outError}.goal()) {
  ------------------
  |  Branch (936:7): [True: 5, False: 0]
  ------------------
  937|      5|    ret = std::move(bigintDigits);
  938|      5|  }
  939|      5|  return ret;
  940|      5|}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_118NumericValueParserC2EN4llvh9StringRefERhRNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEERNS0_10ParsedSignEPSC_:
  840|      5|      : BigIntLiteralParsingToolBox(str, radix, bigintDigits, sign, outError) {}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEEC2EN4llvh9StringRefERhRNSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEERNS0_10ParsedSignEPSE_:
  519|      5|      : it_(str.begin()),
  520|       |#ifndef NDEBUG
  521|      5|        begin_(str.begin()),
  522|       |#endif // NDEBUG
  523|      5|        end_(str.end()),
  524|      5|        radix_(radix),
  525|      5|        bigintDigits_(bigintDigits),
  526|      5|        sign_(sign),
  527|      5|        outError_(outError) {
  528|      5|    bigintDigits_.clear();
  529|      5|    bigintDigits_.reserve(end_ - it_);
  530|       |
  531|      5|    sign_ = ParsedSign::None;
  532|      5|  }
BigIntSupport.cpp:_ZNO6hermes6bigint12_GLOBAL__N_118NumericValueParser4goalEv:
  844|      5|  bool goal() && {
  845|      5|    if (auto ch = peek()) {
  ------------------
  |  Branch (845:14): [True: 5, False: 0]
  ------------------
  846|      5|      if (*ch == '0') {
  ------------------
  |  Branch (846:11): [True: 0, False: 5]
  ------------------
  847|       |        // discard the current char -- it is known to be '0'.
  848|      0|        eat();
  849|       |
  850|       |        // This is either:
  851|       |        //    (1) 0 BigIntLiteralSuffix
  852|       |        //    (2) NonDecimalIntegerLiteral BigIntLiteralSuffix
  853|       |
  854|       |        // Try matching (1).
  855|      0|        if (bigIntLiteralSuffix()) {
  ------------------
  |  Branch (855:13): [True: 0, False: 0]
  ------------------
  856|      0|          radix_ = 10;
  857|      0|          bigintDigits_ = "0";
  858|      0|          return checkEnd("trailing data in 0n literal");
  859|      0|        }
  860|       |
  861|       |        // Try matching (2).
  862|      0|        if (nonDecimalIntegerLiteral()) {
  ------------------
  |  Branch (862:13): [True: 0, False: 0]
  ------------------
  863|      0|          if (bigIntLiteralSuffix()) {
  ------------------
  |  Branch (863:15): [True: 0, False: 0]
  ------------------
  864|      0|            return checkEnd("trailing data in non-decimal literal");
  865|      0|          }
  866|       |
  867|      0|          return fail("no n suffix in non-decimal");
  868|      0|        }
  869|      5|      } else {
  870|       |        // This must be NonZeroDecimalLiteral BigIntLiteralSuffix
  871|      5|        if (nonZeroDecimalLiteral()) {
  ------------------
  |  Branch (871:13): [True: 5, False: 0]
  ------------------
  872|      5|          if (bigIntLiteralSuffix()) {
  ------------------
  |  Branch (872:15): [True: 5, False: 0]
  ------------------
  873|      5|            return checkEnd("trailing data in decimal literal");
  874|      5|          }
  875|       |
  876|      0|          return fail("no n suffix in decimal");
  877|      5|        }
  878|      5|      }
  879|      5|    }
  880|       |
  881|      0|    return fail("invalid bigint literal");
  882|      5|  }
BigIntSupport.cpp:_ZNK6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE4peekEl:
  709|     87|  OptValue<CharT> peek(std::ptrdiff_t which = 0) const {
  710|     87|    OptValue<CharT> ret;
  711|     87|    if (it_ + which < end_) {
  ------------------
  |  Branch (711:9): [True: 82, False: 5]
  ------------------
  712|     82|      ret = *(it_ + which);
  713|     82|    }
  714|     87|    return ret;
  715|     87|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE3eatEv:
  697|     24|  OptValue<CharT> eat() {
  698|     24|    OptValue<CharT> c = peek();
  699|     24|    if (c) {
  ------------------
  |  Branch (699:9): [True: 24, False: 0]
  ------------------
  700|     24|      it_ += 1;
  701|     24|    }
  702|     24|    return c;
  703|     24|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_118NumericValueParser19bigIntLiteralSuffixEv:
  903|      5|  bool bigIntLiteralSuffix() {
  904|      5|    return lookaheadAndEatIfAnyOf<'n'>().hasValue();
  905|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE22lookaheadAndEatIfAnyOfIJLc110EEEENS_8OptValueIcEEv:
  652|      5|  OptValue<CharT> lookaheadAndEatIfAnyOf() {
  653|      5|    OptValue<CharT> ret;
  654|       |
  655|      5|    if (auto ch = nextIsAnyOf<chars...>()) {
  ------------------
  |  Branch (655:14): [True: 5, False: 0]
  ------------------
  656|      5|      eat();
  657|      5|      ret = ch;
  658|      5|    }
  659|       |
  660|      5|    return ret;
  661|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE11nextIsAnyOfIJLc110EEEENS_8OptValueIcEEv:
  664|      5|  OptValue<CharT> nextIsAnyOf() {
  665|      5|    OptValue<CharT> ret;
  666|       |
  667|      5|    if (auto ch = peek()) {
  ------------------
  |  Branch (667:14): [True: 5, False: 0]
  ------------------
  668|      5|      if (anyOf<chars...>(*ch)) {
  ------------------
  |  Branch (668:11): [True: 5, False: 0]
  ------------------
  669|      5|        ret = ch;
  670|      5|      }
  671|      5|    }
  672|       |
  673|      5|    return ret;
  674|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc110EEEbc:
  642|      5|  static bool anyOf(char rhs) {
  643|      5|    return c == rhs;
  644|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE8checkEndEPKc:
  634|      5|  bool checkEnd(const char *err) {
  635|      5|    auto ch = peek();
  636|       |    // parsing suceeded if there are no more characters to be consumed, or if
  637|       |    // the next charater is a null terminator.
  638|      5|    return (ch && *ch != 0) ? fail(err) : true;
  ------------------
  |  Branch (638:13): [True: 0, False: 5]
  |  Branch (638:19): [True: 0, False: 0]
  ------------------
  639|      5|  }
BigIntSupport.cpp:_ZNK6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE21getCurrentParserStateEv:
  682|     19|  ParserState getCurrentParserState() const {
  683|     19|    return it_;
  684|     19|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_118NumericValueParser23numericLiteralSeparatorEv:
  899|     19|  bool numericLiteralSeparator() {
  900|     19|    return lookaheadAndEatIfAnyOf<'_'>().hasValue();
  901|     19|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE22lookaheadAndEatIfAnyOfIJLc95EEEENS_8OptValueIcEEv:
  652|     19|  OptValue<CharT> lookaheadAndEatIfAnyOf() {
  653|     19|    OptValue<CharT> ret;
  654|       |
  655|     19|    if (auto ch = nextIsAnyOf<chars...>()) {
  ------------------
  |  Branch (655:14): [True: 0, False: 19]
  ------------------
  656|      0|      eat();
  657|      0|      ret = ch;
  658|      0|    }
  659|       |
  660|     19|    return ret;
  661|     19|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE11nextIsAnyOfIJLc95EEEENS_8OptValueIcEEv:
  664|     19|  OptValue<CharT> nextIsAnyOf() {
  665|     19|    OptValue<CharT> ret;
  666|       |
  667|     19|    if (auto ch = peek()) {
  ------------------
  |  Branch (667:14): [True: 19, False: 0]
  ------------------
  668|     19|      if (anyOf<chars...>(*ch)) {
  ------------------
  |  Branch (668:11): [True: 0, False: 19]
  ------------------
  669|      0|        ret = ch;
  670|      0|      }
  671|     19|    }
  672|       |
  673|     19|    return ret;
  674|     19|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc95EEEbc:
  642|     19|  static bool anyOf(char rhs) {
  643|     19|    return c == rhs;
  644|     19|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE21nonZeroDecimalLiteralEv:
  584|      5|  bool nonZeroDecimalLiteral() {
  585|      5|#define BIGINT_NONZERO_DEC_DIGITS '1', '2', '3', '4', '5', '6', '7', '8', '9'
  586|      5|#define BIGINT_DEC_DIGITS '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
  587|      5|    if (nextIsAnyOf<BIGINT_NONZERO_DEC_DIGITS>()) {
  ------------------
  |  Branch (587:9): [True: 5, False: 0]
  ------------------
  588|      5|      radix_ = 10;
  589|      5|      dispatchBuildBigIntWithDigitsToConcrete<BIGINT_DEC_DIGITS>();
  590|      5|      return bigintDigits_.size() > 0;
  591|      5|    }
  592|      0|    return false;
  593|      5|#undef BIGINT_NONZERO_DEC_DIGITS
  594|      5|#undef BIGINT_DEC_DIGITS
  595|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE11nextIsAnyOfIJLc49ELc50ELc51ELc52ELc53ELc54ELc55ELc56ELc57EEEENS_8OptValueIcEEv:
  664|      5|  OptValue<CharT> nextIsAnyOf() {
  665|      5|    OptValue<CharT> ret;
  666|       |
  667|      5|    if (auto ch = peek()) {
  ------------------
  |  Branch (667:14): [True: 5, False: 0]
  ------------------
  668|      5|      if (anyOf<chars...>(*ch)) {
  ------------------
  |  Branch (668:11): [True: 5, False: 0]
  ------------------
  669|      5|        ret = ch;
  670|      5|      }
  671|      5|    }
  672|       |
  673|      5|    return ret;
  674|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc49ELc50EJLc51ELc52ELc53ELc54ELc55ELc56ELc57EEEEbc:
  647|     27|  static bool anyOf(CharT rhs) {
  648|     27|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 9, False: 18]
  |  Branch (648:26): [True: 13, False: 5]
  ------------------
  649|     27|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc50ELc51EJLc52ELc53ELc54ELc55ELc56ELc57EEEEbc:
  647|     18|  static bool anyOf(CharT rhs) {
  648|     18|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 1, False: 17]
  |  Branch (648:26): [True: 12, False: 5]
  ------------------
  649|     18|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc51ELc52EJLc53ELc54ELc55ELc56ELc57EEEEbc:
  647|     17|  static bool anyOf(CharT rhs) {
  648|     17|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 2, False: 15]
  |  Branch (648:26): [True: 10, False: 5]
  ------------------
  649|     17|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc52ELc53EJLc54ELc55ELc56ELc57EEEEbc:
  647|     15|  static bool anyOf(CharT rhs) {
  648|     15|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 2, False: 13]
  |  Branch (648:26): [True: 8, False: 5]
  ------------------
  649|     15|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc53ELc54EJLc55ELc56ELc57EEEEbc:
  647|     13|  static bool anyOf(CharT rhs) {
  648|     13|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 3, False: 10]
  |  Branch (648:26): [True: 5, False: 5]
  ------------------
  649|     13|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc54ELc55EJLc56ELc57EEEEbc:
  647|     10|  static bool anyOf(CharT rhs) {
  648|     10|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 4, False: 6]
  |  Branch (648:26): [True: 1, False: 5]
  ------------------
  649|     10|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc55ELc56EJLc57EEEEbc:
  647|      6|  static bool anyOf(CharT rhs) {
  648|      6|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 0, False: 6]
  |  Branch (648:26): [True: 1, False: 5]
  ------------------
  649|      6|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc56ELc57ETpTncJEEEbc:
  647|      6|  static bool anyOf(CharT rhs) {
  648|      6|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 1, False: 5]
  |  Branch (648:26): [True: 0, False: 5]
  ------------------
  649|      6|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc57EEEbc:
  642|      5|  static bool anyOf(char rhs) {
  643|      5|    return c == rhs;
  644|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE39dispatchBuildBigIntWithDigitsToConcreteIJLc48ELc49ELc50ELc51ELc52ELc53ELc54ELc55ELc56ELc57EEEEvv:
  622|      5|  void dispatchBuildBigIntWithDigitsToConcrete() {
  623|      5|    static_cast<ConcreteParser *>(this)
  624|      5|        ->template buildBigIntWithDigits<digits...>();
  625|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_118NumericValueParser21buildBigIntWithDigitsIJLc48ELc49ELc50ELc51ELc52ELc53ELc54ELc55ELc56ELc57EEEEvv:
  885|      5|  void buildBigIntWithDigits() {
  886|      5|    OptValue<char> ch = lookaheadAndEatIfAnyOf<digits...>();
  887|     24|    while (ch.hasValue()) {
  ------------------
  |  Branch (887:12): [True: 19, False: 5]
  ------------------
  888|     19|      bigintDigits_.push_back(*ch);
  889|     19|      auto atSep = getCurrentParserState();
  890|     19|      bool isSep = numericLiteralSeparator();
  891|     19|      ch = lookaheadAndEatIfAnyOf<digits...>();
  892|     19|      if (isSep && !ch) {
  ------------------
  |  Branch (892:11): [True: 0, False: 19]
  |  Branch (892:20): [True: 0, False: 0]
  ------------------
  893|      0|        restoreParserState(atSep);
  894|      0|      }
  895|     19|    }
  896|      5|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE22lookaheadAndEatIfAnyOfIJLc48ELc49ELc50ELc51ELc52ELc53ELc54ELc55ELc56ELc57EEEENS_8OptValueIcEEv:
  652|     24|  OptValue<CharT> lookaheadAndEatIfAnyOf() {
  653|     24|    OptValue<CharT> ret;
  654|       |
  655|     24|    if (auto ch = nextIsAnyOf<chars...>()) {
  ------------------
  |  Branch (655:14): [True: 19, False: 5]
  ------------------
  656|     19|      eat();
  657|     19|      ret = ch;
  658|     19|    }
  659|       |
  660|     24|    return ret;
  661|     24|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE11nextIsAnyOfIJLc48ELc49ELc50ELc51ELc52ELc53ELc54ELc55ELc56ELc57EEEENS_8OptValueIcEEv:
  664|     24|  OptValue<CharT> nextIsAnyOf() {
  665|     24|    OptValue<CharT> ret;
  666|       |
  667|     24|    if (auto ch = peek()) {
  ------------------
  |  Branch (667:14): [True: 24, False: 0]
  ------------------
  668|     24|      if (anyOf<chars...>(*ch)) {
  ------------------
  |  Branch (668:11): [True: 19, False: 5]
  ------------------
  669|     19|        ret = ch;
  670|     19|      }
  671|     24|    }
  672|       |
  673|     24|    return ret;
  674|     24|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_127BigIntLiteralParsingToolBoxINS1_18NumericValueParserEE5anyOfILc48ELc49EJLc50ELc51ELc52ELc53ELc54ELc55ELc56ELc57EEEEbc:
  647|     24|  static bool anyOf(CharT rhs) {
  648|     24|    return (c == rhs) || anyOf<d, rest...>(rhs);
  ------------------
  |  Branch (648:12): [True: 2, False: 22]
  |  Branch (648:26): [True: 17, False: 5]
  ------------------
  649|     24|  }
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_122numBitsForBigintDigitsINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEjT_h:
  912|      5|static unsigned numBitsForBigintDigits(StringRefT str, uint8_t radix) {
  913|      5|  assert(
  914|      5|      (radix == 2 || radix == 4 || radix == 8 || radix == 10 || radix == 16) &&
  915|      5|      "unpected bigint radix");
  916|       |
  917|       |  // For power of 2 radixes we know exactly how many bits each digit
  918|       |  // consumes in binary.  For base 10, we have to guess, so we assume the
  919|       |  // maximum bits each digit consumes.
  920|      5|  uint8_t maxBitsPerChar = radix == 10 ? 4 : llvh::findFirstSet(radix);
  ------------------
  |  Branch (920:28): [True: 5, False: 0]
  ------------------
  921|       |
  922|       |  // maxBitsPerChar * str.size() gives the exact-ish size S to represent str as
  923|       |  // a BigIntDigitType, and the + 1 adds the sign bit.
  924|      5|  return numDigitsForSizeInBits(maxBitsPerChar * str.size() + 1) *
  925|      5|      BigIntDigitSizeInBits;
  926|      5|}
BigIntSupport.cpp:_ZN6hermes6bigint12_GLOBAL__N_116parsedBigIntFromINS1_18NumericValueParserEN4llvh9StringRefEEENSt3__18optionalINS6_6vectorIhNS6_9allocatorIhEEEEEET0_PNS6_12basic_stringIcNS6_11char_traitsIcEENS9_IcEEEE:
  973|      5|    std::string *outError) {
  974|      5|  uint8_t radix;
  975|      5|  ParsedSign sign;
  976|      5|  std::optional<std::string> bigintDigits =
  977|      5|      getDigitsWith<ParserT>(input, radix, sign, outError);
  978|       |
  979|      5|  std::optional<std::vector<uint8_t>> result;
  980|      5|  if (bigintDigits) {
  ------------------
  |  Branch (980:7): [True: 5, False: 0]
  ------------------
  981|      5|    llvh::APInt i(
  982|      5|        numBitsForBigintDigits(*bigintDigits, radix), *bigintDigits, radix);
  983|       |
  984|      5|    assert(
  985|      5|        i.getBitWidth() % sizeof(llvh::APInt::WordType) == 0 &&
  986|      5|        "Must always allocate full words");
  987|       |
  988|      5|    auto *ptr = reinterpret_cast<const uint8_t *>(i.getRawData());
  989|      5|    size_t size = i.getNumWords() * sizeof(llvh::APInt::WordType);
  990|       |
  991|      5|    if (sign == ParsedSign::Minus) {
  ------------------
  |  Branch (991:9): [True: 0, False: 5]
  ------------------
  992|      0|      i.negate();
  993|      0|    }
  994|       |
  995|      5|    result = std::vector<uint8_t>(ptr, ptr + size);
  996|      5|  }
  997|       |
  998|      5|  return result;
  999|      5|}

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

_ZN6hermes23truncateToInt32SlowPathEd:
   22|      1|int32_t truncateToInt32SlowPath(double d) {
   23|      1|  double tmp = d; // Allow d to stay in a register.
   24|      1|  uint64_t bits = llvh::DoubleToBits(tmp);
   25|      1|  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|      1|  int sign = 1 - ((int)((int64_t)bits >> 62) & 2);
   29|      1|  uint64_t m = bits & 0xFFFFFFFFFFFFFul;
   30|       |
   31|       |  // Check for a denormalized exponent. We can bail early in that case.
   32|      1|  if (!exp)
  ------------------
  |  Branch (32:7): [True: 0, False: 1]
  ------------------
   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|      1|  exp -= 1023 + 52;
   38|       |  // Add the implied leading 1 bit.
   39|      1|  m |= 1ull << 52;
   40|       |
   41|       |  // The sign of the exponent tells us which way to shift.
   42|      1|  if (exp >= 0) {
  ------------------
  |  Branch (42:7): [True: 1, 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|      1|    return exp <= 31 ? sign * (int64_t)(m << exp) : 0;
  ------------------
  |  Branch (49:12): [True: 0, False: 1]
  ------------------
   50|      1|  } 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|      1|}
_ZN6hermes14numberToStringEdPcm:
   59|  21.3k|size_t numberToString(double m, char *dest, size_t destSize) {
   60|  21.3k|  assert(destSize >= NUMBER_TO_STRING_BUF_SIZE);
   61|  21.3k|  (void)destSize;
   62|  21.3k|  DtoaAllocator<> dalloc{};
   63|       |
   64|  21.3k|  if (std::isnan(m)) {
  ------------------
  |  Branch (64:7): [True: 0, False: 21.3k]
  ------------------
   65|      0|    strcpy(dest, "NaN");
   66|      0|    return 3;
   67|      0|  }
   68|       |
   69|  21.3k|  if (m == 0) {
  ------------------
  |  Branch (69:7): [True: 0, False: 21.3k]
  ------------------
   70|      0|    strcpy(dest, "0");
   71|      0|    return 1;
   72|      0|  }
   73|       |
   74|  21.3k|  if (m == std::numeric_limits<double>::infinity()) {
  ------------------
  |  Branch (74:7): [True: 0, False: 21.3k]
  ------------------
   75|      0|    strcpy(dest, "Infinity");
   76|      0|    return 8;
   77|      0|  }
   78|  21.3k|  if (m == -std::numeric_limits<double>::infinity()) {
  ------------------
  |  Branch (78:7): [True: 0, False: 21.3k]
  ------------------
   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|  21.3k|  char *destPtr = dest;
   89|       |
   90|       |  // Decimal point index.
   91|  21.3k|  int n;
   92|       |
   93|       |  // 1 if negative, 0 else.
   94|  21.3k|  int sign;
   95|       |
   96|       |  // Points to the end of the string s after it's populated.
   97|  21.3k|  char *sEnd;
   98|       |
   99|  21.3k|  char *s = ::g_dtoa(dalloc, m, 0, 0, &n, &sign, &sEnd);
  100|       |
  101|  21.3k|  if (sign)
  ------------------
  |  Branch (101:7): [True: 21.0k, False: 361]
  ------------------
  102|  21.0k|    *destPtr++ = '-';
  103|       |
  104|       |  // Length of decimal representation of s.
  105|  21.3k|  int k = sEnd - s;
  106|       |
  107|  21.3k|  if (k <= n && n <= 21) {
  ------------------
  |  Branch (107:7): [True: 21.3k, False: 0]
  |  Branch (107:17): [True: 21.0k, False: 308]
  ------------------
  108|       |    // Step 6 of 9.8.1.
  109|   349k|    for (int i = 0; i < k; ++i) {
  ------------------
  |  Branch (109:21): [True: 328k, False: 21.0k]
  ------------------
  110|   328k|      *destPtr++ = s[i];
  111|   328k|    }
  112|  60.2k|    for (int i = 0; i < n - k; ++i) {
  ------------------
  |  Branch (112:21): [True: 39.2k, False: 21.0k]
  ------------------
  113|  39.2k|      *destPtr++ = '0';
  114|  39.2k|    }
  115|  21.0k|  } else if (0 < n && n <= 21) {
  ------------------
  |  Branch (115:14): [True: 308, False: 0]
  |  Branch (115:23): [True: 0, False: 308]
  ------------------
  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|    308|  } else if (-6 < n && n <= 0) {
  ------------------
  |  Branch (124:14): [True: 308, False: 0]
  |  Branch (124:24): [True: 0, False: 308]
  ------------------
  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|    308|  } else if (k == 1) {
  ------------------
  |  Branch (134:14): [True: 0, False: 308]
  ------------------
  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|    308|  } else {
  146|       |    // Step 10 of 9.8.1.
  147|    308|    char nBuf[NUMBER_TO_STRING_BUF_SIZE];
  148|    308|    int nLen = ::snprintf(nBuf, sizeof(nBuf), "%d", ::abs(n - 1));
  149|       |
  150|    308|    *destPtr++ = s[0];
  151|    308|    *destPtr++ = '.';
  152|  5.21k|    for (int i = 1; i < k; ++i) {
  ------------------
  |  Branch (152:21): [True: 4.90k, False: 308]
  ------------------
  153|  4.90k|      *destPtr++ = s[i];
  154|  4.90k|    }
  155|    308|    *destPtr++ = 'e';
  156|    308|    *destPtr++ = n - 1 < 0 ? '-' : '+';
  ------------------
  |  Branch (156:18): [True: 0, False: 308]
  ------------------
  157|    933|    for (int i = 0; i < nLen; ++i) {
  ------------------
  |  Branch (157:21): [True: 625, False: 308]
  ------------------
  158|    625|      *destPtr++ = nBuf[i];
  159|    625|    }
  160|    308|  }
  161|       |
  162|       |  // Null-terminate
  163|  21.3k|  *destPtr++ = '\0';
  164|  21.3k|  assert(static_cast<size_t>(destPtr - dest) < NUMBER_TO_STRING_BUF_SIZE);
  165|       |
  166|  21.3k|  g_freedtoa(dalloc, s);
  167|  21.3k|  return destPtr - dest - 1;
  168|  21.3k|}

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

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

_ZN6hermes8oscompat19thread_stack_boundsEj:
   13|    160|std::pair<const void *, size_t> thread_stack_bounds(unsigned gap) {
   14|       |  // Avoid calling into the platform-specific code if we can cache the result
   15|       |  // on a per-thread basis.
   16|       |
   17|       |  // The cached result of thread_stack_bounds().
   18|    160|  static thread_local std::pair<const void *, size_t> cachedBounds{nullptr, 0};
   19|       |
   20|    160|  std::pair<const void *, size_t> bounds = cachedBounds;
   21|       |
   22|    160|  if (LLVM_UNLIKELY(!bounds.first)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 159]
  |  |  ------------------
  ------------------
   23|      1|    cachedBounds = bounds = detail::thread_stack_bounds_impl();
   24|      1|  }
   25|       |
   26|       |  // Adjust for the gap here to allow caching with multiple gaps.
   27|    160|  auto [high, size] = bounds;
   28|    160|  return {high, gap < size ? size - gap : 0};
  ------------------
  |  Branch (28:17): [True: 160, False: 0]
  ------------------
   29|    160|}

_ZN6hermes8oscompat9page_sizeEv:
   92|  1.60k|size_t page_size() {
   93|  1.60k|#ifndef NDEBUG
   94|  1.60k|  if (testPgSz != 0) {
  ------------------
  |  Branch (94:7): [True: 0, False: 1.60k]
  ------------------
   95|      0|    return testPgSz;
   96|      0|  }
   97|  1.60k|#endif
   98|  1.60k|  return page_size_real();
   99|  1.60k|}
_ZN6hermes8oscompat11vm_allocateEmPv:
  181|    160|llvh::ErrorOr<void *> vm_allocate(size_t sz, void *hint) {
  182|    160|  assert(sz % page_size() == 0);
  183|    160|#ifndef NDEBUG
  184|    160|  if (testPgSz != 0 && testPgSz > static_cast<size_t>(page_size_real())) {
  ------------------
  |  Branch (184:7): [True: 0, False: 160]
  |  Branch (184:24): [True: 0, False: 0]
  ------------------
  185|      0|    return vm_allocate_aligned(sz, testPgSz);
  186|      0|  }
  187|    160|#endif // !NDEBUG
  188|    160|  return vm_mmap(hint, sz, kVMAllocateProt, kVMAllocateFlags, true);
  189|    160|}
_ZN6hermes8oscompat7vm_freeEPvm:
  219|    160|void vm_free(void *p, size_t sz) {
  220|    160|  vm_munmap(p, sz);
  221|    160|}
_ZN6hermes8oscompat18vm_reserve_alignedEmmPv:
  232|    160|vm_reserve_aligned(size_t sz, size_t alignment, void *hint) {
  233|    160|  return vm_mmap_aligned(hint, sz, alignment, kVMReserveProt, kVMReserveFlags);
  234|    160|}
_ZN6hermes8oscompat18vm_release_alignedEPvm:
  236|    160|void vm_release_aligned(void *p, size_t sz) {
  237|    160|  vm_munmap(p, sz);
  238|    160|}
_ZN6hermes8oscompat9vm_commitEPvm:
  240|    480|llvh::ErrorOr<void *> vm_commit(void *p, size_t sz) {
  241|    480|  return vm_mmap(p, sz, kVMAllocateProt, kVMAllocateFlags | MAP_FIXED, false);
  242|    480|}
_ZN6hermes8oscompat11vm_uncommitEPvm:
  244|    480|void vm_uncommit(void *p, size_t sz) {
  245|    480|  auto res = vm_mmap(p, sz, kVMReserveProt, kVMReserveFlags | MAP_FIXED, false);
  246|    480|  (void)res;
  247|    480|  assert(res && "uncommit failed");
  248|    480|}
_ZN6hermes8oscompat7vm_nameEPvmPKc:
  299|  1.12k|void vm_name(void *p, size_t sz, const char *name) {
  300|       |#ifdef __ANDROID__
  301|       |  prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, p, sz, name);
  302|       |#else
  303|  1.12k|  (void)p;
  304|  1.12k|  (void)sz;
  305|  1.12k|  (void)name;
  306|  1.12k|#endif // __ANDROID__
  307|  1.12k|}
_ZN6hermes8oscompat10vm_protectEPvmNS0_11ProtectModeE:
  309|    640|bool vm_protect(void *p, size_t sz, ProtectMode mode) {
  310|    640|  auto prot = PROT_NONE;
  311|    640|  if (mode == ProtectMode::ReadWrite) {
  ------------------
  |  Branch (311:7): [True: 320, False: 320]
  ------------------
  312|    320|    prot = PROT_WRITE | PROT_READ;
  313|    320|  }
  314|    640|  int err = mprotect(p, sz, prot);
  315|    640|  return err != -1;
  316|    640|}
_ZN6hermes8oscompat6detail24thread_stack_bounds_implEv:
  640|      1|std::pair<const void *, size_t> thread_stack_bounds_impl() {
  641|      1|  pthread_attr_t attr;
  642|      1|  pthread_attr_init(&attr);
  643|      1|  pthread_getattr_np(pthread_self(), &attr);
  644|       |
  645|      1|  void *origin;
  646|      1|  size_t size;
  647|      1|  if (pthread_attr_getstack(&attr, &origin, &size))
  ------------------
  |  Branch (647:7): [True: 0, False: 1]
  ------------------
  648|      0|    hermes_fatal("Unable to obtain native stack bounds");
  649|       |
  650|       |#ifdef __BIONIC__
  651|       |  // It appears that on Android/Bionic, the range returned by
  652|       |  // pthread_attr_getstack() includes the stack guard pages. We must remove them
  653|       |  // from the bounds.
  654|       |  size_t guardSize;
  655|       |  if (pthread_attr_getguardsize(&attr, &guardSize)) {
  656|       |    // Don't give up in case of error.
  657|       |    guardSize = 0;
  658|       |  }
  659|       |  if (guardSize > size)
  660|       |    guardSize = size;
  661|       |  // Exclude the guard pages from the available stack.
  662|       |  origin = (char *)origin + guardSize;
  663|       |  size -= guardSize;
  664|       |#endif
  665|       |
  666|      1|  pthread_attr_destroy(&attr);
  667|       |
  668|       |  // origin is now the lowest addressable byte.
  669|      1|  return {(char *)origin + size, size};
  670|      1|}
_ZN6hermes8oscompat15set_thread_nameEPKc:
  676|    320|void set_thread_name(const char *name) {
  677|       |  // Set the thread name for TSAN. It doesn't share the same name mapping as the
  678|       |  // OS does. This macro expands to nothing if TSAN isn't on.
  679|    320|  TsanThreadName(name);
  680|    320|#if defined(__linux__) || defined(__ANDROID__)
  681|    320|  prctl(PR_SET_NAME, name);
  682|       |#elif defined(__APPLE__)
  683|       |  ::pthread_setname_np(name);
  684|       |#endif
  685|       |  // Do nothing if the platform doesn't support it.
  686|    320|}
_ZN6hermes8oscompat15thread_cpu_timeEv:
  715|    226|std::chrono::microseconds thread_cpu_time() {
  716|    226|  using namespace std::chrono;
  717|       |
  718|    226|  struct timespec ts;
  719|       |
  720|    226|  if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) != 0) {
  ------------------
  |  Branch (720:7): [True: 0, False: 226]
  ------------------
  721|      0|    return microseconds::max();
  722|      0|  }
  723|       |
  724|    226|  microseconds::rep total = 0;
  725|    226|  total += ts.tv_nsec / 1000;
  726|    226|  total += ts.tv_sec * 1000000;
  727|    226|  return microseconds(total);
  728|    226|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL14page_size_realEv:
   88|  3.04k|static inline size_t page_size_real() {
   89|  3.04k|  return getpagesize();
   90|  3.04k|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL7vm_mmapEPvmiib:
  115|  1.28k|vm_mmap(void *addr, size_t sz, int prot, int flags, bool checkDebugLimit) {
  116|  1.28k|  assert(sz % page_size_real() == 0);
  117|  1.28k|#ifndef NDEBUG
  118|  1.28k|  if (checkDebugLimit) {
  ------------------
  |  Branch (118:7): [True: 320, False: 960]
  ------------------
  119|    320|    if (LLVM_UNLIKELY(sz > totalVMAllocLimit)) {
  ------------------
  |  |  189|    320|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  120|      0|      return make_error_code(OOMError::TestVMLimitReached);
  121|    320|    } else if (LLVM_UNLIKELY(totalVMAllocLimit != unsetVMAllocLimit)) {
  ------------------
  |  |  189|    320|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  ------------------
  ------------------
  122|      0|      totalVMAllocLimit -= sz;
  123|      0|    }
  124|    320|  }
  125|  1.28k|#endif // !NDEBUG
  126|  1.28k|  void *result = mmap(addr, sz, prot, flags, -1, 0);
  127|  1.28k|  if (result == MAP_FAILED) {
  ------------------
  |  Branch (127:7): [True: 0, False: 1.28k]
  ------------------
  128|       |    // Since mmap is a POSIX API, even on MacOS, errno should use the POSIX
  129|       |    // generic_category.
  130|      0|    return std::error_code(errno, std::generic_category());
  131|      0|  }
  132|  1.28k|  return result;
  133|  1.28k|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL10alignAllocEPvm:
  147|    160|static char *alignAlloc(void *p, size_t alignment) {
  148|    160|  return reinterpret_cast<char *>(
  149|    160|      llvh::alignTo(reinterpret_cast<uintptr_t>(p), alignment));
  150|    160|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL9vm_munmapEPvm:
  135|    480|static void vm_munmap(void *addr, size_t sz) {
  136|    480|  auto ret = munmap(addr, sz);
  137|    480|  assert(!ret && "Failed to free memory region.");
  138|    480|  (void)ret;
  139|       |
  140|    480|#ifndef NDEBUG
  141|    480|  if (LLVM_UNLIKELY(totalVMAllocLimit != unsetVMAllocLimit) && addr) {
  ------------------
  |  |  189|    960|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 480]
  |  |  ------------------
  ------------------
  |  Branch (141:64): [True: 0, False: 0]
  ------------------
  142|      0|    totalVMAllocLimit += sz;
  143|      0|  }
  144|    480|#endif
  145|    480|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL15vm_mmap_alignedEPvmmii:
  153|    160|vm_mmap_aligned(void *addr, size_t sz, size_t alignment, int prot, int flags) {
  154|    160|  assert(sz > 0 && sz % page_size() == 0);
  155|    160|  assert(alignment > 0 && alignment % page_size() == 0);
  156|       |
  157|       |  // Allocate a larger section to ensure that it contains  a subsection that
  158|       |  // satisfies the request. Use *real* page size here since that's what vm_mmap
  159|       |  // guarantees.
  160|    160|  const size_t excessSize = sz + alignment - page_size_real();
  161|    160|  auto result = vm_mmap(addr, excessSize, prot, flags, true);
  162|    160|  if (!result)
  ------------------
  |  Branch (162:7): [True: 0, False: 160]
  ------------------
  163|      0|    return result;
  164|       |
  165|    160|  void *raw = *result;
  166|    160|  char *aligned = alignAlloc(raw, alignment);
  167|    160|  size_t excessAtFront = aligned - static_cast<char *>(raw);
  168|    160|  size_t excessAtBack = excessSize - excessAtFront - sz;
  169|       |
  170|    160|  if (excessAtFront)
  ------------------
  |  Branch (170:7): [True: 0, False: 160]
  ------------------
  171|      0|    vm_munmap(raw, excessAtFront);
  172|    160|  if (excessAtBack)
  ------------------
  |  Branch (172:7): [True: 160, False: 0]
  ------------------
  173|    160|    vm_munmap(aligned + sz, excessAtBack);
  174|       |
  175|    160|  return aligned;
  176|    160|}

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

_ZN6hermes18SourceErrorManagerC2Ev:
   21|    247|    : warningStatuses_((unsigned)Warning::_NumWarnings, true),
   22|    247|      warningsAreErrors_((unsigned)Warning::_NumWarnings, false) {
   23|    247|  sm_.setDiagHandler(SourceErrorManager::printDiagnostic, this);
   24|    247|}
_ZNK6hermes18SourceErrorManager15BufferedMessage5notesERKNSt3__16vectorINS0_11MessageDataENS2_9allocatorIS4_EEEE:
   41|     16|    const std::vector<MessageData> &bufferedNotes) const {
   42|     16|  if (!noteCount_)
  ------------------
  |  Branch (42:7): [True: 16, False: 0]
  ------------------
   43|     16|    return {nullptr, nullptr};
   44|      0|  return {
   45|      0|      bufferedNotes.data() + firstNote_,
   46|      0|      bufferedNotes.data() + firstNote_ + noteCount_};
   47|     16|}
_ZN6hermes18SourceErrorManager15enableBufferingEv:
   49|    204|void SourceErrorManager::enableBuffering() {
   50|    204|  ++bufferingEnabled_;
   51|    204|  assert(bufferingEnabled_ != 0 && "unsigned counter overflow");
   52|    204|}
_ZN6hermes18SourceErrorManager16disableBufferingEv:
   54|    204|void SourceErrorManager::disableBuffering() {
   55|    204|  assert(bufferingEnabled_ != 0 && "unsigned counter underflow");
   56|       |
   57|    204|  if (--bufferingEnabled_ != 0)
  ------------------
  |  Branch (57:7): [True: 0, False: 204]
  ------------------
   58|      0|    return;
   59|       |
   60|       |  // Sort all messages.
   61|    204|  std::sort(
   62|    204|      bufferedMessages_.begin(),
   63|    204|      bufferedMessages_.end(),
   64|    204|      [](const BufferedMessage &a, const BufferedMessage &b) {
   65|       |        // Make sure the "too many errors" message is always last.
   66|    204|        if (a.dk == DK_Error && !a.loc.isValid() && a.msg == sTooManyErrors)
   67|    204|          return false;
   68|    204|        if (b.dk == DK_Error && !b.loc.isValid() && b.msg == sTooManyErrors)
   69|    204|          return true;
   70|    204|        return a.loc.getPointer() < b.loc.getPointer();
   71|    204|      });
   72|       |
   73|       |  // Print them.
   74|    204|  for (const auto &bm : bufferedMessages_) {
  ------------------
  |  Branch (74:23): [True: 16, False: 204]
  ------------------
   75|     16|    doPrintMessage(bm.dk, bm.loc, bm.sm, bm.msg);
   76|     16|    for (const auto &note : bm.notes(bufferedNotes_))
  ------------------
  |  Branch (76:27): [True: 0, False: 16]
  ------------------
   77|      0|      doPrintMessage(note.dk, note.loc, note.sm, note.msg);
   78|     16|  }
   79|       |
   80|       |  // Clean the buffer.
   81|    204|  bufferedMessages_.clear();
   82|    204|  bufferedNotes_.clear();
   83|    204|}
_ZN6hermes18SourceErrorManager18addNewSourceBufferENSt3__110unique_ptrIN4llvh12MemoryBufferENS1_14default_deleteIS4_EEEE:
   86|    407|    std::unique_ptr<llvh::MemoryBuffer> f) {
   87|    407|  unsigned bufId = sm_.AddNewSourceBuffer(std::move(f), SMLoc{});
   88|    407|  assert(
   89|    407|      !isVirtualBufferId(bufId) && "unexpected virtual buf id from SourceMgr");
   90|    407|  return bufId;
   91|    407|}
_ZNK6hermes18SourceErrorManager17getBufferFileNameEj:
  101|    195|llvh::StringRef SourceErrorManager::getBufferFileName(unsigned bufId) const {
  102|    195|  if (isVirtualBufferId(bufId))
  ------------------
  |  Branch (102:7): [True: 0, False: 195]
  ------------------
  103|      0|    return virtualBufferNames_[virtualBufferIdToIndex(bufId)];
  104|    195|  else
  105|    195|    return sm_.getMemoryBuffer(bufId)->getBufferIdentifier();
  106|    195|}
_ZN6hermes18SourceErrorManager18countAndGenMessageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineE:
  128|    721|    const Twine &msg) {
  129|    721|  ++messageCount_[dk];
  130|    721|  doGenMessage(dk, loc, sm, msg);
  131|       |
  132|    721|  if (LLVM_UNLIKELY(dk == DK_Error && messageCount_[DK_Error] == errorLimit_)) {
  ------------------
  |  |  189|    772|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 51, False: 670]
  |  |  |  Branch (189:53): [True: 51, False: 670]
  |  |  |  Branch (189:53): [True: 51, False: 0]
  |  |  ------------------
  ------------------
  133|     51|    errorLimitReached_ = true;
  134|     51|    doGenMessage(DK_Error, {}, {}, sTooManyErrors);
  135|     51|  }
  136|    721|}
_ZN6hermes18SourceErrorManager12doGenMessageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineE:
  142|    772|    llvh::Twine const &msg) {
  143|    772|  if (bufferingEnabled_) {
  ------------------
  |  Branch (143:7): [True: 16, False: 756]
  ------------------
  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|     16|    if (dk == DK_Note && !bufferedMessages_.empty()) {
  ------------------
  |  Branch (147:9): [True: 0, False: 16]
  |  Branch (147:26): [True: 0, False: 0]
  ------------------
  148|      0|      bufferedMessages_.back().addNote(bufferedNotes_, dk, loc, sm, msg.str());
  149|     16|    } else {
  150|     16|      bufferedMessages_.emplace_back(dk, loc, sm, msg.str());
  151|     16|    }
  152|    756|  } else {
  153|    756|    doPrintMessage(dk, loc, sm, msg);
  154|    756|  }
  155|    772|}
_ZN6hermes18SourceErrorManager14doPrintMessageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineE:
  161|    772|    const Twine &msg) {
  162|    772|  sm_.PrintMessage(
  163|    772|      loc,
  164|    772|      static_cast<llvh::SourceMgr::DiagKind>(dk),
  165|    772|      msg,
  166|    772|      sm.isValid() ? llvh::ArrayRef<SMRange>(sm)
  ------------------
  |  Branch (166:7): [True: 686, False: 86]
  ------------------
  167|    772|                   : llvh::ArrayRef<SMRange>(llvh::None),
  168|    772|      llvh::None,
  169|    772|      outputOptions_.showColors);
  170|    772|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineENS_7WarningENS_9SubsystemE:
  178|    746|    Subsystem subsystem) {
  179|    746|  assert(dk <= DK_Note);
  180|    746|  if (suppressMessages_) {
  ------------------
  |  Branch (180:7): [True: 0, False: 746]
  ------------------
  181|      0|    if (*suppressMessages_ == Subsystem::Unspecified) {
  ------------------
  |  Branch (181:9): [True: 0, False: 0]
  ------------------
  182|      0|      return;
  183|      0|    }
  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|    746|  if (LLVM_UNLIKELY(errorLimitReached_))
  ------------------
  |  |  189|    746|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 25, False: 721]
  |  |  ------------------
  ------------------
  190|     25|    return;
  191|    721|  if (dk == DK_Warning && !isWarningEnabled(w)) {
  ------------------
  |  Branch (191:7): [True: 670, False: 51]
  |  Branch (191:27): [True: 0, False: 670]
  ------------------
  192|      0|    lastMessageSuppressed_ = true;
  193|      0|    return;
  194|      0|  }
  195|       |  // Automatically suppress notes if the last message was suppressed.
  196|    721|  if (dk == DK_Note && lastMessageSuppressed_)
  ------------------
  |  Branch (196:7): [True: 0, False: 721]
  |  Branch (196:24): [True: 0, False: 0]
  ------------------
  197|      0|    return;
  198|    721|  lastMessageSuppressed_ = false;
  199|       |
  200|       |  /// Optionally upgrade warnings into errors.
  201|    721|  if (dk == DK_Warning && isWarningAnError(w)) {
  ------------------
  |  Branch (201:7): [True: 670, False: 51]
  |  Branch (201:27): [True: 0, False: 670]
  ------------------
  202|      0|    dk = DK_Error;
  203|      0|  }
  204|    721|  assert(static_cast<unsigned>(dk) < kMessageCountSize && "bounds check");
  205|       |
  206|    721|  if (externalMessageBuffer_) {
  ------------------
  |  Branch (206:7): [True: 0, False: 721]
  ------------------
  207|      0|    externalMessageBuffer_->addMessage(dk, loc, sm, msg);
  208|      0|    return;
  209|      0|  }
  210|       |
  211|    721|  countAndGenMessage(dk, loc, sm, msg);
  212|    721|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineENS_9SubsystemE:
  219|     76|    Subsystem subsystem) {
  220|     76|  message(dk, loc, sm, msg, Warning::NoWarning, subsystem);
  221|     76|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh7SMRangeERKNS2_5TwineENS_9SubsystemE:
  227|      9|    Subsystem subsystem) {
  228|      9|  message(dk, sm.Start, sm, msg, subsystem);
  229|      9|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh5SMLocERKNS2_5TwineENS_9SubsystemE:
  235|     57|    Subsystem subsystem) {
  236|     57|  message(dk, loc, SMRange{}, msg, subsystem);
  237|     57|}
_ZNK6hermes18SourceErrorManager17findBufferAndLineEN4llvh5SMLocE:
  240|  50.8k|    -> llvh::Optional<LineCoord> {
  241|  50.8k|  if (!loc.isValid())
  ------------------
  |  Branch (241:7): [True: 0, False: 50.8k]
  ------------------
  242|      0|    return llvh::None;
  243|       |
  244|  50.8k|  auto bufId = sm_.FindBufferContainingLoc(loc);
  245|  50.8k|  if (!bufId)
  ------------------
  |  Branch (245:7): [True: 0, False: 50.8k]
  ------------------
  246|      0|    return llvh::None;
  247|       |
  248|  50.8k|  auto lineRefAndNo = sm_.FindLine(loc, bufId);
  249|       |
  250|  50.8k|  return LineCoord{bufId, lineRefAndNo.second, lineRefAndNo.first};
  251|  50.8k|}
_ZN6hermes18SourceErrorManager20findBufferLineAndLocEN4llvh5SMLocERNS0_12SourceCoordsE:
  288|  4.28M|bool SourceErrorManager::findBufferLineAndLoc(SMLoc loc, SourceCoords &result) {
  289|  4.28M|  if (!loc.isValid()) {
  ------------------
  |  Branch (289:7): [True: 0, False: 4.28M]
  ------------------
  290|      0|    result.bufId = 0;
  291|      0|    return false;
  292|      0|  }
  293|       |
  294|  4.28M|  if (findLineCache_.bufferId) {
  ------------------
  |  Branch (294:7): [True: 4.28M, False: 207]
  ------------------
  295|       |    // Check the cache with the hope that the lookup is within the last line or
  296|       |    // the next line.
  297|  4.28M|    if (locInside(findLineCache_.lineRef, loc)) {
  ------------------
  |  Branch (297:9): [True: 4.09M, False: 189k]
  ------------------
  298|  4.09M|      findLineCache_.fillCoords(loc, result);
  299|  4.09M|      return true;
  300|  4.09M|    }
  301|   189k|    if (locInside(findLineCache_.nextLineRef, loc)) {
  ------------------
  |  Branch (301:9): [True: 139k, False: 50.6k]
  ------------------
  302|   139k|      ++findLineCache_.lineNo;
  303|   139k|      findLineCache_.lineRef = findLineCache_.nextLineRef;
  304|   139k|      findLineCache_.nextLineRef =
  305|   139k|          sm_.getLineRef(findLineCache_.lineNo + 1, findLineCache_.bufferId);
  306|       |
  307|   139k|      findLineCache_.fillCoords(loc, result);
  308|   139k|      return true;
  309|   139k|    }
  310|       |
  311|  50.6k|    findLineCache_.bufferId = 0;
  312|  50.6k|  }
  313|       |
  314|  50.8k|  auto lineCoord = findBufferAndLine(loc);
  315|  50.8k|  if (!lineCoord) {
  ------------------
  |  Branch (315:7): [True: 0, False: 50.8k]
  ------------------
  316|      0|    result.bufId = 0;
  317|      0|    return false;
  318|      0|  }
  319|       |
  320|       |  // Populate the cache.
  321|  50.8k|  findLineCache_.bufferId = lineCoord->bufId;
  322|  50.8k|  findLineCache_.lineNo = lineCoord->lineNo;
  323|  50.8k|  findLineCache_.lineRef = lineCoord->lineRef;
  324|  50.8k|  findLineCache_.nextLineRef =
  325|  50.8k|      sm_.getLineRef(findLineCache_.lineNo + 1, lineCoord->bufId);
  326|       |
  327|  50.8k|  findLineCache_.fillCoords(loc, result);
  328|  50.8k|  return true;
  329|  50.8k|}
_ZN6hermes18SourceErrorManager20findBufferLineAndLocEN4llvh5SMLocERNS0_12SourceCoordsEb:
  334|  4.28M|    bool translate) {
  335|  4.28M|  if (!findBufferLineAndLoc(loc, result))
  ------------------
  |  Branch (335:7): [True: 0, False: 4.28M]
  ------------------
  336|      0|    return false;
  337|  4.28M|  if (translate && translator_)
  ------------------
  |  Branch (337:7): [True: 4.28M, False: 0]
  |  Branch (337:20): [True: 0, False: 4.28M]
  ------------------
  338|      0|    translator_->translate(result);
  339|  4.28M|  return true;
  340|  4.28M|}
_ZN6hermes18SourceErrorManager20convertEndToLocationEN4llvh7SMRangeE:
  616|   103k|SMLoc SourceErrorManager::convertEndToLocation(SMRange range) {
  617|       |  // If the range is empty, return the starting point.
  618|   103k|  if (range.Start == range.End)
  ------------------
  |  Branch (618:7): [True: 0, False: 103k]
  ------------------
  619|      0|    return range.Start;
  620|       |
  621|   103k|  return SMLoc::getFromPointer(range.End.getPointer() - 1);
  622|   103k|}
SourceErrorManager.cpp:_ZN6hermesL9locInsideEN4llvh9StringRefENS0_5SMLocE:
  274|  4.47M|static bool locInside(llvh::StringRef str, SMLoc loc) {
  275|  4.47M|  const char *ptr = loc.getPointer();
  276|  4.47M|  return ptr >= str.begin() && ptr < str.end();
  ------------------
  |  Branch (276:10): [True: 4.40M, False: 66.1k]
  |  Branch (276:32): [True: 4.23M, False: 174k]
  ------------------
  277|  4.47M|}
_ZN6hermes18SourceErrorManager13FindLineCache10fillCoordsEN4llvh5SMLocERNS0_12SourceCoordsE:
  281|  4.28M|    SourceCoords &result) {
  282|  4.28M|  loc = adjustSourceLocation(lineRef.data(), loc);
  283|  4.28M|  result.bufId = bufferId;
  284|  4.28M|  result.line = lineNo;
  285|  4.28M|  result.col = loc.getPointer() - lineRef.data() + 1;
  286|  4.28M|}
SourceErrorManager.cpp:_ZN6hermesL20adjustSourceLocationEPKcN4llvh5SMLocE:
  255|  4.28M|static inline SMLoc adjustSourceLocation(const char *bufStart, SMLoc loc) {
  256|  4.28M|  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|  4.28M|  if (LLVM_UNLIKELY(*ptr == '\r') ||
  ------------------
  |  |  189|  8.56M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.28M]
  |  |  ------------------
  ------------------
  261|  4.28M|      LLVM_UNLIKELY(isUTF8ContinuationByte(*ptr))) {
  ------------------
  |  |  189|  4.28M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.28M]
  |  |  ------------------
  ------------------
  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|  4.28M|}
SourceErrorManager.cpp:_ZZN6hermes18SourceErrorManager16disableBufferingEvENK3$_0clERKNS0_15BufferedMessageES4_:
   64|      8|      [](const BufferedMessage &a, const BufferedMessage &b) {
   65|       |        // Make sure the "too many errors" message is always last.
   66|      8|        if (a.dk == DK_Error && !a.loc.isValid() && a.msg == sTooManyErrors)
  ------------------
  |  Branch (66:13): [True: 8, False: 0]
  |  Branch (66:33): [True: 8, False: 0]
  |  Branch (66:53): [True: 8, False: 0]
  ------------------
   67|      8|          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|   421k|void encodeUTF8(char *&dst, uint32_t cp) {
   13|   421k|  char *d = dst;
   14|   421k|  if (cp <= 0x7F) {
  ------------------
  |  Branch (14:7): [True: 4.46k, False: 416k]
  ------------------
   15|  4.46k|    *d = (char)cp;
   16|  4.46k|    ++d;
   17|   416k|  } else if (cp <= 0x7FF) {
  ------------------
  |  Branch (17:14): [True: 17.5k, False: 398k]
  ------------------
   18|  17.5k|    d[1] = (cp & 0x3F) | 0x80;
   19|  17.5k|    cp >>= 6;
   20|  17.5k|    d[0] = (cp & 0x1F) | 0xC0;
   21|  17.5k|    d += 2;
   22|   398k|  } else if (cp <= 0xFFFF) {
  ------------------
  |  Branch (22:14): [True: 8.19k, False: 390k]
  ------------------
   23|  8.19k|    d[2] = (cp & 0x3F) | 0x80;
   24|  8.19k|    cp >>= 6;
   25|  8.19k|    d[1] = (cp & 0x3F) | 0x80;
   26|  8.19k|    cp >>= 6;
   27|  8.19k|    d[0] = (cp & 0x0F) | 0xE0;
   28|  8.19k|    d += 3;
   29|   390k|  } else if (cp <= 0x1FFFFF) {
  ------------------
  |  Branch (29:14): [True: 390k, False: 0]
  ------------------
   30|   390k|    d[3] = (cp & 0x3F) | 0x80;
   31|   390k|    cp >>= 6;
   32|   390k|    d[2] = (cp & 0x3F) | 0x80;
   33|   390k|    cp >>= 6;
   34|   390k|    d[1] = (cp & 0x3F) | 0x80;
   35|   390k|    cp >>= 6;
   36|   390k|    d[0] = (cp & 0x07) | 0xF0;
   37|   390k|    d += 4;
   38|   390k|  } 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|   421k|  dst = d;
   64|   421k|}
_ZN6hermes34convertUTF16ToUTF8WithReplacementsERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEN4llvh8ArrayRefIDsEEm:
  102|   325k|    size_t maxCharacters) {
  103|   325k|  out.clear();
  104|   325k|  out.reserve(input.size());
  105|       |  // Stop early if we've reached currNumCharacters worth of UTF-8 characters.
  106|   325k|  size_t currNumCharacters = 0;
  107|   325k|  if (!maxCharacters) {
  ------------------
  |  Branch (107:7): [True: 325k, False: 0]
  ------------------
  108|       |    // Condition checks are easier if this number is set to the max value.
  109|   325k|    maxCharacters = std::numeric_limits<size_t>::max();
  110|   325k|  }
  111|   325k|  auto cur = input.begin(), end = input.end();
  112|  32.7M|  for (; cur < end && currNumCharacters < maxCharacters;
  ------------------
  |  Branch (112:10): [True: 32.4M, False: 325k]
  |  Branch (112:23): [True: 32.4M, False: 0]
  ------------------
  113|  32.4M|       ++cur, ++currNumCharacters) {
  114|  32.4M|    char16_t c = cur[0];
  115|       |    // ASCII fast-path.
  116|  32.4M|    if (LLVM_LIKELY(c <= 0x7F)) {
  ------------------
  |  |  188|  32.4M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 32.4M, False: 1.30k]
  |  |  ------------------
  ------------------
  117|  32.4M|      out.push_back(static_cast<char>(c));
  118|  32.4M|      continue;
  119|  32.4M|    }
  120|       |
  121|  1.30k|    auto [c32, inputConsumed] = convertToCodePointAt(cur, end);
  122|  1.30k|    cur += (inputConsumed - 1);
  123|       |
  124|       |    // The code point to be encoded here is guaranteed to be a valid unicode
  125|       |    // code point and not a surrogate. Because of the convertToCodePointAt()
  126|       |    // process.
  127|  1.30k|    std::array<char, UTF8CodepointMaxBytes> buff;
  128|  1.30k|    char *ptr = buff.data();
  129|  1.30k|    encodeUTF8(ptr, c32);
  130|  1.30k|    out.insert(out.end(), buff.data(), ptr);
  131|  1.30k|  }
  132|   325k|  return cur == end;
  133|   325k|}
_ZN6hermes38convertUTF16ToUTF8WithSingleSurrogatesERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEN4llvh8ArrayRefIDsEE:
  181|    388|    llvh::ArrayRef<char16_t> input) {
  182|    388|  dest.clear();
  183|    388|  dest.reserve(input.size());
  184|  1.60M|  for (char16_t c : input) {
  ------------------
  |  Branch (184:19): [True: 1.60M, False: 388]
  ------------------
  185|       |    // ASCII fast-path.
  186|  1.60M|    if (LLVM_LIKELY(c <= 0x7F)) {
  ------------------
  |  |  188|  1.60M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.60M, False: 1.01k]
  |  |  ------------------
  ------------------
  187|  1.60M|      dest.push_back(static_cast<char>(c));
  188|  1.60M|      continue;
  189|  1.60M|    }
  190|  1.01k|    char32_t c32 = c;
  191|  1.01k|    char buff[UTF8CodepointMaxBytes];
  192|  1.01k|    char *ptr = buff;
  193|  1.01k|    encodeUTF8(ptr, c32);
  194|  1.01k|    dest.insert(dest.end(), buff, ptr);
  195|  1.01k|  }
  196|    388|}
_ZN6hermes10isAllASCIIEPKhS1_:
  198|  1.17M|bool isAllASCII(const uint8_t *start, const uint8_t *end) {
  199|  1.17M|  const uint8_t *cursor = start;
  200|  1.17M|  size_t len = end - start;
  201|  1.17M|  static_assert(
  202|  1.17M|      sizeof(uint32_t) == 4 && alignof(uint32_t) <= 4,
  203|  1.17M|      "uint32_t must be 4 bytes and cannot be more than 4 byte aligned");
  204|       |
  205|  1.17M|  if (len >= 4) {
  ------------------
  |  Branch (205:7): [True: 394k, False: 783k]
  ------------------
  206|       |    // Step by 1s until aligned for uint32_t.
  207|   394k|    uint8_t mask = 0;
  208|  1.57M|    while ((uintptr_t)cursor % alignof(uint32_t)) {
  ------------------
  |  Branch (208:12): [True: 1.18M, False: 394k]
  ------------------
  209|  1.18M|      mask |= *cursor++;
  210|  1.18M|      len -= 1;
  211|  1.18M|    }
  212|   394k|    if (mask & 0x80u) {
  ------------------
  |  Branch (212:9): [True: 112, False: 394k]
  ------------------
  213|    112|      return false;
  214|    112|    }
  215|       |
  216|       |    // Now that we are aligned, step by 4s.
  217|  5.34M|    while (len >= 4) {
  ------------------
  |  Branch (217:12): [True: 4.94M, False: 393k]
  ------------------
  218|  4.94M|      uint32_t val = *(const uint32_t *)cursor;
  219|  4.94M|      if (val & 0x80808080u) {
  ------------------
  |  Branch (219:11): [True: 241, False: 4.94M]
  ------------------
  220|    241|        return false;
  221|    241|      }
  222|  4.94M|      cursor += 4;
  223|  4.94M|      len -= 4;
  224|  4.94M|    }
  225|   394k|  }
  226|  1.17M|  assert(len < 4 && "Length should now be less than 4");
  227|  1.17M|  uint8_t mask = 0;
  228|  2.74M|  while (len--) {
  ------------------
  |  Branch (228:10): [True: 1.57M, False: 1.17M]
  ------------------
  229|  1.57M|    mask |= *cursor++;
  230|  1.57M|  }
  231|  1.17M|  if (mask & 0x80u)
  ------------------
  |  Branch (231:7): [True: 35, False: 1.17M]
  ------------------
  232|     35|    return false;
  233|  1.17M|  return true;
  234|  1.17M|}
_ZN6hermes47convertUTF8WithSurrogatesToUTF8WithReplacementsERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEN4llvh9StringRefE:
  238|      4|    llvh::StringRef input) {
  239|       |  // Temporary buffer to convert input to UTF16.
  240|      4|  llvh::SmallVector<char16_t, 8> ustr;
  241|       |  // The temporary string cannot possibly have more characters than input. Using
  242|       |  // reserve avoids default-initializing the elements.
  243|      4|  ustr.reserve(input.size());
  244|       |  // ustr is pessimistically allocated, so pass a raw pointer to its contents to
  245|       |  // convertUTF8WithSurrogatesToUTF16. The alternative is to use a
  246|       |  // std::back_inserter that would resize the buffer if needed. It turns out
  247|       |  // that the resulting code using std::back_inserter is considerably larger.
  248|      4|  char16_t *ustrEnd =
  249|      4|      convertUTF8WithSurrogatesToUTF16(ustr.data(), input.begin(), input.end());
  250|       |  // Sanity-check for buffer overflow.
  251|      4|  assert(
  252|      4|      static_cast<uintptr_t>(ustrEnd - ustr.data()) <= ustr.capacity() &&
  253|      4|      "buffer overflow while converting UTF8 surrogates");
  254|       |  // Now convert the UTF16 string to UTF8 without surrogates.
  255|      4|  convertUTF16ToUTF8WithReplacements(
  256|      4|      output, llvh::makeArrayRef(ustr.data(), ustrEnd));
  257|      4|}
UTF8.cpp:_ZN6hermesL20convertToCodePointAtEPKDsS1_:
   79|  1.30k|    llvh::ArrayRef<char16_t>::iterator end) {
   80|  1.30k|  char16_t c = cur[0];
   81|  1.30k|  if (isLowSurrogate(c)) {
  ------------------
  |  Branch (81:7): [True: 0, False: 1.30k]
  ------------------
   82|       |    // Unpaired low surrogate.
   83|      0|    return {UNICODE_REPLACEMENT_CHARACTER, 1};
   84|  1.30k|  } else if (isHighSurrogate(c)) {
  ------------------
  |  Branch (84:14): [True: 30, False: 1.27k]
  ------------------
   85|       |    // Leading high surrogate. See if the next character is a low surrogate.
   86|     30|    if (cur + 1 == end || !isLowSurrogate(cur[1])) {
  ------------------
  |  Branch (86:9): [True: 0, False: 30]
  |  Branch (86:27): [True: 0, False: 30]
  ------------------
   87|       |      // Trailing or unpaired high surrogate.
   88|      0|      return {UNICODE_REPLACEMENT_CHARACTER, 1};
   89|     30|    } else {
   90|       |      // Decode surrogate pair and increment, because we consumed two chars.
   91|     30|      return {utf16SurrogatePairToCodePoint(c, cur[1]), 2};
   92|     30|    }
   93|  1.27k|  } else {
   94|       |    // Not a surrogate.
   95|  1.27k|    return {c, 1};
   96|  1.27k|  }
   97|  1.30k|}

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

_ZN6hermes2vm24BigIntPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   31|      1|void BigIntPrimitiveBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   32|      1|  mb.setVTable(&BigIntPrimitive::vt);
   33|      1|}
_ZN6hermes2vm15BigIntPrimitive19calcCellSizeInBytesEj:
   35|   781k|uint32_t BigIntPrimitive::calcCellSizeInBytes(uint32_t numDigits) {
   36|   781k|  return sizeof(BigIntPrimitive) + numDigits * DigitSizeInBytes;
   37|   781k|}
_ZN6hermes2vm15BigIntPrimitiveC2Ej:
   39|   390k|BigIntPrimitive::BigIntPrimitive(uint32_t numDigits) : numDigits(numDigits) {
   40|   390k|  assert(
   41|   390k|      (calcCellSizeInBytes(numDigits) - numTrailingBytes() ==
   42|   390k|       sizeof(BigIntPrimitive)) &&
   43|   390k|      "cell must fit BigIntPrimitive + Digits exactly");
   44|   390k|}
_ZN6hermes2vm15BigIntPrimitive8toStringERNS0_7RuntimeENS0_12PseudoHandleIS1_EEh:
   80|   781k|    uint8_t radix) {
   81|   781k|  std::string result = bigint::toString(self->getImmutableRef(runtime), radix);
   82|   781k|  return StringPrimitive::createEfficient(
   83|   781k|      runtime, createASCIIRef(result.c_str()));
   84|   781k|}
_ZN6hermes2vm15BigIntPrimitive10unaryMinusERNS0_7RuntimeENS0_6HandleIS1_EE:
  147|      1|    Handle<BigIntPrimitive> src) {
  148|      1|  if (src->compare(0) == 0) {
  ------------------
  |  Branch (148:7): [True: 0, False: 1]
  ------------------
  149|      0|    return HermesValue::encodeBigIntValue(*src);
  150|      0|  }
  151|       |
  152|      1|  const uint32_t numDigits =
  153|      1|      bigint::unaryMinusResultSize(src->getImmutableRef(runtime));
  154|      1|  return unaryOp(runtime, &bigint::unaryMinus, src, numDigits);
  155|      1|}
_ZN6hermes2vm15BigIntPrimitive7unaryOpIPFNS_6bigint15OperationStatusENS3_16MutableBigIntRefENS3_18ImmutableBigIntRefEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeET_NS0_6HandleIS1_EEm:
  129|      1|    size_t numDigits) {
  130|      1|  auto u =
  131|      1|      BigIntPrimitive::createUninitializedWithNumDigits(runtime, numDigits);
  132|       |
  133|      1|  if (LLVM_UNLIKELY(u == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  134|      0|    return ExecutionStatus::EXCEPTION;
  135|      0|  }
  136|       |
  137|      1|  auto res = (op)(u->getMutableRef(runtime), src->getImmutableRef(runtime));
  138|      1|  if (LLVM_UNLIKELY(res != bigint::OperationStatus::RETURNED)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  139|      0|    return raiseOnError(runtime, res);
  140|      0|  }
  141|       |
  142|      1|  return HermesValue::encodeBigIntValue(u->getBigIntPrimitive());
  143|      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|    160|void buildMetadataTable() {
   42|       |  // Once the storage is initialized, also initialize the global array of VTable
   43|       |  // pointers using the new metadata.
   44|    160|  static std::once_flag flag;
   45|    160|  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|    160|    Metadata::metadataTable = {
   49|    160|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
   50|    160|#include "hermes/VM/CellKinds.def"
   51|    160|#undef CELL_KIND
   52|    160|    };
   53|       |
   54|    160|    assert(
   55|    160|        !VTable::vtableArray[0] &&
   56|    160|        "VTable array should not be initialized before this point.");
   57|    160|    VTable::vtableArray = {
   58|    160|#define CELL_KIND(name) \
   59|    160|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
   60|    160|#include "hermes/VM/CellKinds.def"
   61|    160|#undef CELL_KIND
   62|    160|    };
   63|    160|  });
   64|    160|}
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|      1|    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|    960|    Handle<JSObject> parentHandle) {
   71|    960|  return JSObject::create(runtime, parentHandle);
   72|    960|}
_ZN6hermes2vm8Callable20defineLazyPropertiesENS0_6HandleIS1_EERNS0_7RuntimeE:
   74|    454|void Callable::defineLazyProperties(Handle<Callable> fn, Runtime &runtime) {
   75|       |  // lazy functions can be Bound or JS Functions.
   76|    454|  if (auto jsFun = Handle<JSFunction>::dyn_vmcast(fn)) {
  ------------------
  |  Branch (76:12): [True: 454, False: 0]
  ------------------
   77|    454|    const CodeBlock *codeBlock = jsFun->getCodeBlock(runtime);
   78|       |    // Create empty object for prototype.
   79|    454|    auto prototypeParent = vmisa<JSGeneratorFunction>(*jsFun)
  ------------------
  |  Branch (79:28): [True: 0, False: 454]
  ------------------
   80|    454|        ? Handle<JSObject>::vmcast(&runtime.generatorPrototype)
   81|    454|        : 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|    454|    auto prototypeObjectHandle =
   89|    454|        codeBlock->getHeaderFlags().isCallProhibited(/* construct */ true) &&
  ------------------
  |  Branch (89:9): [True: 0, False: 454]
  ------------------
   90|    454|            !vmisa<JSGeneratorFunction>(*jsFun)
  ------------------
  |  Branch (90:13): [True: 0, False: 0]
  ------------------
   91|    454|        ? Runtime::makeNullHandle<JSObject>()
   92|    454|        : runtime.makeHandle(JSObject::create(runtime, prototypeParent));
   93|       |
   94|    454|    auto cr = Callable::defineNameLengthAndPrototype(
   95|    454|        fn,
   96|    454|        runtime,
   97|    454|        codeBlock->getNameMayAllocate(),
   98|    454|        codeBlock->getParamCount() - 1,
   99|    454|        prototypeObjectHandle,
  100|    454|        Callable::WritablePrototype::Yes,
  101|    454|        codeBlock->isStrictMode());
  102|    454|    assert(
  103|    454|        cr != ExecutionStatus::EXCEPTION && "failed to define length and name");
  104|    454|    (void)cr;
  105|    454|  } else {
  106|       |    // no other kind of function can be lazy currently
  107|      0|    assert(false && "invalid lazy function");
  108|      0|  }
  109|    454|}
_ZN6hermes2vm8Callable28defineNameLengthAndPrototypeENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDEjNS2_INS0_8JSObjectEEENS1_17WritablePrototypeEb:
  118|  77.7k|    bool strictMode) {
  119|  77.7k|  PropertyFlags pf;
  120|  77.7k|  pf.clear();
  121|  77.7k|  pf.enumerable = 0;
  122|  77.7k|  pf.writable = 0;
  123|  77.7k|  pf.configurable = 1;
  124|       |
  125|  77.7k|  GCScope scope{runtime, "defineNameLengthAndPrototype"};
  126|       |
  127|  77.7k|  namespace P = Predefined;
  128|       |/// Adds a property to the object in \p OBJ_HANDLE.  \p SYMBOL provides its name
  129|       |/// as a \c Predefined enum value, and its value is  rooted in \p HANDLE.  If
  130|       |/// property definition fails, the exceptional execution status will be
  131|       |/// propagated to the outer function.
  132|  77.7k|#define DEFINE_PROP(OBJ_HANDLE, SYMBOL, HANDLE)                            \
  133|  77.7k|  do {                                                                     \
  134|  77.7k|    auto status = JSObject::defineNewOwnProperty(                          \
  135|  77.7k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  136|  77.7k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  137|  77.7k|      return ExecutionStatus::EXCEPTION;                                   \
  138|  77.7k|    }                                                                      \
  139|  77.7k|  } while (false)
  140|       |
  141|  77.7k|  assert(name.isValid() && "A name must always be provided");
  142|       |
  143|       |  // Length is the number of formal arguments.
  144|       |  // 10.2.9 SetFunctionLength is performed during 10.2.3 OrdinaryFunctionCreate.
  145|  77.7k|  auto lengthHandle =
  146|  77.7k|      runtime.makeHandle(HermesValue::encodeUntrustedNumberValue(paramCount));
  147|  77.7k|  DEFINE_PROP(selfHandle, P::length, lengthHandle);
  ------------------
  |  |  133|  77.7k|  do {                                                                     \
  |  |  134|  77.7k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  135|  77.7k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  136|  77.7k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  77.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 77.7k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  138|      0|    }                                                                      \
  |  |  139|  77.7k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (139:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  148|       |
  149|       |  // Define the name.
  150|       |  // 10.2.8 SetFunctionName is performed after 10.2.3 OrdinaryFunctionCreate.
  151|  77.7k|  auto nameHandle = runtime.makeHandle(runtime.getStringPrimFromSymbolID(name));
  152|  77.7k|  DEFINE_PROP(selfHandle, P::name, nameHandle);
  ------------------
  |  |  133|  77.7k|  do {                                                                     \
  |  |  134|  77.7k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  135|  77.7k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  136|  77.7k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  77.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 77.7k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  138|      0|    }                                                                      \
  |  |  139|  77.7k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (139:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  153|       |
  154|  77.7k|  if (strictMode) {
  ------------------
  |  Branch (154:7): [True: 320, False: 77.4k]
  ------------------
  155|       |    // Define .callee and .arguments properties: throw always in strict mode.
  156|    320|    auto accessor =
  157|    320|        Handle<PropertyAccessor>::vmcast(&runtime.throwTypeErrorAccessor);
  158|       |
  159|    320|    pf.clear();
  160|    320|    pf.enumerable = 0;
  161|    320|    pf.configurable = 0;
  162|    320|    pf.accessor = 1;
  163|       |
  164|    320|    DEFINE_PROP(selfHandle, P::caller, accessor);
  ------------------
  |  |  133|    320|  do {                                                                     \
  |  |  134|    320|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  135|    320|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  136|    320|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|    320|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  138|      0|    }                                                                      \
  |  |  139|    320|  } while (false)
  |  |  ------------------
  |  |  |  Branch (139:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  165|    320|    DEFINE_PROP(selfHandle, P::arguments, accessor);
  ------------------
  |  |  133|    320|  do {                                                                     \
  |  |  134|    320|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  135|    320|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  136|    320|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|    320|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 320]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  138|      0|    }                                                                      \
  |  |  139|    320|  } while (false)
  |  |  ------------------
  |  |  |  Branch (139:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  166|    320|  }
  167|       |
  168|  77.7k|  if (prototypeObjectHandle) {
  ------------------
  |  Branch (168:7): [True: 7.01k, False: 70.7k]
  ------------------
  169|       |    // Set its 'prototype' property.
  170|  7.01k|    pf.clear();
  171|  7.01k|    pf.enumerable = 0;
  172|       |    /// System constructors have read-only prototypes.
  173|  7.01k|    pf.writable = (uint8_t)writablePrototype;
  174|  7.01k|    pf.configurable = 0;
  175|  7.01k|    DEFINE_PROP(selfHandle, P::prototype, prototypeObjectHandle);
  ------------------
  |  |  133|  7.01k|  do {                                                                     \
  |  |  134|  7.01k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  135|  7.01k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  136|  7.01k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  7.01k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 7.01k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  138|      0|    }                                                                      \
  |  |  139|  7.01k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (139:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  176|       |
  177|  7.01k|    if (LLVM_LIKELY(!vmisa<JSGeneratorFunction>(*selfHandle))) {
  ------------------
  |  |  188|  7.01k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7.01k, False: 0]
  |  |  ------------------
  ------------------
  178|       |      // Set the 'constructor' property in the prototype object.
  179|       |      // This must not be set for GeneratorFunctions, because
  180|       |      // prototypes must not point back to their constructors.
  181|       |      // See the diagram: ES9.0 25.2 (GeneratorFunction objects).
  182|  7.01k|      pf.clear();
  183|  7.01k|      pf.enumerable = 0;
  184|  7.01k|      pf.writable = 1;
  185|  7.01k|      pf.configurable = 1;
  186|  7.01k|      DEFINE_PROP(prototypeObjectHandle, P::constructor, selfHandle);
  ------------------
  |  |  133|  7.01k|  do {                                                                     \
  |  |  134|  7.01k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  135|  7.01k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  136|  7.01k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  7.01k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 7.01k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  138|      0|    }                                                                      \
  |  |  139|  7.01k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (139:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  187|  7.01k|    }
  188|  7.01k|  }
  189|       |
  190|  77.7k|  return ExecutionStatus::RETURNED;
  191|       |
  192|  77.7k|#undef DEFINE_PROP
  193|  77.7k|}
_ZN6hermes2vm8Callable12executeCall0ENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEEb:
  201|  2.66M|    bool construct) {
  202|  2.66M|  ScopedNativeCallFrame newFrame{
  203|  2.66M|      runtime,
  204|  2.66M|      0,
  205|  2.66M|      selfHandle.getHermesValue(),
  206|  2.66M|      construct ? selfHandle.getHermesValue()
  ------------------
  |  Branch (206:7): [True: 0, False: 2.66M]
  ------------------
  207|  2.66M|                : HermesValue::encodeUndefinedValue(),
  208|  2.66M|      *thisArgHandle};
  209|  2.66M|  if (LLVM_UNLIKELY(newFrame.overflowed()))
  ------------------
  |  |  189|  2.66M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.66M]
  |  |  ------------------
  ------------------
  210|      0|    return runtime.raiseStackOverflow(Runtime::StackOverflowKind::NativeStack);
  211|  2.66M|  return call(selfHandle, runtime);
  212|  2.66M|}
_ZN6hermes2vm8Callable28extractOwnLengthProperty_RJSENS0_6HandleIS1_EERNS0_7RuntimeE:
  401|    241|    Runtime &runtime) {
  402|    241|  CallResult<PseudoHandle<>> propRes{
  403|    241|      createPseudoHandle(HermesValue::encodeUndefinedValue())};
  404|    241|  NamedPropertyDescriptor desc;
  405|    241|  if (JSObject::getOwnNamedDescriptor(
  ------------------
  |  Branch (405:7): [True: 241, False: 0]
  ------------------
  406|    241|          selfHandle,
  407|    241|          runtime,
  408|    241|          Predefined::getSymbolID(Predefined::length),
  409|    241|          desc)) {
  410|    241|    propRes = JSObject::getNamedPropertyValue_RJS(
  411|    241|        selfHandle, runtime, selfHandle, desc);
  412|    241|  } else if (selfHandle->isProxyObject()) {
  ------------------
  |  Branch (412:14): [True: 0, False: 0]
  ------------------
  413|      0|    ComputedPropertyDescriptor desc;
  414|      0|    CallResult<bool> hasLength = JSProxy::getOwnProperty(
  415|      0|        selfHandle,
  416|      0|        runtime,
  417|      0|        runtime.getPredefinedStringHandle(Predefined::length),
  418|      0|        desc,
  419|      0|        nullptr);
  420|      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]
  |  |  ------------------
  ------------------
  421|      0|      return ExecutionStatus::EXCEPTION;
  422|      0|    }
  423|      0|    if (*hasLength) {
  ------------------
  |  Branch (423:9): [True: 0, False: 0]
  ------------------
  424|      0|      propRes = JSProxy::getNamed(
  425|      0|          selfHandle,
  426|      0|          runtime,
  427|      0|          Predefined::getSymbolID(Predefined::length),
  428|      0|          selfHandle);
  429|      0|    }
  430|      0|  }
  431|       |
  432|    241|  {
  433|    241|    NoAllocScope naScope{runtime};
  434|       |
  435|    241|    if (propRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (435:9): [True: 0, False: 241]
  ------------------
  436|      0|      return ExecutionStatus::EXCEPTION;
  437|      0|    }
  438|       |
  439|    241|    if (!(*propRes)->isNumber()) {
  ------------------
  |  Branch (439:9): [True: 0, False: 241]
  ------------------
  440|      0|      return 0.0;
  441|      0|    }
  442|    241|  }
  443|       |
  444|    241|  auto intRes =
  445|    241|      toIntegerOrInfinity(runtime, runtime.makeHandle(std::move(*propRes)));
  446|    241|  if (intRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (446:7): [True: 0, False: 241]
  ------------------
  447|      0|    return ExecutionStatus::EXCEPTION;
  448|      0|  }
  449|       |
  450|    241|  return intRes->getNumber();
  451|    241|}
_ZN6hermes2vm22BoundFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  485|      1|void BoundFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  486|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<BoundFunction>());
  487|      1|  CallableBuildMeta(cell, mb);
  488|      1|  const auto *self = static_cast<const BoundFunction *>(cell);
  489|      1|  mb.setVTable(&BoundFunction::vt);
  490|      1|  mb.addField("target", &self->target_);
  491|      1|  mb.addField("argStorage", &self->argStorage_);
  492|      1|}
_ZN6hermes2vm13BoundFunction6createERNS0_7RuntimeENS0_6HandleINS0_8CallableEEEjNSt3__116reverse_iteratorIPKNS0_17PinnedHermesValueEEE:
  498|    160|    ConstArgIterator argsWithThis) {
  499|    160|  unsigned argCount = argCountWithThis > 0 ? argCountWithThis - 1 : 0;
  ------------------
  |  Branch (499:23): [True: 160, False: 0]
  ------------------
  500|       |
  501|       |  // Copy the arguments. If we don't have any, we must at least initialize
  502|       |  // 'this' to 'undefined'.
  503|    160|  auto arrRes = ArrayStorage::create(runtime, argCount + 1);
  504|    160|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  505|      0|    return ExecutionStatus::EXCEPTION;
  506|      0|  }
  507|    160|  auto arrHandle = runtime.makeMutableHandle(vmcast<ArrayStorage>(*arrRes));
  508|       |
  509|    160|  if (argCountWithThis) {
  ------------------
  |  Branch (509:7): [True: 160, False: 0]
  ------------------
  510|    320|    for (unsigned i = 0; i != argCountWithThis; ++i) {
  ------------------
  |  Branch (510:26): [True: 160, False: 160]
  ------------------
  511|    160|      ArrayStorage::push_back(arrHandle, runtime, Handle<>(&argsWithThis[i]));
  512|    160|    }
  513|    160|  } else {
  514|       |    // Don't need to worry about resizing since it was created with a capacity
  515|       |    // of at least 1.
  516|      0|    ArrayStorage::push_back(arrHandle, runtime, Runtime::getUndefinedValue());
  517|      0|  }
  518|       |
  519|    160|  auto *cell = runtime.makeAFixed<BoundFunction>(
  520|    160|      runtime,
  521|    160|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
  522|    160|      runtime.getHiddenClassForPrototype(
  523|    160|          runtime.functionPrototypeRawPtr, numOverlapSlots<BoundFunction>()),
  524|    160|      target,
  525|    160|      arrHandle);
  526|    160|  auto selfHandle = JSObjectInit::initToHandle(runtime, cell);
  527|       |
  528|    160|  if (initializeLengthAndName_RJS(selfHandle, runtime, target, argCount) ==
  ------------------
  |  Branch (528:7): [True: 0, False: 160]
  ------------------
  529|    160|      ExecutionStatus::EXCEPTION) {
  530|      0|    return ExecutionStatus::EXCEPTION;
  531|      0|  }
  532|    160|  return selfHandle.getHermesValue();
  533|    160|}
_ZN6hermes2vm13BoundFunction27initializeLengthAndName_RJSENS0_6HandleINS0_8CallableEEERNS0_7RuntimeES4_j:
  539|    160|    unsigned argCount) {
  540|    160|  if (LLVM_UNLIKELY(target->isLazy())) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  541|      0|    Callable::initializeLazyObject(runtime, target);
  542|      0|  }
  543|       |
  544|       |  // Extract target.length.
  545|    160|  auto targetLength = Callable::extractOwnLengthProperty_RJS(target, runtime);
  546|    160|  if (targetLength == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (546:7): [True: 0, False: 160]
  ------------------
  547|      0|    return ExecutionStatus::EXCEPTION;
  548|       |
  549|       |  // Define .length
  550|    160|  PropertyFlags pf{};
  551|    160|  pf.enumerable = 0;
  552|    160|  pf.writable = 0;
  553|    160|  pf.configurable = 1;
  554|       |
  555|       |  // Length is the number of formal arguments.
  556|    160|  auto length = runtime.makeHandle(HermesValue::encodeUntrustedNumberValue(
  557|    160|      argCount >= *targetLength ? 0.0 : *targetLength - argCount));
  ------------------
  |  Branch (557:7): [True: 0, False: 160]
  ------------------
  558|    160|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  559|    160|          JSObject::defineNewOwnProperty(
  560|    160|              selfHandle,
  561|    160|              runtime,
  562|    160|              Predefined::getSymbolID(Predefined::length),
  563|    160|              pf,
  564|    160|              length) == ExecutionStatus::EXCEPTION)) {
  565|      0|    return ExecutionStatus::EXCEPTION;
  566|      0|  }
  567|       |
  568|       |  // Set the name by prepending "bound ".
  569|    160|  auto propRes = JSObject::getNamed_RJS(
  570|    160|      target, runtime, Predefined::getSymbolID(Predefined::name));
  571|    160|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  572|      0|    return ExecutionStatus::EXCEPTION;
  573|      0|  }
  574|    160|  auto nameHandle = (*propRes)->isString()
  ------------------
  |  Branch (574:21): [True: 160, False: 0]
  ------------------
  575|    160|      ? runtime.makeHandle<StringPrimitive>(propRes->getHermesValue())
  576|    160|      : runtime.getPredefinedStringHandle(Predefined::emptyString);
  577|    160|  auto nameView = StringPrimitive::createStringView(runtime, nameHandle);
  578|    160|  llvh::SmallU16String<32> boundName{"bound "};
  579|    160|  boundName.append(nameView.begin(), nameView.end());
  580|       |  // Share name strings for repeatedly bound functions by using the
  581|       |  // identifier table. If a new symbol is created, it will disappear
  582|       |  // after the name string dies, since nothing else refers to it.
  583|    160|  auto &identifierTable = runtime.getIdentifierTable();
  584|    160|  auto boundNameSym = identifierTable.getSymbolHandle(runtime, boundName);
  585|    160|  if (LLVM_UNLIKELY(boundNameSym == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  586|      0|    return ExecutionStatus::EXCEPTION;
  587|      0|  }
  588|    160|  Handle<StringPrimitive> boundNameHandle(
  589|    160|      runtime, identifierTable.getStringPrim(runtime, **boundNameSym));
  590|    160|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  591|    160|  dpf.writable = 0;
  592|    160|  dpf.enumerable = 0;
  593|       |
  594|    160|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  595|    160|          JSObject::defineOwnProperty(
  596|    160|              selfHandle,
  597|    160|              runtime,
  598|    160|              Predefined::getSymbolID(Predefined::name),
  599|    160|              dpf,
  600|    160|              boundNameHandle) == ExecutionStatus::EXCEPTION)) {
  601|      0|    return ExecutionStatus::EXCEPTION;
  602|      0|  }
  603|       |
  604|       |  // Define .callee and .arguments properties: throw always in bound functions.
  605|    160|  auto accessor =
  606|    160|      Handle<PropertyAccessor>::vmcast(&runtime.throwTypeErrorAccessor);
  607|       |
  608|    160|  pf.clear();
  609|    160|  pf.enumerable = 0;
  610|    160|  pf.configurable = 0;
  611|    160|  pf.accessor = 1;
  612|       |
  613|    160|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  614|    160|          JSObject::defineNewOwnProperty(
  615|    160|              selfHandle,
  616|    160|              runtime,
  617|    160|              Predefined::getSymbolID(Predefined::caller),
  618|    160|              pf,
  619|    160|              accessor) == ExecutionStatus::EXCEPTION)) {
  620|      0|    return ExecutionStatus::EXCEPTION;
  621|      0|  }
  622|       |
  623|    160|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  624|    160|          JSObject::defineNewOwnProperty(
  625|    160|              selfHandle,
  626|    160|              runtime,
  627|    160|              Predefined::getSymbolID(Predefined::arguments),
  628|    160|              pf,
  629|    160|              accessor) == ExecutionStatus::EXCEPTION)) {
  630|      0|    return ExecutionStatus::EXCEPTION;
  631|      0|  }
  632|       |
  633|    160|  return ExecutionStatus::RETURNED;
  634|    160|}
_ZN6hermes2vm23NativeFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  833|      4|void NativeFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  834|      4|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<NativeFunction>());
  835|      4|  CallableBuildMeta(cell, mb);
  836|      4|  mb.setVTable(&NativeFunction::vt);
  837|      4|}
_ZN6hermes2vm14NativeFunction6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S3_NS0_10NativeArgsEENS0_8SymbolIDEjS6_j:
  854|  70.5k|    unsigned additionalSlotCount) {
  855|  70.5k|  size_t reservedSlots =
  856|  70.5k|      numOverlapSlots<NativeFunction>() + additionalSlotCount;
  857|  70.5k|  auto *cell = runtime.makeAFixed<NativeFunction>(
  858|  70.5k|      runtime,
  859|  70.5k|      parentHandle,
  860|  70.5k|      runtime.getHiddenClassForPrototype(*parentHandle, reservedSlots),
  861|  70.5k|      context,
  862|  70.5k|      functionPtr);
  863|  70.5k|  auto selfHandle = JSObjectInit::initToHandle(runtime, cell);
  864|       |
  865|       |  // Allocate a propStorage if the number of additional slots requires it.
  866|  70.5k|  runtime.ignoreAllocationFailure(
  867|  70.5k|      JSObject::allocatePropStorage(selfHandle, runtime, reservedSlots));
  868|       |
  869|  70.5k|  auto st = defineNameLengthAndPrototype(
  870|  70.5k|      selfHandle,
  871|  70.5k|      runtime,
  872|  70.5k|      name,
  873|  70.5k|      paramCount,
  874|  70.5k|      prototypeObjectHandle,
  875|  70.5k|      Callable::WritablePrototype::Yes,
  876|  70.5k|      false);
  877|  70.5k|  (void)st;
  878|  70.5k|  assert(
  879|  70.5k|      st != ExecutionStatus::EXCEPTION && "defineLengthAndPrototype() failed");
  880|       |
  881|  70.5k|  return selfHandle;
  882|  70.5k|}
_ZN6hermes2vm14NativeFunction9_callImplENS0_6HandleINS0_8CallableEEERNS0_7RuntimeE:
  922|  2.66M|    Runtime &runtime) {
  923|  2.66M|  return _nativeCall(vmcast<NativeFunction>(selfHandle.get()), runtime);
  924|  2.66M|}
_ZN6hermes2vm26NativeConstructorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1008|      1|void NativeConstructorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1009|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<NativeConstructor>());
 1010|      1|  NativeFunctionBuildMeta(cell, mb);
 1011|      1|  mb.setVTable(&NativeConstructor::vt);
 1012|      1|}
_ZN6hermes2vm19JSFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1063|      4|void JSFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1064|      4|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSFunction>());
 1065|      4|  CallableBuildMeta(cell, mb);
 1066|      4|  const auto *self = static_cast<const JSFunction *>(cell);
 1067|      4|  mb.addField("domain", &self->domain_);
 1068|      4|  mb.setVTable(&JSFunction::vt);
 1069|      4|}
_ZN6hermes2vm10JSFunction6createERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS4_INS0_8JSObjectEEENS4_INS0_11EnvironmentEEEPNS0_9CodeBlockE:
 1076|  6.19k|    CodeBlock *codeBlock) {
 1077|  6.19k|  auto *cell = runtime.makeAFixed<JSFunction, kHasFinalizer>(
 1078|  6.19k|      runtime,
 1079|  6.19k|      domain,
 1080|  6.19k|      parentHandle,
 1081|  6.19k|      runtime.getHiddenClassForPrototype(
 1082|  6.19k|          *parentHandle, numOverlapSlots<JSFunction>()),
 1083|  6.19k|      envHandle,
 1084|  6.19k|      codeBlock);
 1085|  6.19k|  auto self = JSObjectInit::initToPseudoHandle(runtime, cell);
 1086|  6.19k|  self->flags_.lazyObject = 1;
 1087|  6.19k|  return self;
 1088|  6.19k|}
_ZN6hermes2vm24JSAsyncFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1183|      1|void JSAsyncFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1184|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSAsyncFunction>());
 1185|      1|  JSFunctionBuildMeta(cell, mb);
 1186|      1|  mb.setVTable(&JSAsyncFunction::vt);
 1187|      1|}
_ZN6hermes2vm28JSGeneratorFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1240|      1|void JSGeneratorFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1241|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSGeneratorFunction>());
 1242|      1|  JSFunctionBuildMeta(cell, mb);
 1243|      1|  mb.setVTable(&JSGeneratorFunction::vt);
 1244|      1|}
_ZN6hermes2vm31GeneratorInnerFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1299|      1|    Metadata::Builder &mb) {
 1300|      1|  mb.addJSObjectOverlapSlots(
 1301|      1|      JSObject::numOverlapSlots<GeneratorInnerFunction>());
 1302|      1|  JSFunctionBuildMeta(cell, mb);
 1303|      1|  const auto *self = static_cast<const GeneratorInnerFunction *>(cell);
 1304|      1|  mb.setVTable(&GeneratorInnerFunction::vt);
 1305|      1|  mb.addField("savedContext", &self->savedContext_);
 1306|      1|  mb.addField("result", &self->result_);
 1307|      1|}

_ZN6hermes2vm27CheckHeapWellFormedAcceptorC2ERNS0_6GCBaseE:
   19|    226|    : RootAndSlotAcceptorDefault(gc.getPointerBase()),
   20|    226|      WeakAcceptorDefault(gc.getPointerBase()),
   21|    226|      gc(gc) {}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor6acceptERPNS0_6GCCellE:
   23|  11.1M|void CheckHeapWellFormedAcceptor::accept(GCCell *&ptr) {
   24|  11.1M|  accept(static_cast<const GCCell *>(ptr));
   25|  11.1M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor6acceptEPKNS0_6GCCellE:
   27|  13.5M|void CheckHeapWellFormedAcceptor::accept(const GCCell *ptr) {
   28|  13.5M|  assert(
   29|  13.5M|      (!ptr || gc.validPointer(ptr)) &&
   30|  13.5M|      "A pointer is pointing outside of the valid region");
   31|  13.5M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor10acceptWeakERPNS0_6GCCellE:
   33|   139k|void CheckHeapWellFormedAcceptor::acceptWeak(GCCell *&ptr) {
   34|       |  // A weak pointer has the same well-formed-ness checks as a normal pointer.
   35|   139k|  accept(ptr);
   36|   139k|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor8acceptHVERNS0_11HermesValueE:
   38|  21.9M|void CheckHeapWellFormedAcceptor::acceptHV(HermesValue &hv) {
   39|  21.9M|  assert(!hv.isInvalid() && "HermesValue with InvalidTag encountered by GC.");
   40|  21.9M|  if (hv.isPointer()) {
  ------------------
  |  Branch (40:7): [True: 1.32M, False: 20.6M]
  ------------------
   41|  1.32M|    GCCell *cell = static_cast<GCCell *>(hv.getPointer());
   42|  1.32M|    accept(cell);
   43|  20.6M|  } else if (hv.isSymbol()) {
  ------------------
  |  Branch (43:14): [True: 212, False: 20.6M]
  ------------------
   44|    212|    acceptSym(hv.getSymbol());
   45|    212|  }
   46|  21.9M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor9acceptSHVERNS0_13HermesValue32E:
   48|  7.39M|void CheckHeapWellFormedAcceptor::acceptSHV(SmallHermesValue &hv) {
   49|  7.39M|  if (hv.isPointer()) {
  ------------------
  |  Branch (49:7): [True: 3.11M, False: 4.28M]
  ------------------
   50|  3.11M|    GCCell *cell = static_cast<GCCell *>(hv.getPointer(pointerBase_));
   51|  3.11M|    accept(cell);
   52|  4.28M|  } else if (hv.isSymbol()) {
  ------------------
  |  Branch (52:14): [True: 2.34k, False: 4.27M]
  ------------------
   53|  2.34k|    acceptSym(hv.getSymbol());
   54|  2.34k|  }
   55|  7.39M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor9acceptSymENS0_8SymbolIDE:
   57|  2.34M|void CheckHeapWellFormedAcceptor::acceptSym(SymbolID sym) {
   58|  2.34M|  if (!sym.isValid()) {
  ------------------
  |  Branch (58:7): [True: 570, False: 2.34M]
  ------------------
   59|    570|    return;
   60|    570|  }
   61|  2.34M|  assert(
   62|  2.34M|      gc.getCallbacks().isSymbolLive(sym) &&
   63|  2.34M|      "Symbol is marked but is not live");
   64|       |  // Check that the string used by this symbol is valid.
   65|  2.34M|  accept(
   66|  2.34M|      static_cast<const GCCell *>(gc.getCallbacks().getStringForSymbol(sym)));
   67|  2.34M|}

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

_ZN6hermes2vm8Debugger17willExecuteModuleEPNS0_13RuntimeModuleEPNS0_9CodeBlockE:
  543|    356|void Debugger::willExecuteModule(RuntimeModule *module, CodeBlock *codeBlock) {
  544|       |  // This function should only be called on the main RuntimeModule and not on
  545|       |  // any "child" RuntimeModules it may create through lazy compilation.
  546|    356|  assert(
  547|    356|      module == module->getLazyRootModule() &&
  548|    356|      "Expected to only run on lazy root module");
  549|       |
  550|    356|  if (!getShouldPauseOnScriptLoad())
  ------------------
  |  Branch (550:7): [True: 356, False: 0]
  ------------------
  551|    356|    return;
  552|       |  // We want to pause on the first instruction of this module.
  553|       |  // Add a breakpoint on the first opcode of its global function.
  554|      0|  auto globalFunctionIndex = module->getBytecode()->getGlobalFunctionIndex();
  555|      0|  auto globalCode = module->getCodeBlockMayAllocate(globalFunctionIndex);
  556|      0|  setOnLoadBreakpoint(globalCode, 0);
  557|      0|}
_ZN6hermes2vm8Debugger16willUnloadModuleEPNS0_13RuntimeModuleE:
  559|    597|void Debugger::willUnloadModule(RuntimeModule *module) {
  560|    597|  if (tempBreakpoints_.size() == 0 && restorationBreakpoints_.size() == 0 &&
  ------------------
  |  Branch (560:7): [True: 597, False: 0]
  |  Branch (560:39): [True: 597, False: 0]
  ------------------
  561|    597|      userBreakpoints_.size() == 0) {
  ------------------
  |  Branch (561:7): [True: 597, False: 0]
  ------------------
  562|    597|    return;
  563|    597|  }
  564|       |
  565|      0|  llvh::DenseSet<CodeBlock *> unloadingBlocks;
  566|      0|  for (auto *block : module->getFunctionMap()) {
  ------------------
  |  Branch (566:20): [True: 0, False: 0]
  ------------------
  567|      0|    if (block) {
  ------------------
  |  Branch (567:9): [True: 0, False: 0]
  ------------------
  568|      0|      unloadingBlocks.insert(block);
  569|      0|    }
  570|      0|  }
  571|       |
  572|      0|  for (auto &bp : userBreakpoints_) {
  ------------------
  |  Branch (572:17): [True: 0, False: 0]
  ------------------
  573|      0|    if (unloadingBlocks.count(bp.second.codeBlock)) {
  ------------------
  |  Branch (573:9): [True: 0, False: 0]
  ------------------
  574|      0|      unresolveBreakpointLocation(bp.second);
  575|      0|    }
  576|      0|  }
  577|       |
  578|      0|  auto cleanNonUserBreakpoint = [&](Breakpoint &bp) {
  579|      0|    if (!unloadingBlocks.count(bp.codeBlock))
  580|      0|      return false;
  581|       |
  582|      0|    auto *ptr = bp.codeBlock->getOffsetPtr(bp.offset);
  583|      0|    auto it = breakpointLocations_.find(ptr);
  584|      0|    if (it != breakpointLocations_.end()) {
  585|      0|      auto &location = it->second;
  586|      0|      assert(!location.user.hasValue() && "Unexpected user breakpoint");
  587|      0|      uninstallBreakpoint(bp.codeBlock, bp.offset, location.opCode);
  588|      0|      breakpointLocations_.erase(it);
  589|      0|    }
  590|      0|    return true;
  591|      0|  };
  592|       |
  593|      0|  tempBreakpoints_.erase(
  594|      0|      std::remove_if(
  595|      0|          tempBreakpoints_.begin(),
  596|      0|          tempBreakpoints_.end(),
  597|      0|          cleanNonUserBreakpoint),
  598|      0|      tempBreakpoints_.end());
  599|       |
  600|      0|  restorationBreakpoints_.erase(
  601|      0|      std::remove_if(
  602|      0|          restorationBreakpoints_.begin(),
  603|      0|          restorationBreakpoints_.end(),
  604|      0|          cleanNonUserBreakpoint),
  605|      0|      restorationBreakpoints_.end());
  606|      0|}

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

_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|   192k|DictPropertyMap::size_type DictPropertyMap::getMaxCapacity() {
   65|   192k|  return detail::kMaxCapacity;
   66|   192k|}
_ZN6hermes2vm15DictPropertyMap6createERNS0_7RuntimeEj:
   70|   209k|    size_type capacity) {
   71|   209k|  if (LLVM_UNLIKELY(capacity > detail::kMaxCapacity)) {
  ------------------
  |  |  189|   209k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 209k]
  |  |  ------------------
  ------------------
   72|      0|    return runtime.raiseRangeError(
   73|      0|        TwineChar16("Property storage exceeds ") + detail::kMaxCapacity +
   74|      0|        " properties");
   75|      0|  }
   76|   209k|  size_type hashCapacity = calcHashCapacity(capacity);
   77|   209k|  auto *cell = runtime.makeAVariable<DictPropertyMap>(
   78|   209k|      allocationSize(capacity, hashCapacity), capacity, hashCapacity);
   79|   209k|  return createPseudoHandle(cell);
   80|   209k|}
_ZN6hermes2vm15DictPropertyMap14lookupEntryForEPS1_NS0_8SymbolIDE:
   84|  17.2M|    SymbolID symbolID) {
   85|  17.2M|  ++NumDictLookups;
   86|       |
   87|  17.2M|  size_type const mask = self->hashCapacity_ - 1;
   88|  17.2M|  size_type index = hash(symbolID) & mask;
   89|       |
   90|       |  // Probing step.
   91|  17.2M|  size_type step = 1;
   92|       |  // Save the address of the start of the table to avoid recalculating it.
   93|  17.2M|  HashPair *const tableStart = self->getHashPairs();
   94|       |  // The first deleted entry we found.
   95|  17.2M|  HashPair *deleted = nullptr;
   96|       |
   97|  17.2M|  assert(symbolID.isValid() && "looking for an invalid SymbolID");
   98|       |
   99|  27.5M|  for (;;) {
  100|  27.5M|    HashPair *curEntry = tableStart + index;
  101|       |
  102|  27.5M|    if (curEntry->isValid()) {
  ------------------
  |  Branch (102:9): [True: 17.1M, False: 10.4M]
  ------------------
  103|  17.1M|      if (self->isMatch(curEntry, symbolID))
  ------------------
  |  Branch (103:11): [True: 6.79M, False: 10.3M]
  ------------------
  104|  6.79M|        return {true, curEntry};
  105|  17.1M|    } else if (curEntry->isEmpty()) {
  ------------------
  |  Branch (105:16): [True: 10.4M, 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|  10.4M|      return {false, deleted ? deleted : curEntry};
  ------------------
  |  Branch (109:22): [True: 0, False: 10.4M]
  ------------------
  110|  10.4M|    } 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|  10.3M|    ++NumExtraHashProbes;
  119|  10.3M|    index = (index + step) & mask;
  120|  10.3M|    ++step;
  121|  10.3M|  }
  122|  17.2M|}
_ZN6hermes2vm15DictPropertyMap4growERNS0_13MutableHandleIS1_EERNS0_7RuntimeEj:
  127|  16.7k|    size_type newCapacity) {
  128|  16.7k|  auto res = create(runtime, newCapacity);
  129|  16.7k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  16.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 16.7k]
  |  |  ------------------
  ------------------
  130|      0|    return ExecutionStatus::EXCEPTION;
  131|      0|  }
  132|  16.7k|  auto *newSelf = res->get();
  133|  16.7k|  auto *self = *selfHandleRef;
  134|       |
  135|  16.7k|  selfHandleRef = newSelf;
  136|       |
  137|  16.7k|  auto *dst = newSelf->getDescriptorPairs();
  138|  16.7k|  size_type count = 0;
  139|       |
  140|  16.7k|  for (auto *src = self->getDescriptorPairs(),
  141|  16.7k|            *e = src + self->numDescriptors_.load(std::memory_order_relaxed);
  142|  1.23M|       src != e;
  ------------------
  |  Branch (142:8): [True: 1.21M, False: 16.7k]
  ------------------
  143|  1.21M|       ++src) {
  144|  1.21M|    if (src->first.isInvalid())
  ------------------
  |  Branch (144:9): [True: 0, False: 1.21M]
  ------------------
  145|      0|      continue;
  146|       |
  147|  1.21M|    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|  1.21M|    new (&dst->first) GCSymbolID(key);
  152|  1.21M|    dst->second = src->second;
  153|       |
  154|  1.21M|    auto result = lookupEntryFor(newSelf, key);
  155|  1.21M|    assert(!result.first && "found duplicate entry while growing");
  156|  1.21M|    result.second->setDescIndex(count, key);
  157|       |
  158|  1.21M|    ++dst;
  159|  1.21M|    ++count;
  160|  1.21M|  }
  161|       |
  162|  16.7k|  assert(
  163|  16.7k|      count == self->numProperties_ && "numProperties mismatch when growing");
  164|       |
  165|  16.7k|  newSelf->numProperties_ = count;
  166|       |
  167|       |  // Transfer the deleted list to the new instance.
  168|  16.7k|  auto deletedIndex = self->deletedListHead_;
  169|  16.7k|  if (deletedIndex != END_OF_LIST) {
  ------------------
  |  Branch (169:7): [True: 0, False: 16.7k]
  ------------------
  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|  16.7k|  newSelf->numDescriptors_.store(count, std::memory_order_release);
  194|  16.7k|  assert(count <= newSelf->descriptorCapacity_);
  195|  16.7k|  return ExecutionStatus::RETURNED;
  196|  16.7k|}
_ZN6hermes2vm15DictPropertyMap9findOrAddERNS0_13MutableHandleIS1_EERNS0_7RuntimeENS0_8SymbolIDE:
  202|   877k|    SymbolID id) {
  203|   877k|  auto *self = *selfHandleRef;
  204|   877k|  auto numDescriptors = self->numDescriptors_.load(std::memory_order_relaxed);
  205|   877k|  auto found = lookupEntryFor(self, id);
  206|   877k|  if (found.first) {
  ------------------
  |  Branch (206:7): [True: 0, False: 877k]
  ------------------
  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|   877k|  if (numDescriptors == self->descriptorCapacity_) {
  ------------------
  |  Branch (217:7): [True: 16.7k, False: 860k]
  ------------------
  218|  16.7k|    size_type newCapacity;
  219|  16.7k|    if (self->numProperties_ == self->descriptorCapacity_) {
  ------------------
  |  Branch (219:9): [True: 16.7k, 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|  16.7k|      newCapacity = self->numProperties_ * 2;
  225|  16.7k|      if (newCapacity > detail::kMaxCapacity)
  ------------------
  |  Branch (225:11): [True: 0, False: 16.7k]
  ------------------
  226|      0|        newCapacity =
  227|      0|            std::max(toRValue(detail::kMaxCapacity), self->numProperties_ + 1);
  228|  16.7k|    } 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|  16.7k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  16.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 16.7k]
  |  |  ------------------
  ------------------
  237|  16.7k|            grow(selfHandleRef, runtime, newCapacity) ==
  238|  16.7k|            ExecutionStatus::EXCEPTION)) {
  239|      0|      return ExecutionStatus::EXCEPTION;
  240|      0|    }
  241|       |
  242|  16.7k|    self = *selfHandleRef;
  243|  16.7k|    numDescriptors = self->numDescriptors_.load(std::memory_order_relaxed);
  244|       |
  245|  16.7k|    found = lookupEntryFor(self, id);
  246|  16.7k|  }
  247|       |
  248|   877k|  ++self->numProperties_;
  249|   877k|  if (found.second->isDeleted())
  ------------------
  |  Branch (249:7): [True: 0, False: 877k]
  ------------------
  250|      0|    self->decDeletedHashCount();
  251|       |
  252|   877k|  found.second->setDescIndex(numDescriptors, id);
  253|       |
  254|   877k|  auto *descPair = self->getDescriptorPairs() + numDescriptors;
  255|       |
  256|   877k|  descPair->first.set(id, runtime.getHeap());
  257|   877k|  self->numDescriptors_.fetch_add(1, std::memory_order_acq_rel);
  258|       |
  259|   877k|  return std::make_pair(&descPair->second, true);
  260|   877k|}
_ZN6hermes2vm15DictPropertyMap20allocatePropertySlotEPS1_RNS0_7RuntimeE:
  291|   701k|    Runtime &runtime) {
  292|       |  // If there are no deleted properties, the number of properties corresponds
  293|       |  // exactly to the number of slots.
  294|   701k|  if (self->deletedListHead_ == END_OF_LIST)
  ------------------
  |  Branch (294:7): [True: 701k, False: 0]
  ------------------
  295|   701k|    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|      0|}

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

_ZN6hermes2vm20DummyObjectBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  116|      1|void DummyObjectBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  117|      1|  const auto *self = static_cast<const testhelpers::DummyObject *>(cell);
  118|      1|  mb.setVTable(&testhelpers::DummyObject::vt);
  119|      1|  mb.addField("HermesBool", &self->hvBool);
  120|      1|  mb.addField("HermesDouble", &self->hvDouble);
  121|      1|  mb.addField("HermesUndefined", &self->hvUndefined);
  122|      1|  mb.addField("HermesEmpty", &self->hvEmpty);
  123|      1|  mb.addField("HermesNative", &self->hvNative);
  124|      1|  mb.addField("HermesNull", &self->hvNull);
  125|      1|  mb.addField("other", &self->other);
  126|      1|}

_ZN6hermes2vm6GCBaseC2ERNS1_11GCCallbacksERNS0_11PointerBaseERKNS0_8GCConfigENSt3__110shared_ptrINS0_12CrashManagerEEENS1_8HeapKindE:
   51|    160|    : gcCallbacks_(gcCallbacks),
   52|    160|      pointerBase_(pointerBase),
   53|    160|      crashMgr_(crashMgr),
   54|    160|      heapKind_(kind),
   55|    160|      analyticsCallback_(gcConfig.getAnalyticsCallback()),
   56|    160|      recordGcStats_(gcConfig.getShouldRecordStats()),
   57|       |      // Start off not in GC.
   58|    160|      inGC_(false),
   59|    160|      name_(gcConfig.getName()),
   60|    160|      weakSlots_(gcConfig.getOccupancyTarget(), 0.5 /* sizingWeight */),
   61|    160|      weakMapEntrySlots_(gcConfig.getOccupancyTarget(), 0.5 /* sizingWeight */),
   62|       |#ifdef HERMES_MEMORY_INSTRUMENTATION
   63|    160|      allocationLocationTracker_(this),
   64|    160|      samplingAllocationTracker_(this),
   65|       |#endif
   66|       |#ifdef HERMESVM_SANITIZE_HANDLES
   67|       |      sanitizeRate_(gcConfig.getSanitizeConfig().getSanitizeRate()),
   68|       |#endif
   69|    160|      tripwireCallback_(gcConfig.getTripwireConfig().getCallback()),
   70|    160|      tripwireLimit_(gcConfig.getTripwireConfig().getLimit()) {
   71|    640|  for (unsigned i = 0; i < (unsigned)XorPtrKeyID::_NumKeys; ++i) {
  ------------------
  |  Branch (71:24): [True: 480, False: 160]
  ------------------
   72|    480|    pointerEncryptionKey_[i] = std::random_device()();
   73|    480|    if constexpr (sizeof(uintptr_t) >= 8) {
   74|       |      // std::random_device() yields an unsigned int, so combine two.
   75|    480|      pointerEncryptionKey_[i] =
   76|    480|          (pointerEncryptionKey_[i] << 32) | std::random_device()();
   77|    480|    }
   78|    480|  }
   79|    160|  buildMetadataTable();
   80|       |#ifdef HERMESVM_PLATFORM_LOGGING
   81|       |  hermesLog(
   82|       |      "HermesGC",
   83|       |      "Initialisation (Init: %dMB, Max: %dMB, Tripwire: %dMB)",
   84|       |      gcConfig.getInitHeapSize() >> 20,
   85|       |      gcConfig.getMaxHeapSize() >> 20,
   86|       |      gcConfig.getTripwireConfig().getLimit() >> 20);
   87|       |#endif // HERMESVM_PLATFORM_LOGGING
   88|       |#ifdef HERMESVM_SANITIZE_HANDLES
   89|       |  const std::minstd_rand::result_type seed =
   90|       |      gcConfig.getSanitizeConfig().getRandomSeed() >= 0
   91|       |      ? gcConfig.getSanitizeConfig().getRandomSeed()
   92|       |      : std::random_device()();
   93|       |  if (sanitizeRate_ > 0.0 && sanitizeRate_ < 1.0) {
   94|       |    llvh::errs()
   95|       |        << "Warning: you are using handle sanitization with random sampling.\n"
   96|       |        << "Sanitize Rate: ";
   97|       |    llvh::write_double(llvh::errs(), sanitizeRate_, llvh::FloatStyle::Percent);
   98|       |    llvh::errs() << "\n"
   99|       |                 << "Sanitize Rate Seed: " << seed << "\n"
  100|       |                 << "Re-run with -gc-sanitize-handles-random-seed=" << seed
  101|       |                 << " for deterministic crashes.\n";
  102|       |  }
  103|       |  randomEngine_.seed(seed);
  104|       |#endif
  105|    160|}
_ZN6hermes2vm6GCBase7GCCycleC2ERS1_NSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
  108|    113|    : gc_(gc), extraInfo_(std::move(extraInfo)), previousInGC_(gc_.inGC_) {
  109|    113|  if (!previousInGC_) {
  ------------------
  |  Branch (109:7): [True: 113, False: 0]
  ------------------
  110|    113|    gc_.getCallbacks().onGCEvent(GCEventKind::CollectionStart, extraInfo_);
  111|    113|    gc_.inGC_ = true;
  112|    113|  }
  113|    113|}
_ZN6hermes2vm6GCBase7GCCycleD2Ev:
  115|    113|GCBase::GCCycle::~GCCycle() {
  116|    113|  if (!previousInGC_) {
  ------------------
  |  Branch (116:7): [True: 113, False: 0]
  ------------------
  117|    113|    gc_.inGC_ = false;
  118|    113|    gc_.getCallbacks().onGCEvent(GCEventKind::CollectionEnd, extraInfo_);
  119|    113|  }
  120|    113|}
_ZN6hermes2vm6GCBase18runtimeWillExecuteEv:
  122|    274|void GCBase::runtimeWillExecute() {
  123|    274|  if (recordGcStats_ && !execStartTimeRecorded_) {
  ------------------
  |  Branch (123:7): [True: 0, False: 274]
  |  Branch (123:25): [True: 0, False: 0]
  ------------------
  124|      0|    execStartTime_ = std::chrono::steady_clock::now();
  125|      0|    execStartCPUTime_ = oscompat::thread_cpu_time();
  126|      0|    oscompat::num_context_switches(
  127|      0|        startNumVoluntaryContextSwitches_, startNumInvoluntaryContextSwitches_);
  128|      0|    execStartTimeRecorded_ = true;
  129|      0|  }
  130|    274|}
_ZN6hermes2vm6GCBase13recordGCStatsERKNS0_16GCAnalyticsEventEPNS1_19CumulativeHeapStatsEb:
  893|    226|    bool onMutator) {
  894|       |  // Hades OG collections do not block the mutator, and so do not contribute to
  895|       |  // the max pause time or the total execution time.
  896|    226|  if (onMutator)
  ------------------
  |  Branch (896:7): [True: 226, False: 0]
  ------------------
  897|    226|    stats->gcWallTime.record(
  898|    226|        std::chrono::duration<double>(event.duration).count());
  899|    226|  stats->gcCPUTime.record(
  900|    226|      std::chrono::duration<double>(event.cpuDuration).count());
  901|    226|  stats->finalHeapSize = event.size.after;
  902|    226|  stats->usedBefore.record(event.allocated.before);
  903|    226|  stats->usedAfter.record(event.allocated.after);
  904|    226|  stats->numCollections++;
  905|    226|}
_ZN6hermes2vm6GCBase13recordGCStatsERKNS0_16GCAnalyticsEventEb:
  907|    113|void GCBase::recordGCStats(const GCAnalyticsEvent &event, bool onMutator) {
  908|    113|  if (analyticsCallback_) {
  ------------------
  |  Branch (908:7): [True: 0, False: 113]
  ------------------
  909|      0|    analyticsCallback_(event);
  910|      0|  }
  911|    113|  if (recordGcStats_) {
  ------------------
  |  Branch (911:7): [True: 0, False: 113]
  ------------------
  912|      0|    analyticsEvents_.push_back(event);
  913|      0|  }
  914|    113|  recordGCStats(event, &cumStats_, onMutator);
  915|    113|}
_ZN6hermes2vm6GCBase13allocWeakSlotENS0_17CompressedPointerE:
 1010|  95.9k|WeakRefSlot *GCBase::allocWeakSlot(CompressedPointer ptr) {
 1011|  95.9k|  return &weakSlots_.add(ptr);
 1012|  95.9k|}
_ZN6hermes2vm6GCBase8newAllocEPKNS0_6GCCellEj:
 1056|  8.69M|void GCBase::newAlloc(const GCCell *ptr, uint32_t sz) {
 1057|  8.69M|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1058|  8.69M|  allocationLocationTracker_.newAlloc(ptr, sz);
 1059|  8.69M|  samplingAllocationTracker_.newAlloc(ptr, sz);
 1060|  8.69M|#endif
 1061|  8.69M|}
_ZN6hermes2vm6GCBase12nextObjectIDEv:
 1093|  8.69M|uint64_t GCBase::nextObjectID() {
 1094|  8.69M|  return debugAllocationCounter_++;
 1095|  8.69M|}
_ZN6hermes2vm6GCBase11GCCallbacksD2Ev:
 1132|    160|GCBase::GCCallbacks::~GCCallbacks() {}
_ZN6hermes2vm6GCBase9IDTrackerC2Ev:
 1134|    160|GCBase::IDTracker::IDTracker() {
 1135|    160|  assert(lastID_ % 2 == 1 && "First JS object ID isn't odd");
 1136|    160|}
_ZN6hermes2vm6GCBase9IDTracker12hasNativeIDsEv:
 1216|    160|bool GCBase::IDTracker::hasNativeIDs() {
 1217|    160|  std::lock_guard<Mutex> lk{mtx_};
 1218|    160|  return !nativeIDMap_.empty();
 1219|    160|}
_ZN6hermes2vm6GCBase9IDTracker19hasTrackedObjectIDsEv:
 1221|    226|bool GCBase::IDTracker::hasTrackedObjectIDs() {
 1222|    226|  std::lock_guard<Mutex> lk{mtx_};
 1223|    226|  return !objectIDMap_.empty();
 1224|    226|}
_ZN6hermes2vm6GCBase9IDTracker13untrackNativeEPKv:
 1302|  10.1k|void GCBase::IDTracker::untrackNative(const void *mem) {
 1303|  10.1k|  std::lock_guard<Mutex> lk{mtx_};
 1304|  10.1k|  nativeIDMap_.erase(mem);
 1305|  10.1k|}
_ZN6hermes2vm6GCBase25AllocationLocationTrackerC2EPS1_:
 1342|    160|    : gc_(gc) {}
_ZNK6hermes2vm6GCBase25AllocationLocationTracker9isEnabledEv:
 1344|    226|bool GCBase::AllocationLocationTracker::isEnabled() const {
 1345|    226|  return enabled_;
 1346|    226|}
_ZN6hermes2vm6GCBase25AllocationLocationTracker8newAllocEPKNS0_6GCCellEj:
 1400|  8.69M|    uint32_t sz) {
 1401|       |  // Note we always get the current IP even if allocation tracking is not
 1402|       |  // enabled as it allows us to assert this feature works across many tests.
 1403|       |  // Note it's not very slow, it's slower than the non-virtual version
 1404|       |  // in Runtime though.
 1405|  8.69M|  const auto *ip = gc_->gcCallbacks_.getCurrentIPSlow();
 1406|  8.69M|  if (!enabled_) {
  ------------------
  |  Branch (1406:7): [True: 8.69M, False: 0]
  ------------------
 1407|  8.69M|    return;
 1408|  8.69M|  }
 1409|      0|  std::lock_guard<Mutex> lk{mtx_};
 1410|       |  // This is stateful and causes the object to have an ID assigned.
 1411|      0|  const auto id = gc_->getObjectID(ptr);
 1412|      0|  HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 1413|      0|      &findFragmentForID(id) == &fragments_.back() &&
 1414|      0|      "Should only ever be allocating into the newest fragment");
 1415|      0|  Fragment &lastFrag = fragments_.back();
 1416|      0|  assert(
 1417|      0|      lastFrag.lastSeenObjectID_ == IDTracker::kInvalidNode &&
 1418|      0|      "Last fragment should not have an ID assigned yet");
 1419|      0|  lastFrag.numObjects_++;
 1420|      0|  lastFrag.numBytes_ += sz;
 1421|      0|  lastFrag.touchedSinceLastFlush_ = true;
 1422|      0|  if (lastFrag.numBytes_ >= kFlushThreshold) {
  ------------------
  |  Branch (1422:7): [True: 0, False: 0]
  ------------------
 1423|      0|    flushCallback();
 1424|      0|  }
 1425|      0|  if (auto node = gc_->gcCallbacks_.getCurrentStackTracesTreeNode(ip)) {
  ------------------
  |  Branch (1425:12): [True: 0, False: 0]
  ------------------
 1426|      0|    auto itAndDidInsert = stackMap_.try_emplace(id, node);
 1427|      0|    assert(itAndDidInsert.second && "Failed to create a new node");
 1428|      0|    (void)itAndDidInsert;
 1429|      0|  }
 1430|      0|}
_ZN6hermes2vm6GCBase33SamplingAllocationLocationTracker8newAllocEPKNS0_6GCCellEj:
 1575|  8.69M|    uint32_t sz) {
 1576|       |  // If the sampling profiler isn't enabled, don't check anything else.
 1577|  8.69M|  if (!isEnabled()) {
  ------------------
  |  Branch (1577:7): [True: 8.69M, False: 0]
  ------------------
 1578|  8.69M|    return;
 1579|  8.69M|  }
 1580|      0|  if (sz <= limit_) {
  ------------------
  |  Branch (1580:7): [True: 0, False: 0]
  ------------------
 1581|       |    // Exit if it's not time for a sample yet.
 1582|      0|    limit_ -= sz;
 1583|      0|    return;
 1584|      0|  }
 1585|      0|  const auto *ip = gc_->gcCallbacks_.getCurrentIPSlow();
 1586|       |  // This is stateful and causes the object to have an ID assigned.
 1587|      0|  const auto id = gc_->getObjectID(ptr);
 1588|      0|  if (StackTracesTreeNode *node =
  ------------------
  |  Branch (1588:28): [True: 0, False: 0]
  ------------------
 1589|      0|          gc_->gcCallbacks_.getCurrentStackTracesTreeNode(ip)) {
 1590|       |    // Hold a lock while modifying samples_.
 1591|      0|    std::lock_guard<Mutex> lk{mtx_};
 1592|      0|    auto sampleItAndDidInsert =
 1593|      0|        samples_.try_emplace(id, Sample{sz, node, nextSampleID_++});
 1594|      0|    assert(sampleItAndDidInsert.second && "Failed to create a sample");
 1595|      0|    (void)sampleItAndDidInsert;
 1596|      0|  }
 1597|       |  // Reset the limit.
 1598|      0|  limit_ = nextSample();
 1599|      0|}

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

_ZN6hermes2vm6detail13TransitionMap21snapshotUntrackMemoryERNS0_7HadesGCE:
   71|  94.2k|void TransitionMap::snapshotUntrackMemory(GC &gc) {
   72|       |  // Untrack the memory ID in case one was created.
   73|  94.2k|  if (isLarge()) {
  ------------------
  |  Branch (73:7): [True: 2.09k, False: 92.1k]
  ------------------
   74|  2.09k|    gc.getIDTracker().untrackNative(large());
   75|  2.09k|  }
   76|  94.2k|}
_ZN6hermes2vm6detail13TransitionMap16uncleanMakeLargeERNS0_7RuntimeE:
   84|  2.09k|void TransitionMap::uncleanMakeLarge(Runtime &runtime) {
   85|  2.09k|  assert(!isClean() && "must not still be clean");
   86|  2.09k|  assert(!isLarge() && "must not yet be large");
   87|  2.09k|  auto large = new WeakValueMap<Transition, HiddenClass>();
   88|       |  // Move any valid entry into the allocated map.
   89|  2.09k|  if (auto value = smallValue().get(runtime))
  ------------------
  |  Branch (89:12): [True: 2.09k, False: 0]
  ------------------
   90|  2.09k|    large->insertNew(runtime, smallKey_, runtime.makeHandle(value));
   91|  2.09k|  smallValue().releaseSlot();
   92|  2.09k|  u.large_ = large;
   93|  2.09k|  smallKey_.symbolID = SymbolID::deleted();
   94|  2.09k|  assert(isLarge());
   95|  2.09k|}
_ZN6hermes2vm20HiddenClassBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  116|      1|void HiddenClassBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  117|      1|  const auto *self = static_cast<const HiddenClass *>(cell);
  118|      1|  mb.setVTable(&HiddenClass::vt);
  119|      1|  mb.addField("symbol", &self->symbolID_);
  120|      1|  mb.addField("parent", &self->parent_);
  121|      1|  mb.addField("propertyMap", &self->propertyMap_);
  122|      1|  mb.addField("forInCache", &self->forInCache_);
  123|      1|}
_ZN6hermes2vm11HiddenClass13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  125|  94.2k|void HiddenClass::_finalizeImpl(GCCell *cell, GC &gc) {
  126|  94.2k|  auto *self = vmcast<HiddenClass>(cell);
  127|  94.2k|#ifdef HERMES_MEMORY_INSTRUMENTATION
  128|  94.2k|  self->transitionMap_.snapshotUntrackMemory(gc);
  129|  94.2k|#endif
  130|  94.2k|  self->~HiddenClass();
  131|  94.2k|}
_ZN6hermes2vm11HiddenClass10createRootERNS0_7RuntimeE:
  165|    160|CallResult<HermesValue> HiddenClass::createRoot(Runtime &runtime) {
  166|    160|  return create(
  167|    160|      runtime,
  168|    160|      ClassFlags{},
  169|    160|      Runtime::makeNullHandle<HiddenClass>(),
  170|    160|      SymbolID{},
  171|    160|      PropertyFlags{},
  172|    160|      0);
  173|    160|}
_ZN6hermes2vm11HiddenClass6createERNS0_7RuntimeENS0_10ClassFlagsENS0_6HandleIS1_EENS0_8SymbolIDENS0_13PropertyFlagsEj:
  181|  94.2k|    unsigned numProperties) {
  182|  94.2k|  assert(
  183|  94.2k|      (flags.dictionaryMode || numProperties == 0 || *parent) &&
  184|  94.2k|      "non-empty non-dictionary orphan");
  185|  94.2k|  auto *obj =
  186|  94.2k|      runtime.makeAFixed<HiddenClass, HasFinalizer::Yes, LongLived::Yes>(
  187|  94.2k|          runtime, flags, parent, symbolID, propertyFlags, numProperties);
  188|  94.2k|  return HermesValue::encodeObjectValue(obj);
  189|  94.2k|}
_ZN6hermes2vm11HiddenClass19copyToNewDictionaryENS0_6HandleIS1_EERNS0_7RuntimeEb:
  194|    236|    bool noCache) {
  195|    236|  assert(
  196|    236|      !selfHandle->isDictionaryNoCache() && "class already in no-cache mode");
  197|       |
  198|    236|  auto newFlags = selfHandle->flags_;
  199|    236|  newFlags.dictionaryMode = true;
  200|       |  // If the requested, transition to no-cache mode.
  201|    236|  if (noCache) {
  ------------------
  |  Branch (201:7): [True: 38, False: 198]
  ------------------
  202|     38|    newFlags.dictionaryNoCacheMode = true;
  203|     38|  }
  204|       |
  205|       |  /// Allocate a new class without a parent.
  206|    236|  auto newClassHandle = runtime.makeHandle<HiddenClass>(
  207|    236|      runtime.ignoreAllocationFailure(HiddenClass::create(
  208|    236|          runtime,
  209|    236|          newFlags,
  210|    236|          Runtime::makeNullHandle<HiddenClass>(),
  211|    236|          SymbolID{},
  212|    236|          PropertyFlags{},
  213|    236|          selfHandle->numProperties_)));
  214|       |
  215|       |  // Optionally allocate the property map and move it to the new class.
  216|    236|  if (LLVM_UNLIKELY(!selfHandle->propertyMap_))
  ------------------
  |  |  189|    236|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 236]
  |  |  ------------------
  ------------------
  217|      0|    initializeMissingPropertyMap(selfHandle, runtime);
  218|       |
  219|    236|  newClassHandle->propertyMap_.set(
  220|    236|      runtime, selfHandle->propertyMap_, runtime.getHeap());
  221|    236|  selfHandle->propertyMap_.setNull(runtime.getHeap());
  222|       |
  223|    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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  224|    236|      dbgs() << "Converted Class:" << selfHandle->getDebugAllocationId()
  225|    236|             << " to dictionary Class:"
  226|    236|             << newClassHandle->getDebugAllocationId() << "\n");
  227|       |
  228|    236|  return newClassHandle;
  229|    236|}
_ZN6hermes2vm11HiddenClass12findPropertyENS0_12PseudoHandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsERNS0_23NamedPropertyDescriptorE:
  273|  13.7M|    NamedPropertyDescriptor &desc) {
  274|       |  // Lazily create the property map.
  275|  13.7M|  if (LLVM_UNLIKELY(!self->propertyMap_)) {
  ------------------
  |  |  189|  13.7M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 196k, False: 13.5M]
  |  |  ------------------
  ------------------
  276|       |    // If expectedFlags is valid, we can check if there is an outgoing
  277|       |    // transition with name and the flags. The presence of such a transition
  278|       |    // indicates that this is a new property and we don't have to build the map
  279|       |    // in order to look for it (since we wouldn't find it anyway).
  280|   196k|    if (expectedFlags.isValid()) {
  ------------------
  |  Branch (280:9): [True: 3.84k, False: 192k]
  ------------------
  281|  3.84k|      Transition t{name, expectedFlags};
  282|  3.84k|      if (self->transitionMap_.containsKey(t, runtime.getHeap())) {
  ------------------
  |  Branch (282:11): [True: 3.20k, False: 642]
  ------------------
  283|  3.20k|        LLVM_DEBUG(
  ------------------
  |  |  123|  3.20k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  3.20k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 3.20k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  3.20k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|  3.20k|            dbgs()
  285|  3.20k|            << "Property " << runtime.formatSymbolID(name)
  286|  3.20k|            << " NOT FOUND in Class:" << self->getDebugAllocationId()
  287|  3.20k|            << " due to existing transition to Class:"
  288|  3.20k|            << self->transitionMap_.lookup(runtime, t)->getDebugAllocationId()
  289|  3.20k|            << "\n");
  290|  3.20k|        return llvh::None;
  291|  3.20k|      }
  292|  3.84k|    }
  293|       |
  294|   192k|    auto selfHandle = runtime.makeHandle(std::move(self));
  295|   192k|    initializeMissingPropertyMap(selfHandle, runtime);
  296|   192k|    self = selfHandle;
  297|   192k|  }
  298|       |
  299|  13.7M|  auto *propMap = self->propertyMap_.getNonNull(runtime);
  300|  13.7M|  {
  301|       |    // propMap is a raw pointer.  We assume that find does no allocation.
  302|  13.7M|    NoAllocScope noAlloc(runtime);
  303|  13.7M|    auto found = DictPropertyMap::find(propMap, name);
  304|  13.7M|    if (!found)
  ------------------
  |  Branch (304:9): [True: 8.02M, False: 5.67M]
  ------------------
  305|  8.02M|      return llvh::None;
  306|       |    // Technically, the last use of propMap occurs before the call here, so
  307|       |    // it would be legal for the call to allocate.  If that were ever the case,
  308|       |    // we would move "found" out of scope, and terminate the NoAllocScope here.
  309|  5.67M|    desc = DictPropertyMap::getDescriptorPair(propMap, *found)->second;
  310|  5.67M|    return *found;
  311|  13.7M|  }
  312|  13.7M|}
_ZN6hermes2vm11HiddenClass22debugIsPropertyDefinedEPS1_RNS0_11PointerBaseENS0_8SymbolIDE:
  344|   348k|    SymbolID name) {
  345|  1.24M|  do {
  346|       |    // If we happen to have a property map, use it.
  347|  1.24M|    if (self->propertyMap_)
  ------------------
  |  Branch (347:9): [True: 182k, False: 1.06M]
  ------------------
  348|   182k|      return DictPropertyMap::find(self->propertyMap_.getNonNull(base), name)
  349|   182k|          .hasValue();
  350|       |    // Is the property defined in this class?
  351|  1.06M|    if (self->symbolID_ == name)
  ------------------
  |  Branch (351:9): [True: 0, False: 1.06M]
  ------------------
  352|      0|      return true;
  353|  1.06M|    self = self->parent_.get(base);
  354|  1.06M|  } while (self);
  ------------------
  |  Branch (354:12): [True: 898k, False: 166k]
  ------------------
  355|   166k|  return false;
  356|   348k|}
_ZN6hermes2vm11HiddenClass11addPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsE:
  385|  1.15M|    PropertyFlags propertyFlags) {
  386|  1.15M|  assert(propertyFlags.isValid() && "propertyFlags must be valid");
  387|       |
  388|  1.15M|  if (LLVM_UNLIKELY(selfHandle->isDictionary())) {
  ------------------
  |  |  189|  1.15M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 701k, False: 450k]
  |  |  ------------------
  ------------------
  389|   701k|    auto isIndexLike =
  390|   701k|        toArrayIndex(runtime.getIdentifierTable().getStringView(runtime, name))
  391|   701k|            .hasValue();
  392|   701k|    selfHandle->flags_ =
  393|   701k|        computeFlags(selfHandle->flags_, propertyFlags, isIndexLike);
  394|       |
  395|       |    // Allocate a new slot.
  396|       |    // TODO: this changes the property map, so if we want to support OOM
  397|       |    // handling in the future, and the following operation fails, we would have
  398|       |    // to somehow be able to undo it, or use an approach where we peek the slot
  399|       |    // but not consume until we are sure (which is less efficient, but more
  400|       |    // robust). T31555339.
  401|   701k|    SlotIndex newSlot = DictPropertyMap::allocatePropertySlot(
  402|   701k|        selfHandle->propertyMap_.get(runtime), runtime);
  403|       |
  404|   701k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   701k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 701k]
  |  |  ------------------
  ------------------
  405|   701k|            addToPropertyMap(
  406|   701k|                selfHandle,
  407|   701k|                runtime,
  408|   701k|                name,
  409|   701k|                NamedPropertyDescriptor(propertyFlags, newSlot)) ==
  410|   701k|            ExecutionStatus::EXCEPTION)) {
  411|      0|      return ExecutionStatus::EXCEPTION;
  412|      0|    }
  413|       |
  414|   701k|    ++selfHandle->numProperties_;
  415|   701k|    return std::make_pair(selfHandle, newSlot);
  416|   701k|  }
  417|       |
  418|       |  // Do we already have a transition for that property+flags pair?
  419|   450k|  auto existingChild =
  420|   450k|      selfHandle->transitionMap_.lookup(runtime, {name, propertyFlags});
  421|   450k|  if (LLVM_LIKELY(existingChild)) {
  ------------------
  |  |  188|   450k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 357k, False: 93.6k]
  |  |  ------------------
  ------------------
  422|   357k|    auto childHandle = runtime.makeHandle(existingChild);
  423|       |    // If the child doesn't have a property map, but we do, update our map and
  424|       |    // move it to the child.
  425|   357k|    if (!childHandle->propertyMap_ && selfHandle->propertyMap_) {
  ------------------
  |  Branch (425:9): [True: 172k, False: 184k]
  |  Branch (425:39): [True: 5.55k, False: 166k]
  ------------------
  426|  5.55k|      LLVM_DEBUG(
  ------------------
  |  |  123|  5.55k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  5.55k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 5.55k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  5.55k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  427|  5.55k|          dbgs() << "Adding property " << runtime.formatSymbolID(name)
  428|  5.55k|                 << " to Class:" << selfHandle->getDebugAllocationId()
  429|  5.55k|                 << " transitions Map to existing Class:"
  430|  5.55k|                 << childHandle->getDebugAllocationId() << "\n");
  431|       |
  432|  5.55k|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  5.55k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.55k]
  |  |  ------------------
  ------------------
  433|  5.55k|              addToPropertyMap(
  434|  5.55k|                  selfHandle,
  435|  5.55k|                  runtime,
  436|  5.55k|                  name,
  437|  5.55k|                  NamedPropertyDescriptor(
  438|  5.55k|                      propertyFlags, selfHandle->numProperties_)) ==
  439|  5.55k|              ExecutionStatus::EXCEPTION)) {
  440|      0|        return ExecutionStatus::EXCEPTION;
  441|      0|      }
  442|  5.55k|      childHandle->propertyMap_.set(
  443|  5.55k|          runtime, selfHandle->propertyMap_, runtime.getHeap());
  444|   351k|    } else {
  445|   351k|      LLVM_DEBUG(
  ------------------
  |  |  123|   351k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   351k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 351k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   351k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  446|   351k|          dbgs() << "Adding property " << runtime.formatSymbolID(name)
  447|   351k|                 << " to Class:" << selfHandle->getDebugAllocationId()
  448|   351k|                 << " transitions to existing Class:"
  449|   351k|                 << childHandle->getDebugAllocationId() << "\n");
  450|   351k|    }
  451|       |
  452|       |    // In any case, clear our own map.
  453|   357k|    selfHandle->propertyMap_.setNull(runtime.getHeap());
  454|       |
  455|   357k|    return std::make_pair(childHandle, selfHandle->numProperties_);
  456|   357k|  }
  457|       |
  458|       |  // Do we need to convert to dictionary?
  459|  93.6k|  if (LLVM_UNLIKELY(selfHandle->numProperties_ == kDictionaryThreshold)) {
  ------------------
  |  |  189|  93.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 198, False: 93.5k]
  |  |  ------------------
  ------------------
  460|       |    // Do it.
  461|    198|    auto childHandle = copyToNewDictionary(selfHandle, runtime);
  462|       |
  463|    198|    auto isIndexLike =
  464|    198|        toArrayIndex(runtime.getIdentifierTable().getStringView(runtime, name))
  465|    198|            .hasValue();
  466|    198|    childHandle->flags_ =
  467|    198|        computeFlags(childHandle->flags_, propertyFlags, isIndexLike);
  468|       |
  469|       |    // Add the property to the child.
  470|    198|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    198|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  471|    198|            addToPropertyMap(
  472|    198|                childHandle,
  473|    198|                runtime,
  474|    198|                name,
  475|    198|                NamedPropertyDescriptor(
  476|    198|                    propertyFlags, childHandle->numProperties_)) ==
  477|    198|            ExecutionStatus::EXCEPTION)) {
  478|      0|      return ExecutionStatus::EXCEPTION;
  479|      0|    }
  480|    198|    return std::make_pair(childHandle, childHandle->numProperties_++);
  481|    198|  }
  482|       |
  483|  93.5k|  auto isIndexLike =
  484|  93.5k|      toArrayIndex(runtime.getIdentifierTable().getStringView(runtime, name))
  485|  93.5k|          .hasValue();
  486|  93.5k|  auto newFlags = computeFlags(selfHandle->flags_, propertyFlags, isIndexLike);
  487|       |
  488|       |  // Allocate the child.
  489|  93.5k|  auto childHandle = runtime.makeHandle<HiddenClass>(
  490|  93.5k|      runtime.ignoreAllocationFailure(HiddenClass::create(
  491|  93.5k|          runtime,
  492|  93.5k|          newFlags,
  493|  93.5k|          selfHandle,
  494|  93.5k|          name,
  495|  93.5k|          propertyFlags,
  496|  93.5k|          selfHandle->numProperties_ + 1)));
  497|       |
  498|       |  // Add it to the transition table.
  499|  93.5k|  auto inserted = selfHandle->transitionMap_.insertNew(
  500|  93.5k|      runtime, Transition(name, propertyFlags), childHandle);
  501|  93.5k|  (void)inserted;
  502|  93.5k|  assert(
  503|  93.5k|      inserted &&
  504|  93.5k|      "transition already exists when adding a new property to hidden class");
  505|       |
  506|  93.5k|  if (selfHandle->propertyMap_) {
  ------------------
  |  Branch (506:7): [True: 89.8k, False: 3.69k]
  ------------------
  507|  89.8k|    assert(
  508|  89.8k|        !DictPropertyMap::find(selfHandle->propertyMap_.get(runtime), name) &&
  509|  89.8k|        "Adding an existing property to hidden class");
  510|       |
  511|  89.8k|    LLVM_DEBUG(
  ------------------
  |  |  123|  89.8k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  89.8k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 89.8k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  89.8k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  512|  89.8k|        dbgs() << "Adding property " << runtime.formatSymbolID(name)
  513|  89.8k|               << " to Class:" << selfHandle->getDebugAllocationId()
  514|  89.8k|               << " transitions Map to new Class:"
  515|  89.8k|               << childHandle->getDebugAllocationId() << "\n");
  516|       |
  517|       |    // Move the map to the child class.
  518|  89.8k|    childHandle->propertyMap_.set(
  519|  89.8k|        runtime, selfHandle->propertyMap_, runtime.getHeap());
  520|  89.8k|    selfHandle->propertyMap_.setNull(runtime.getHeap());
  521|       |
  522|  89.8k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  89.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 89.8k]
  |  |  ------------------
  ------------------
  523|  89.8k|            addToPropertyMap(
  524|  89.8k|                childHandle,
  525|  89.8k|                runtime,
  526|  89.8k|                name,
  527|  89.8k|                NamedPropertyDescriptor(
  528|  89.8k|                    propertyFlags, selfHandle->numProperties_)) ==
  529|  89.8k|            ExecutionStatus::EXCEPTION)) {
  530|      0|      return ExecutionStatus::EXCEPTION;
  531|      0|    }
  532|  89.8k|  } else {
  533|  3.69k|    LLVM_DEBUG(
  ------------------
  |  |  123|  3.69k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  3.69k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 3.69k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  3.69k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  534|  3.69k|        dbgs() << "Adding property " << runtime.formatSymbolID(name)
  535|  3.69k|               << " to Class:" << selfHandle->getDebugAllocationId()
  536|  3.69k|               << " transitions to new Class:"
  537|  3.69k|               << childHandle->getDebugAllocationId() << "\n");
  538|  3.69k|  }
  539|       |
  540|  93.5k|  return std::make_pair(childHandle, selfHandle->numProperties_);
  541|  93.5k|}
_ZN6hermes2vm11HiddenClass14updatePropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_15DictPropertyMap11PropertyPosENS0_13PropertyFlagsE:
  547|    556|    PropertyFlags newFlags) {
  548|    556|  assert(newFlags.isValid() && "newFlags must be valid");
  549|       |
  550|       |  // In dictionary mode we simply update our map (which must exist).
  551|    556|  if (LLVM_UNLIKELY(selfHandle->isDictionary())) {
  ------------------
  |  |  189|    556|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 38, False: 518]
  |  |  ------------------
  ------------------
  552|     38|    assert(
  553|     38|        selfHandle->propertyMap_ &&
  554|     38|        "propertyMap must exist in dictionary mode");
  555|     38|    selfHandle->flags_ = computeFlags(selfHandle->flags_, newFlags, false);
  556|     38|    DictPropertyMap::getDescriptorPair(
  557|     38|        selfHandle->propertyMap_.getNonNull(runtime), pos)
  558|     38|        ->second.flags = newFlags;
  559|       |    // If it's still cacheable, make it non-cacheable.
  560|     38|    if (!selfHandle->isDictionaryNoCache()) {
  ------------------
  |  Branch (560:9): [True: 38, False: 0]
  ------------------
  561|     38|      selfHandle = copyToNewDictionary(selfHandle, runtime, /*noCache*/ true);
  562|     38|    }
  563|     38|    return selfHandle;
  564|     38|  }
  565|       |
  566|    518|  assert(
  567|    518|      selfHandle->propertyMap_ && "propertyMap must exist in updateProperty()");
  568|       |
  569|    518|  auto *descPair = DictPropertyMap::getDescriptorPair(
  570|    518|      selfHandle->propertyMap_.get(runtime), pos);
  571|       |  // If the property flags didn't change, do nothing.
  572|    518|  if (descPair->second.flags == newFlags)
  ------------------
  |  Branch (572:7): [True: 0, False: 518]
  ------------------
  573|      0|    return selfHandle;
  574|       |
  575|    518|  auto name = descPair->first;
  576|       |
  577|       |  // The transition flags must indicate that it is a "flags transition".
  578|    518|  PropertyFlags transitionFlags = newFlags;
  579|    518|  transitionFlags.flagsTransition = 1;
  580|       |
  581|       |  // Do we already have a transition for that property+flags pair?
  582|    518|  auto existingChild =
  583|    518|      selfHandle->transitionMap_.lookup(runtime, {name, transitionFlags});
  584|    518|  if (LLVM_LIKELY(existingChild)) {
  ------------------
  |  |  188|    518|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 166, False: 352]
  |  |  ------------------
  ------------------
  585|       |    // If the child doesn't have a property map, but we do, update our map and
  586|       |    // move it to the child.
  587|    166|    if (!existingChild->propertyMap_) {
  ------------------
  |  Branch (587:9): [True: 160, False: 6]
  ------------------
  588|    160|      LLVM_DEBUG(
  ------------------
  |  |  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  589|    160|          dbgs() << "Updating property " << runtime.formatSymbolID(name)
  590|    160|                 << " in Class:" << selfHandle->getDebugAllocationId()
  591|    160|                 << " transitions Map to existing Class:"
  592|    160|                 << existingChild->getDebugAllocationId() << "\n");
  593|       |
  594|    160|      descPair->second.flags = newFlags;
  595|    160|      existingChild->propertyMap_.set(
  596|    160|          runtime, selfHandle->propertyMap_, runtime.getHeap());
  597|    160|    } else {
  598|      6|      LLVM_DEBUG(
  ------------------
  |  |  123|      6|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      6|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 6]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      6|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  599|      6|          dbgs() << "Updating property " << runtime.formatSymbolID(name)
  600|      6|                 << " in Class:" << selfHandle->getDebugAllocationId()
  601|      6|                 << " transitions to existing Class:"
  602|      6|                 << existingChild->getDebugAllocationId() << "\n");
  603|      6|    }
  604|       |
  605|       |    // In any case, clear our own map.
  606|    166|    selfHandle->propertyMap_.setNull(runtime.getHeap());
  607|       |
  608|    166|    return runtime.makeHandle(existingChild);
  609|    166|  }
  610|       |
  611|       |  // We are updating the existing property and adding a transition to a new
  612|       |  // hidden class.
  613|    352|  descPair->second.flags = newFlags;
  614|       |
  615|       |  // Allocate the child.
  616|    352|  auto childHandle = runtime.makeHandle<HiddenClass>(
  617|    352|      runtime.ignoreAllocationFailure(HiddenClass::create(
  618|    352|          runtime,
  619|    352|          computeFlags(selfHandle->flags_, newFlags, false),
  620|    352|          selfHandle,
  621|    352|          name,
  622|    352|          transitionFlags,
  623|    352|          selfHandle->numProperties_)));
  624|       |
  625|       |  // Add it to the transition table.
  626|    352|  auto inserted = selfHandle->transitionMap_.insertNew(
  627|    352|      runtime, Transition(name, transitionFlags), childHandle);
  628|    352|  (void)inserted;
  629|    352|  assert(
  630|    352|      inserted &&
  631|    352|      "transition already exists when updating a property in hidden class");
  632|       |
  633|    352|  LLVM_DEBUG(
  ------------------
  |  |  123|    352|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    352|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 352]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    352|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  634|    352|      dbgs() << "Updating property " << runtime.formatSymbolID(name)
  635|    352|             << " in Class:" << selfHandle->getDebugAllocationId()
  636|    352|             << " transitions Map to new Class:"
  637|    352|             << childHandle->getDebugAllocationId() << "\n");
  638|       |
  639|       |  // Move the updated map to the child class.
  640|    352|  childHandle->propertyMap_.set(
  641|    352|      runtime, selfHandle->propertyMap_, runtime.getHeap());
  642|    352|  selfHandle->propertyMap_.setNull(runtime.getHeap());
  643|       |
  644|    352|  return childHandle;
  645|    352|}
_ZN6hermes2vm11HiddenClass11reserveSlotENS0_6HandleIS1_EERNS0_7RuntimeE:
  776|  1.12k|    Runtime &runtime) {
  777|  1.12k|  assert(
  778|  1.12k|      !selfHandle->isDictionary() &&
  779|  1.12k|      "Reserved slots can only be added in class mode");
  780|  1.12k|  SlotIndex index = selfHandle->numProperties_;
  781|  1.12k|  assert(
  782|  1.12k|      index < InternalProperty::NumAnonymousInternalProperties &&
  783|  1.12k|      "Reserved slot index is too large");
  784|       |
  785|  1.12k|  return HiddenClass::addProperty(
  786|  1.12k|      selfHandle,
  787|  1.12k|      runtime,
  788|  1.12k|      InternalProperty::getSymbolID(index),
  789|  1.12k|      PropertyFlags{});
  790|  1.12k|}
_ZN6hermes2vm11HiddenClass16addToPropertyMapENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_23NamedPropertyDescriptorE:
  820|   796k|    NamedPropertyDescriptor desc) {
  821|   796k|  assert(selfHandle->propertyMap_ && "the property map must be initialized");
  822|       |
  823|       |  // Add the new field to the property map.
  824|   796k|  MutableHandle<DictPropertyMap> updatedMap{
  825|   796k|      runtime, selfHandle->propertyMap_.get(runtime)};
  826|       |
  827|   796k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   796k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 796k]
  |  |  ------------------
  ------------------
  828|   796k|          DictPropertyMap::add(updatedMap, runtime, name, desc) ==
  829|   796k|          ExecutionStatus::EXCEPTION)) {
  830|      0|    return ExecutionStatus::EXCEPTION;
  831|      0|  }
  832|       |
  833|   796k|  selfHandle->propertyMap_.setNonNull(runtime, *updatedMap, runtime.getHeap());
  834|   796k|  return ExecutionStatus::RETURNED;
  835|   796k|}
_ZN6hermes2vm11HiddenClass28initializeMissingPropertyMapENS0_6HandleIS1_EERNS0_7RuntimeE:
  839|   192k|    Runtime &runtime) {
  840|   192k|  assert(!selfHandle->propertyMap_ && "property map is already initialized");
  841|       |
  842|       |  // Check whether we can steal our parent's map. If we can, we only need
  843|       |  // to add or update a single property.
  844|   192k|  if (selfHandle->parent_ &&
  ------------------
  |  Branch (844:7): [True: 10.2k, False: 182k]
  ------------------
  845|   192k|      selfHandle->parent_.getNonNull(runtime)->propertyMap_)
  ------------------
  |  Branch (845:7): [True: 13, False: 10.2k]
  ------------------
  846|     13|    return stealPropertyMapFromParent(selfHandle, runtime);
  847|       |
  848|   192k|  LLVM_DEBUG(
  ------------------
  |  |  123|   192k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   192k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 192k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   192k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  849|   192k|      dbgs() << "Class:" << selfHandle->getDebugAllocationId()
  850|   192k|             << " allocating new map\n");
  851|       |
  852|       |  // First collect all entries in reverse order. This avoids recursion.
  853|   192k|  using MapEntry = std::pair<SymbolID, PropertyFlags>;
  854|   192k|  llvh::SmallVector<MapEntry, 4> entries;
  855|   192k|  entries.reserve(selfHandle->numProperties_);
  856|   192k|  {
  857|       |    // Walk chain of parents using raw pointers.
  858|   192k|    NoAllocScope _(runtime);
  859|   273k|    for (auto *cur = *selfHandle; cur->numProperties_ > 0;
  ------------------
  |  Branch (859:35): [True: 80.7k, False: 192k]
  ------------------
  860|   192k|         cur = cur->parent_.getNonNull(runtime)) {
  861|  80.7k|      auto tmpFlags = cur->propertyFlags_;
  862|  80.7k|      tmpFlags.flagsTransition = 0;
  863|  80.7k|      entries.emplace_back(cur->symbolID_, tmpFlags);
  864|  80.7k|    }
  865|   192k|  }
  866|       |
  867|   192k|  assert(
  868|   192k|      entries.size() <= DictPropertyMap::getMaxCapacity() &&
  869|   192k|      "There shouldn't ever be this many properties");
  870|       |  // Allocate the map with the correct size.
  871|   192k|  auto res = DictPropertyMap::create(
  872|   192k|      runtime,
  873|   192k|      std::max(
  874|   192k|          (DictPropertyMap::size_type)entries.size(),
  875|   192k|          toRValue(DictPropertyMap::DEFAULT_CAPACITY)));
  876|   192k|  assert(
  877|   192k|      res != ExecutionStatus::EXCEPTION &&
  878|   192k|      "Since the entries would fit, there shouldn't be an exception");
  879|   192k|  MutableHandle<DictPropertyMap> mapHandle{runtime, res->get()};
  880|       |
  881|       |  // Add the collected entries in reverse order. Note that there could be
  882|       |  // duplicates.
  883|   192k|  SlotIndex slotIndex = 0;
  884|   273k|  for (auto it = entries.rbegin(), e = entries.rend(); it != e; ++it) {
  ------------------
  |  Branch (884:56): [True: 80.7k, False: 192k]
  ------------------
  885|  80.7k|    auto inserted = DictPropertyMap::findOrAdd(mapHandle, runtime, it->first);
  886|  80.7k|    assert(
  887|  80.7k|        inserted != ExecutionStatus::EXCEPTION &&
  888|  80.7k|        "Space was already reserved, this couldn't have grown");
  889|       |
  890|  80.7k|    inserted->first->flags = it->second;
  891|       |    // If it is a new property, allocate the next slot.
  892|  80.7k|    if (LLVM_LIKELY(inserted->second))
  ------------------
  |  |  188|  80.7k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 80.7k, False: 0]
  |  |  ------------------
  ------------------
  893|  80.7k|      inserted->first->slot = slotIndex++;
  894|  80.7k|  }
  895|       |
  896|   192k|  selfHandle->propertyMap_.setNonNull(runtime, *mapHandle, runtime.getHeap());
  897|   192k|}
_ZN6hermes2vm11HiddenClass26stealPropertyMapFromParentENS0_6HandleIS1_EERNS0_7RuntimeE:
  901|     13|    Runtime &runtime) {
  902|       |  // Most of this method uses raw pointers.
  903|     13|  NoAllocScope noAlloc(runtime);
  904|     13|  auto *self = *selfHandle;
  905|     13|  assert(
  906|     13|      self->parent_ && self->parent_.getNonNull(runtime)->propertyMap_ &&
  907|     13|      !self->propertyMap_ &&
  908|     13|      "stealPropertyMapFromParent() must be called with a valid parent with a property map");
  909|       |
  910|     13|  LLVM_DEBUG(
  ------------------
  |  |  123|     13|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     13|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 13]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     13|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  911|     13|      dbgs() << "Class:" << self->getDebugAllocationId()
  912|     13|             << " stealing map from parent Class:"
  913|     13|             << self->parent_.getNonNull(runtime)->getDebugAllocationId()
  914|     13|             << "\n");
  915|       |
  916|       |  // Success! Just steal our parent's map and add our own property.
  917|     13|  self->propertyMap_.set(
  918|     13|      runtime,
  919|     13|      self->parent_.getNonNull(runtime)->propertyMap_,
  920|     13|      runtime.getHeap());
  921|     13|  self->parent_.getNonNull(runtime)->propertyMap_.setNull(runtime.getHeap());
  922|       |
  923|       |  // Does our class add a new property?
  924|     13|  if (LLVM_LIKELY(!self->propertyFlags_.flagsTransition)) {
  ------------------
  |  |  188|     13|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 13, False: 0]
  |  |  ------------------
  ------------------
  925|       |    // This is a new property that we must now add.
  926|     13|    assert(
  927|     13|        self->numProperties_ - 1 ==
  928|     13|            self->propertyMap_.getNonNull(runtime)->size() &&
  929|     13|        "propertyMap->size() must match HiddenClass::numProperties-1 in "
  930|     13|        "new prop transition");
  931|       |
  932|       |    // Create a descriptor for our property.
  933|     13|    NamedPropertyDescriptor desc{
  934|     13|        self->propertyFlags_, self->numProperties_ - 1};
  935|       |    // Return to handle mode to add the property.
  936|     13|    noAlloc.release();
  937|     13|    addToPropertyMap(selfHandle, runtime, selfHandle->symbolID_, desc);
  938|     13|    return;
  939|     13|  }
  940|       |  // Our class is updating the flags of an existing property. So we need
  941|       |  // to find it and update it.
  942|       |
  943|      0|  assert(
  944|      0|      self->numProperties_ == self->propertyMap_.getNonNull(runtime)->size() &&
  945|      0|      "propertyMap->size() must match HiddenClass::numProperties in "
  946|      0|      "flag update transition");
  947|       |
  948|      0|  auto pos =
  949|      0|      DictPropertyMap::find(self->propertyMap_.get(runtime), self->symbolID_);
  950|      0|  assert(pos && "property must exist in flag update transition");
  951|      0|  auto tmpFlags = self->propertyFlags_;
  952|      0|  tmpFlags.flagsTransition = 0;
  953|      0|  DictPropertyMap::getDescriptorPair(self->propertyMap_.get(runtime), *pos)
  954|      0|      ->second.flags = tmpFlags;
  955|      0|}

_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|    160|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|    160|    std::unique_ptr<HostObjectProxy> proxy) {
  105|    160|  auto parentHandle = Handle<JSObject>::vmcast(&runtime.objectPrototype);
  106|       |
  107|    160|  HostObject *hostObj = runtime.makeAFixed<HostObject, HasFinalizer::Yes>(
  108|    160|      runtime,
  109|    160|      parentHandle,
  110|    160|      runtime.getHiddenClassForPrototype(
  111|    160|          *parentHandle, numOverlapSlots<HostObject>()),
  112|    160|      std::move(proxy));
  113|       |
  114|    160|  hostObj->flags_.hostObject = true;
  115|       |
  116|    160|  return JSObjectInit::initToHermesValue(runtime, hostObj);
  117|    160|}

_ZN6hermes2vm15IdentifierTable11LookupEntryC2EPNS0_15StringPrimitiveEb:
   29|   358k|    : strPrim_(str),
   30|   358k|      isUTF16_(false),
   31|   358k|      isNotUniqued_(isNotUniqued),
   32|   358k|      num_(NON_LAZY_STRING_PRIM_TAG) {
   33|   358k|  assert(str && "Invalid string primitive pointer");
   34|   358k|  llvh::SmallVector<char16_t, 32> storage{};
   35|   358k|  str->appendUTF16String(storage);
   36|   358k|  hash_ = hermes::hashString(llvh::ArrayRef<char16_t>(storage));
   37|   358k|}
_ZN6hermes2vm15IdentifierTableC2Ev:
   39|    160|IdentifierTable::IdentifierTable() {
   40|    160|  hashTable_.setIdentifierTable(this);
   41|    160|}
_ZN6hermes2vm15IdentifierTable15getSymbolHandleERNS0_7RuntimeEN4llvh8ArrayRefIDsEEj:
   46|    160|    uint32_t hash) {
   47|    160|  auto cr = getOrCreateIdentifier(
   48|    160|      runtime, str, Runtime::makeNullHandle<StringPrimitive>(), hash);
   49|    160|  if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
   50|      0|    return ExecutionStatus::EXCEPTION;
   51|    160|  return runtime.makeHandle(*cr);
   52|    160|}
_ZN6hermes2vm15IdentifierTable15getSymbolHandleERNS0_7RuntimeEN4llvh8ArrayRefIcEEj:
   57|    243|    uint32_t hash) {
   58|    243|  auto cr = getOrCreateIdentifier(
   59|    243|      runtime, str, Runtime::makeNullHandle<StringPrimitive>(), hash);
   60|    243|  if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    243|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 243]
  |  |  ------------------
  ------------------
   61|      0|    return ExecutionStatus::EXCEPTION;
   62|    243|  return runtime.makeHandle(*cr);
   63|    243|}
_ZN6hermes2vm15IdentifierTable22registerLazyIdentifierEN4llvh8ArrayRefIcEE:
   65|    480|SymbolID IdentifierTable::registerLazyIdentifier(ASCIIRef str) {
   66|    480|  return registerLazyIdentifierImpl(str, hermes::hashString(str));
   67|    480|}
_ZN6hermes2vm15IdentifierTable22registerLazyIdentifierEN4llvh8ArrayRefIcEEj:
   69|   106k|SymbolID IdentifierTable::registerLazyIdentifier(ASCIIRef str, uint32_t hash) {
   70|   106k|  return registerLazyIdentifierImpl(str, hash);
   71|   106k|}
_ZN6hermes2vm15IdentifierTable22registerLazyIdentifierEN4llvh8ArrayRefIDsEEj:
   77|    328|SymbolID IdentifierTable::registerLazyIdentifier(UTF16Ref str, uint32_t hash) {
   78|    328|  return registerLazyIdentifierImpl(str, hash);
   79|    328|}
_ZN6hermes2vm15IdentifierTable28getSymbolHandleFromPrimitiveERNS0_7RuntimeENS0_12PseudoHandleINS0_15StringPrimitiveEEE:
   83|  2.22M|    PseudoHandle<StringPrimitive> str) {
   84|  2.22M|  assert(str && "null string primitive");
   85|  2.22M|  if (str->isUniqued()) {
  ------------------
  |  Branch (85:7): [True: 390k, False: 1.83M]
  ------------------
   86|       |    // If the string was already uniqued, we can return directly.
   87|   390k|    SymbolID id = str->getUniqueID();
   88|   390k|    symbolReadBarrier(id.unsafeGetIndex());
   89|   390k|    return runtime.makeHandle(id);
   90|   390k|  }
   91|  1.83M|  auto handle = runtime.makeHandle(std::move(str));
   92|       |  // Force the string primitive to flatten if it's a rope.
   93|  1.83M|  handle = StringPrimitive::ensureFlat(runtime, handle);
   94|  1.83M|  auto cr = handle->isASCII()
  ------------------
  |  Branch (94:13): [True: 1.83M, False: 0]
  ------------------
   95|  1.83M|      ? getOrCreateIdentifier(runtime, handle->castToASCIIRef(), handle)
   96|  1.83M|      : getOrCreateIdentifier(runtime, handle->castToUTF16Ref(), handle);
   97|  1.83M|  if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  1.83M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.83M]
  |  |  ------------------
  ------------------
   98|      0|    return ExecutionStatus::EXCEPTION;
   99|  1.83M|  return runtime.makeHandle(*cr);
  100|  1.83M|}
_ZN6hermes2vm15IdentifierTable13getStringPrimERNS0_7RuntimeENS0_8SymbolIDE:
  102|  3.67M|StringPrimitive *IdentifierTable::getStringPrim(Runtime &runtime, SymbolID id) {
  103|  3.67M|  auto &entry = getLookupTableEntry(id);
  104|  3.67M|  if (entry.isStringPrim()) {
  ------------------
  |  Branch (104:7): [True: 3.61M, False: 57.6k]
  ------------------
  105|  3.61M|    return entry.getStringPrimRef();
  106|  3.61M|  }
  107|       |
  108|       |  // This is a lazy identifier, since a string primitive is requested, we must
  109|       |  // materialize it.
  110|  57.6k|  return materializeLazyIdentifier(runtime, id);
  111|  3.67M|}
_ZNK6hermes2vm15IdentifierTable13getStringViewERNS0_7RuntimeENS0_8SymbolIDE:
  113|  3.73M|StringView IdentifierTable::getStringView(Runtime &runtime, SymbolID id) const {
  114|  3.73M|  auto &entry = getLookupTableEntry(id);
  115|  3.73M|  if (entry.isStringPrim()) {
  ------------------
  |  Branch (115:7): [True: 835k, False: 2.90M]
  ------------------
  116|       |    // The const_cast is a mechanical requirement as it's not worth it to
  117|       |    // add const version constructors for Handle.
  118|   835k|    Handle<StringPrimitive> handle{
  119|   835k|        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|   835k|    return StringPrimitive::createStringViewMustBeFlat(handle);
  123|   835k|  }
  124|  2.90M|  if (entry.isLazyASCII()) {
  ------------------
  |  Branch (124:7): [True: 2.90M, False: 1]
  ------------------
  125|  2.90M|    return StringView(entry.getLazyASCIIRef());
  126|  2.90M|  }
  127|      1|  return StringView(entry.getLazyUTF16Ref());
  128|  2.90M|}
_ZNK6hermes2vm15IdentifierTable19getStringViewForDevERNS0_7RuntimeENS0_8SymbolIDE:
  131|     45|    const {
  132|     45|  if (id == SymbolID::empty()) {
  ------------------
  |  Branch (132:7): [True: 0, False: 45]
  ------------------
  133|      0|    assert(false && "getStringViewForDev on empty SymbolID");
  134|      0|    return "<<empty>>";
  135|      0|  }
  136|     45|  if (id == SymbolID::deleted()) {
  ------------------
  |  Branch (136:7): [True: 0, False: 45]
  ------------------
  137|      0|    assert(false && "getStringViewForDev on deleted SymbolID");
  138|      0|    return "<<deleted>>";
  139|      0|  }
  140|     45|  if (id.isInvalid()) {
  ------------------
  |  Branch (140:7): [True: 0, False: 45]
  ------------------
  141|      0|    assert(false && "getStringViewForDev on invalid SymbolID");
  142|      0|    return "<<invalid>>";
  143|      0|  }
  144|     45|  return getStringView(runtime, id);
  145|     45|}
_ZN6hermes2vm15IdentifierTable15markIdentifiersERNS0_12RootAcceptorERNS0_7HadesGCE:
  171|    226|void IdentifierTable::markIdentifiers(RootAcceptor &acceptor, GC &gc) {
  172|   675k|  for (auto &vectorEntry : lookupVector_) {
  ------------------
  |  Branch (172:26): [True: 675k, False: 226]
  ------------------
  173|   675k|    if (!vectorEntry.isFreeSlot() && vectorEntry.isStringPrim()) {
  ------------------
  |  Branch (173:9): [True: 675k, False: 0]
  |  Branch (173:38): [True: 615k, False: 60.0k]
  ------------------
  174|   615k|      assert(
  175|   615k|          !gc.inYoungGen(vectorEntry.getStringPrimRef()) &&
  176|   615k|          "Identifiers must be allocated in the old gen");
  177|   615k|      acceptor.acceptPtr(vectorEntry.getStringPrimRef());
  178|   615k|    }
  179|   675k|  }
  180|    226|}
_ZN6hermes2vm15IdentifierTable17symbolReadBarrierEj:
  288|  1.87M|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|  1.87M|  markedSymbols_.set(id);
  294|  1.87M|}
_ZN6hermes2vm15IdentifierTable16allocIDAndInsertEjPNS0_15StringPrimitiveE:
  298|   358k|    StringPrimitive *strPrim) {
  299|   358k|  uint32_t nextId = allocNextID();
  300|   358k|  SymbolID symbolId = SymbolID::unsafeCreate(nextId);
  301|   358k|  assert(lookupVector_[nextId].isFreeSlot() && "Allocated a non-free slot");
  302|   358k|  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|   358k|  new (&lookupVector_[nextId]) LookupEntry(strPrim);
  308|       |
  309|   358k|  hashTable_.insert(hashTableIndex, symbolId);
  310|       |
  311|   358k|  LLVM_DEBUG(
  ------------------
  |  |  123|   358k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   358k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 358k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   358k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|   358k|      llvh::dbgs() << "allocated symbol " << nextId << " '" << strPrim
  313|   358k|                   << "'\n");
  314|       |
  315|   358k|  return nextId;
  316|   358k|}
_ZN6hermes2vm15IdentifierTable25materializeLazyIdentifierERNS0_7RuntimeENS0_8SymbolIDE:
  413|  57.6k|    SymbolID id) {
  414|  57.6k|  auto &entry = getLookupTableEntry(id);
  415|  57.6k|  assert(
  416|  57.6k|      (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|  57.6k|  PseudoHandle<StringPrimitive> strPrim = runtime.ignoreAllocationFailure(
  421|  57.6k|      entry.isLazyASCII() ? allocateDynamicString(
  ------------------
  |  Branch (421:7): [True: 57.5k, False: 67]
  ------------------
  422|  57.5k|                                runtime,
  423|  57.5k|                                entry.getLazyASCIIRef(),
  424|  57.5k|                                Runtime::makeNullHandle<StringPrimitive>())
  425|  57.6k|                          : allocateDynamicString(
  426|     67|                                runtime,
  427|     67|                                entry.getLazyUTF16Ref(),
  428|     67|                                Runtime::makeNullHandle<StringPrimitive>()));
  429|  57.6k|  if (id.isUniqued())
  ------------------
  |  Branch (429:7): [True: 57.6k, False: 0]
  ------------------
  430|  57.6k|    strPrim->convertToUniqued(id);
  431|  57.6k|  LLVM_DEBUG(llvh::dbgs() << "Materializing lazy identifier " << id << "\n");
  ------------------
  |  |  123|  57.6k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  57.6k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 57.6k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  57.6k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  432|  57.6k|  entry.materialize(strPrim.get());
  433|  57.6k|  return strPrim.get();
  434|  57.6k|}
_ZN6hermes2vm15IdentifierTable11allocNextIDEv:
  455|   461k|uint32_t IdentifierTable::allocNextID() {
  456|       |  // If the free list is empty, grow the array.
  457|   461k|  if (firstFreeID_ == LookupEntry::FREE_LIST_END) {
  ------------------
  |  Branch (457:7): [True: 461k, False: 0]
  ------------------
  458|   461k|    uint32_t newID = lookupVector_.size();
  459|   461k|    if (LLVM_UNLIKELY(newID > LookupEntry::MAX_IDENTIFIER)) {
  ------------------
  |  |  189|   461k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 461k]
  |  |  ------------------
  ------------------
  460|      0|      hermes_fatal("Failed to allocate Identifier: IdentifierTable is full");
  461|      0|    }
  462|   461k|    lookupVector_.emplace_back();
  463|   461k|    markedSymbols_.push_back(true);
  464|   461k|    LLVM_DEBUG(
  ------------------
  |  |  123|   461k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   461k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 461k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   461k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  465|   461k|        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|   461k|    return newID;
  469|   461k|  }
  470|       |
  471|       |  // Allocate from the free list.
  472|      0|  uint32_t nextId = firstFreeID_;
  473|      0|  auto &entry = getLookupTableEntry(nextId);
  474|      0|  assert(entry.isFreeSlot() && "firstFreeID_ is not a free slot");
  475|      0|  firstFreeID_ = entry.getNextFreeSlot();
  476|      0|  markedSymbols_.set(nextId);
  477|      0|  LLVM_DEBUG(llvh::dbgs() << "Allocated freed symbol id " << nextId << "\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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|      0|  return nextId;
  479|      0|}
_ZNK6hermes2vm15IdentifierTable12isSymbolLiveENS0_8SymbolIDE:
  530|  2.34M|bool IdentifierTable::isSymbolLive(SymbolID id) const {
  531|  2.34M|  auto &entry = getLookupTableEntry(id);
  532|       |  // If the entry is not a free slot, then it is live.
  533|  2.34M|  return !entry.isFreeSlot();
  534|  2.34M|}
_ZNK6hermes2vm15IdentifierTable18getStringForSymbolENS0_8SymbolIDE:
  536|  2.34M|const StringPrimitive *IdentifierTable::getStringForSymbol(SymbolID id) const {
  537|  2.34M|  auto &entry = getLookupTableEntry(id);
  538|  2.34M|  if (entry.isStringPrim()) {
  ------------------
  |  Branch (538:7): [True: 2.20M, False: 146k]
  ------------------
  539|  2.20M|    return entry.getStringPrim();
  540|  2.20M|  }
  541|   146k|  return nullptr;
  542|  2.34M|}
_ZN6hermes2vm15IdentifierTable26createNotUniquedLazySymbolEN4llvh8ArrayRefIcEE:
  545|  3.84k|SymbolID IdentifierTable::createNotUniquedLazySymbol(ASCIIRef desc) {
  546|  3.84k|  uint32_t nextID = allocNextID();
  547|  3.84k|  new (&lookupVector_[nextID]) LookupEntry(desc, 0, true);
  548|  3.84k|  return SymbolID::unsafeCreateNotUniqued(nextID);
  549|  3.84k|}
_ZN6hermes2vm15IdentifierTable21getOrCreateIdentifierIDsEENS0_10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleINS0_15StringPrimitiveEEEj:
  323|    160|    uint32_t hash) {
  324|    160|  assert(
  325|    160|      !(maybeIncomingPrimHandle && maybeIncomingPrimHandle->isUniqued()) &&
  326|    160|      "Should not call getOrCreateIdentifier with a uniqued StrPrim");
  327|    160|  assert(
  328|    160|      (!maybeIncomingPrimHandle || maybeIncomingPrimHandle->isFlat()) &&
  329|    160|      "StringPrimitive must be flat");
  330|       |
  331|    160|  auto idx = hashTable_.lookupString(str, hash);
  332|    160|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (332:7): [True: 0, False: 160]
  ------------------
  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|    160|  CallResult<PseudoHandle<StringPrimitive>> cr =
  356|    160|      allocateDynamicString(runtime, str, maybeIncomingPrimHandle);
  357|    160|  if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (357:7): [True: 0, False: 160]
  ------------------
  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|    160|  return SymbolID::unsafeCreate(allocIDAndInsert(idx, cr->get()));
  364|    160|}
_ZN6hermes2vm15IdentifierTable21getOrCreateIdentifierIcEENS0_10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleINS0_15StringPrimitiveEEEj:
  323|  1.83M|    uint32_t hash) {
  324|  1.83M|  assert(
  325|  1.83M|      !(maybeIncomingPrimHandle && maybeIncomingPrimHandle->isUniqued()) &&
  326|  1.83M|      "Should not call getOrCreateIdentifier with a uniqued StrPrim");
  327|  1.83M|  assert(
  328|  1.83M|      (!maybeIncomingPrimHandle || maybeIncomingPrimHandle->isFlat()) &&
  329|  1.83M|      "StringPrimitive must be flat");
  330|       |
  331|  1.83M|  auto idx = hashTable_.lookupString(str, hash);
  332|  1.83M|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (332:7): [True: 1.47M, False: 358k]
  ------------------
  333|  1.47M|    NoAllocScope scope{runtime};
  334|  1.47M|    const auto id = hashTable_.get(idx);
  335|       |    // Read barrier here because a symbol value is getting read out of the hash
  336|       |    // map.
  337|  1.47M|    symbolReadBarrier(id);
  338|  1.47M|    return SymbolID::unsafeCreate(id);
  339|  1.47M|  }
  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|   358k|  CallResult<PseudoHandle<StringPrimitive>> cr =
  356|   358k|      allocateDynamicString(runtime, str, maybeIncomingPrimHandle);
  357|   358k|  if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (357:7): [True: 0, False: 358k]
  ------------------
  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|   358k|  return SymbolID::unsafeCreate(allocIDAndInsert(idx, cr->get()));
  364|   358k|}
_ZN6hermes2vm15IdentifierTable26registerLazyIdentifierImplIcEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEj:
  392|   107k|    uint32_t hash) {
  393|   107k|  auto idx = hashTable_.lookupString(str, hash);
  394|   107k|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (394:7): [True: 7.84k, False: 99.2k]
  ------------------
  395|       |    // If the string is already in the table, return it.
  396|  7.84k|    const auto id = hashTable_.get(idx);
  397|  7.84k|    symbolReadBarrier(id);
  398|  7.84k|    return SymbolID::unsafeCreate(id);
  399|  7.84k|  }
  400|  99.2k|  uint32_t nextId = allocNextID();
  401|  99.2k|  SymbolID symbolId = SymbolID::unsafeCreate(nextId);
  402|  99.2k|  assert(lookupVector_[nextId].isFreeSlot() && "Allocated a non-free slot");
  403|  99.2k|  new (&lookupVector_[nextId]) LookupEntry(str, hash);
  404|  99.2k|  hashTable_.insert(idx, symbolId);
  405|  99.2k|  LLVM_DEBUG(
  ------------------
  |  |  123|  99.2k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  99.2k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 99.2k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  99.2k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  406|  99.2k|      llvh::dbgs() << "Allocated lazy identifier: " << nextId << " " << str
  407|  99.2k|                   << "\n");
  408|  99.2k|  return symbolId;
  409|  99.2k|}
_ZN6hermes2vm15IdentifierTable26registerLazyIdentifierImplIDsEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEj:
  392|    328|    uint32_t hash) {
  393|    328|  auto idx = hashTable_.lookupString(str, hash);
  394|    328|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (394:7): [True: 0, False: 328]
  ------------------
  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|    328|  uint32_t nextId = allocNextID();
  401|    328|  SymbolID symbolId = SymbolID::unsafeCreate(nextId);
  402|    328|  assert(lookupVector_[nextId].isFreeSlot() && "Allocated a non-free slot");
  403|    328|  new (&lookupVector_[nextId]) LookupEntry(str, hash);
  404|    328|  hashTable_.insert(idx, symbolId);
  405|    328|  LLVM_DEBUG(
  ------------------
  |  |  123|    328|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    328|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 328]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    328|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  406|    328|      llvh::dbgs() << "Allocated lazy identifier: " << nextId << " " << str
  407|    328|                   << "\n");
  408|    328|  return symbolId;
  409|    328|}
_ZN6hermes2vm15IdentifierTable21allocateDynamicStringIcLb1EEENS0_10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleIS5_EE:
  248|   415k|    Handle<StringPrimitive> primHandle) {
  249|   415k|  size_t length = str.size();
  250|       |
  251|   415k|  assert(
  252|   415k|      (!primHandle || primHandle->isFlat()) && "StringPrimitive must be flat");
  253|       |
  254|   415k|  GCScope gcScope(runtime);
  255|       |
  256|   415k|  PseudoHandle<StringPrimitive> result;
  257|   415k|  if (StringPrimitive::isExternalLength(length)) {
  ------------------
  |  Branch (257:7): [True: 28, False: 415k]
  ------------------
  258|     28|    if (LLVM_UNLIKELY(length > StringPrimitive::MAX_STRING_LENGTH)) {
  ------------------
  |  |  189|     28|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 28]
  |  |  ------------------
  ------------------
  259|      0|      return runtime.raiseRangeError("String length exceeds limit");
  260|      0|    }
  261|     28|    std::basic_string<T> stdString(str.begin(), str.end());
  262|     28|    auto cr = ExternalStringPrimitive<T>::createLongLived(
  263|     28|        runtime, std::move(stdString));
  264|     28|    if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     28|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 28]
  |  |  ------------------
  ------------------
  265|      0|      return ExecutionStatus::EXCEPTION;
  266|      0|    }
  267|     28|    result = createPseudoHandle(vmcast<StringPrimitive>(*cr));
  268|   415k|  } else {
  269|   415k|    auto *tmp = runtime.makeAVariable<
  270|   415k|        DynamicStringPrimitive<T, Unique>,
  271|   415k|        HasFinalizer::No,
  272|   415k|        LongLived::Yes>(
  273|   415k|        DynamicStringPrimitive<T, Unique>::allocationSize((uint32_t)length),
  274|   415k|        length);
  275|       |    // Since we keep a raw pointer to mem, no more JS heap allocations after
  276|       |    // this point.
  277|   415k|    NoAllocScope _(runtime);
  278|   415k|    if (primHandle) {
  ------------------
  |  Branch (278:9): [True: 358k, False: 57.5k]
  ------------------
  279|   358k|      str = primHandle->getStringRef<T>();
  280|   358k|    }
  281|   415k|    std::copy(str.begin(), str.end(), tmp->getRawPointerForWrite());
  282|   415k|    result = createPseudoHandle<StringPrimitive>(tmp);
  283|   415k|  }
  284|       |
  285|   415k|  return result;
  286|   415k|}
_ZN6hermes2vm15IdentifierTable21allocateDynamicStringIDsLb1EEENS0_10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleIS5_EE:
  248|    227|    Handle<StringPrimitive> primHandle) {
  249|    227|  size_t length = str.size();
  250|       |
  251|    227|  assert(
  252|    227|      (!primHandle || primHandle->isFlat()) && "StringPrimitive must be flat");
  253|       |
  254|    227|  GCScope gcScope(runtime);
  255|       |
  256|    227|  PseudoHandle<StringPrimitive> result;
  257|    227|  if (StringPrimitive::isExternalLength(length)) {
  ------------------
  |  Branch (257:7): [True: 11, False: 216]
  ------------------
  258|     11|    if (LLVM_UNLIKELY(length > StringPrimitive::MAX_STRING_LENGTH)) {
  ------------------
  |  |  189|     11|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  259|      0|      return runtime.raiseRangeError("String length exceeds limit");
  260|      0|    }
  261|     11|    std::basic_string<T> stdString(str.begin(), str.end());
  262|     11|    auto cr = ExternalStringPrimitive<T>::createLongLived(
  263|     11|        runtime, std::move(stdString));
  264|     11|    if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     11|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  265|      0|      return ExecutionStatus::EXCEPTION;
  266|      0|    }
  267|     11|    result = createPseudoHandle(vmcast<StringPrimitive>(*cr));
  268|    216|  } else {
  269|    216|    auto *tmp = runtime.makeAVariable<
  270|    216|        DynamicStringPrimitive<T, Unique>,
  271|    216|        HasFinalizer::No,
  272|    216|        LongLived::Yes>(
  273|    216|        DynamicStringPrimitive<T, Unique>::allocationSize((uint32_t)length),
  274|    216|        length);
  275|       |    // Since we keep a raw pointer to mem, no more JS heap allocations after
  276|       |    // this point.
  277|    216|    NoAllocScope _(runtime);
  278|    216|    if (primHandle) {
  ------------------
  |  Branch (278:9): [True: 0, False: 216]
  ------------------
  279|      0|      str = primHandle->getStringRef<T>();
  280|      0|    }
  281|    216|    std::copy(str.begin(), str.end(), tmp->getRawPointerForWrite());
  282|    216|    result = createPseudoHandle<StringPrimitive>(tmp);
  283|    216|  }
  284|       |
  285|    227|  return result;
  286|    227|}

_ZN6hermes2vm5doIncEd:
  119|   271k|inline double doInc(double d) {
  120|   271k|  return d + 1;
  121|   271k|}
_ZN6hermes2vm5doSubEdd:
   91|   177k|inline double doSub(double x, double y) {
   92|   177k|  return x - y;
   93|   177k|}
_ZN6hermes2vm5doMulEdd:
   86|      1|inline double doMul(double x, double y) {
   87|      1|  return x * y;
   88|      1|}
_ZN6hermes2vm8doBitAndEii:
   95|      1|inline int32_t doBitAnd(int32_t x, int32_t y) {
   96|      1|  return x & y;
   97|      1|}

_ZN6hermes2vm14doOperSlowPathITnDaXadL_ZNS0_5doSubEddEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeENS0_6HandleIS3_EESA_:
  462|   177k|doOperSlowPath(Runtime &runtime, Handle<> lhs, Handle<> rhs) {
  463|   177k|  CallResult<HermesValue> res =
  464|   177k|      toPrimitive_RJS(runtime, lhs, PreferredType::NUMBER);
  465|   177k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 177k]
  |  |  ------------------
  ------------------
  466|      0|    return ExecutionStatus::EXCEPTION;
  467|      0|  }
  468|   177k|  if (LLVM_LIKELY(!res->isBigInt())) {
  ------------------
  |  |  188|   177k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 177k, False: 0]
  |  |  ------------------
  ------------------
  469|   177k|    res = toNumber_RJS(runtime, runtime.makeHandle(*res));
  470|   177k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 177k]
  |  |  ------------------
  ------------------
  471|      0|      return ExecutionStatus::EXCEPTION;
  472|      0|    }
  473|   177k|    double left = res->getDouble();
  474|   177k|    res = toNumber_RJS(runtime, rhs);
  475|   177k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 177k]
  |  |  ------------------
  ------------------
  476|      0|      return ExecutionStatus::EXCEPTION;
  477|      0|    }
  478|   177k|    return HermesValue::encodeUntrustedNumberValue(
  479|   177k|        Oper(left, res->getDouble()));
  480|   177k|  }
  481|      0|  return doBigIntBinOp(
  482|      0|      runtime, BigIntOper<Oper>, runtime.makeHandle(res->getBigInt()), rhs);
  483|   177k|}
_ZN6hermes2vm17doBitOperSlowPathITnDaXadL_ZNS0_8doBitAndEiiEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeENS0_6HandleIS3_EESA_:
  499|      1|doBitOperSlowPath(Runtime &runtime, Handle<> lhs, Handle<> rhs) {
  500|      1|  CallResult<HermesValue> res =
  501|      1|      toPrimitive_RJS(runtime, lhs, PreferredType::NUMBER);
  502|      1|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  503|      0|    return ExecutionStatus::EXCEPTION;
  504|      0|  }
  505|      1|  if (LLVM_LIKELY(!res->isBigInt())) {
  ------------------
  |  |  188|      1|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  506|      1|    res = toInt32_RJS(runtime, runtime.makeHandle(*res));
  507|      1|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  508|      0|      return ExecutionStatus::EXCEPTION;
  509|      0|    }
  510|      1|    const int32_t left = res->getNumberAs<int32_t>();
  511|      1|    res = toInt32_RJS(runtime, std::move(rhs));
  512|      1|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  513|      0|      return ExecutionStatus::EXCEPTION;
  514|      0|    }
  515|      1|    return HermesValue::encodeUntrustedNumberValue(
  516|      1|        Oper(left, res->getNumberAs<int32_t>()));
  517|      1|  }
  518|      0|  return doBigIntBinOp(
  519|      0|      runtime, BigIntOper<Oper>, runtime.makeHandle(res->getBigInt()), rhs);
  520|      1|}
_ZN6hermes2vm20doIncDecOperSlowPathITnDaXadL_ZNS0_5doIncEdEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeENS0_6HandleIS3_EE:
  589|   271k|CallResult<HermesValue> doIncDecOperSlowPath(Runtime &runtime, Handle<> src) {
  590|   271k|  CallResult<HermesValue> res =
  591|   271k|      toPrimitive_RJS(runtime, std::move(src), PreferredType::NUMBER);
  592|   271k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 271k]
  |  |  ------------------
  ------------------
  593|      0|    return ExecutionStatus::EXCEPTION;
  594|      0|  }
  595|       |
  596|   271k|  if (LLVM_LIKELY(!res->isBigInt())) {
  ------------------
  |  |  188|   271k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 271k, False: 0]
  |  |  ------------------
  ------------------
  597|   271k|    res = toNumber_RJS(runtime, runtime.makeHandle(*res));
  598|   271k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 271k]
  |  |  ------------------
  ------------------
  599|      0|      return ExecutionStatus::EXCEPTION;
  600|      0|    }
  601|   271k|    return HermesValue::encodeUntrustedNumberValue(Oper(res->getNumber()));
  602|   271k|  }
  603|       |
  604|      0|  return BigIntOper<Oper>(runtime, runtime.makeHandle(res->getBigInt()));
  605|   271k|}
_ZN6hermes2vm11Interpreter16caseGetPNameListERNS0_7RuntimeEPNS0_17PinnedHermesValueEPKNS_4inst4InstE:
  283|     15|    const Inst *ip) {
  284|     15|  if (O2REG(GetPNameList).isUndefined() || O2REG(GetPNameList).isNull()) {
  ------------------
  |  |   32|     15|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|     15|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                if (O2REG(GetPNameList).isUndefined() || O2REG(GetPNameList).isNull()) {
  ------------------
  |  |   32|     15|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|     15|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (284:7): [True: 0, False: 15]
  |  Branch (284:44): [True: 0, False: 15]
  ------------------
  285|       |    // Set the iterator to be undefined value.
  286|      0|    O1REG(GetPNameList) = HermesValue::encodeUndefinedValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  287|      0|    return ExecutionStatus::RETURNED;
  288|      0|  }
  289|       |
  290|       |  // Convert to object and store it back to the register.
  291|     15|  auto res = toObject(runtime, Handle<>(&O2REG(GetPNameList)));
  ------------------
  |  |   32|     15|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|     15|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  292|     15|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     15|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15]
  |  |  ------------------
  ------------------
  293|      0|    return ExecutionStatus::EXCEPTION;
  294|      0|  }
  295|     15|  O2REG(GetPNameList) = res.getValue();
  ------------------
  |  |   32|     15|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|     30|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  296|       |
  297|     15|  auto obj = runtime.makeMutableHandle(vmcast<JSObject>(res.getValue()));
  298|     15|  uint32_t beginIndex;
  299|     15|  uint32_t endIndex;
  300|     15|  auto cr = getForInPropertyNames(runtime, obj, beginIndex, endIndex);
  301|     15|  if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (301:7): [True: 0, False: 15]
  ------------------
  302|      0|    return ExecutionStatus::EXCEPTION;
  303|      0|  }
  304|     15|  auto arr = *cr;
  305|     15|  O3REG(GetPNameList) = HermesValue::encodeUntrustedNumberValue(beginIndex);
  ------------------
  |  |   33|     15|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|     30|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  306|     15|  O4REG(GetPNameList) = HermesValue::encodeUntrustedNumberValue(endIndex);
  ------------------
  |  |   34|     15|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|     30|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  307|       |  // Write the result last in case it is the same register as one of the in/out
  308|       |  // operands.
  309|     15|  O1REG(GetPNameList) = arr.getHermesValue();
  ------------------
  |  |   31|     15|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     30|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  310|     15|  return ExecutionStatus::RETURNED;
  311|     15|}
_ZN6hermes2vm11Interpreter15implCallBuiltinERNS0_7RuntimeEPNS0_17PinnedHermesValueEPNS0_9CodeBlockEj:
  317|   390k|    uint32_t op3) {
  318|   390k|  const Inst *ip = runtime.getCurrentIP();
  319|   390k|  uint8_t methodIndex = ip->iCallBuiltin.op2;
  320|   390k|  Callable *callable = runtime.getBuiltinCallable(methodIndex);
  321|   390k|  assert(
  322|   390k|      isNativeBuiltin(methodIndex) &&
  323|   390k|      "CallBuiltin must take a native builtin.");
  324|   390k|  NativeFunction *nf = vmcast<NativeFunction>(callable);
  325|       |
  326|   390k|  auto newFrame = StackFramePtr::initFrame(
  327|   390k|      runtime.stackPointer_, FRAME, ip, curCodeBlock, op3 - 1, nf, false);
  ------------------
  |  |   39|   390k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  328|       |  // "thisArg" is implicitly assumed to "undefined".
  329|   390k|  newFrame.getThisArgRef() = HermesValue::encodeUndefinedValue();
  330|       |
  331|   390k|  SLOW_DEBUG(dumpCallArguments(llvh::dbgs(), runtime, newFrame));
  ------------------
  |  |   18|   390k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|   390k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|   390k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 390k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|   390k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|       |
  333|   390k|  auto resPH = NativeFunction::_nativeCall(nf, runtime);
  334|   390k|  if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
  335|      0|    return ExecutionStatus::EXCEPTION;
  336|   390k|  O1REG(CallBuiltin) = std::move(resPH->get());
  ------------------
  |  |   31|   390k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|   781k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  337|   390k|  SLOW_DEBUG(
  ------------------
  |  |   18|   390k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|   390k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|   390k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 390k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|   390k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|   390k|      llvh::dbgs() << "native return value r" << (unsigned)ip->iCallBuiltin.op1
  339|   390k|                   << "=" << DumpHermesValue(O1REG(CallBuiltin)) << "\n");
  340|   390k|  return ExecutionStatus::RETURNED;
  341|   390k|}
_ZN6hermes2vm16doNegateSlowPathERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  631|   177k|CallResult<HermesValue> doNegateSlowPath(Runtime &runtime, Handle<> src) {
  632|       |  // Try converting src to a numeric.
  633|   177k|  auto numRes = toNumeric_RJS(runtime, src);
  634|   177k|  if (LLVM_UNLIKELY(numRes == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 177k]
  |  |  ------------------
  ------------------
  635|      0|    return ExecutionStatus::EXCEPTION;
  636|       |  // Test for BigInt since it is cheaper than testing for number. If it is a
  637|       |  // number, negate it and return.
  638|   177k|  if (LLVM_LIKELY(!numRes->isBigInt()))
  ------------------
  |  |  188|   177k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 177k, False: 1]
  |  |  ------------------
  ------------------
  639|   177k|    return HermesValue::encodeUntrustedNumberValue(-numRes->getNumber());
  640|       |
  641|       |  // The result is a BigInt, perform a BigInt unary minus.
  642|      1|  auto bigint = runtime.makeHandle(numRes->getBigInt());
  643|      1|  return BigIntPrimitive::unaryMinus(runtime, bigint);
  644|   177k|}

_ZN6hermes2vm11Interpreter18handleCallSlowPathERNS0_7RuntimeEPNS0_17PinnedHermesValueE:
  270|   391k|    PinnedHermesValue *callTarget) {
  271|   391k|  if (auto *native = dyn_vmcast<NativeFunction>(*callTarget)) {
  ------------------
  |  Branch (271:13): [True: 391k, False: 1]
  ------------------
  272|   391k|    ++NumNativeFunctionCalls;
  273|       |    // Call the native function directly
  274|   391k|    return NativeFunction::_nativeCall(native, runtime);
  275|   391k|  } else if (auto *bound = dyn_vmcast<BoundFunction>(*callTarget)) {
  ------------------
  |  Branch (275:20): [True: 0, False: 1]
  ------------------
  276|      0|    ++NumBoundFunctionCalls;
  277|       |    // Call the bound function.
  278|      0|    return BoundFunction::_boundCall(bound, runtime.getCurrentIP(), runtime);
  279|      1|  } else {
  280|      1|    return runtime.raiseTypeErrorForCallable(Handle<>(callTarget));
  281|      1|  }
  282|   391k|}
_ZN6hermes2vm11Interpreter20getByIdTransient_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEENS0_8SymbolIDE:
  298|     22|    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|     22|  PseudoHandle<> valOpt = tryGetPrimitiveOwnPropertyById(runtime, base, id);
  305|     22|  if (!valOpt->isEmpty()) {
  ------------------
  |  Branch (305:7): [True: 0, False: 22]
  ------------------
  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|     22|  CallResult<Handle<JSObject>> primitivePrototypeResult =
  313|     22|      getPrimitivePrototype(runtime, base);
  314|     22|  if (primitivePrototypeResult == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (314:7): [True: 1, False: 21]
  ------------------
  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|      1|    return amendPropAccessErrorMsgWithPropName(runtime, base, "read", id);
  319|      1|  }
  320|       |
  321|     21|  return JSObject::getNamedWithReceiver_RJS(
  322|     21|      *primitivePrototypeResult, runtime, id, base);
  323|     22|}
_ZN6hermes2vm11Interpreter21createArrayFromBufferERNS0_7RuntimeEPNS0_9CodeBlockEjjj:
  629|     14|    unsigned bufferIndex) {
  630|       |  // Create a new array using the built-in constructor, and initialize
  631|       |  // the elements from a literal array buffer.
  632|     14|  auto arrRes = JSArray::create(runtime, numElements, numElements);
  633|     14|  if (arrRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (633:7): [True: 0, False: 14]
  ------------------
  634|      0|    return ExecutionStatus::EXCEPTION;
  635|      0|  }
  636|       |  // Resize the array storage in advance.
  637|     14|  auto arr = *arrRes;
  638|     14|  JSArray::setStorageEndIndex(arr, runtime, numElements);
  639|       |
  640|     14|  auto iter = curCodeBlock->getArrayBufferIter(bufferIndex, numLiterals);
  641|     14|  JSArray::size_type i = 0;
  642|   411k|  while (iter.hasNext()) {
  ------------------
  |  Branch (642:10): [True: 411k, False: 14]
  ------------------
  643|       |    // NOTE: we must get the value in a separate step to guarantee ordering.
  644|   411k|    const auto value =
  645|   411k|        SmallHermesValue::encodeHermesValue(iter.get(runtime), runtime);
  646|   411k|    JSArray::unsafeSetExistingElementAt(*arr, runtime, i++, value);
  647|   411k|  }
  648|       |
  649|     14|  return createPseudoHandle(HermesValue::encodeObjectValue(*arr));
  650|     14|}
_ZN6hermes2vm7Runtime21interpretFunctionImplEPNS0_9CodeBlockE:
  772|    356|    CodeBlock *newCodeBlock) {
  773|    356|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    356|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 356]
  |  |  ------------------
  ------------------
  774|    356|          newCodeBlock->lazyCompile(*this) == ExecutionStatus::EXCEPTION)) {
  775|      0|    return ExecutionStatus::EXCEPTION;
  776|      0|  }
  777|       |
  778|    356|#if defined(HERMES_MEMORY_INSTRUMENTATION) || !defined(NDEBUG)
  779|       |  // We always call getCurrentIP() in a debug build as this has the effect
  780|       |  // of asserting the IP is correctly set (not invalidated) at this point.
  781|       |  // This allows us to leverage our whole test-suite to find missing cases
  782|       |  // of CAPTURE_IP* macros in the interpreter loop.
  783|    356|  const inst::Inst *ip = getCurrentIP();
  784|    356|  (void)ip;
  785|    356|#endif
  786|    356|#ifdef HERMES_MEMORY_INSTRUMENTATION
  787|    356|  if (ip) {
  ------------------
  |  Branch (787:7): [True: 82, False: 274]
  ------------------
  788|     82|    const CodeBlock *codeBlock;
  789|     82|    std::tie(codeBlock, ip) = getCurrentInterpreterLocation(ip);
  790|       |    // All functions end in a Ret so we must match this with a pushCallStack()
  791|       |    // before executing.
  792|     82|    if (codeBlock) {
  ------------------
  |  Branch (792:9): [True: 82, False: 0]
  ------------------
  793|       |      // Push a call entry at the last location we were executing bytecode.
  794|       |      // This will correctly attribute things like eval().
  795|     82|      pushCallStack(codeBlock, ip);
  796|     82|    } else {
  797|       |      // Push a call entry at the entry at the top of interpreted code.
  798|      0|      pushCallStack(newCodeBlock, (const Inst *)newCodeBlock->begin());
  799|      0|    }
  800|    274|  } else {
  801|       |    // Push a call entry at the entry at the top of interpreted code.
  802|    274|    pushCallStack(newCodeBlock, (const Inst *)newCodeBlock->begin());
  803|    274|  }
  804|    356|#endif
  805|       |
  806|    356|  InterpreterState state{newCodeBlock, 0};
  807|    356|  if (HERMESVM_CRASH_TRACE &&
  ------------------
  |  |  196|    712|#define HERMESVM_CRASH_TRACE 0
  |  |  ------------------
  |  |  |  Branch (196:30): [Folded - Ignored]
  |  |  ------------------
  ------------------
  808|    356|      (getVMExperimentFlags() & experiments::CrashTrace)) {
  ------------------
  |  Branch (808:7): [True: 0, False: 0]
  ------------------
  809|      0|    return Interpreter::interpretFunction<false, true>(*this, state);
  810|    356|  } else {
  811|    356|    return Interpreter::interpretFunction<false, false>(*this, state);
  812|    356|  }
  813|    356|}
_ZN6hermes2vm7Runtime17interpretFunctionEPNS0_9CodeBlockE:
  815|    356|CallResult<HermesValue> Runtime::interpretFunction(CodeBlock *newCodeBlock) {
  816|       |  // Make sure we are not re-entering JS execution from a context that doesn't
  817|       |  // allow reentrancy
  818|    356|  assert(this->noRJSLevel_ == 0 && "No JS execution allowed right now.");
  819|    356|  return interpretFunctionImpl(newCodeBlock);
  820|    356|}
_ZN6hermes2vm11Interpreter30tryGetPrimitiveOwnPropertyByIdERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEENS0_8SymbolIDE:
  287|     22|    SymbolID id) {
  288|     22|  if (base->isString() && id == Predefined::getSymbolID(Predefined::length)) {
  ------------------
  |  Branch (288:7): [True: 21, False: 1]
  |  Branch (288:27): [True: 0, False: 21]
  ------------------
  289|      0|    return createPseudoHandle(HermesValue::encodeUntrustedNumberValue(
  290|      0|        base->getString()->getStringLength()));
  291|      0|  }
  292|     22|  return createPseudoHandle(HermesValue::encodeEmptyValue());
  293|     22|}
_ZN6hermes2vm11Interpreter17interpretFunctionILb0ELb0EEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeERNS0_16InterpreterStateE:
  836|    356|    InterpreterState &state) {
  837|       |  // The interpreter is re-entrant and also saves/restores its IP via the
  838|       |  // runtime whenever a call out is made (see the CAPTURE_IP_* macros). As such,
  839|       |  // failure to preserve the IP across calls to interpreterFunction() disrupt
  840|       |  // interpreter calls further up the C++ callstack. The RAII utility class
  841|       |  // below makes sure we always do this correctly.
  842|       |  //
  843|       |  // TODO: The IPs stored in the C++ callstack via this holder will generally be
  844|       |  // the same as in the JS stack frames via the Saved IP field. We can probably
  845|       |  // get rid of one of these redundant stores. Doing this isn't completely
  846|       |  // trivial as there are currently cases where we re-enter the interpreter
  847|       |  // without calling Runtime::saveCallerIPInStackFrame(), and there are features
  848|       |  // (I think mostly the debugger + stack traces) which implicitly rely on
  849|       |  // this behavior. At least their tests break if this behavior is not
  850|       |  // preserved.
  851|    356|  struct IPSaver {
  852|    356|    IPSaver(Runtime &runtime)
  853|    356|        : ip_(runtime.getCurrentIP()), runtime_(runtime) {}
  854|       |
  855|    356|    ~IPSaver() {
  856|    356|      runtime_.setCurrentIP(ip_);
  857|    356|    }
  858|       |
  859|    356|   private:
  860|    356|    const Inst *ip_;
  861|    356|    Runtime &runtime_;
  862|    356|  };
  863|    356|  IPSaver ipSaver(runtime);
  864|       |
  865|       |#ifndef HERMES_ENABLE_DEBUGGER
  866|       |  static_assert(!SingleStep, "can't use single-step mode without the debugger");
  867|       |#endif
  868|       |  // Make sure that the cache can use an optimization by avoiding a branch to
  869|       |  // access the property storage.
  870|    356|  static_assert(
  871|    356|      HiddenClass::kDictionaryThreshold <=
  872|    356|          SegmentedArray::kValueToSegmentThreshold,
  873|    356|      "Cannot avoid branches in cache check if the dictionary "
  874|    356|      "crossover point is larger than the inline storage");
  875|       |
  876|    356|  CodeBlock *curCodeBlock = state.codeBlock;
  877|    356|  const Inst *ip = nullptr;
  878|       |  // Points to the first local register in the current frame.
  879|       |  // This eliminates the indirect load from Runtime and the -1 offset.
  880|    356|  PinnedHermesValue *frameRegs;
  881|       |  // Strictness of current function.
  882|    356|  bool strictMode;
  883|       |  // Default flags when accessing properties.
  884|    356|  PropOpFlags defaultPropOpFlags;
  885|       |
  886|       |// These CAPTURE_IP* macros should wrap around any major calls out of the
  887|       |// interpreter loop. They stash and retrieve the IP via the current Runtime
  888|       |// allowing the IP to be externally observed and even altered to change the flow
  889|       |// of execution. Explicitly saving AND restoring the IP from the Runtime in this
  890|       |// way means the C++ compiler will keep IP in a register within the rest of the
  891|       |// interpreter loop.
  892|       |//
  893|       |// When assertions are enabled we take the extra step of "invalidating" the IP
  894|       |// between captures so we can detect if it's erroneously accessed.
  895|       |//
  896|       |#ifdef NDEBUG
  897|       |
  898|       |#define CAPTURE_IP(expr)    \
  899|       |  runtime.setCurrentIP(ip); \
  900|       |  (void)(expr);             \
  901|       |  ip = runtime.getCurrentIP();
  902|       |
  903|       |// Used when we want to declare a new variable and assign the expression to it.
  904|       |#define CAPTURE_IP_ASSIGN(decl, expr) \
  905|       |  runtime.setCurrentIP(ip);           \
  906|       |  decl = (expr);                      \
  907|       |  ip = runtime.getCurrentIP();
  908|       |
  909|       |#else // !NDEBUG
  910|       |
  911|    356|#define CAPTURE_IP(expr)       \
  912|    356|  runtime.setCurrentIP(ip);    \
  913|    356|  (void)(expr);                \
  914|    356|  ip = runtime.getCurrentIP(); \
  915|    356|  runtime.invalidateCurrentIP();
  916|       |
  917|       |// Used when we want to declare a new variable and assign the expression to it.
  918|    356|#define CAPTURE_IP_ASSIGN(decl, expr) \
  919|    356|  runtime.setCurrentIP(ip);           \
  920|    356|  decl = (expr);                      \
  921|    356|  ip = runtime.getCurrentIP();        \
  922|    356|  runtime.invalidateCurrentIP();
  923|       |
  924|    356|#endif // NDEBUG
  925|       |
  926|       |/// \def DONT_CAPTURE_IP(expr)
  927|       |/// \param expr A call expression to a function external to the interpreter. The
  928|       |///   expression should not make any allocations and the IP should be set
  929|       |///   immediately following this macro.
  930|    356|#define DONT_CAPTURE_IP(expr)      \
  931|    356|  do {                             \
  932|    356|    NoAllocScope noAlloc(runtime); \
  933|    356|    (void)expr;                    \
  934|    356|  } while (false)
  935|       |
  936|       |// When performing a tail call, we need to set the runtime IP and leave it set.
  937|    356|#define CAPTURE_IP_SET() runtime.setCurrentIP(ip)
  938|       |
  939|    356|  LLVM_DEBUG(dbgs() << "interpretFunction() called\n");
  ------------------
  |  |  123|    356|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    356|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 356]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    356|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  940|       |
  941|    356|  ScopedNativeDepthTracker depthTracker{runtime};
  942|    356|  if (LLVM_UNLIKELY(depthTracker.overflowed())) {
  ------------------
  |  |  189|    356|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 356]
  |  |  ------------------
  ------------------
  943|      0|    return runtime.raiseStackOverflow(Runtime::StackOverflowKind::NativeStack);
  944|      0|  }
  945|       |
  946|    356|  GCScope gcScope(runtime);
  947|       |  // Avoid allocating a handle dynamically by reusing this one.
  948|    356|  MutableHandle<> tmpHandle(runtime);
  949|    356|  CallResult<HermesValue> res{ExecutionStatus::EXCEPTION};
  950|    356|  CallResult<PseudoHandle<>> resPH{ExecutionStatus::EXCEPTION};
  951|    356|  CallResult<Handle<Arguments>> resArgs{ExecutionStatus::EXCEPTION};
  952|    356|  CallResult<bool> boolRes{ExecutionStatus::EXCEPTION};
  953|       |  // Start of the bytecode file, used to calculate IP offset in crash traces.
  954|    356|  const uint8_t *bytecodeFileStart;
  955|       |
  956|       |  // Mark the gcScope so we can clear all allocated handles.
  957|       |  // Remember how many handles the scope has so we can clear them in the loop.
  958|    356|  static constexpr unsigned KEEP_HANDLES = 1;
  959|    356|  assert(
  960|    356|      gcScope.getHandleCountDbg() == KEEP_HANDLES &&
  961|    356|      "scope has unexpected number of handles");
  962|       |
  963|    356|  INIT_OPCODE_PROFILER;
  964|       |
  965|  2.75k|tailCall:
  966|  2.75k|  PROFILER_ENTER_FUNCTION(curCodeBlock);
  967|       |
  968|  2.75k|#ifdef HERMES_ENABLE_DEBUGGER
  969|  2.75k|  runtime.getDebugger().willEnterCodeBlock(curCodeBlock);
  970|  2.75k|#endif
  971|       |
  972|  2.75k|  runtime.getCodeCoverageProfiler().markExecuted(curCodeBlock);
  973|       |
  974|  2.75k|  if (!SingleStep) {
  ------------------
  |  Branch (974:7): [Folded - Ignored]
  ------------------
  975|  2.75k|    auto newFrame = runtime.setCurrentFrameToTopOfStack();
  976|  2.75k|    runtime.saveCallerIPInStackFrame();
  977|  2.75k|#ifndef NDEBUG
  978|  2.75k|    runtime.invalidateCurrentIP();
  979|  2.75k|#endif
  980|       |
  981|       |    // Point frameRegs to the first register in the new frame. Note that at this
  982|       |    // moment technically it points above the top of the stack, but we are never
  983|       |    // going to access it.
  984|  2.75k|    frameRegs = &newFrame.getFirstLocalRef();
  985|       |
  986|  2.75k|#ifndef NDEBUG
  987|  2.75k|    LLVM_DEBUG(
  ------------------
  |  |  123|  2.75k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.75k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.75k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.75k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  988|  2.75k|        dbgs() << "function entry: stackLevel=" << runtime.getStackLevel()
  989|  2.75k|               << ", argCount=" << runtime.getCurrentFrame().getArgCount()
  990|  2.75k|               << ", frameSize=" << curCodeBlock->getFrameSize() << "\n");
  991|       |
  992|  2.75k|    LLVM_DEBUG(
  ------------------
  |  |  123|  2.75k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.75k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.75k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.75k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  993|  2.75k|        dbgs() << " callee "
  994|  2.75k|               << DumpHermesValue(
  995|  2.75k|                      runtime.getCurrentFrame().getCalleeClosureOrCBRef())
  996|  2.75k|               << "\n");
  997|  2.75k|    LLVM_DEBUG(
  ------------------
  |  |  123|  2.75k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.75k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.75k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.75k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  998|  2.75k|        dbgs() << "   this "
  999|  2.75k|               << DumpHermesValue(runtime.getCurrentFrame().getThisArgRef())
 1000|  2.75k|               << "\n");
 1001|  4.67k|    for (uint32_t i = 0; i != runtime.getCurrentFrame()->getArgCount(); ++i) {
  ------------------
  |  Branch (1001:26): [True: 1.92k, False: 2.75k]
  ------------------
 1002|  1.92k|      LLVM_DEBUG(
  ------------------
  |  |  123|  1.92k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.92k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.92k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.92k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1003|  1.92k|          dbgs() << "   " << llvh::format_decimal(i, 4) << " "
 1004|  1.92k|                 << DumpHermesValue(runtime.getCurrentFrame().getArgRef(i))
 1005|  1.92k|                 << "\n");
 1006|  1.92k|    }
 1007|  2.75k|#endif
 1008|       |
 1009|       |    // Allocate the registers for the new frame.
 1010|  2.75k|    if (LLVM_UNLIKELY(!runtime.checkAndAllocStack(
  ------------------
  |  |  189|  2.75k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.75k]
  |  |  ------------------
  ------------------
 1011|  2.75k|            curCodeBlock->getFrameSize() +
 1012|  2.75k|                StackFrameLayout::CalleeExtraRegistersAtStart,
 1013|  2.75k|            HermesValue::encodeUndefinedValue())))
 1014|      0|      goto stackOverflow;
 1015|       |
 1016|  2.75k|    ip = (Inst const *)curCodeBlock->begin();
 1017|       |
 1018|       |    // Check for invalid invocation.
 1019|  2.75k|    if (LLVM_UNLIKELY(curCodeBlock->getHeaderFlags().isCallProhibited(
  ------------------
  |  |  189|  2.75k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.75k]
  |  |  ------------------
  ------------------
 1020|  2.75k|            newFrame.isConstructorCall()))) {
 1021|      0|      if (!newFrame.isConstructorCall()) {
  ------------------
  |  Branch (1021:11): [True: 0, False: 0]
  ------------------
 1022|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 1023|      0|            runtime.raiseTypeError("Class constructor invoked without new"));
 1024|      0|      } else {
 1025|      0|        CAPTURE_IP(runtime.raiseTypeError("Function is not a constructor"));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 1026|      0|      }
 1027|      0|      goto handleExceptionInParent;
 1028|      0|    }
 1029|  2.75k|  } else {
 1030|       |    // Point frameRegs to the first register in the frame.
 1031|      0|    frameRegs = &runtime.getCurrentFrame().getFirstLocalRef();
 1032|      0|    ip = (Inst const *)(curCodeBlock->begin() + state.offset);
 1033|      0|  }
 1034|       |
 1035|  2.75k|  assert((const uint8_t *)ip < curCodeBlock->end() && "CodeBlock is empty");
 1036|       |
 1037|  2.75k|  INIT_STATE_FOR_CODEBLOCK(curCodeBlock);
  ------------------
  |  |  116|  2.75k|  do {                                                           \
  |  |  117|  2.75k|    strictMode = (codeBlock)->isStrictMode();                    \
  |  |  118|  2.75k|    defaultPropOpFlags = DEFAULT_PROP_OP_FLAGS(strictMode);      \
  |  |  ------------------
  |  |  |  |   44|  2.75k|  (strictMode ? PropOpFlags().plusThrowOnError() : PropOpFlags())
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (44:4): [True: 2.40k, False: 356]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|  2.75k|    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|  2.75k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (128:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1038|       |
 1039|  2.75k|#define BEFORE_OP_CODE                                                       \
 1040|  2.75k|  {                                                                          \
 1041|  2.75k|    UPDATE_OPCODE_TIME_SPENT;                                                \
 1042|  2.75k|    HERMES_SLOW_ASSERT(                                                      \
 1043|  2.75k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
 1044|  2.75k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
 1045|  2.75k|    HERMES_SLOW_ASSERT(                                                      \
 1046|  2.75k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
 1047|  2.75k|        "unaccounted handles were created");                                 \
 1048|  2.75k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
 1049|  2.75k|    RECORD_OPCODE_START_TIME;                                                \
 1050|  2.75k|    INC_OPCODE_COUNT;                                                        \
 1051|  2.75k|    if (EnableCrashTrace) {                                                  \
 1052|  2.75k|      runtime.crashTrace_.recordInst(                                        \
 1053|  2.75k|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
 1054|  2.75k|    }                                                                        \
 1055|  2.75k|  }
 1056|       |
 1057|  2.75k|#ifdef HERMESVM_INDIRECT_THREADING
 1058|  2.75k|  static void *opcodeDispatch[] = {
 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
 1060|  2.75k|#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|  2.75k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  2.75k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  2.75k|#endif
  |  |   12|  2.75k|#ifndef DEFINE_OPCODE_0
  |  |   13|  2.75k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  2.75k|#endif
  |  |   15|  2.75k|#ifndef DEFINE_OPCODE_1
  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  2.75k|#endif
  |  |   18|  2.75k|#ifndef DEFINE_OPCODE_2
  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  2.75k|#endif
  |  |   21|  2.75k|#ifndef DEFINE_OPCODE_3
  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  2.75k|#endif
  |  |   24|  2.75k|#ifndef DEFINE_OPCODE_4
  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  2.75k|#endif
  |  |   27|  2.75k|#ifndef DEFINE_OPCODE_5
  |  |   28|  2.75k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  2.75k|#endif
  |  |   30|  2.75k|#ifndef DEFINE_OPCODE_6
  |  |   31|  2.75k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  2.75k|#endif
  |  |   33|       |#ifndef DEFINE_OPCODE
  |  |   34|       |#define DEFINE_OPCODE(...)
  |  |   35|       |#endif
  |  |   36|  2.75k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  2.75k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  2.75k|#endif
  |  |   39|  2.75k|#ifndef DEFINE_RET_TARGET
  |  |   40|  2.75k|#define DEFINE_RET_TARGET(...)
  |  |   41|  2.75k|#endif
  |  |   42|  2.75k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  2.75k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  2.75k|#endif
  |  |   45|  2.75k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  2.75k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  2.75k|#endif
  |  |   48|  2.75k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  2.75k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  2.75k|#endif
  |  |   51|  2.75k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  2.75k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  2.75k|#endif
  |  |   54|  2.75k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  2.75k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  2.75k|#endif
  |  |   57|  2.75k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  2.75k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  2.75k|#endif
  |  |   60|  2.75k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  2.75k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  2.75k|#endif
  |  |   63|  2.75k|#ifndef OPERAND_STRING_ID
  |  |   64|  2.75k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  2.75k|#endif
  |  |   66|       |
  |  |   67|  2.75k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  2.75k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  2.75k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  2.75k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  2.75k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  2.75k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  2.75k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  2.75k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  2.75k|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|  2.75k|DEFINE_OPCODE_0(Unreachable)
  |  |  ------------------
  |  |  |  |   13|  2.75k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |  ------------------
  |  |  |  |   28|  2.75k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   89|  2.75k|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   28|  2.75k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|  2.75k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  2.75k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  2.75k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  2.75k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  2.75k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  2.75k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  2.75k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  2.75k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  2.75k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  2.75k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  2.75k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  2.75k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  2.75k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  2.75k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  2.75k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  2.75k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  2.75k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  2.75k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  2.75k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  2.75k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  2.75k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  2.75k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  2.75k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  2.75k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  2.75k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  2.75k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  2.75k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  2.75k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  2.75k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  2.75k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  2.75k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  2.75k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  2.75k|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  2.75k|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  227|  2.75k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  228|  2.75k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  229|  2.75k|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#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|  2.75k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  236|  2.75k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  2.75k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  2.75k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  2.75k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|       |
  |  |  248|       |/// Create a new inner environment, to store values captured by closures.
  |  |  249|       |/// Arg1 is the destination.
  |  |  250|       |/// Arg2 is the parent environment.
  |  |  251|       |/// Arg3 is the number of slots in the environment.
  |  |  252|  2.75k|DEFINE_OPCODE_3(CreateInnerEnvironment, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  253|       |
  |  |  254|       |/// Declare a global variable by string table index.
  |  |  255|       |/// The variable will be set to undefined.
  |  |  256|  2.75k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  257|  2.75k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  258|       |
  |  |  259|       |/// Checks if globalThis has a restricted global property with the given name.
  |  |  260|       |/// Arg1 is the name to check.
  |  |  261|  2.75k|DEFINE_OPCODE_1(ThrowIfHasRestrictedGlobalProperty, UInt32)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  262|  2.75k|OPERAND_STRING_ID(ThrowIfHasRestrictedGlobalProperty, 1)
  |  |  263|       |
  |  |  264|       |/// Get an object property by string table index.
  |  |  265|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  266|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  267|  2.75k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  268|  2.75k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  269|  2.75k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  270|  2.75k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  271|  2.75k|OPERAND_STRING_ID(GetById, 4)
  |  |  272|  2.75k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  273|       |
  |  |  274|       |/// Get an object property by string table index, or throw if not found.
  |  |  275|       |/// This is similar to GetById, but intended for use with global variables
  |  |  276|       |/// where Arg2 = GetGlobalObject.
  |  |  277|  2.75k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  278|  2.75k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  279|  2.75k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  280|  2.75k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  281|       |
  |  |  282|       |/// Set an object property by string index.
  |  |  283|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  284|  2.75k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  285|  2.75k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  286|  2.75k|OPERAND_STRING_ID(PutById, 4)
  |  |  287|  2.75k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  288|       |
  |  |  289|       |/// Set an object property by string index, or throw if undeclared.
  |  |  290|       |/// This is similar to PutById, but intended for use with global variables
  |  |  291|       |/// where Arg1 = GetGlobalObject.
  |  |  292|  2.75k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  293|  2.75k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  294|  2.75k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  295|  2.75k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  296|       |
  |  |  297|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  298|       |/// the destination must be an object, it only deals with own properties,
  |  |  299|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  300|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  301|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  302|       |/// Arg2 is the value to write.
  |  |  303|       |/// Arg3 is the string table ID of the property name.
  |  |  304|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  305|  2.75k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  306|  2.75k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  307|  2.75k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  308|  2.75k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  309|  2.75k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  310|  2.75k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  311|       |
  |  |  312|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  313|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  314|       |/// Arg1 is the destination object.
  |  |  315|       |/// Arg2 is the value to write.
  |  |  316|       |/// Arg3 is the string table ID of the property name.
  |  |  317|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  318|  2.75k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  319|  2.75k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  320|  2.75k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  321|  2.75k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  322|       |
  |  |  323|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  324|  2.75k|ASSERT_MONOTONE_INCREASING(
  |  |  325|  2.75k|    PutNewOwnByIdShort,
  |  |  326|  2.75k|    PutNewOwnById,
  |  |  327|  2.75k|    PutNewOwnByIdLong,
  |  |  328|  2.75k|    PutNewOwnNEById,
  |  |  329|  2.75k|    PutNewOwnNEByIdLong)
  |  |  330|       |
  |  |  331|       |/// Assign a value to a constant integer own property which will be created as
  |  |  332|       |/// enumerable. This is used (potentially in conjunction with
  |  |  333|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  334|       |/// Arg1[Arg3] = Arg2;
  |  |  335|  2.75k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  336|  2.75k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  337|       |
  |  |  338|       |/// Set an own property identified by value.
  |  |  339|       |/// Arg1 is the destination object.
  |  |  340|       |/// Arg2 is the value to write.
  |  |  341|       |/// Arg3 is the property name.
  |  |  342|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  343|       |///        non-enumerable otherwise.
  |  |  344|       |/// Arg1[Arg3] = Arg2;
  |  |  345|  2.75k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|       |
  |  |  347|       |/// Delete a property by string table index.
  |  |  348|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  349|  2.75k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|  2.75k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  351|  2.75k|OPERAND_STRING_ID(DelById, 3)
  |  |  352|  2.75k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  353|       |
  |  |  354|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  355|       |/// Arg1 = Arg2[Arg3]
  |  |  356|  2.75k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  357|       |
  |  |  358|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  359|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  360|       |/// case this is still the right opcode).
  |  |  361|       |/// Arg1[Arg2] = Arg3
  |  |  362|  2.75k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  363|       |
  |  |  364|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  365|       |/// Arg1 = delete Arg2[Arg3]
  |  |  366|  2.75k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  367|       |
  |  |  368|       |/// Add a getter and a setter for a property by value.
  |  |  369|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  370|       |/// Arg1 is the target object which will have a property defined.
  |  |  371|       |/// Arg2 is the property name
  |  |  372|       |/// Arg3 is the getter closure or undefined
  |  |  373|       |/// Arg4 is the setter closure or undefined
  |  |  374|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  375|  2.75k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   28|  2.75k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  376|       |
  |  |  377|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  378|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  379|       |/// Returns Undefined if the object is null/undefined.
  |  |  380|       |/// Arg2 is the register that holds the object.
  |  |  381|       |/// Arg3 is the register that holds the iterating index.
  |  |  382|       |/// Arg4 is the register that holds the size of the property list.
  |  |  383|  2.75k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  384|       |
  |  |  385|       |/// Get the next property in the for..in iterator.
  |  |  386|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  387|       |/// Arg2 is the register that holds array of properties.
  |  |  388|       |/// Arg3 is the register that holds the object.
  |  |  389|       |/// Arg4 is the register that holds the iterating index.
  |  |  390|       |/// Arg5 is the register that holds the size of the property list.
  |  |  391|  2.75k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   28|  2.75k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  392|       |
  |  |  393|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  394|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  395|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  396|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  397|       |/// wider instructions appearing after narrower ones.
  |  |  398|       |
  |  |  399|       |/// Call a function.
  |  |  400|       |/// Arg1 is the destination of the return value.
  |  |  401|       |/// Arg2 is the closure to invoke.
  |  |  402|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  403|       |///      from the end of the current frame.
  |  |  404|  2.75k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  405|  2.75k|DEFINE_RET_TARGET(Call)
  |  |  406|       |
  |  |  407|       |/// Call a constructor, with semantics identical to Call.
  |  |  408|       |/// Arg1 is the destination of the return value.
  |  |  409|       |/// Arg2 is the closure to invoke.
  |  |  410|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  411|       |///      from the end of the current frame. The first argument 'this'
  |  |  412|       |///      is assumed to be created with CreateThis.
  |  |  413|  2.75k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  414|  2.75k|DEFINE_RET_TARGET(Construct)
  |  |  415|       |
  |  |  416|       |/// Call a function with one arg.
  |  |  417|       |/// Arg1 is the destination of the return value.
  |  |  418|       |/// Arg2 is the closure to invoke.
  |  |  419|       |/// Arg3 is the first argument.
  |  |  420|  2.75k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  421|  2.75k|DEFINE_RET_TARGET(Call1)
  |  |  422|       |
  |  |  423|       |/// Call a function directly without a closure.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  426|       |///      from the end of the current frame. The first argument 'this'
  |  |  427|       |///      is assumed to be created with CreateThis.
  |  |  428|       |/// Arg3 is index in the function table.
  |  |  429|       |/// Note that we expect the variable-sized argument to be last.
  |  |  430|  2.75k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  431|  2.75k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  432|  2.75k|DEFINE_RET_TARGET(CallDirect)
  |  |  433|       |
  |  |  434|       |/// Call a function with two args.
  |  |  435|       |/// Arg1 is the destination of the return value.
  |  |  436|       |/// Arg2 is the closure to invoke.
  |  |  437|       |/// Arg3 is the first argument.
  |  |  438|       |/// Arg4 is the second argument.
  |  |  439|  2.75k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  440|  2.75k|DEFINE_RET_TARGET(Call2)
  |  |  441|       |
  |  |  442|       |/// Call a function with three args.
  |  |  443|       |/// Arg1 is the destination of the return value.
  |  |  444|       |/// Arg2 is the closure to invoke.
  |  |  445|       |/// Arg3 is the first argument.
  |  |  446|       |/// Arg4 is the second argument.
  |  |  447|       |/// Arg5 is the third argument.
  |  |  448|  2.75k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   28|  2.75k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  449|  2.75k|DEFINE_RET_TARGET(Call3)
  |  |  450|       |
  |  |  451|       |/// Call a function with four args.
  |  |  452|       |/// Arg1 is the destination of the return value.
  |  |  453|       |/// Arg2 is the closure to invoke.
  |  |  454|       |/// Arg3 is the first argument.
  |  |  455|       |/// Arg4 is the second argument.
  |  |  456|       |/// Arg5 is the third argument.
  |  |  457|       |/// Arg6 is the fourth argument.
  |  |  458|  2.75k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   31|  2.75k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  459|  2.75k|DEFINE_RET_TARGET(Call4)
  |  |  460|       |
  |  |  461|       |/// Identical to Call, but allowing more arguments.
  |  |  462|  2.75k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  463|  2.75k|DEFINE_RET_TARGET(CallLong)
  |  |  464|       |
  |  |  465|       |/// Identical to Construct, but allowing more arguments.
  |  |  466|  2.75k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  467|  2.75k|DEFINE_RET_TARGET(ConstructLong)
  |  |  468|       |
  |  |  469|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  470|  2.75k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  471|  2.75k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  472|       |
  |  |  473|       |// Enforce the order.
  |  |  474|  2.75k|ASSERT_MONOTONE_INCREASING(
  |  |  475|  2.75k|    Call,
  |  |  476|  2.75k|    Construct,
  |  |  477|  2.75k|    Call1,
  |  |  478|  2.75k|    CallDirect,
  |  |  479|  2.75k|    Call2,
  |  |  480|  2.75k|    Call3,
  |  |  481|  2.75k|    Call4,
  |  |  482|  2.75k|    CallLong,
  |  |  483|  2.75k|    ConstructLong,
  |  |  484|  2.75k|    CallDirectLongIndex)
  |  |  485|       |
  |  |  486|       |/// Call a builtin function.
  |  |  487|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  488|       |/// and therefore never JS.
  |  |  489|       |/// Arg1 is the destination of the return value.
  |  |  490|       |/// Arg2 is the builtin number.
  |  |  491|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  492|       |///      from the end of the current frame.
  |  |  493|       |/// thisArg is set to "undefined".
  |  |  494|  2.75k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  495|       |
  |  |  496|       |/// Call a builtin function.
  |  |  497|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  498|       |/// and therefore never JS.
  |  |  499|       |/// Arg1 is the destination of the return value.
  |  |  500|       |/// Arg2 is the builtin number.
  |  |  501|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  502|       |///      from the end of the current frame.
  |  |  503|       |/// thisArg is set to "undefined".
  |  |  504|  2.75k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  505|       |
  |  |  506|       |/// Get a closure from a builtin function.
  |  |  507|       |/// Arg1 is the destination of the return value.
  |  |  508|       |/// Arg2 is the builtin number.
  |  |  509|  2.75k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  510|       |
  |  |  511|       |///
  |  |  512|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  513|       |
  |  |  514|       |/// Return a value from the current function.
  |  |  515|       |/// return Arg1;
  |  |  516|  2.75k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  517|       |
  |  |  518|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  519|       |/// } catch(Arg1) {
  |  |  520|  2.75k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  521|       |
  |  |  522|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  523|       |/// Arg1 is the destination of the return value.
  |  |  524|       |/// Arg2 is the value to eval.
  |  |  525|       |/// Arg3 is a boolean which is true if the eval should be performed in strict mode.
  |  |  526|  2.75k|DEFINE_OPCODE_3(DirectEval, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  527|       |
  |  |  528|       |/// Throw an exception.
  |  |  529|       |/// throw Arg1;
  |  |  530|  2.75k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  531|       |
  |  |  532|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  533|       |/// Arg1 is the destination of the return value
  |  |  534|       |/// Arg2 is the value to check
  |  |  535|  2.75k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  536|       |
  |  |  537|       |/// Implementation dependent debugger action.
  |  |  538|  2.75k|DEFINE_OPCODE_0(Debugger)
  |  |  ------------------
  |  |  |  |   13|  2.75k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  539|       |
  |  |  540|       |/// Fast check for an async interrupt request.
  |  |  541|  2.75k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  ------------------
  |  |  |  |   13|  2.75k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  542|       |
  |  |  543|       |/// Define a profile point.
  |  |  544|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  545|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  546|       |/// all the overflowed profile points have index zero.
  |  |  547|  2.75k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  548|       |
  |  |  549|       |/// Create a closure.
  |  |  550|       |/// Arg1 is the register in which to store the closure.
  |  |  551|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  552|       |/// Arg3 is index in the function table.
  |  |  553|  2.75k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  554|  2.75k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  555|  2.75k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  556|  2.75k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  557|       |
  |  |  558|       |/// Create a closure for a GeneratorFunction.
  |  |  559|       |/// Arg1 is the register in which to store the closure.
  |  |  560|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  561|       |/// Arg3 is index in the function table.
  |  |  562|  2.75k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  563|  2.75k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  564|  2.75k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  565|  2.75k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  566|       |
  |  |  567|       |/// Create a closure for an AsyncFunction.
  |  |  568|       |/// Arg1 is the register in which to store the closure.
  |  |  569|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  570|       |/// Arg3 is index in the function table.
  |  |  571|  2.75k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  572|  2.75k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  573|  2.75k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  574|  2.75k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  575|       |
  |  |  576|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  577|       |/// Arg1 is the destination register.
  |  |  578|       |/// Arg2 is the prototype to assign it.
  |  |  579|       |/// Arg3 is the constructor closure that will be used*.
  |  |  580|       |/// * To allow internal constructors to have special objects allocated.
  |  |  581|  2.75k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  582|       |
  |  |  583|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  584|       |/// Arg1 is the result.
  |  |  585|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  586|       |/// Arg3 is the constructor's return value.
  |  |  587|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  588|  2.75k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  589|       |
  |  |  590|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  591|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  592|  2.75k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  593|       |
  |  |  594|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  595|  2.75k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  596|       |
  |  |  597|       |/// Load a constant integer value.
  |  |  598|  2.75k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  599|  2.75k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  600|       |
  |  |  601|       |/// Load a constant double value.
  |  |  602|  2.75k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  603|       |
  |  |  604|       |/// Load a constant BigInt value by bigint table index.
  |  |  605|  2.75k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  606|  2.75k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  607|  2.75k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  608|  2.75k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  609|       |
  |  |  610|       |/// Load a constant string value by string table index.
  |  |  611|  2.75k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  612|  2.75k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  613|  2.75k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  614|  2.75k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  615|       |
  |  |  616|       |/// Load common constants.
  |  |  617|  2.75k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  618|  2.75k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  619|  2.75k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  620|  2.75k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  621|  2.75k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  622|  2.75k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  623|       |
  |  |  624|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  625|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  626|       |/// object.
  |  |  627|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  628|  2.75k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|       |
  |  |  630|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  631|       |/// \code
  |  |  632|       |///     LoadParam    Arg1, #0
  |  |  633|       |///     CoerceThisNS Arg1, Arg1
  |  |  634|       |/// \endcode
  |  |  635|  2.75k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  636|       |
  |  |  637|       |/// Convert a value to a number.
  |  |  638|       |/// Arg1 = Arg2 - 0
  |  |  639|  2.75k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|       |/// Convert a value to a numberic.
  |  |  641|       |/// Arg1 = ToNumeric(Arg2)
  |  |  642|  2.75k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  643|       |/// Convert a value to a 32-bit signed integer.
  |  |  644|       |/// Arg1 = Arg2 | 0
  |  |  645|  2.75k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  646|       |
  |  |  647|       |/// Convert a value to a string as if evaluating the expression:
  |  |  648|       |///     Arg1 = "" + Arg2
  |  |  649|       |/// In practice this means
  |  |  650|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  651|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  652|  2.75k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  653|       |
  |  |  654|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  655|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  656|       |// will be populated and the rest of the instruction will access it directly.
  |  |  657|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  658|       |// instead of doing a full array allocation and property lookup.
  |  |  659|       |
  |  |  660|       |/// Get a property of the 'arguments' array by value.
  |  |  661|       |/// Arg1 is the result.
  |  |  662|       |/// Arg2 is the index.
  |  |  663|       |/// Arg3 is the lazy loaded register.
  |  |  664|       |/// Arg1 = arguments[Arg2]
  |  |  665|  2.75k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  666|       |
  |  |  667|       |/// Get the length of the 'arguments' array.
  |  |  668|       |/// Arg1 is the result.
  |  |  669|       |/// Arg2 is the lazy loaded register.
  |  |  670|       |/// Arg1 = arguments.length
  |  |  671|  2.75k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  672|       |
  |  |  673|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  674|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  675|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  676|  2.75k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  ------------------
  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  677|       |
  |  |  678|       |/// Create a regular expression.
  |  |  679|       |/// Arg1 is the result.
  |  |  680|       |/// Arg2 is the string index of the pattern.
  |  |  681|       |/// Arg3 is the string index of the flags.
  |  |  682|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  683|  2.75k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   25|  2.75k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  684|  2.75k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  685|  2.75k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  686|       |
  |  |  687|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  688|       |/// input or to the default block if out of range (or not right type)
  |  |  689|       |/// Arg 1 is the value to be branched upon
  |  |  690|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  691|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  692|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  693|       |/// less than this value jmp to
  |  |  694|       |///   default block
  |  |  695|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  696|       |///   default block.
  |  |  697|       |///
  |  |  698|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  699|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  700|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  701|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  702|  2.75k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   28|  2.75k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  703|       |
  |  |  704|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  705|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  706|  2.75k|DEFINE_OPCODE_0(StartGenerator)
  |  |  ------------------
  |  |  |  |   13|  2.75k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  707|       |
  |  |  708|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  709|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  710|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  711|       |/// - throw(val): Throw val as an error
  |  |  712|       |/// Arg1 is the result provided by the user.
  |  |  713|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  714|  2.75k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  715|       |
  |  |  716|       |/// Set the generator status to complete, but do not return.
  |  |  717|  2.75k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  ------------------
  |  |  |  |   13|  2.75k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  718|       |
  |  |  719|       |/// Create a generator.
  |  |  720|       |/// Arg1 is the register in which to store the generator.
  |  |  721|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  722|       |/// Arg3 is index in the function table.
  |  |  723|  2.75k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  724|  2.75k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  725|  2.75k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  726|  2.75k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  727|       |
  |  |  728|       |/// Arg1 [out] is the result iterator or index.
  |  |  729|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  730|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  731|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  732|       |/// method on the iterator.
  |  |  733|       |/// See IR.md for IteratorBeginInst.
  |  |  734|  2.75k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  735|       |
  |  |  736|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  737|       |/// Arg2 [in/out] is the iterator or index.
  |  |  738|       |/// Arg2 [in] is the source or the next method.
  |  |  739|       |/// If iterator is undefined, result = undefined.
  |  |  740|       |/// If iterator is a number:
  |  |  741|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  742|       |///   Else iterator = undefined and result = undefined
  |  |  743|       |/// Else:
  |  |  744|       |///   n = iterator.next()
  |  |  745|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  746|       |///   Else result = n.value
  |  |  747|       |/// See IR.md for IteratorNextInst.
  |  |  748|  2.75k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  749|       |
  |  |  750|       |/// Arg1 [in] is the iterator or array index.
  |  |  751|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  752|       |/// If the iterator is an object, call iterator.return().
  |  |  753|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  754|       |/// See IR.md for IteratorCloseInst.
  |  |  755|  2.75k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  756|       |
  |  |  757|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  758|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  759|       |// The macros will automatically generate two opcodes for each definition,
  |  |  760|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  761|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  762|  2.75k|#define DEFINE_JUMP_1(name)           \
  |  |  763|  2.75k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  764|  2.75k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  765|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  766|       |
  |  |  767|  2.75k|#define DEFINE_JUMP_2(name)                 \
  |  |  768|  2.75k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  769|  2.75k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  770|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  771|       |
  |  |  772|  2.75k|#define DEFINE_JUMP_3(name)                       \
  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  776|       |
  |  |  777|       |/// Unconditional branch to Arg1.
  |  |  778|  2.75k|DEFINE_JUMP_1(Jmp)
  |  |  ------------------
  |  |  |  |  763|  2.75k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  764|  2.75k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  765|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  779|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  780|  2.75k|DEFINE_JUMP_2(JmpTrue)
  |  |  ------------------
  |  |  |  |  768|  2.75k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  769|  2.75k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  770|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  781|  2.75k|DEFINE_JUMP_2(JmpFalse)
  |  |  ------------------
  |  |  |  |  768|  2.75k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  769|  2.75k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  770|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  782|       |/// Jump if the value is undefined.
  |  |  783|  2.75k|DEFINE_JUMP_2(JmpUndefined)
  |  |  ------------------
  |  |  |  |  768|  2.75k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  769|  2.75k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  2.75k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  770|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  784|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  785|       |/// at the provided target.
  |  |  786|  2.75k|DEFINE_JUMP_1(SaveGenerator)
  |  |  ------------------
  |  |  |  |  763|  2.75k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  764|  2.75k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  2.75k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  765|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  787|       |
  |  |  788|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  789|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  790|       |
  |  |  791|       |/// Not conditionals are required for NaN comparisons
  |  |  792|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  793|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  794|       |/// "jump when less than to BB1".
  |  |  795|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  796|  2.75k|DEFINE_JUMP_3(JLess)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  797|  2.75k|DEFINE_JUMP_3(JNotLess)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  798|  2.75k|DEFINE_JUMP_3(JLessN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  799|  2.75k|DEFINE_JUMP_3(JNotLessN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  800|  2.75k|DEFINE_JUMP_3(JLessEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  801|  2.75k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  802|  2.75k|DEFINE_JUMP_3(JLessEqualN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  803|  2.75k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  804|  2.75k|DEFINE_JUMP_3(JGreater)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  805|  2.75k|DEFINE_JUMP_3(JNotGreater)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  806|  2.75k|DEFINE_JUMP_3(JGreaterN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  807|  2.75k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  808|  2.75k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  809|  2.75k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  810|  2.75k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  811|  2.75k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  812|  2.75k|DEFINE_JUMP_3(JEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  813|  2.75k|DEFINE_JUMP_3(JNotEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  814|  2.75k|DEFINE_JUMP_3(JStrictEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  815|  2.75k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  ------------------
  |  |  |  |  773|  2.75k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  774|  2.75k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  2.75k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1059|  2.75k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  775|  2.75k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  816|       |
  |  |  817|       |#ifdef HERMES_RUN_WASM
  |  |  818|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  819|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  820|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  821|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  822|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  823|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  824|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  825|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  826|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  827|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  828|       |
  |  |  829|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  830|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  831|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  832|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  833|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  834|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  835|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  836|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  837|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  838|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  839|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  840|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  841|       |
  |  |  842|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  843|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  844|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  845|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  846|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  847|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  848|       |#endif
  |  |  849|       |
  |  |  850|       |// Implementations can rely on the following pairs of instructions having the
  |  |  851|       |// same number and type of operands.
  |  |  852|  2.75k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  853|  2.75k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  854|  2.75k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  855|  2.75k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  856|  2.75k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  857|  2.75k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  858|  2.75k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  859|  2.75k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  860|       |
  |  |  861|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  862|  2.75k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  863|  2.75k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  864|       |
  |  |  865|  2.75k|#undef DEFINE_JUMP_1
  |  |  866|  2.75k|#undef DEFINE_JUMP_2
  |  |  867|  2.75k|#undef DEFINE_JUMP_3
  |  |  868|       |
  |  |  869|       |// Undefine all macros used to avoid confusing next include.
  |  |  870|  2.75k|#undef DEFINE_OPERAND_TYPE
  |  |  871|  2.75k|#undef DEFINE_OPCODE_0
  |  |  872|  2.75k|#undef DEFINE_OPCODE_1
  |  |  873|  2.75k|#undef DEFINE_OPCODE_2
  |  |  874|  2.75k|#undef DEFINE_OPCODE_3
  |  |  875|  2.75k|#undef DEFINE_OPCODE_4
  |  |  876|  2.75k|#undef DEFINE_OPCODE_5
  |  |  877|  2.75k|#undef DEFINE_OPCODE_6
  |  |  878|  2.75k|#undef DEFINE_OPCODE
  |  |  879|  2.75k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  880|  2.75k|#undef DEFINE_RET_TARGET
  |  |  881|  2.75k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  882|  2.75k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  883|  2.75k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  884|  2.75k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  885|  2.75k|#undef ASSERT_MONOTONE_INCREASING
  |  |  886|  2.75k|#undef OPERAND_BIGINT_ID
  |  |  887|  2.75k|#undef OPERAND_FUNCTION_ID
  |  |  888|  2.75k|#undef OPERAND_STRING_ID
  ------------------
 1061|  2.75k|      &&case__last};
 1062|       |
 1063|  2.75k|#define CASE(name) case_##name:
 1064|       |// For indirect threading, there is no way to specify a default, leave it as
 1065|       |// an empty label.
 1066|  2.75k|#define DEFAULT_CASE
 1067|  2.75k|#define DISPATCH                                \
 1068|  2.75k|  BEFORE_OP_CODE;                               \
 1069|  2.75k|  if (SingleStep) {                             \
 1070|  2.75k|    state.codeBlock = curCodeBlock;             \
 1071|  2.75k|    state.offset = CUROFFSET;                   \
 1072|  2.75k|    return HermesValue::encodeUndefinedValue(); \
 1073|  2.75k|  }                                             \
 1074|  2.75k|  goto *opcodeDispatch[(unsigned)ip->opCode]
 1075|       |
 1076|       |// Do nothing if we're not in a switch.
 1077|  2.75k|#define INTERPRETER_FALLTHROUGH
 1078|       |
 1079|       |#else // HERMESVM_INDIRECT_THREADING
 1080|       |
 1081|       |#define CASE(name) case OpCode::name:
 1082|       |#define DEFAULT_CASE default:
 1083|       |#define DISPATCH                                \
 1084|       |  if (SingleStep) {                             \
 1085|       |    state.codeBlock = curCodeBlock;             \
 1086|       |    state.offset = CUROFFSET;                   \
 1087|       |    return HermesValue::encodeUndefinedValue(); \
 1088|       |  }                                             \
 1089|       |  continue
 1090|       |
 1091|       |// Fallthrough if we're in a switch.
 1092|       |#define INTERPRETER_FALLTHROUGH [[fallthrough]]
 1093|       |
 1094|       |#endif // HERMESVM_INDIRECT_THREADING
 1095|       |
 1096|       |// This macro is used when we detect that either the Implicit or Explicit
 1097|       |// AsyncBreak flags have been set. It checks to see which one was requested and
 1098|       |// propagate the corresponding RunReason. If both Implicit and Explicit have
 1099|       |// been requested, then we'll propagate the RunReasons for both. Once for
 1100|       |// Implicit and once for Explicit.
 1101|  2.75k|#define RUN_DEBUGGER_ASYNC_BREAK(flags)                         \
 1102|  2.75k|  bool requestedImplicit = (uint8_t)(flags) &                   \
 1103|  2.75k|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerImplicit; \
 1104|  2.75k|  bool requestedExplicit = (uint8_t)(flags) &                   \
 1105|  2.75k|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit; \
 1106|  2.75k|  do {                                                          \
 1107|  2.75k|    if (requestedImplicit) {                                    \
 1108|  2.75k|      CAPTURE_IP_ASSIGN(                                        \
 1109|  2.75k|          auto dRes,                                            \
 1110|  2.75k|          runDebuggerUpdatingState(                             \
 1111|  2.75k|              Debugger::RunReason::AsyncBreakImplicit,          \
 1112|  2.75k|              runtime,                                          \
 1113|  2.75k|              curCodeBlock,                                     \
 1114|  2.75k|              ip,                                               \
 1115|  2.75k|              frameRegs));                                      \
 1116|  2.75k|      if (dRes == ExecutionStatus::EXCEPTION)                   \
 1117|  2.75k|        goto exception;                                         \
 1118|  2.75k|    }                                                           \
 1119|  2.75k|    if (requestedExplicit) {                                    \
 1120|  2.75k|      CAPTURE_IP_ASSIGN(                                        \
 1121|  2.75k|          auto dRes,                                            \
 1122|  2.75k|          runDebuggerUpdatingState(                             \
 1123|  2.75k|              Debugger::RunReason::AsyncBreakExplicit,          \
 1124|  2.75k|              runtime,                                          \
 1125|  2.75k|              curCodeBlock,                                     \
 1126|  2.75k|              ip,                                               \
 1127|  2.75k|              frameRegs));                                      \
 1128|  2.75k|      if (dRes == ExecutionStatus::EXCEPTION)                   \
 1129|  2.75k|        goto exception;                                         \
 1130|  2.75k|    }                                                           \
 1131|  2.75k|  } while (0)
 1132|       |
 1133|  2.75k|  for (;;) {
 1134|  11.0k|    BEFORE_OP_CODE;
  ------------------
  |  | 1040|  2.75k|  {                                                                          \
  |  | 1041|  2.75k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  | 1042|  2.75k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  ------------------
  |  |  |  |   17|  2.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1043|  2.75k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  | 1044|  2.75k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  ------------------
  |  |  |  |   17|  2.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1045|  2.75k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  ------------------
  |  |  |  |   17|  2.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1046|  2.75k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  | 1047|  2.75k|        "unaccounted handles were created");                                 \
  |  | 1048|  2.75k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  ------------------
  |  |  |  |   17|  2.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1049|  2.75k|    RECORD_OPCODE_START_TIME;                                                \
  |  | 1050|  2.75k|    INC_OPCODE_COUNT;                                                        \
  |  | 1051|  2.75k|    if (EnableCrashTrace) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  ------------------
  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  | 1054|      0|    }                                                                        \
  |  | 1055|  2.75k|  }
  ------------------
 1135|       |
 1136|  11.0k|#ifdef HERMESVM_INDIRECT_THREADING
 1137|  11.0k|    goto *opcodeDispatch[(unsigned)ip->opCode];
 1138|       |#else
 1139|       |    switch (ip->opCode)
 1140|       |#endif
 1141|  11.0k|    {
 1142|  11.0k|      const Inst *nextIP;
 1143|  11.0k|      uint32_t idVal;
 1144|  11.0k|      bool tryProp;
 1145|  11.0k|      uint32_t callArgCount;
 1146|       |      // This is HermesValue::getRaw(), since HermesValue cannot be assigned
 1147|       |      // to. It is meant to be used only for very short durations, in the
 1148|       |      // dispatch of call instructions, when there is definitely no possibility
 1149|       |      // of a GC.
 1150|  11.0k|      HermesValue::RawType callNewTarget;
 1151|       |
 1152|       |/// Handle an opcode \p name with an out-of-line implementation in a function
 1153|       |///   ExecutionStatus caseName(
 1154|       |///       Runtime &,
 1155|       |///       PinnedHermesValue *frameRegs,
 1156|       |///       Inst *ip)
 1157|  11.0k|#define CASE_OUTOFLINE(name)                                         \
 1158|  11.0k|  CASE(name) {                                                       \
 1159|  11.0k|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
 1160|  11.0k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
 1161|  11.0k|      goto exception;                                                \
 1162|  11.0k|    }                                                                \
 1163|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
 1164|  11.0k|    ip = NEXTINST(name);                                             \
 1165|  11.0k|    DISPATCH;                                                        \
 1166|  11.0k|  }
 1167|       |
 1168|       |/// Implement a binary arithmetic instruction with a fast path where both
 1169|       |/// operands are numbers.
 1170|       |/// \param name the name of the instruction. The fast path case will have a
 1171|       |///     "n" appended to the name.
 1172|  11.0k|#define BINOP(name)                                                      \
 1173|  11.0k|  CASE(name) {                                                           \
 1174|  11.0k|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
 1175|       |      /* Fast-path. */                                                   \
 1176|  11.0k|      INTERPRETER_FALLTHROUGH;                                           \
 1177|  11.0k|      CASE(name##N) {                                                    \
 1178|  11.0k|        O1REG(name) = HermesValue::encodeTrustedNumberValue(             \
 1179|  11.0k|            do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
 1180|  11.0k|        ip = NEXTINST(name);                                             \
 1181|  11.0k|        DISPATCH;                                                        \
 1182|  11.0k|      }                                                                  \
 1183|  11.0k|    }                                                                    \
 1184|  11.0k|    CAPTURE_IP(                                                          \
 1185|  11.0k|        res = doOperSlowPath<do##name>(                                  \
 1186|  11.0k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
 1187|  11.0k|    if (res == ExecutionStatus::EXCEPTION)                               \
 1188|  11.0k|      goto exception;                                                    \
 1189|  11.0k|    O1REG(name) = *res;                                                  \
 1190|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
 1191|  11.0k|    ip = NEXTINST(name);                                                 \
 1192|  11.0k|    DISPATCH;                                                            \
 1193|  11.0k|  }
 1194|       |
 1195|  11.0k|#define INCDECOP(name)                                                        \
 1196|  11.0k|  CASE(name) {                                                                \
 1197|  11.0k|    if (LLVM_LIKELY(O2REG(name).isNumber())) {                                \
 1198|  11.0k|      O1REG(name) = HermesValue::encodeTrustedNumberValue(                    \
 1199|  11.0k|          do##name(O2REG(name).getNumber()));                                 \
 1200|  11.0k|      ip = NEXTINST(name);                                                    \
 1201|  11.0k|      DISPATCH;                                                               \
 1202|  11.0k|    }                                                                         \
 1203|  11.0k|    CAPTURE_IP(                                                               \
 1204|  11.0k|        res =                                                                 \
 1205|  11.0k|            doIncDecOperSlowPath<do##name>(runtime, Handle<>(&O2REG(name)))); \
 1206|  11.0k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                   \
 1207|  11.0k|      goto exception;                                                         \
 1208|  11.0k|    }                                                                         \
 1209|  11.0k|    O1REG(name) = *res;                                                       \
 1210|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);                                  \
 1211|  11.0k|    ip = NEXTINST(name);                                                      \
 1212|  11.0k|    DISPATCH;                                                                 \
 1213|  11.0k|  }
 1214|       |
 1215|       |/// Implement a shift instruction with a fast path where both
 1216|       |/// operands are numbers.
 1217|       |/// \param name the name of the instruction.
 1218|  11.0k|#define SHIFTOP(name)                                                          \
 1219|  11.0k|  CASE(name) {                                                                 \
 1220|  11.0k|    if (LLVM_LIKELY(                                                           \
 1221|  11.0k|            O2REG(name).isNumber() &&                                          \
 1222|  11.0k|            O3REG(name).isNumber())) { /* Fast-path. */                        \
 1223|  11.0k|      auto lnum = hermes::truncateToInt32(O2REG(name).getNumber());            \
 1224|  11.0k|      uint32_t rnum = hermes::truncateToInt32(O3REG(name).getNumber()) & 0x1f; \
 1225|  11.0k|      O1REG(name) =                                                            \
 1226|  11.0k|          HermesValue::encodeTrustedNumberValue(do##name(lnum, rnum));         \
 1227|  11.0k|      ip = NEXTINST(name);                                                     \
 1228|  11.0k|      DISPATCH;                                                                \
 1229|  11.0k|    }                                                                          \
 1230|  11.0k|    CAPTURE_IP(                                                                \
 1231|  11.0k|        res = doShiftOperSlowPath<do##name>(                                   \
 1232|  11.0k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
 1233|  11.0k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                    \
 1234|  11.0k|      goto exception;                                                          \
 1235|  11.0k|    }                                                                          \
 1236|  11.0k|    O1REG(name) = *res;                                                        \
 1237|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
 1238|  11.0k|    ip = NEXTINST(name);                                                       \
 1239|  11.0k|    DISPATCH;                                                                  \
 1240|  11.0k|  }
 1241|       |
 1242|       |/// Implement a binary bitwise instruction with a fast path where both
 1243|       |/// operands are numbers.
 1244|       |/// \param name the name of the instruction.
 1245|  11.0k|#define BITWISEBINOP(name)                                               \
 1246|  11.0k|  CASE(name) {                                                           \
 1247|  11.0k|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
 1248|       |      /* Fast-path. */                                                   \
 1249|  11.0k|      O1REG(name) = HermesValue::encodeTrustedNumberValue(do##name(      \
 1250|  11.0k|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
 1251|  11.0k|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
 1252|  11.0k|      ip = NEXTINST(name);                                               \
 1253|  11.0k|      DISPATCH;                                                          \
 1254|  11.0k|    }                                                                    \
 1255|  11.0k|    CAPTURE_IP(                                                          \
 1256|  11.0k|        res = doBitOperSlowPath<do##name>(                               \
 1257|  11.0k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
 1258|  11.0k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {              \
 1259|  11.0k|      goto exception;                                                    \
 1260|  11.0k|    }                                                                    \
 1261|  11.0k|    O1REG(name) = *res;                                                  \
 1262|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
 1263|  11.0k|    ip = NEXTINST(name);                                                 \
 1264|  11.0k|    DISPATCH;                                                            \
 1265|  11.0k|  }
 1266|       |
 1267|       |/// Implement a comparison instruction.
 1268|       |/// \param name the name of the instruction.
 1269|       |/// \param oper the C++ operator to use to actually perform the fast arithmetic
 1270|       |///     comparison.
 1271|       |/// \param operFuncName  function to call for the slow-path comparison.
 1272|  11.0k|#define CONDOP(name, oper, operFuncName)                                 \
 1273|  11.0k|  CASE(name) {                                                           \
 1274|  11.0k|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
 1275|       |      /* Fast-path. */                                                   \
 1276|  11.0k|      O1REG(name) = HermesValue::encodeBoolValue(                        \
 1277|  11.0k|          O2REG(name).getNumber() oper O3REG(name).getNumber());         \
 1278|  11.0k|      ip = NEXTINST(name);                                               \
 1279|  11.0k|      DISPATCH;                                                          \
 1280|  11.0k|    }                                                                    \
 1281|  11.0k|    CAPTURE_IP(                                                          \
 1282|  11.0k|        boolRes = operFuncName(                                          \
 1283|  11.0k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
 1284|  11.0k|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
 1285|  11.0k|      goto exception;                                                    \
 1286|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
 1287|  11.0k|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
 1288|  11.0k|    ip = NEXTINST(name);                                                 \
 1289|  11.0k|    DISPATCH;                                                            \
 1290|  11.0k|  }
 1291|       |
 1292|       |/// Implement a comparison conditional jump with a fast path where both
 1293|       |/// operands are numbers.
 1294|       |/// \param name the name of the instruction. The fast path case will have a
 1295|       |///     "N" appended to the name.
 1296|       |/// \param suffix  Optional suffix to be added to the end (e.g. Long)
 1297|       |/// \param oper the C++ operator to use to actually perform the fast arithmetic
 1298|       |///     comparison.
 1299|       |/// \param operFuncName  function to call for the slow-path comparison.
 1300|       |/// \param trueDest  ip value if the conditional evaluates to true
 1301|       |/// \param falseDest  ip value if the conditional evaluates to false
 1302|  11.0k|#define JCOND_IMPL(name, suffix, oper, operFuncName, trueDest, falseDest) \
 1303|  11.0k|  CASE(name##suffix) {                                                    \
 1304|  11.0k|    if (LLVM_LIKELY(                                                      \
 1305|  11.0k|            O2REG(name##suffix).isNumber() &&                             \
 1306|  11.0k|            O3REG(name##suffix).isNumber())) {                            \
 1307|       |      /* Fast-path. */                                                    \
 1308|  11.0k|      INTERPRETER_FALLTHROUGH;                                            \
 1309|  11.0k|      CASE(name##N##suffix) {                                             \
 1310|  11.0k|        if (O2REG(name##N##suffix)                                        \
 1311|  11.0k|                .getNumber() oper O3REG(name##N##suffix)                  \
 1312|  11.0k|                .getNumber()) {                                           \
 1313|  11.0k|          ip = trueDest;                                                  \
 1314|  11.0k|          DISPATCH;                                                       \
 1315|  11.0k|        }                                                                 \
 1316|  11.0k|        ip = falseDest;                                                   \
 1317|  11.0k|        DISPATCH;                                                         \
 1318|  11.0k|      }                                                                   \
 1319|  11.0k|    }                                                                     \
 1320|  11.0k|    CAPTURE_IP(                                                           \
 1321|  11.0k|        boolRes = operFuncName(                                           \
 1322|  11.0k|            runtime,                                                      \
 1323|  11.0k|            Handle<>(&O2REG(name##suffix)),                               \
 1324|  11.0k|            Handle<>(&O3REG(name##suffix))));                             \
 1325|  11.0k|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
 1326|  11.0k|      goto exception;                                                     \
 1327|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
 1328|  11.0k|    if (boolRes.getValue()) {                                             \
 1329|  11.0k|      ip = trueDest;                                                      \
 1330|  11.0k|      DISPATCH;                                                           \
 1331|  11.0k|    }                                                                     \
 1332|  11.0k|    ip = falseDest;                                                       \
 1333|  11.0k|    DISPATCH;                                                             \
 1334|  11.0k|  }
 1335|       |
 1336|       |/// Implement a strict equality conditional jump
 1337|       |/// \param name the name of the instruction.
 1338|       |/// \param suffix  Optional suffix to be added to the end (e.g. Long)
 1339|       |/// \param trueDest  ip value if the conditional evaluates to true
 1340|       |/// \param falseDest  ip value if the conditional evaluates to false
 1341|  11.0k|#define JCOND_STRICT_EQ_IMPL(name, suffix, trueDest, falseDest)         \
 1342|  11.0k|  CASE(name##suffix) {                                                  \
 1343|  11.0k|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
 1344|  11.0k|      ip = trueDest;                                                    \
 1345|  11.0k|      DISPATCH;                                                         \
 1346|  11.0k|    }                                                                   \
 1347|  11.0k|    ip = falseDest;                                                     \
 1348|  11.0k|    DISPATCH;                                                           \
 1349|  11.0k|  }
 1350|       |
 1351|       |/// Implement an equality conditional jump
 1352|       |/// \param name the name of the instruction.
 1353|       |/// \param suffix  Optional suffix to be added to the end (e.g. Long)
 1354|       |/// \param trueDest  ip value if the conditional evaluates to true
 1355|       |/// \param falseDest  ip value if the conditional evaluates to false
 1356|  11.0k|#define JCOND_EQ_IMPL(name, suffix, trueDest, falseDest) \
 1357|  11.0k|  CASE(name##suffix) {                                   \
 1358|  11.0k|    CAPTURE_IP_ASSIGN(                                   \
 1359|  11.0k|        auto eqRes,                                      \
 1360|  11.0k|        abstractEqualityTest_RJS(                        \
 1361|  11.0k|            runtime,                                     \
 1362|  11.0k|            Handle<>(&O2REG(name##suffix)),              \
 1363|  11.0k|            Handle<>(&O3REG(name##suffix))));            \
 1364|  11.0k|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
 1365|  11.0k|      goto exception;                                    \
 1366|  11.0k|    }                                                    \
 1367|  11.0k|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
 1368|  11.0k|    if (*eqRes) {                                        \
 1369|  11.0k|      ip = trueDest;                                     \
 1370|  11.0k|      DISPATCH;                                          \
 1371|  11.0k|    }                                                    \
 1372|  11.0k|    ip = falseDest;                                      \
 1373|  11.0k|    DISPATCH;                                            \
 1374|  11.0k|  }
 1375|       |
 1376|       |/// Implement the long and short forms of a conditional jump, and its negation.
 1377|  11.0k|#define JCOND(name, oper, operFuncName) \
 1378|  11.0k|  JCOND_IMPL(                           \
 1379|  11.0k|      J##name,                          \
 1380|  11.0k|      ,                                 \
 1381|  11.0k|      oper,                             \
 1382|  11.0k|      operFuncName,                     \
 1383|  11.0k|      IPADD(ip->iJ##name.op1),          \
 1384|  11.0k|      NEXTINST(J##name));               \
 1385|  11.0k|  JCOND_IMPL(                           \
 1386|  11.0k|      J##name,                          \
 1387|  11.0k|      Long,                             \
 1388|  11.0k|      oper,                             \
 1389|  11.0k|      operFuncName,                     \
 1390|  11.0k|      IPADD(ip->iJ##name##Long.op1),    \
 1391|  11.0k|      NEXTINST(J##name##Long));         \
 1392|  11.0k|  JCOND_IMPL(                           \
 1393|  11.0k|      JNot##name,                       \
 1394|  11.0k|      ,                                 \
 1395|  11.0k|      oper,                             \
 1396|  11.0k|      operFuncName,                     \
 1397|  11.0k|      NEXTINST(JNot##name),             \
 1398|  11.0k|      IPADD(ip->iJNot##name.op1));      \
 1399|  11.0k|  JCOND_IMPL(                           \
 1400|  11.0k|      JNot##name,                       \
 1401|  11.0k|      Long,                             \
 1402|  11.0k|      oper,                             \
 1403|  11.0k|      operFuncName,                     \
 1404|  11.0k|      NEXTINST(JNot##name##Long),       \
 1405|  11.0k|      IPADD(ip->iJNot##name##Long.op1));
 1406|       |
 1407|       |/// Load a constant.
 1408|       |/// \param value is the value to store in the output register.
 1409|  11.0k|#define LOAD_CONST(name, value) \
 1410|  11.0k|  CASE(name) {                  \
 1411|  11.0k|    O1REG(name) = value;        \
 1412|  11.0k|    ip = NEXTINST(name);        \
 1413|  11.0k|    DISPATCH;                   \
 1414|  11.0k|  }
 1415|       |
 1416|  11.0k|#define LOAD_CONST_CAPTURE_IP(name, value) \
 1417|  11.0k|  CASE(name) {                             \
 1418|  11.0k|    CAPTURE_IP(O1REG(name) = value);       \
 1419|  11.0k|    ip = NEXTINST(name);                   \
 1420|  11.0k|    DISPATCH;                              \
 1421|  11.0k|  }
 1422|       |
 1423|  3.63M|      CASE(Mov) {
  ------------------
  |  | 1063|  3.63M|#define CASE(name) case_##name:
  ------------------
 1424|  3.63M|        O1REG(Mov) = O2REG(Mov);
  ------------------
  |  |   31|  3.63M|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  7.27M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(Mov) = O2REG(Mov);
  ------------------
  |  |   32|  3.63M|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  3.63M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1425|  3.63M|        ip = NEXTINST(Mov);
  ------------------
  |  |   59|  3.63M|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1426|  18.1M|        DISPATCH;
  ------------------
  |  | 1068|  3.63M|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  3.63M|  {                                                                          \
  |  |  |  | 1041|  3.63M|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  3.63M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.63M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  3.63M|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  3.63M|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.63M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  3.63M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.63M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  3.63M|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  3.63M|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  3.63M|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.63M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  3.63M|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  3.63M|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  3.63M|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  3.63M|  }
  |  |  ------------------
  |  | 1069|  3.63M|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  3.63M|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1427|  18.1M|      }
 1428|       |
 1429|  1.41M|      CASE(MovLong) {
  ------------------
  |  | 1063|  1.41M|#define CASE(name) case_##name:
  ------------------
 1430|  1.41M|        O1REG(MovLong) = O2REG(MovLong);
  ------------------
  |  |   31|  1.41M|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  2.82M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(MovLong) = O2REG(MovLong);
  ------------------
  |  |   32|  1.41M|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  1.41M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1431|  1.41M|        ip = NEXTINST(MovLong);
  ------------------
  |  |   59|  1.41M|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1432|  7.05M|        DISPATCH;
  ------------------
  |  | 1068|  1.41M|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  1.41M|  {                                                                          \
  |  |  |  | 1041|  1.41M|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  1.41M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.41M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  1.41M|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  1.41M|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.41M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  1.41M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.41M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  1.41M|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  1.41M|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  1.41M|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.41M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  1.41M|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  1.41M|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  1.41M|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  1.41M|  }
  |  |  ------------------
  |  | 1069|  1.41M|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  1.41M|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1433|  7.05M|      }
 1434|       |
 1435|  2.88k|      CASE(LoadParam) {
  ------------------
  |  | 1063|  2.88k|#define CASE(name) case_##name:
  ------------------
 1436|  2.88k|        if (LLVM_LIKELY(ip->iLoadParam.op2 <= FRAME.getArgCount())) {
  ------------------
  |  |  188|  2.88k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.88k, False: 0]
  |  |  ------------------
  ------------------
 1437|       |          // index 0 must load 'this'. Index 1 the first argument, etc.
 1438|  2.88k|          O1REG(LoadParam) = FRAME.getArgRef((int32_t)ip->iLoadParam.op2 - 1);
  ------------------
  |  |   31|  2.88k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  5.76k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(LoadParam) = FRAME.getArgRef((int32_t)ip->iLoadParam.op2 - 1);
  ------------------
  |  |   39|  2.88k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1439|  2.88k|          ip = NEXTINST(LoadParam);
  ------------------
  |  |   59|  2.88k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1440|  14.4k|          DISPATCH;
  ------------------
  |  | 1068|  2.88k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  2.88k|  {                                                                          \
  |  |  |  | 1041|  2.88k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  2.88k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.88k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  2.88k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  2.88k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.88k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  2.88k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.88k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  2.88k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  2.88k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  2.88k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.88k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  2.88k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  2.88k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  2.88k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  2.88k|  }
  |  |  ------------------
  |  | 1069|  2.88k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  2.88k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1441|  14.4k|        }
 1442|  2.88k|        O1REG(LoadParam) = HermesValue::encodeUndefinedValue();
  ------------------
  |  |   31|  2.88k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  5.76k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1443|  2.88k|        ip = NEXTINST(LoadParam);
  ------------------
  |  |   59|  2.88k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1444|  2.88k|        DISPATCH;
  ------------------
  |  | 1068|  2.88k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  2.88k|  {                                                                          \
  |  |  |  | 1041|  2.88k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  2.88k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.88k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  2.88k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  2.88k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1445|      0|      }
 1446|       |
 1447|      0|      CASE(LoadParamLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1448|      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]
  |  |  ------------------
  ------------------
 1449|       |          // index 0 must load 'this'. Index 1 the first argument, etc.
 1450|      0|          O1REG(LoadParamLong) =
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1451|      0|              FRAME.getArgRef((int32_t)ip->iLoadParamLong.op2 - 1);
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1452|      0|          ip = NEXTINST(LoadParamLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1453|      0|          DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1454|      0|        }
 1455|      0|        O1REG(LoadParamLong) = HermesValue::encodeUndefinedValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1456|      0|        ip = NEXTINST(LoadParamLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1457|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1458|      0|      }
 1459|       |
 1460|      0|      CASE(CoerceThisNS) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1461|      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]
  |  |  ------------------
  ------------------
 1462|      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]
  |  |  ------------------
  ------------------
 1463|      0|        } else if (
 1464|      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 (1464:13): [True: 0, False: 0]
  |  Branch (1464:45): [True: 0, False: 0]
  ------------------
 1465|      0|          O1REG(CoerceThisNS) = runtime.global_;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1466|      0|        } else {
 1467|      0|          tmpHandle = O2REG(CoerceThisNS);
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1468|      0|          nextIP = NEXTINST(CoerceThisNS);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1469|      0|          goto coerceThisSlowPath;
 1470|      0|        }
 1471|      0|        ip = NEXTINST(CoerceThisNS);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1472|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1473|      0|      }
 1474|      9|      CASE(LoadThisNS) {
  ------------------
  |  | 1063|      9|#define CASE(name) case_##name:
  ------------------
 1475|      9|        if (LLVM_LIKELY(FRAME.getThisArgRef().isObject())) {
  ------------------
  |  |  188|      9|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 9, False: 0]
  |  |  ------------------
  ------------------
 1476|      9|          O1REG(LoadThisNS) = FRAME.getThisArgRef();
  ------------------
  |  |   31|      9|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     18|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(LoadThisNS) = FRAME.getThisArgRef();
  ------------------
  |  |   39|      9|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1477|      9|        } else if (
 1478|      0|            FRAME.getThisArgRef().isNull() ||
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  |  Branch (1478:13): [True: 0, False: 0]
  |  Branch (1478:13): [True: 0, False: 0]
  ------------------
 1479|      0|            FRAME.getThisArgRef().isUndefined()) {
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  |  Branch (1479:13): [True: 0, False: 0]
  ------------------
 1480|      0|          O1REG(LoadThisNS) = runtime.global_;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1481|      0|        } else {
 1482|      0|          tmpHandle = FRAME.getThisArgRef();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1483|      0|          nextIP = NEXTINST(LoadThisNS);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1484|      0|          goto coerceThisSlowPath;
 1485|      0|        }
 1486|      9|        ip = NEXTINST(LoadThisNS);
  ------------------
  |  |   59|      9|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1487|     45|        DISPATCH;
  ------------------
  |  | 1068|      9|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      9|  {                                                                          \
  |  |  |  | 1041|      9|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      9|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      9|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      9|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      9|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      9|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      9|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      9|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      9|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      9|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      9|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      9|  }
  |  |  ------------------
  |  | 1069|      9|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      9|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1488|     45|      }
 1489|      0|    coerceThisSlowPath: {
 1490|      0|      CAPTURE_IP(res = toObject(runtime, tmpHandle));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 1491|      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]
  |  |  ------------------
  ------------------
 1492|      0|        goto exception;
 1493|      0|      }
 1494|      0|      O1REG(CoerceThisNS) = res.getValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1495|      0|      tmpHandle.clear();
 1496|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1497|      0|      ip = nextIP;
 1498|      0|      DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1499|      0|    }
 1500|       |
 1501|      0|      CASE(ConstructLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1502|      0|        callArgCount = (uint32_t)ip->iConstructLong.op3;
 1503|      0|        nextIP = NEXTINST(ConstructLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1504|      0|        callNewTarget = O2REG(ConstructLong).getRaw();
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1505|      0|        goto doCall;
 1506|      0|      }
 1507|     18|      CASE(CallLong) {
  ------------------
  |  | 1063|     18|#define CASE(name) case_##name:
  ------------------
 1508|     18|        callArgCount = (uint32_t)ip->iCallLong.op3;
 1509|     18|        nextIP = NEXTINST(CallLong);
  ------------------
  |  |   59|     18|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1510|     18|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1511|     18|        goto doCall;
 1512|      0|      }
 1513|       |
 1514|       |      // Note in Call1 through Call4, the first argument is 'this' which has
 1515|       |      // argument index -1.
 1516|       |      // Also note that we are writing to callNewTarget last, to avoid the
 1517|       |      // possibility of it being aliased by the arg writes.
 1518|  1.12k|      CASE(Call1) {
  ------------------
  |  | 1063|  1.12k|#define CASE(name) case_##name:
  ------------------
 1519|  1.12k|        callArgCount = 1;
 1520|  1.12k|        nextIP = NEXTINST(Call1);
  ------------------
  |  |   59|  1.12k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1521|  1.12k|        StackFramePtr fr{runtime.stackPointer_};
 1522|  1.12k|        fr.getArgRefUnsafe(-1) = O3REG(Call1);
  ------------------
  |  |   33|  1.12k|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|  1.12k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1523|  1.12k|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1524|  1.12k|        goto doCall;
 1525|      0|      }
 1526|       |
 1527|  1.28k|      CASE(Call2) {
  ------------------
  |  | 1063|  1.28k|#define CASE(name) case_##name:
  ------------------
 1528|  1.28k|        callArgCount = 2;
 1529|  1.28k|        nextIP = NEXTINST(Call2);
  ------------------
  |  |   59|  1.28k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1530|  1.28k|        StackFramePtr fr{runtime.stackPointer_};
 1531|  1.28k|        fr.getArgRefUnsafe(-1) = O3REG(Call2);
  ------------------
  |  |   33|  1.28k|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|  1.28k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1532|  1.28k|        fr.getArgRefUnsafe(0) = O4REG(Call2);
  ------------------
  |  |   34|  1.28k|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|  1.28k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1533|  1.28k|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1534|  1.28k|        goto doCall;
 1535|      0|      }
 1536|       |
 1537|      0|      CASE(Call3) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1538|      0|        callArgCount = 3;
 1539|      0|        nextIP = NEXTINST(Call3);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1540|      0|        StackFramePtr fr{runtime.stackPointer_};
 1541|      0|        fr.getArgRefUnsafe(-1) = O3REG(Call3);
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1542|      0|        fr.getArgRefUnsafe(0) = O4REG(Call3);
  ------------------
  |  |   34|      0|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1543|      0|        fr.getArgRefUnsafe(1) = O5REG(Call3);
  ------------------
  |  |   35|      0|#define O5REG(name) REG(ip->i##name.op5)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1544|      0|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1545|      0|        goto doCall;
 1546|      0|      }
 1547|       |
 1548|      0|      CASE(Call4) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1549|      0|        callArgCount = 4;
 1550|      0|        nextIP = NEXTINST(Call4);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1551|      0|        StackFramePtr fr{runtime.stackPointer_};
 1552|      0|        fr.getArgRefUnsafe(-1) = O3REG(Call4);
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1553|      0|        fr.getArgRefUnsafe(0) = O4REG(Call4);
  ------------------
  |  |   34|      0|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1554|      0|        fr.getArgRefUnsafe(1) = O5REG(Call4);
  ------------------
  |  |   35|      0|#define O5REG(name) REG(ip->i##name.op5)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1555|      0|        fr.getArgRefUnsafe(2) = O6REG(Call4);
  ------------------
  |  |   36|      0|#define O6REG(name) REG(ip->i##name.op6)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1556|      0|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1557|      0|        goto doCall;
 1558|      0|      }
 1559|       |
 1560|    960|      CASE(Construct) {
  ------------------
  |  | 1063|    960|#define CASE(name) case_##name:
  ------------------
 1561|    960|        callArgCount = (uint32_t)ip->iConstruct.op3;
 1562|    960|        nextIP = NEXTINST(Construct);
  ------------------
  |  |   59|    960|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1563|    960|        callNewTarget = O2REG(Construct).getRaw();
  ------------------
  |  |   32|    960|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|    960|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1564|    960|        goto doCall;
 1565|      0|      }
 1566|   390k|      CASE(Call) {
  ------------------
  |  | 1063|   390k|#define CASE(name) case_##name:
  ------------------
 1567|   390k|        callArgCount = (uint32_t)ip->iCall.op3;
 1568|   390k|        nextIP = NEXTINST(Call);
  ------------------
  |  |   59|   390k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1569|   390k|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1570|   390k|        goto doCall;
 1571|      0|      }
 1572|       |
 1573|   394k|    doCall: {
 1574|   394k|#ifdef HERMES_ENABLE_DEBUGGER
 1575|       |      // Check for an async debugger request.
 1576|   394k|      if (uint8_t asyncFlags =
  ------------------
  |  Branch (1576:19): [True: 0, False: 394k]
  ------------------
 1577|   394k|              runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1578|      0|        RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  bool requestedImplicit = (uint8_t)(flags) &                   \
  |  | 1103|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerImplicit; \
  |  | 1104|      0|  bool requestedExplicit = (uint8_t)(flags) &                   \
  |  | 1105|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit; \
  |  | 1106|      0|  do {                                                          \
  |  | 1107|      0|    if (requestedImplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1107:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1108|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1109|      0|          auto dRes,                                            \
  |  | 1110|      0|          runDebuggerUpdatingState(                             \
  |  | 1111|      0|              Debugger::RunReason::AsyncBreakImplicit,          \
  |  | 1112|      0|              runtime,                                          \
  |  | 1113|      0|              curCodeBlock,                                     \
  |  | 1114|      0|              ip,                                               \
  |  | 1115|      0|              frameRegs));                                      \
  |  | 1116|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1116:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1117|      0|        goto exception;                                         \
  |  | 1118|      0|    }                                                           \
  |  | 1119|      0|    if (requestedExplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1119:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1120|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1121|      0|          auto dRes,                                            \
  |  | 1122|      0|          runDebuggerUpdatingState(                             \
  |  | 1123|      0|              Debugger::RunReason::AsyncBreakExplicit,          \
  |  | 1124|      0|              runtime,                                          \
  |  | 1125|      0|              curCodeBlock,                                     \
  |  | 1126|      0|              ip,                                               \
  |  | 1127|      0|              frameRegs));                                      \
  |  | 1128|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1128:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1129|      0|        goto exception;                                         \
  |  | 1130|      0|    }                                                           \
  |  | 1131|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1131:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1579|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1580|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1581|      0|      }
 1582|   394k|#endif
 1583|       |
 1584|       |      // Subtract 1 from callArgCount as 'this' is considered an argument in the
 1585|       |      // instruction, but not in the frame.
 1586|   394k|      auto newFrame = StackFramePtr::initFrame(
 1587|   394k|          runtime.stackPointer_,
 1588|   394k|          FRAME,
  ------------------
  |  |   39|   394k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1589|   394k|          ip,
 1590|   394k|          curCodeBlock,
 1591|   394k|          callArgCount - 1,
 1592|   394k|          O2REG(Call),
  ------------------
  |  |   32|   394k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|   394k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1593|   394k|          HermesValue::fromRaw(callNewTarget));
 1594|   394k|      (void)newFrame;
 1595|       |
 1596|   394k|      SLOW_DEBUG(dumpCallArguments(dbgs(), runtime, newFrame));
  ------------------
  |  |   18|   394k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|   394k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|   394k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 394k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|   394k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1597|       |
 1598|   394k|      if (auto *func = dyn_vmcast<JSFunction>(O2REG(Call))) {
  ------------------
  |  Branch (1598:17): [True: 2.40k, False: 391k]
  ------------------
 1599|  2.40k|        assert(!SingleStep && "can't single-step a call");
 1600|       |
 1601|  2.40k|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1602|  2.40k|        runtime.pushCallStack(curCodeBlock, ip);
 1603|  2.40k|#endif
 1604|       |
 1605|  2.40k|        CodeBlock *calleeBlock = func->getCodeBlock(runtime);
 1606|  2.40k|        CAPTURE_IP_ASSIGN(auto res, calleeBlock->lazyCompile(runtime));
  ------------------
  |  |  919|  2.40k|  runtime.setCurrentIP(ip);           \
  |  |  920|  2.40k|  decl = (expr);                      \
  |  |  921|  2.40k|  ip = runtime.getCurrentIP();        \
  |  |  922|  2.40k|  runtime.invalidateCurrentIP();
  ------------------
 1607|  2.40k|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  2.40k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.40k]
  |  |  ------------------
  ------------------
 1608|      0|          goto exception;
 1609|      0|        }
 1610|  2.40k|        curCodeBlock = calleeBlock;
 1611|  2.40k|        CAPTURE_IP_SET();
  ------------------
  |  |  937|  2.40k|#define CAPTURE_IP_SET() runtime.setCurrentIP(ip)
  ------------------
 1612|  2.40k|        goto tailCall;
 1613|  2.40k|      }
 1614|   391k|      CAPTURE_IP(
  ------------------
  |  |  912|   391k|  runtime.setCurrentIP(ip);    \
  |  |  913|   391k|  (void)(expr);                \
  |  |  914|   391k|  ip = runtime.getCurrentIP(); \
  |  |  915|   391k|  runtime.invalidateCurrentIP();
  ------------------
 1615|   391k|          resPH = Interpreter::handleCallSlowPath(runtime, &O2REG(Call)));
 1616|   391k|      if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   391k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 6, False: 391k]
  |  |  ------------------
  ------------------
 1617|      6|        goto exception;
 1618|      6|      }
 1619|   391k|      O1REG(Call) = std::move(resPH->get());
  ------------------
  |  |   31|   391k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|   783k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1620|   391k|      SLOW_DEBUG(
  ------------------
  |  |   18|   391k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|   391k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|   391k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 391k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|   391k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1621|   391k|          dbgs() << "native return value r" << (unsigned)ip->iCall.op1 << "="
 1622|   391k|                 << DumpHermesValue(O1REG(Call)) << "\n");
 1623|   391k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1624|   391k|      ip = nextIP;
 1625|  1.95M|      DISPATCH;
  ------------------
  |  | 1068|   391k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   391k|  {                                                                          \
  |  |  |  | 1041|   391k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   391k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   391k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   391k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   391k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   391k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   391k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   391k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   391k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   391k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   391k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   391k|  }
  |  |  ------------------
  |  | 1069|   391k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   391k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1626|  1.95M|    }
 1627|       |
 1628|      0|      CASE(CallDirect)
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1629|      0|      CASE(CallDirectLongIndex) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1630|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1631|       |        // Check for an async debugger request.
 1632|      0|        if (uint8_t asyncFlags =
  ------------------
  |  Branch (1632:21): [True: 0, False: 0]
  ------------------
 1633|      0|                runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1634|      0|          RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  bool requestedImplicit = (uint8_t)(flags) &                   \
  |  | 1103|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerImplicit; \
  |  | 1104|      0|  bool requestedExplicit = (uint8_t)(flags) &                   \
  |  | 1105|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit; \
  |  | 1106|      0|  do {                                                          \
  |  | 1107|      0|    if (requestedImplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1107:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1108|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1109|      0|          auto dRes,                                            \
  |  | 1110|      0|          runDebuggerUpdatingState(                             \
  |  | 1111|      0|              Debugger::RunReason::AsyncBreakImplicit,          \
  |  | 1112|      0|              runtime,                                          \
  |  | 1113|      0|              curCodeBlock,                                     \
  |  | 1114|      0|              ip,                                               \
  |  | 1115|      0|              frameRegs));                                      \
  |  | 1116|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1116:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1117|      0|        goto exception;                                         \
  |  | 1118|      0|    }                                                           \
  |  | 1119|      0|    if (requestedExplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1119:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1120|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1121|      0|          auto dRes,                                            \
  |  | 1122|      0|          runDebuggerUpdatingState(                             \
  |  | 1123|      0|              Debugger::RunReason::AsyncBreakExplicit,          \
  |  | 1124|      0|              runtime,                                          \
  |  | 1125|      0|              curCodeBlock,                                     \
  |  | 1126|      0|              ip,                                               \
  |  | 1127|      0|              frameRegs));                                      \
  |  | 1128|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1128:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1129|      0|        goto exception;                                         \
  |  | 1130|      0|    }                                                           \
  |  | 1131|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1131:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1635|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 1636|      0|          DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1637|      0|        }
 1638|      0|#endif
 1639|       |
 1640|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (920:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 1641|      0|            CodeBlock * calleeBlock,
 1642|      0|            ip->opCode == OpCode::CallDirect
 1643|      0|                ? curCodeBlock->getRuntimeModule()->getCodeBlockMayAllocate(
 1644|      0|                      ip->iCallDirect.op3)
 1645|      0|                : curCodeBlock->getRuntimeModule()->getCodeBlockMayAllocate(
 1646|      0|                      ip->iCallDirectLongIndex.op3));
 1647|       |
 1648|      0|        auto newFrame = StackFramePtr::initFrame(
 1649|      0|            runtime.stackPointer_,
 1650|      0|            FRAME,
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1651|      0|            ip,
 1652|      0|            curCodeBlock,
 1653|      0|            (uint32_t)ip->iCallDirect.op2 - 1,
 1654|      0|            HermesValue::encodeNativePointer(calleeBlock),
 1655|      0|            HermesValue::encodeUndefinedValue());
 1656|      0|        (void)newFrame;
 1657|       |
 1658|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1659|       |
 1660|      0|        assert(!SingleStep && "can't single-step a call");
 1661|       |
 1662|      0|        CAPTURE_IP_ASSIGN(auto res, calleeBlock->lazyCompile(runtime));
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 1663|      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]
  |  |  ------------------
  ------------------
 1664|      0|          goto exception;
 1665|      0|        }
 1666|      0|        curCodeBlock = calleeBlock;
 1667|      0|        CAPTURE_IP_SET();
  ------------------
  |  |  937|      0|#define CAPTURE_IP_SET() runtime.setCurrentIP(ip)
  ------------------
 1668|      0|        goto tailCall;
 1669|      0|      }
 1670|       |
 1671|      0|      CASE(GetBuiltinClosure) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1672|      0|        uint8_t methodIndex = ip->iCallBuiltin.op2;
 1673|      0|        Callable *closure = runtime.getBuiltinCallable(methodIndex);
 1674|      0|        O1REG(GetBuiltinClosure) = HermesValue::encodeObjectValue(closure);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1675|      0|        ip = NEXTINST(GetBuiltinClosure);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1676|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1677|      0|      }
 1678|       |
 1679|   390k|      CASE(CallBuiltin) {
  ------------------
  |  | 1063|   390k|#define CASE(name) case_##name:
  ------------------
 1680|   390k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   390k|  runtime.setCurrentIP(ip);           \
  |  |  920|   390k|  decl = (expr);                      \
  |  |  921|   390k|  ip = runtime.getCurrentIP();        \
  |  |  922|   390k|  runtime.invalidateCurrentIP();
  ------------------
 1681|   390k|            auto cres,
 1682|   390k|            implCallBuiltin(
 1683|   390k|                runtime, frameRegs, curCodeBlock, ip->iCallBuiltin.op3));
 1684|   390k|        if (LLVM_UNLIKELY(cres == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
 1685|      0|          goto exception;
 1686|   390k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1687|   390k|        ip = NEXTINST(CallBuiltin);
  ------------------
  |  |   59|   390k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1688|  1.95M|        DISPATCH;
  ------------------
  |  | 1068|   390k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   390k|  {                                                                          \
  |  |  |  | 1041|   390k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   390k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   390k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   390k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   390k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   390k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   390k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   390k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   390k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   390k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   390k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   390k|  }
  |  |  ------------------
  |  | 1069|   390k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   390k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1689|  1.95M|      }
 1690|     19|      CASE(CallBuiltinLong) {
  ------------------
  |  | 1063|     19|#define CASE(name) case_##name:
  ------------------
 1691|     19|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|     19|  runtime.setCurrentIP(ip);           \
  |  |  920|     19|  decl = (expr);                      \
  |  |  921|     19|  ip = runtime.getCurrentIP();        \
  |  |  922|     19|  runtime.invalidateCurrentIP();
  ------------------
 1692|     19|            auto cres,
 1693|     19|            implCallBuiltin(
 1694|     19|                runtime, frameRegs, curCodeBlock, ip->iCallBuiltinLong.op3));
 1695|     19|        if (LLVM_UNLIKELY(cres == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|     19|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 19]
  |  |  ------------------
  ------------------
 1696|      0|          goto exception;
 1697|     19|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1698|     19|        ip = NEXTINST(CallBuiltinLong);
  ------------------
  |  |   59|     19|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1699|     95|        DISPATCH;
  ------------------
  |  | 1068|     19|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|     19|  {                                                                          \
  |  |  |  | 1041|     19|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|     19|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     19|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|     19|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|     19|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     19|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|     19|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     19|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|     19|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|     19|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|     19|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     19|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|     19|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|     19|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|     19|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|     19|  }
  |  |  ------------------
  |  | 1069|     19|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|     19|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1700|     95|      }
 1701|       |
 1702|      0|      CASE(CompleteGenerator) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1703|      0|        auto *innerFn = vmcast<GeneratorInnerFunction>(
 1704|      0|            runtime.getCurrentFrame().getCalleeClosureUnsafe());
 1705|      0|        innerFn->setState(GeneratorInnerFunction::State::Completed);
 1706|      0|        ip = NEXTINST(CompleteGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1707|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1708|      0|      }
 1709|       |
 1710|      0|      CASE(SaveGenerator) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1711|      0|        DONT_CAPTURE_IP(
  ------------------
  |  |  931|      0|  do {                             \
  |  |  932|      0|    NoAllocScope noAlloc(runtime); \
  |  |  933|      0|    (void)expr;                    \
  |  |  934|      0|  } while (false)
  |  |  ------------------
  |  |  |  Branch (934:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1712|      0|            saveGenerator(runtime, frameRegs, IPADD(ip->iSaveGenerator.op1)));
 1713|      0|        ip = NEXTINST(SaveGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1714|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1715|      0|      }
 1716|      0|      CASE(SaveGeneratorLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1717|      0|        DONT_CAPTURE_IP(saveGenerator(
  ------------------
  |  |  931|      0|  do {                             \
  |  |  932|      0|    NoAllocScope noAlloc(runtime); \
  |  |  933|      0|    (void)expr;                    \
  |  |  934|      0|  } while (false)
  |  |  ------------------
  |  |  |  Branch (934:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1718|      0|            runtime, frameRegs, IPADD(ip->iSaveGeneratorLong.op1)));
 1719|      0|        ip = NEXTINST(SaveGeneratorLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1720|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1721|      0|      }
 1722|       |
 1723|      0|      CASE(StartGenerator) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1724|      0|        auto *innerFn = vmcast<GeneratorInnerFunction>(
 1725|      0|            runtime.getCurrentFrame().getCalleeClosureUnsafe());
 1726|      0|        if (innerFn->getState() ==
  ------------------
  |  Branch (1726:13): [True: 0, False: 0]
  ------------------
 1727|      0|            GeneratorInnerFunction::State::SuspendedStart) {
 1728|      0|          nextIP = NEXTINST(StartGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1729|      0|        } else {
 1730|      0|          nextIP = innerFn->getNextIP(runtime);
 1731|      0|          innerFn->restoreStack(runtime);
 1732|      0|        }
 1733|      0|        innerFn->setState(GeneratorInnerFunction::State::Executing);
 1734|      0|        ip = nextIP;
 1735|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1736|      0|      }
 1737|       |
 1738|      0|      CASE(ResumeGenerator) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1739|      0|        auto *innerFn = vmcast<GeneratorInnerFunction>(
 1740|      0|            runtime.getCurrentFrame().getCalleeClosureUnsafe());
 1741|      0|        O2REG(ResumeGenerator) = HermesValue::encodeBoolValue(
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1742|      0|            innerFn->getAction() == GeneratorInnerFunction::Action::Return);
 1743|       |        // Write the result last in case it is the same register as O2REG.
 1744|      0|        O1REG(ResumeGenerator) = innerFn->getResult().unboxToHV(runtime);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1745|      0|        innerFn->clearResult(runtime);
 1746|      0|        if (innerFn->getAction() == GeneratorInnerFunction::Action::Throw) {
  ------------------
  |  Branch (1746:13): [True: 0, False: 0]
  ------------------
 1747|      0|          runtime.setThrownValue(O1REG(ResumeGenerator));
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1748|      0|          goto exception;
 1749|      0|        }
 1750|      0|        ip = NEXTINST(ResumeGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1751|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1752|      0|      }
 1753|       |
 1754|  2.70k|      CASE(Ret) {
  ------------------
  |  | 1063|  2.70k|#define CASE(name) case_##name:
  ------------------
 1755|  2.70k|#ifdef HERMES_ENABLE_DEBUGGER
 1756|       |        // Check for an async debugger request, but skip it if we're single
 1757|       |        // stepping. The only case where we'd be single stepping a Ret is if it
 1758|       |        // was replaced with Debugger OpCode and we're coming here from
 1759|       |        // stepFunction(). This does take away a chance to handle AsyncBreak. An
 1760|       |        // AsyncBreak request could be either Explicit or Implicit. The Explicit
 1761|       |        // case is to have the program being executed to pause. There isn't a
 1762|       |        // need to pause at a particular location. Also, since we just came from
 1763|       |        // a breakpoint, handling Explicit AsyncBreak for single step isn't so
 1764|       |        // important. The other possible kind is an Implicit AsyncBreak, which
 1765|       |        // is used for debug clients to interrupt the runtime to execute their
 1766|       |        // own code. Not processing AsyncBreak just means that the Implicit
 1767|       |        // AsyncBreak needs to wait for the next opportunity to interrupt the
 1768|       |        // runtime, which should be fine. There is no contract for when the
 1769|       |        // interrupt should happen.
 1770|  2.70k|        if (!SingleStep) {
  ------------------
  |  Branch (1770:13): [Folded - Ignored]
  ------------------
 1771|  2.70k|          if (uint8_t asyncFlags =
  ------------------
  |  Branch (1771:23): [True: 0, False: 2.70k]
  ------------------
 1772|  2.70k|                  runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1773|      0|            RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  bool requestedImplicit = (uint8_t)(flags) &                   \
  |  | 1103|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerImplicit; \
  |  | 1104|      0|  bool requestedExplicit = (uint8_t)(flags) &                   \
  |  | 1105|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit; \
  |  | 1106|      0|  do {                                                          \
  |  | 1107|      0|    if (requestedImplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1107:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1108|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1109|      0|          auto dRes,                                            \
  |  | 1110|      0|          runDebuggerUpdatingState(                             \
  |  | 1111|      0|              Debugger::RunReason::AsyncBreakImplicit,          \
  |  | 1112|      0|              runtime,                                          \
  |  | 1113|      0|              curCodeBlock,                                     \
  |  | 1114|      0|              ip,                                               \
  |  | 1115|      0|              frameRegs));                                      \
  |  | 1116|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1116:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1117|      0|        goto exception;                                         \
  |  | 1118|      0|    }                                                           \
  |  | 1119|      0|    if (requestedExplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1119:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1120|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1121|      0|          auto dRes,                                            \
  |  | 1122|      0|          runDebuggerUpdatingState(                             \
  |  | 1123|      0|              Debugger::RunReason::AsyncBreakExplicit,          \
  |  | 1124|      0|              runtime,                                          \
  |  | 1125|      0|              curCodeBlock,                                     \
  |  | 1126|      0|              ip,                                               \
  |  | 1127|      0|              frameRegs));                                      \
  |  | 1128|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1128:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1129|      0|        goto exception;                                         \
  |  | 1130|      0|    }                                                           \
  |  | 1131|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1131:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1774|      0|            gcScope.flushToSmallCount(KEEP_HANDLES);
 1775|      0|            DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1776|      0|          }
 1777|  2.70k|        }
 1778|  2.70k|#endif
 1779|       |
 1780|  2.70k|        PROFILER_EXIT_FUNCTION(curCodeBlock);
 1781|       |
 1782|  2.70k|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1783|  2.70k|        runtime.popCallStack();
 1784|  2.70k|#endif
 1785|       |
 1786|       |        // Store the return value.
 1787|  2.70k|        res = O1REG(Ret);
  ------------------
  |  |   31|  2.70k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  2.70k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1788|       |
 1789|  2.70k|        ip = FRAME.getSavedIP();
  ------------------
  |  |   39|  2.70k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1790|  2.70k|        curCodeBlock = FRAME.getSavedCodeBlock();
  ------------------
  |  |   39|  2.70k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1791|       |
 1792|  2.70k|        frameRegs =
 1793|  2.70k|            &runtime.restoreStackAndPreviousFrame(FRAME).getFirstLocalRef();
  ------------------
  |  |   39|  2.70k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1794|       |
 1795|  2.70k|        SLOW_DEBUG(
  ------------------
  |  |   18|  2.70k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|  2.70k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|  2.70k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.70k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|  2.70k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1796|  2.70k|            dbgs() << "function exit: restored stackLevel="
 1797|  2.70k|                   << runtime.getStackLevel() << "\n");
 1798|       |
 1799|       |        // Are we returning to native code?
 1800|  2.70k|        if (!curCodeBlock) {
  ------------------
  |  Branch (1800:13): [True: 304, False: 2.40k]
  ------------------
 1801|    304|          SLOW_DEBUG(dbgs() << "function exit: returning to native code\n");
  ------------------
  |  |   18|    304|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|    304|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|    304|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 304]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|    304|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1802|    304|          return res;
 1803|    304|        }
 1804|       |
 1805|  2.40k|        INIT_STATE_FOR_CODEBLOCK(curCodeBlock);
  ------------------
  |  |  116|  2.40k|  do {                                                           \
  |  |  117|  2.40k|    strictMode = (codeBlock)->isStrictMode();                    \
  |  |  118|  2.40k|    defaultPropOpFlags = DEFAULT_PROP_OP_FLAGS(strictMode);      \
  |  |  ------------------
  |  |  |  |   44|  2.40k|  (strictMode ? PropOpFlags().plusThrowOnError() : PropOpFlags())
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (44:4): [True: 2.24k, False: 160]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|  2.40k|    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|  2.40k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (128:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1806|  2.40k|        O1REG(Call) = res.getValue();
  ------------------
  |  |   31|  2.40k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  4.80k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1807|       |
 1808|  2.40k|#ifdef HERMES_ENABLE_DEBUGGER
 1809|       |        // Only do the more expensive check for breakpoint location (in
 1810|       |        // getRealOpCode) if there are breakpoints installed in the function
 1811|       |        // we're returning into.
 1812|  2.40k|        if (LLVM_UNLIKELY(curCodeBlock->getNumInstalledBreakpoints() > 0)) {
  ------------------
  |  |  189|  2.40k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.40k]
  |  |  ------------------
  ------------------
 1813|      0|          ip = IPADD(inst::getInstSize(
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 1814|      0|              runtime.debugger_.getRealOpCode(curCodeBlock, CUROFFSET)));
 1815|  2.40k|        } else {
 1816|       |          // No breakpoints in the function being returned to, just use
 1817|       |          // nextInstCall().
 1818|  2.40k|          ip = nextInstCall(ip);
 1819|  2.40k|        }
 1820|       |#else
 1821|       |        ip = nextInstCall(ip);
 1822|       |#endif
 1823|       |
 1824|  12.0k|        DISPATCH;
  ------------------
  |  | 1068|  2.40k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  2.40k|  {                                                                          \
  |  |  |  | 1041|  2.40k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  2.40k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.40k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  2.40k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  2.40k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.40k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  2.40k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.40k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  2.40k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  2.40k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  2.40k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.40k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  2.40k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  2.40k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  2.40k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  2.40k|  }
  |  |  ------------------
  |  | 1069|  2.40k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  2.40k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1825|  12.0k|      }
 1826|       |
 1827|      0|      CASE(Catch) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1828|      0|        assert(!runtime.thrownValue_.isEmpty() && "Invalid thrown value");
 1829|      0|        assert(
 1830|      0|            !isUncatchableError(runtime.thrownValue_) &&
 1831|      0|            "Uncatchable thrown value was caught");
 1832|      0|        O1REG(Catch) = runtime.thrownValue_;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1833|      0|        runtime.clearThrownValue();
 1834|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1835|       |        // Signal to the debugger that we're done unwinding an exception,
 1836|       |        // and we can resume normal debugging flow.
 1837|      0|        runtime.debugger_.finishedUnwindingException();
 1838|      0|#endif
 1839|      0|        ip = NEXTINST(Catch);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1840|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1841|      0|      }
 1842|       |
 1843|      0|      CASE(Throw) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1844|      0|        runtime.thrownValue_ = O1REG(Throw);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1845|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1846|      0|            dbgs() << "Exception thrown: "
 1847|      0|                   << DumpHermesValue(runtime.thrownValue_) << "\n");
 1848|      0|        goto exception;
 1849|      0|      }
 1850|       |
 1851|      0|      CASE(ThrowIfEmpty) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1852|      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]
  |  |  ------------------
  ------------------
 1853|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1854|      0|          CAPTURE_IP(runtime.raiseReferenceError(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 1855|      0|              "accessing an uninitialized variable"));
 1856|      0|          goto exception;
 1857|      0|        }
 1858|      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]
  |  |  ------------------
  ------------------
 1859|      0|        ip = NEXTINST(ThrowIfEmpty);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1860|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1861|      0|      }
 1862|       |
 1863|      0|      CASE(Debugger) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1864|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1865|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1866|      0|        {
 1867|      0|          if (!runtime.debugger_.isDebugging()) {
  ------------------
  |  Branch (1867:15): [True: 0, False: 0]
  ------------------
 1868|       |            // Only run the debugger if we're not already debugging.
 1869|       |            // Don't want to call it again and mess with its state.
 1870|      0|            CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 1871|      0|                auto res,
 1872|      0|                runDebuggerUpdatingState(
 1873|      0|                    Debugger::RunReason::Opcode,
 1874|      0|                    runtime,
 1875|      0|                    curCodeBlock,
 1876|      0|                    ip,
 1877|      0|                    frameRegs));
 1878|      0|            if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1878:17): [True: 0, False: 0]
  ------------------
 1879|       |              // If one of the internal steps threw,
 1880|       |              // then handle that here by jumping to where we're supposed to go.
 1881|       |              // If we're in mid-step, the breakpoint at the catch point
 1882|       |              // will have been set by the debugger.
 1883|       |              // We don't want to execute this instruction because it's already
 1884|       |              // thrown.
 1885|      0|              goto exception;
 1886|      0|            }
 1887|      0|          }
 1888|      0|          InterpreterState newState{curCodeBlock, (uint32_t)CUROFFSET};
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 1889|      0|          ExecutionStatus status =
 1890|      0|              runtime.debugger_.processInstUnderDebuggerOpCode(newState);
 1891|      0|          if (status == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1891:15): [True: 0, False: 0]
  ------------------
 1892|      0|            goto exception;
 1893|      0|          }
 1894|       |
 1895|      0|          if (newState.codeBlock != curCodeBlock ||
  ------------------
  |  Branch (1895:15): [True: 0, False: 0]
  ------------------
 1896|      0|              newState.offset != (uint32_t)CUROFFSET) {
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
  |  Branch (1896:15): [True: 0, False: 0]
  ------------------
 1897|      0|            ip = newState.codeBlock->getOffsetPtr(newState.offset);
 1898|       |
 1899|      0|            if (newState.codeBlock != curCodeBlock) {
  ------------------
  |  Branch (1899:17): [True: 0, False: 0]
  ------------------
 1900|      0|              curCodeBlock = newState.codeBlock;
 1901|      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]
  |  |  ------------------
  ------------------
 1902|       |              // Single-stepping should handle call stack management for us.
 1903|      0|              frameRegs = &runtime.getCurrentFrame().getFirstLocalRef();
 1904|      0|            }
 1905|      0|          }
 1906|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 1907|      0|        }
 1908|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1909|       |#else
 1910|       |        ip = NEXTINST(Debugger);
 1911|       |        DISPATCH;
 1912|       |#endif
 1913|      0|      }
 1914|       |
 1915|   840k|      CASE(AsyncBreakCheck) {
  ------------------
  |  | 1063|   840k|#define CASE(name) case_##name:
  ------------------
 1916|   840k|        if (LLVM_UNLIKELY(runtime.hasAsyncBreak())) {
  ------------------
  |  |  189|   840k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 840k]
  |  |  ------------------
  ------------------
 1917|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1918|      0|          if (uint8_t asyncFlags =
  ------------------
  |  Branch (1918:23): [True: 0, False: 0]
  ------------------
 1919|      0|                  runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1920|      0|            RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  bool requestedImplicit = (uint8_t)(flags) &                   \
  |  | 1103|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerImplicit; \
  |  | 1104|      0|  bool requestedExplicit = (uint8_t)(flags) &                   \
  |  | 1105|      0|      (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit; \
  |  | 1106|      0|  do {                                                          \
  |  | 1107|      0|    if (requestedImplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1107:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1108|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1109|      0|          auto dRes,                                            \
  |  | 1110|      0|          runDebuggerUpdatingState(                             \
  |  | 1111|      0|              Debugger::RunReason::AsyncBreakImplicit,          \
  |  | 1112|      0|              runtime,                                          \
  |  | 1113|      0|              curCodeBlock,                                     \
  |  | 1114|      0|              ip,                                               \
  |  | 1115|      0|              frameRegs));                                      \
  |  | 1116|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1116:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1117|      0|        goto exception;                                         \
  |  | 1118|      0|    }                                                           \
  |  | 1119|      0|    if (requestedExplicit) {                                    \
  |  |  ------------------
  |  |  |  Branch (1119:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1120|      0|      CAPTURE_IP_ASSIGN(                                        \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1121|      0|          auto dRes,                                            \
  |  | 1122|      0|          runDebuggerUpdatingState(                             \
  |  | 1123|      0|              Debugger::RunReason::AsyncBreakExplicit,          \
  |  | 1124|      0|              runtime,                                          \
  |  | 1125|      0|              curCodeBlock,                                     \
  |  | 1126|      0|              ip,                                               \
  |  | 1127|      0|              frameRegs));                                      \
  |  | 1128|      0|      if (dRes == ExecutionStatus::EXCEPTION)                   \
  |  |  ------------------
  |  |  |  Branch (1128:11): [True: 0, False: 0]
  |  |  ------------------
  |  | 1129|      0|        goto exception;                                         \
  |  | 1130|      0|    }                                                           \
  |  | 1131|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1131:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1921|      0|          }
 1922|      0|#endif
 1923|      0|          if (runtime.testAndClearTimeoutAsyncBreakRequest()) {
  ------------------
  |  Branch (1923:15): [True: 0, False: 0]
  ------------------
 1924|      0|            CAPTURE_IP_ASSIGN(auto nRes, runtime.notifyTimeout());
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 1925|      0|            if (nRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1925:17): [True: 0, False: 0]
  ------------------
 1926|      0|              goto exception;
 1927|      0|            }
 1928|      0|          }
 1929|      0|        }
 1930|   840k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1931|       |
 1932|   840k|        ip = NEXTINST(AsyncBreakCheck);
  ------------------
  |  |   59|   840k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1933|  4.20M|        DISPATCH;
  ------------------
  |  | 1068|   840k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   840k|  {                                                                          \
  |  |  |  | 1041|   840k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   840k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   840k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   840k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   840k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   840k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   840k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   840k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   840k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   840k|  }
  |  |  ------------------
  |  | 1069|   840k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   840k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1934|  4.20M|      }
 1935|       |
 1936|      0|      CASE(ProfilePoint) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1937|       |#ifdef HERMESVM_PROFILER_BB
 1938|       |        auto pointIndex = ip->iProfilePoint.op1;
 1939|       |        SLOW_DEBUG(llvh::dbgs() << "ProfilePoint: " << pointIndex << "\n");
 1940|       |        CAPTURE_IP(runtime.getBasicBlockExecutionInfo().executeBlock(
 1941|       |            curCodeBlock, pointIndex));
 1942|       |#endif
 1943|      0|        ip = NEXTINST(ProfilePoint);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1944|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1945|      0|      }
 1946|       |
 1947|       |      // Use a macro here to avoid clang-format issues with a literal default:
 1948|       |      // label.
 1949|      0|      DEFAULT_CASE
 1950|      0|      CASE(Unreachable) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1951|      0|        hermes_fatal("Unreachable instruction encountered");
 1952|       |        // The fatal call doesn't return, no need to set the IP differently and
 1953|       |        // dispatch.
 1954|      0|      }
 1955|       |
 1956|  5.84k|      CASE(CreateClosure) {
  ------------------
  |  | 1063|  5.84k|#define CASE(name) case_##name:
  ------------------
 1957|  5.84k|        idVal = ip->iCreateClosure.op3;
 1958|  5.84k|        nextIP = NEXTINST(CreateClosure);
  ------------------
  |  |   59|  5.84k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1959|  5.84k|        goto createClosure;
 1960|      0|      }
 1961|      0|      CASE(CreateClosureLongIndex) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1962|      0|        idVal = ip->iCreateClosureLongIndex.op3;
 1963|      0|        nextIP = NEXTINST(CreateClosureLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1964|      0|        goto createClosure;
 1965|      0|      }
 1966|  5.84k|    createClosure: {
 1967|  5.84k|      auto *runtimeModule = curCodeBlock->getRuntimeModule();
 1968|  5.84k|      CAPTURE_IP(
  ------------------
  |  |  912|  5.84k|  runtime.setCurrentIP(ip);    \
  |  |  913|  5.84k|  (void)(expr);                \
  |  |  914|  5.84k|  ip = runtime.getCurrentIP(); \
  |  |  915|  5.84k|  runtime.invalidateCurrentIP();
  ------------------
 1969|  5.84k|          O1REG(CreateClosure) =
 1970|  5.84k|              JSFunction::create(
 1971|  5.84k|                  runtime,
 1972|  5.84k|                  runtimeModule->getDomain(runtime),
 1973|  5.84k|                  Handle<JSObject>::vmcast(&runtime.functionPrototype),
 1974|  5.84k|                  Handle<Environment>::vmcast(&O2REG(CreateClosure)),
 1975|  5.84k|                  runtimeModule->getCodeBlockMayAllocate(idVal))
 1976|  5.84k|                  .getHermesValue());
 1977|  5.84k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1978|  5.84k|      ip = nextIP;
 1979|  29.2k|      DISPATCH;
  ------------------
  |  | 1068|  5.84k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  5.84k|  {                                                                          \
  |  |  |  | 1041|  5.84k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  5.84k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.84k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  5.84k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  5.84k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.84k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  5.84k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.84k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  5.84k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  5.84k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  5.84k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.84k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  5.84k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  5.84k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  5.84k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  5.84k|  }
  |  |  ------------------
  |  | 1069|  5.84k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  5.84k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1980|  29.2k|    }
 1981|       |
 1982|      0|      CASE(CreateAsyncClosure) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1983|      0|        idVal = ip->iCreateAsyncClosure.op3;
 1984|      0|        nextIP = NEXTINST(CreateAsyncClosure);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1985|      0|        goto createAsyncClosure;
 1986|  29.2k|      }
 1987|      0|      CASE(CreateAsyncClosureLongIndex) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 1988|      0|        idVal = ip->iCreateAsyncClosureLongIndex.op3;
 1989|      0|        nextIP = NEXTINST(CreateAsyncClosureLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1990|      0|        goto createAsyncClosure;
 1991|  29.2k|      }
 1992|      0|    createAsyncClosure: {
 1993|      0|      auto *runtimeModule = curCodeBlock->getRuntimeModule();
 1994|      0|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 1995|      0|          O1REG(CreateAsyncClosure),
 1996|      0|          JSAsyncFunction::create(
 1997|      0|              runtime,
 1998|      0|              runtimeModule->getDomain(runtime),
 1999|      0|              Handle<JSObject>::vmcast(&runtime.asyncFunctionPrototype),
 2000|      0|              Handle<Environment>::vmcast(&O2REG(CreateAsyncClosure)),
 2001|      0|              runtimeModule->getCodeBlockMayAllocate(idVal))
 2002|      0|              .getHermesValue());
 2003|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2004|      0|      ip = nextIP;
 2005|      0|      DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2006|      0|    }
 2007|       |
 2008|      0|      CASE(CreateGeneratorClosure) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2009|      0|        idVal = ip->iCreateGeneratorClosure.op3;
 2010|      0|        nextIP = NEXTINST(CreateGeneratorClosure);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2011|      0|        goto createGeneratorClosure;
 2012|      0|      }
 2013|      0|      CASE(CreateGeneratorClosureLongIndex) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2014|      0|        idVal = ip->iCreateGeneratorClosureLongIndex.op3;
 2015|      0|        nextIP = NEXTINST(CreateGeneratorClosureLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2016|      0|        goto createGeneratorClosure;
 2017|      0|      }
 2018|      0|    createGeneratorClosure: {
 2019|      0|      auto *runtimeModule = curCodeBlock->getRuntimeModule();
 2020|      0|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2021|      0|          O1REG(CreateGeneratorClosure),
 2022|      0|          JSGeneratorFunction::create(
 2023|      0|              runtime,
 2024|      0|              runtimeModule->getDomain(runtime),
 2025|      0|              Handle<JSObject>::vmcast(&runtime.generatorFunctionPrototype),
 2026|      0|              Handle<Environment>::vmcast(&O2REG(CreateGeneratorClosure)),
 2027|      0|              runtimeModule->getCodeBlockMayAllocate(idVal))
 2028|      0|              .getHermesValue());
 2029|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2030|      0|      ip = nextIP;
 2031|      0|      DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2032|      0|    }
 2033|       |
 2034|      0|      CASE(CreateGenerator) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2035|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2036|      0|            auto res,
 2037|      0|            createGenerator_RJS(
 2038|      0|                runtime,
 2039|      0|                curCodeBlock->getRuntimeModule(),
 2040|      0|                ip->iCreateGenerator.op3,
 2041|      0|                Handle<Environment>::vmcast(&O2REG(CreateGenerator)),
 2042|      0|                FRAME.getNativeArgs()));
 2043|      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]
  |  |  ------------------
  ------------------
 2044|      0|          goto exception;
 2045|      0|        }
 2046|      0|        O1REG(CreateGenerator) = res->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2047|      0|        res->invalidate();
 2048|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2049|      0|        ip = NEXTINST(CreateGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2050|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2051|      0|      }
 2052|      0|      CASE(CreateGeneratorLongIndex) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2053|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2054|      0|            auto res,
 2055|      0|            createGenerator_RJS(
 2056|      0|                runtime,
 2057|      0|                curCodeBlock->getRuntimeModule(),
 2058|      0|                ip->iCreateGeneratorLongIndex.op3,
 2059|      0|                Handle<Environment>::vmcast(&O2REG(CreateGeneratorLongIndex)),
 2060|      0|                FRAME.getNativeArgs()));
 2061|      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]
  |  |  ------------------
  ------------------
 2062|      0|          goto exception;
 2063|      0|        }
 2064|      0|        O1REG(CreateGeneratorLongIndex) = res->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2065|      0|        res->invalidate();
 2066|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2067|      0|        ip = NEXTINST(CreateGeneratorLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2068|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2069|      0|      }
 2070|       |
 2071|  2.08k|      CASE(GetEnvironment) {
  ------------------
  |  | 1063|  2.08k|#define CASE(name) case_##name:
  ------------------
 2072|       |        // The currently executing function must exist, so get the environment.
 2073|  2.08k|        Environment *curEnv =
 2074|  2.08k|            FRAME.getCalleeClosureUnsafe()->getEnvironment(runtime);
  ------------------
  |  |   39|  2.08k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2075|  2.08k|        for (unsigned level = ip->iGetEnvironment.op2; level; --level) {
  ------------------
  |  Branch (2075:56): [True: 0, False: 2.08k]
  ------------------
 2076|      0|          assert(curEnv && "invalid environment relative level");
 2077|      0|          curEnv = curEnv->getParentEnvironment(runtime);
 2078|      0|        }
 2079|  2.08k|        O1REG(GetEnvironment) = HermesValue::encodeObjectValue(curEnv);
  ------------------
  |  |   31|  2.08k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  4.16k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2080|  2.08k|        ip = NEXTINST(GetEnvironment);
  ------------------
  |  |   59|  2.08k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2081|  10.4k|        DISPATCH;
  ------------------
  |  | 1068|  2.08k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  2.08k|  {                                                                          \
  |  |  |  | 1041|  2.08k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  2.08k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  2.08k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  2.08k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  2.08k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  2.08k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  2.08k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  2.08k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  2.08k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  2.08k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  2.08k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  2.08k|  }
  |  |  ------------------
  |  | 1069|  2.08k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  2.08k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2082|  10.4k|      }
 2083|       |
 2084|      0|      CASE(CreateInnerEnvironment) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2085|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2086|      0|            O1REG(CreateInnerEnvironment) = Environment::create(
 2087|      0|                runtime,
 2088|      0|                Handle<Environment>::vmcast(&O2REG(CreateInnerEnvironment)),
 2089|      0|                ip->iCreateInnerEnvironment.op3));
 2090|      0|        ip = NEXTINST(CreateInnerEnvironment);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2091|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2092|      0|      }
 2093|       |
 2094|    836|      CASE(CreateEnvironment) {
  ------------------
  |  | 1063|    836|#define CASE(name) case_##name:
  ------------------
 2095|    836|        tmpHandle = HermesValue::encodeObjectValueUnsafe(
 2096|    836|            FRAME.getCalleeClosureUnsafe()->getEnvironment(runtime));
  ------------------
  |  |   39|    836|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2097|       |
 2098|    836|        CAPTURE_IP(
  ------------------
  |  |  912|    836|  runtime.setCurrentIP(ip);    \
  |  |  913|    836|  (void)(expr);                \
  |  |  914|    836|  ip = runtime.getCurrentIP(); \
  |  |  915|    836|  runtime.invalidateCurrentIP();
  ------------------
 2099|    836|            O1REG(CreateEnvironment) = Environment::create(
 2100|    836|                runtime,
 2101|    836|                Handle<Environment>::vmcast_or_null(tmpHandle),
 2102|    836|                curCodeBlock->getEnvironmentSize()));
 2103|       |
 2104|    836|        tmpHandle = HermesValue::encodeUndefinedValue();
 2105|    836|        ip = NEXTINST(CreateEnvironment);
  ------------------
  |  |   59|    836|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2106|  4.18k|        DISPATCH;
  ------------------
  |  | 1068|    836|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|    836|  {                                                                          \
  |  |  |  | 1041|    836|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|    836|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    836|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|    836|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|    836|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    836|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|    836|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    836|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|    836|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|    836|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|    836|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    836|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|    836|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|    836|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|    836|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|    836|  }
  |  |  ------------------
  |  | 1069|    836|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|    836|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2107|  4.18k|      }
 2108|       |
 2109|  5.61k|      CASE(StoreToEnvironment) {
  ------------------
  |  | 1063|  5.61k|#define CASE(name) case_##name:
  ------------------
 2110|  5.61k|        vmcast<Environment>(O1REG(StoreToEnvironment))
  ------------------
  |  |   31|  5.61k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  5.61k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2111|  5.61k|            ->slot(ip->iStoreToEnvironment.op2)
 2112|  5.61k|            .set(O3REG(StoreToEnvironment), runtime.getHeap());
  ------------------
  |  |   33|  5.61k|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|  5.61k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2113|  5.61k|        ip = NEXTINST(StoreToEnvironment);
  ------------------
  |  |   59|  5.61k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2114|  28.0k|        DISPATCH;
  ------------------
  |  | 1068|  5.61k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  5.61k|  {                                                                          \
  |  |  |  | 1041|  5.61k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  5.61k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.61k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  5.61k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  5.61k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.61k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  5.61k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.61k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  5.61k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  5.61k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  5.61k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.61k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  5.61k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  5.61k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  5.61k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  5.61k|  }
  |  |  ------------------
  |  | 1069|  5.61k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  5.61k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2115|  28.0k|      }
 2116|      0|      CASE(StoreToEnvironmentL) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2117|      0|        vmcast<Environment>(O1REG(StoreToEnvironmentL))
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2118|      0|            ->slot(ip->iStoreToEnvironmentL.op2)
 2119|      0|            .set(O3REG(StoreToEnvironmentL), runtime.getHeap());
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2120|      0|        ip = NEXTINST(StoreToEnvironmentL);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2121|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2122|      0|      }
 2123|       |
 2124|    320|      CASE(StoreNPToEnvironment) {
  ------------------
  |  | 1063|    320|#define CASE(name) case_##name:
  ------------------
 2125|    320|        vmcast<Environment>(O1REG(StoreNPToEnvironment))
  ------------------
  |  |   31|    320|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|    320|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2126|    320|            ->slot(ip->iStoreNPToEnvironment.op2)
 2127|    320|            .setNonPtr(O3REG(StoreNPToEnvironment), runtime.getHeap());
  ------------------
  |  |   33|    320|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|    320|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2128|    320|        ip = NEXTINST(StoreNPToEnvironment);
  ------------------
  |  |   59|    320|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2129|  1.60k|        DISPATCH;
  ------------------
  |  | 1068|    320|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|    320|  {                                                                          \
  |  |  |  | 1041|    320|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|    320|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|    320|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|    320|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|    320|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|    320|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|    320|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|    320|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|    320|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|    320|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|    320|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|    320|  }
  |  |  ------------------
  |  | 1069|    320|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|    320|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2130|  1.60k|      }
 2131|      0|      CASE(StoreNPToEnvironmentL) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2132|      0|        vmcast<Environment>(O1REG(StoreNPToEnvironmentL))
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2133|      0|            ->slot(ip->iStoreNPToEnvironmentL.op2)
 2134|      0|            .setNonPtr(O3REG(StoreNPToEnvironmentL), runtime.getHeap());
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2135|      0|        ip = NEXTINST(StoreNPToEnvironmentL);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2136|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2137|      0|      }
 2138|       |
 2139|  2.08k|      CASE(LoadFromEnvironment) {
  ------------------
  |  | 1063|  2.08k|#define CASE(name) case_##name:
  ------------------
 2140|  2.08k|        O1REG(LoadFromEnvironment) =
  ------------------
  |  |   31|  2.08k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  4.16k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2141|  2.08k|            vmcast<Environment>(O2REG(LoadFromEnvironment))
  ------------------
  |  |   32|  2.08k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  2.08k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2142|  2.08k|                ->slot(ip->iLoadFromEnvironment.op3);
 2143|  2.08k|        ip = NEXTINST(LoadFromEnvironment);
  ------------------
  |  |   59|  2.08k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2144|  10.4k|        DISPATCH;
  ------------------
  |  | 1068|  2.08k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  2.08k|  {                                                                          \
  |  |  |  | 1041|  2.08k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  2.08k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  2.08k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  2.08k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  2.08k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  2.08k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  2.08k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  2.08k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.08k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  2.08k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  2.08k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  2.08k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  2.08k|  }
  |  |  ------------------
  |  | 1069|  2.08k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  2.08k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2145|  10.4k|      }
 2146|       |
 2147|      0|      CASE(LoadFromEnvironmentL) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2148|      0|        O1REG(LoadFromEnvironmentL) =
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2149|      0|            vmcast<Environment>(O2REG(LoadFromEnvironmentL))
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2150|      0|                ->slot(ip->iLoadFromEnvironmentL.op3);
 2151|      0|        ip = NEXTINST(LoadFromEnvironmentL);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2152|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2153|      0|      }
 2154|       |
 2155|  1.80M|      CASE(GetGlobalObject) {
  ------------------
  |  | 1063|  1.80M|#define CASE(name) case_##name:
  ------------------
 2156|  1.80M|        O1REG(GetGlobalObject) = runtime.global_;
  ------------------
  |  |   31|  1.80M|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  3.60M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2157|  1.80M|        ip = NEXTINST(GetGlobalObject);
  ------------------
  |  |   59|  1.80M|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2158|  9.00M|        DISPATCH;
  ------------------
  |  | 1068|  1.80M|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  1.80M|  {                                                                          \
  |  |  |  | 1041|  1.80M|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  1.80M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.80M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  1.80M|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  1.80M|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.80M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  1.80M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.80M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  1.80M|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  1.80M|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  1.80M|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.80M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  1.80M|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  1.80M|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  1.80M|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  1.80M|  }
  |  |  ------------------
  |  | 1069|  1.80M|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  1.80M|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2159|  9.00M|      }
 2160|       |
 2161|      9|      CASE(GetNewTarget) {
  ------------------
  |  | 1063|      9|#define CASE(name) case_##name:
  ------------------
 2162|      9|        O1REG(GetNewTarget) = FRAME.getNewTargetRef();
  ------------------
  |  |   31|      9|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     18|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(GetNewTarget) = FRAME.getNewTargetRef();
  ------------------
  |  |   39|      9|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2163|      9|        ip = NEXTINST(GetNewTarget);
  ------------------
  |  |   59|      9|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2164|     45|        DISPATCH;
  ------------------
  |  | 1068|      9|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      9|  {                                                                          \
  |  |  |  | 1041|      9|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      9|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      9|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      9|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      9|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      9|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      9|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      9|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      9|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      9|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      9|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      9|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      9|  }
  |  |  ------------------
  |  | 1069|      9|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      9|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2165|     45|      }
 2166|       |
 2167|      0|      CASE(DeclareGlobalVar) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2168|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2169|      0|            auto res, declareGlobalVarImpl(runtime, curCodeBlock, ip));
 2170|      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]
  |  |  ------------------
  ------------------
 2171|      0|          goto exception;
 2172|      0|        }
 2173|      0|        ip = NEXTINST(DeclareGlobalVar);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2174|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2175|      0|      }
 2176|       |
 2177|      0|      CASE(ThrowIfHasRestrictedGlobalProperty) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2178|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2179|      0|            auto res,
 2180|      0|            throwIfHasRestrictedGlobalPropertyImpl(runtime, curCodeBlock, ip));
 2181|      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]
  |  |  ------------------
  ------------------
 2182|      0|          goto exception;
 2183|      0|        }
 2184|      0|        ip = NEXTINST(ThrowIfHasRestrictedGlobalProperty);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2185|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2186|      0|      }
 2187|       |
 2188|      0|      CASE(TryGetByIdLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2189|      0|        tryProp = true;
 2190|      0|        idVal = ip->iTryGetByIdLong.op4;
 2191|      0|        nextIP = NEXTINST(TryGetByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2192|      0|        goto getById;
 2193|      0|      }
 2194|      0|      CASE(GetByIdLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2195|      0|        tryProp = false;
 2196|      0|        idVal = ip->iGetByIdLong.op4;
 2197|      0|        nextIP = NEXTINST(GetByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2198|      0|        goto getById;
 2199|      0|      }
 2200|  3.87k|      CASE(GetByIdShort) {
  ------------------
  |  | 1063|  3.87k|#define CASE(name) case_##name:
  ------------------
 2201|  3.87k|        tryProp = false;
 2202|  3.87k|        idVal = ip->iGetByIdShort.op4;
 2203|  3.87k|        nextIP = NEXTINST(GetByIdShort);
  ------------------
  |  |   59|  3.87k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2204|  3.87k|        goto getById;
 2205|      0|      }
 2206|   960k|      CASE(TryGetById) {
  ------------------
  |  | 1063|   960k|#define CASE(name) case_##name:
  ------------------
 2207|   960k|        tryProp = true;
 2208|   960k|        idVal = ip->iTryGetById.op4;
 2209|   960k|        nextIP = NEXTINST(TryGetById);
  ------------------
  |  |   59|   960k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2210|   960k|        goto getById;
 2211|      0|      }
 2212|      0|      CASE(GetById) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2213|      0|        tryProp = false;
 2214|      0|        idVal = ip->iGetById.op4;
 2215|      0|        nextIP = NEXTINST(GetById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2216|      0|      }
 2217|   964k|    getById: {
 2218|   964k|      ++NumGetById;
 2219|       |      // NOTE: it is safe to use OnREG(GetById) here because all instructions
 2220|       |      // have the same layout: opcode, registers, non-register operands, i.e.
 2221|       |      // they only differ in the width of the last "identifier" field.
 2222|   964k|      if (LLVM_LIKELY(O2REG(GetById).isObject())) {
  ------------------
  |  |  188|   964k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 964k, False: 22]
  |  |  ------------------
  ------------------
 2223|   964k|        auto *obj = vmcast<JSObject>(O2REG(GetById));
  ------------------
  |  |   32|   964k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|   964k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2224|   964k|        auto cacheIdx = ip->iGetById.op3;
 2225|   964k|        auto *cacheEntry = curCodeBlock->getReadCacheEntry(cacheIdx);
 2226|       |
 2227|       |#ifdef HERMESVM_PROFILER_BB
 2228|       |        {
 2229|       |          HERMES_SLOW_ASSERT(
 2230|       |              gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2231|       |              "unaccounted handles were created");
 2232|       |          auto objHandle = runtime.makeHandle(obj);
 2233|       |          auto cacheHCPtr = vmcast_or_null<HiddenClass>(static_cast<GCCell *>(
 2234|       |              cacheEntry->clazz.get(runtime, runtime.getHeap())));
 2235|       |          CAPTURE_IP(runtime.recordHiddenClass(
 2236|       |              curCodeBlock, ip, ID(idVal), obj->getClass(runtime), cacheHCPtr));
 2237|       |          // obj may be moved by GC due to recordHiddenClass
 2238|       |          obj = objHandle.get();
 2239|       |        }
 2240|       |        gcScope.flushToSmallCount(KEEP_HANDLES);
 2241|       |#endif
 2242|   964k|        CompressedPointer clazzPtr{obj->getClassGCPtr()};
 2243|   964k|#ifndef NDEBUG
 2244|   964k|        if (vmcast<HiddenClass>(clazzPtr.getNonNull(runtime))->isDictionary())
  ------------------
  |  Branch (2244:13): [True: 959k, False: 5.45k]
  ------------------
 2245|   959k|          ++NumGetByIdDict;
 2246|       |#else
 2247|       |        (void)NumGetByIdDict;
 2248|       |#endif
 2249|       |
 2250|       |        // If we have a cache hit, reuse the cached offset and immediately
 2251|       |        // return the property.
 2252|   964k|        if (LLVM_LIKELY(cacheEntry->clazz == clazzPtr)) {
  ------------------
  |  |  188|   964k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 961k, False: 3.62k]
  |  |  ------------------
  ------------------
 2253|   961k|          ++NumGetByIdCacheHits;
 2254|   961k|          CAPTURE_IP(
  ------------------
  |  |  912|   961k|  runtime.setCurrentIP(ip);    \
  |  |  913|   961k|  (void)(expr);                \
  |  |  914|   961k|  ip = runtime.getCurrentIP(); \
  |  |  915|   961k|  runtime.invalidateCurrentIP();
  ------------------
 2255|   961k|              O1REG(GetById) =
 2256|   961k|                  JSObject::getNamedSlotValueUnsafe<PropStorage::Inline::Yes>(
 2257|   961k|                      obj, runtime, cacheEntry->slot)
 2258|   961k|                      .unboxToHV(runtime));
 2259|   961k|          ip = nextIP;
 2260|  4.80M|          DISPATCH;
  ------------------
  |  | 1068|   961k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   961k|  {                                                                          \
  |  |  |  | 1041|   961k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   961k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   961k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   961k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   961k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   961k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   961k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   961k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   961k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   961k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   961k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   961k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   961k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   961k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   961k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   961k|  }
  |  |  ------------------
  |  | 1069|   961k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   961k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2261|  4.80M|        }
 2262|   964k|        auto id = ID(idVal);
  ------------------
  |  |   49|   964k|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
 2263|   964k|        NamedPropertyDescriptor desc;
 2264|   964k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   964k|  runtime.setCurrentIP(ip);           \
  |  |  920|   964k|  decl = (expr);                      \
  |  |  921|   964k|  ip = runtime.getCurrentIP();        \
  |  |  922|   964k|  runtime.invalidateCurrentIP();
  ------------------
 2265|   964k|            OptValue<bool> fastPathResult,
 2266|   964k|            JSObject::tryGetOwnNamedDescriptorFast(obj, runtime, id, desc));
 2267|   964k|        if (LLVM_LIKELY(
  ------------------
  |  |  188|  1.92M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.24k, False: 961k]
  |  |  |  Branch (188:51): [True: 3.29k, False: 961k]
  |  |  |  Branch (188:51): [True: 3.24k, False: 51]
  |  |  ------------------
  ------------------
 2268|   964k|                fastPathResult.hasValue() && fastPathResult.getValue()) &&
 2269|   964k|            !desc.flags.accessor) {
  ------------------
  |  Branch (2269:13): [True: 3.24k, False: 0]
  ------------------
 2270|  3.24k|          ++NumGetByIdFastPaths;
 2271|       |
 2272|       |          // cacheIdx == 0 indicates no caching so don't update the cache in
 2273|       |          // those cases.
 2274|  3.24k|          HiddenClass *clazz =
 2275|  3.24k|              vmcast<HiddenClass>(clazzPtr.getNonNull(runtime));
 2276|  3.24k|          if (LLVM_LIKELY(!clazz->isDictionaryNoCache()) &&
  ------------------
  |  |  188|  6.48k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.24k, False: 0]
  |  |  ------------------
  ------------------
 2277|  3.24k|              LLVM_LIKELY(cacheIdx != hbc::PROPERTY_CACHING_DISABLED)) {
  ------------------
  |  |  188|  3.24k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.24k, False: 0]
  |  |  ------------------
  ------------------
 2278|  3.24k|#ifdef HERMES_SLOW_DEBUG
 2279|  3.24k|            if (cacheEntry->clazz && cacheEntry->clazz != clazzPtr)
  ------------------
  |  Branch (2279:17): [True: 640, False: 2.60k]
  |  Branch (2279:38): [True: 640, False: 0]
  ------------------
 2280|    640|              ++NumGetByIdCacheEvicts;
 2281|       |#else
 2282|       |            (void)NumGetByIdCacheEvicts;
 2283|       |#endif
 2284|       |            // Cache the class, id and property slot.
 2285|  3.24k|            cacheEntry->clazz = clazzPtr;
 2286|  3.24k|            cacheEntry->slot = desc.slot;
 2287|  3.24k|          }
 2288|       |
 2289|  3.24k|          assert(
 2290|  3.24k|              !obj->isProxyObject() &&
 2291|  3.24k|              "tryGetOwnNamedDescriptorFast returned true on Proxy");
 2292|  3.24k|          CAPTURE_IP(
  ------------------
  |  |  912|  3.24k|  runtime.setCurrentIP(ip);    \
  |  |  913|  3.24k|  (void)(expr);                \
  |  |  914|  3.24k|  ip = runtime.getCurrentIP(); \
  |  |  915|  3.24k|  runtime.invalidateCurrentIP();
  ------------------
 2293|  3.24k|              O1REG(GetById) =
 2294|  3.24k|                  JSObject::getNamedSlotValueUnsafe(obj, runtime, desc)
 2295|  3.24k|                      .unboxToHV(runtime));
 2296|  3.24k|          ip = nextIP;
 2297|  16.2k|          DISPATCH;
  ------------------
  |  | 1068|  3.24k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  3.24k|  {                                                                          \
  |  |  |  | 1041|  3.24k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  3.24k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.24k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  3.24k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  3.24k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.24k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  3.24k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.24k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  3.24k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  3.24k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  3.24k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.24k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  3.24k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  3.24k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  3.24k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  3.24k|  }
  |  |  ------------------
  |  | 1069|  3.24k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  3.24k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2298|  16.2k|        }
 2299|       |
 2300|       |        // The cache may also be populated via the prototype of the object.
 2301|       |        // This value is only reliable if the fast path was a definite
 2302|       |        // not-found.
 2303|   964k|        if (fastPathResult.hasValue() && !fastPathResult.getValue() &&
  ------------------
  |  Branch (2303:13): [True: 51, False: 964k]
  |  Branch (2303:42): [True: 51, False: 0]
  ------------------
 2304|   964k|            LLVM_LIKELY(!obj->isProxyObject())) {
  ------------------
  |  |  188|     51|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 51, False: 0]
  |  |  ------------------
  ------------------
 2305|     51|          CAPTURE_IP_ASSIGN(JSObject * parent, obj->getParent(runtime));
  ------------------
  |  |  919|     51|  runtime.setCurrentIP(ip);           \
  |  |  920|     51|  decl = (expr);                      \
  |  |  921|     51|  ip = runtime.getCurrentIP();        \
  |  |  922|     51|  runtime.invalidateCurrentIP();
  ------------------
 2306|       |          // TODO: This isLazy check is because a lazy object is reported as
 2307|       |          // having no properties and therefore cannot contain the property.
 2308|       |          // This check does not belong here, it should be merged into
 2309|       |          // tryGetOwnNamedDescriptorFast().
 2310|     51|          if (parent && cacheEntry->clazz == parent->getClassGCPtr() &&
  ------------------
  |  Branch (2310:15): [True: 51, False: 0]
  |  Branch (2310:25): [True: 0, False: 51]
  ------------------
 2311|     51|              LLVM_LIKELY(!obj->isLazy())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2312|      0|            ++NumGetByIdProtoHits;
 2313|       |            // We've already checked that this isn't a Proxy.
 2314|      0|            CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2315|      0|                O1REG(GetById) = JSObject::getNamedSlotValueUnsafe(
 2316|      0|                                     parent, runtime, cacheEntry->slot)
 2317|      0|                                     .unboxToHV(runtime));
 2318|      0|            ip = nextIP;
 2319|      0|            DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2320|      0|          }
 2321|     51|        }
 2322|       |
 2323|   964k|#ifdef HERMES_SLOW_DEBUG
 2324|       |        // Call to getNamedDescriptorUnsafe is safe because `id` is kept alive
 2325|       |        // by the IdentifierTable.
 2326|   964k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   964k|  runtime.setCurrentIP(ip);           \
  |  |  920|   964k|  decl = (expr);                      \
  |  |  921|   964k|  ip = runtime.getCurrentIP();        \
  |  |  922|   964k|  runtime.invalidateCurrentIP();
  ------------------
 2327|   964k|            JSObject * propObj,
 2328|   964k|            JSObject::getNamedDescriptorUnsafe(
 2329|   964k|                Handle<JSObject>::vmcast(&O2REG(GetById)), runtime, id, desc));
 2330|   964k|        if (propObj) {
  ------------------
  |  Branch (2330:13): [True: 330, False: 964k]
  ------------------
 2331|    330|          if (desc.flags.accessor)
  ------------------
  |  Branch (2331:15): [True: 0, False: 330]
  ------------------
 2332|      0|            ++NumGetByIdAccessor;
 2333|    330|          else if (propObj != vmcast<JSObject>(O2REG(GetById)))
  ------------------
  |  |   32|    330|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|    330|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2333:20): [True: 164, False: 166]
  ------------------
 2334|    164|            ++NumGetByIdProto;
 2335|   964k|        } else {
 2336|   964k|          ++NumGetByIdNotFound;
 2337|   964k|        }
 2338|       |#else
 2339|       |        (void)NumGetByIdAccessor;
 2340|       |        (void)NumGetByIdProto;
 2341|       |        (void)NumGetByIdNotFound;
 2342|       |#endif
 2343|   964k|#ifdef HERMES_SLOW_DEBUG
 2344|   964k|        auto *savedClass = cacheIdx != hbc::PROPERTY_CACHING_DISABLED
  ------------------
  |  Branch (2344:28): [True: 380, False: 964k]
  ------------------
 2345|   964k|            ? cacheEntry->clazz.get(runtime, runtime.getHeap())
 2346|   964k|            : nullptr;
 2347|   964k|#endif
 2348|   964k|        ++NumGetByIdSlow;
 2349|   964k|        CAPTURE_IP(
  ------------------
  |  |  912|   964k|  runtime.setCurrentIP(ip);    \
  |  |  913|  3.85M|  (void)(expr);                \
  |  |  ------------------
  |  |  |  Branch (913:10): [True: 335, False: 964k]
  |  |  |  Branch (913:10): [True: 380, False: 964k]
  |  |  ------------------
  |  |  914|   964k|  ip = runtime.getCurrentIP(); \
  |  |  915|   964k|  runtime.invalidateCurrentIP();
  ------------------
 2350|   964k|            resPH = JSObject::getNamed_RJS(
 2351|   964k|                Handle<JSObject>::vmcast(&O2REG(GetById)),
 2352|   964k|                runtime,
 2353|   964k|                id,
 2354|   964k|                !tryProp ? defaultPropOpFlags
 2355|   964k|                         : defaultPropOpFlags.plusMustExist(),
 2356|   964k|                cacheIdx != hbc::PROPERTY_CACHING_DISABLED ? cacheEntry
 2357|   964k|                                                           : nullptr));
 2358|   964k|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   964k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 45, False: 964k]
  |  |  ------------------
  ------------------
 2359|     45|          goto exception;
 2360|     45|        }
 2361|   964k|#ifdef HERMES_SLOW_DEBUG
 2362|   964k|        if (cacheIdx != hbc::PROPERTY_CACHING_DISABLED && savedClass &&
  ------------------
  |  Branch (2362:13): [True: 335, False: 964k]
  |  Branch (2362:59): [True: 2, False: 333]
  ------------------
 2363|   964k|            cacheEntry->clazz.get(runtime, runtime.getHeap()) != savedClass) {
  ------------------
  |  Branch (2363:13): [True: 0, False: 2]
  ------------------
 2364|      0|          ++NumGetByIdCacheEvicts;
 2365|      0|        }
 2366|   964k|#endif
 2367|   964k|      } else {
 2368|     22|        ++NumGetByIdTransient;
 2369|     22|        assert(!tryProp && "TryGetById can only be used on the global object");
 2370|       |        /* Slow path. */
 2371|     22|        CAPTURE_IP(
  ------------------
  |  |  912|     22|  runtime.setCurrentIP(ip);    \
  |  |  913|     22|  (void)(expr);                \
  |  |  914|     22|  ip = runtime.getCurrentIP(); \
  |  |  915|     22|  runtime.invalidateCurrentIP();
  ------------------
 2372|     22|            resPH = Interpreter::getByIdTransient_RJS(
 2373|     22|                runtime, Handle<>(&O2REG(GetById)), ID(idVal)));
 2374|     22|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     22|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 21]
  |  |  ------------------
  ------------------
 2375|      1|          goto exception;
 2376|      1|        }
 2377|     22|      }
 2378|   964k|      O1REG(GetById) = resPH->get();
  ------------------
  |  |   31|   964k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.92M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2379|   964k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2380|   964k|      ip = nextIP;
 2381|   964k|      DISPATCH;
  ------------------
  |  | 1068|   964k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   964k|  {                                                                          \
  |  |  |  | 1041|   964k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   964k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   964k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   964k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   964k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    356|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|    356|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    356|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|    356|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|    356|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|    356|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    356|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|    356|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|    356|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|    356|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|    356|  }
  |  |  ------------------
  |  | 1069|    356|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|    356|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2382|  1.78k|    }
 2383|       |
 2384|      0|      CASE(TryPutByIdLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2385|      0|        tryProp = true;
 2386|      0|        idVal = ip->iTryPutByIdLong.op4;
 2387|      0|        nextIP = NEXTINST(TryPutByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2388|      0|        goto putById;
 2389|  1.78k|      }
 2390|      0|      CASE(PutByIdLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2391|      0|        tryProp = false;
 2392|      0|        idVal = ip->iPutByIdLong.op4;
 2393|      0|        nextIP = NEXTINST(PutByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2394|      0|        goto putById;
 2395|  1.78k|      }
 2396|      0|      CASE(TryPutById) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2397|      0|        tryProp = true;
 2398|      0|        idVal = ip->iTryPutById.op4;
 2399|      0|        nextIP = NEXTINST(TryPutById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2400|      0|        goto putById;
 2401|  1.78k|      }
 2402|  1.12M|      CASE(PutById) {
  ------------------
  |  | 1063|  1.12M|#define CASE(name) case_##name:
  ------------------
 2403|  1.12M|        tryProp = false;
 2404|  1.12M|        idVal = ip->iPutById.op4;
 2405|  1.12M|        nextIP = NEXTINST(PutById);
  ------------------
  |  |   59|  1.12M|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2406|  1.12M|      }
 2407|  1.12M|    putById: {
 2408|  1.12M|      ++NumPutById;
 2409|  1.12M|      if (LLVM_LIKELY(O1REG(PutById).isObject())) {
  ------------------
  |  |  188|  1.12M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.12M, False: 0]
  |  |  ------------------
  ------------------
 2410|  1.12M|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|  1.12M|  runtime.setCurrentIP(ip);           \
  |  |  920|  1.12M|  decl = (expr);                      \
  |  |  921|  1.12M|  ip = runtime.getCurrentIP();        \
  |  |  922|  1.12M|  runtime.invalidateCurrentIP();
  ------------------
 2411|  1.12M|            SmallHermesValue shv,
 2412|  1.12M|            SmallHermesValue::encodeHermesValue(O2REG(PutById), runtime));
 2413|  1.12M|        auto *obj = vmcast<JSObject>(O1REG(PutById));
  ------------------
  |  |   31|  1.12M|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.12M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2414|  1.12M|        auto cacheIdx = ip->iPutById.op3;
 2415|  1.12M|        auto *cacheEntry = curCodeBlock->getWriteCacheEntry(cacheIdx);
 2416|       |
 2417|       |#ifdef HERMESVM_PROFILER_BB
 2418|       |        {
 2419|       |          HERMES_SLOW_ASSERT(
 2420|       |              gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2421|       |              "unaccounted handles were created");
 2422|       |          auto shvHandle = runtime.makeHandle(shv.toHV(runtime));
 2423|       |          auto objHandle = runtime.makeHandle(obj);
 2424|       |          auto cacheHCPtr = vmcast_or_null<HiddenClass>(static_cast<GCCell *>(
 2425|       |              cacheEntry->clazz.get(runtime, runtime.getHeap())));
 2426|       |          CAPTURE_IP(runtime.recordHiddenClass(
 2427|       |              curCodeBlock, ip, ID(idVal), obj->getClass(runtime), cacheHCPtr));
 2428|       |          // shv/obj may be invalidated by recordHiddenClass
 2429|       |          if (shv.isPointer())
 2430|       |            shv.unsafeUpdatePointer(
 2431|       |                static_cast<GCCell *>(shvHandle->getPointer()), runtime);
 2432|       |          obj = objHandle.get();
 2433|       |        }
 2434|       |        gcScope.flushToSmallCount(KEEP_HANDLES);
 2435|       |#endif
 2436|  1.12M|        CompressedPointer clazzPtr{obj->getClassGCPtr()};
 2437|       |        // If we have a cache hit, reuse the cached offset and immediately
 2438|       |        // return the property.
 2439|  1.12M|        if (LLVM_LIKELY(cacheEntry->clazz == clazzPtr)) {
  ------------------
  |  |  188|  1.12M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.60k, False: 1.11M]
  |  |  ------------------
  ------------------
 2440|  1.60k|          ++NumPutByIdCacheHits;
 2441|  1.60k|          CAPTURE_IP(
  ------------------
  |  |  912|  1.60k|  runtime.setCurrentIP(ip);    \
  |  |  913|  1.60k|  (void)(expr);                \
  |  |  914|  1.60k|  ip = runtime.getCurrentIP(); \
  |  |  915|  1.60k|  runtime.invalidateCurrentIP();
  ------------------
 2442|  1.60k|              JSObject::setNamedSlotValueUnsafe<PropStorage::Inline::Yes>(
 2443|  1.60k|                  obj, runtime, cacheEntry->slot, shv));
 2444|  1.60k|          ip = nextIP;
 2445|  8.00k|          DISPATCH;
  ------------------
  |  | 1068|  1.60k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  1.60k|  {                                                                          \
  |  |  |  | 1041|  1.60k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  1.60k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.60k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  1.60k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  1.60k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.60k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  1.60k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.60k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  1.60k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  1.60k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  1.60k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.60k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  1.60k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  1.60k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  1.60k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  1.60k|  }
  |  |  ------------------
  |  | 1069|  1.60k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  1.60k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2446|  8.00k|        }
 2447|  1.12M|        auto id = ID(idVal);
  ------------------
  |  |   49|  1.12M|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
 2448|  1.12M|        NamedPropertyDescriptor desc;
 2449|  1.12M|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|  1.12M|  runtime.setCurrentIP(ip);           \
  |  |  920|  1.12M|  decl = (expr);                      \
  |  |  921|  1.12M|  ip = runtime.getCurrentIP();        \
  |  |  922|  1.12M|  runtime.invalidateCurrentIP();
  ------------------
 2450|  1.12M|            OptValue<bool> hasOwnProp,
 2451|  1.12M|            JSObject::tryGetOwnNamedDescriptorFast(obj, runtime, id, desc));
 2452|  1.12M|        if (LLVM_LIKELY(hasOwnProp.hasValue() && hasOwnProp.getValue()) &&
  ------------------
  |  |  188|  2.24M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.11M, False: 7.69k]
  |  |  |  Branch (188:51): [True: 1.11M, False: 4.32k]
  |  |  |  Branch (188:51): [True: 1.11M, False: 3.37k]
  |  |  ------------------
  ------------------
 2453|  1.12M|            !desc.flags.accessor && desc.flags.writable &&
  ------------------
  |  Branch (2453:13): [True: 1.11M, False: 0]
  |  Branch (2453:37): [True: 1.11M, False: 0]
  ------------------
 2454|  1.12M|            !desc.flags.internalSetter) {
  ------------------
  |  Branch (2454:13): [True: 840k, False: 271k]
  ------------------
 2455|   840k|          ++NumPutByIdFastPaths;
 2456|       |
 2457|       |          // cacheIdx == 0 indicates no caching so don't update the cache in
 2458|       |          // those cases.
 2459|   840k|          HiddenClass *clazz =
 2460|   840k|              vmcast<HiddenClass>(clazzPtr.getNonNull(runtime));
 2461|   840k|          if (LLVM_LIKELY(!clazz->isDictionary()) &&
  ------------------
  |  |  188|  1.68M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 320, False: 840k]
  |  |  ------------------
  ------------------
 2462|   840k|              LLVM_LIKELY(cacheIdx != hbc::PROPERTY_CACHING_DISABLED)) {
  ------------------
  |  |  188|    320|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 320, False: 0]
  |  |  ------------------
  ------------------
 2463|    320|#ifdef HERMES_SLOW_DEBUG
 2464|    320|            if (cacheEntry->clazz && cacheEntry->clazz != clazzPtr)
  ------------------
  |  Branch (2464:17): [True: 0, False: 320]
  |  Branch (2464:38): [True: 0, False: 0]
  ------------------
 2465|      0|              ++NumPutByIdCacheEvicts;
 2466|       |#else
 2467|       |            (void)NumPutByIdCacheEvicts;
 2468|       |#endif
 2469|       |            // Cache the class and property slot.
 2470|    320|            cacheEntry->clazz = clazzPtr;
 2471|    320|            cacheEntry->slot = desc.slot;
 2472|    320|          }
 2473|       |
 2474|       |          // This must be valid because an own property was already found.
 2475|   840k|          CAPTURE_IP(
  ------------------
  |  |  912|   840k|  runtime.setCurrentIP(ip);    \
  |  |  913|   840k|  (void)(expr);                \
  |  |  914|   840k|  ip = runtime.getCurrentIP(); \
  |  |  915|   840k|  runtime.invalidateCurrentIP();
  ------------------
 2476|   840k|              JSObject::setNamedSlotValueUnsafe(obj, runtime, desc.slot, shv));
 2477|   840k|          ip = nextIP;
 2478|  4.20M|          DISPATCH;
  ------------------
  |  | 1068|   840k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   840k|  {                                                                          \
  |  |  |  | 1041|   840k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   840k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   840k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   840k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   840k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   840k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   840k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   840k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   840k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   840k|  }
  |  |  ------------------
  |  | 1069|   840k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   840k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2479|  4.20M|        }
 2480|       |
 2481|  1.12M|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|  1.12M|  runtime.setCurrentIP(ip);           \
  |  |  920|  2.24M|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (920:11): [True: 277k, False: 842k]
  |  |  ------------------
  |  |  921|  1.12M|  ip = runtime.getCurrentIP();        \
  |  |  922|  1.12M|  runtime.invalidateCurrentIP();
  ------------------
 2482|  1.12M|            auto putRes,
 2483|  1.12M|            JSObject::putNamed_RJS(
 2484|  1.12M|                Handle<JSObject>::vmcast(&O1REG(PutById)),
 2485|  1.12M|                runtime,
 2486|  1.12M|                id,
 2487|  1.12M|                Handle<>(&O2REG(PutById)),
 2488|  1.12M|                !tryProp ? defaultPropOpFlags
 2489|  1.12M|                         : defaultPropOpFlags.plusMustExist()));
 2490|  1.12M|        if (LLVM_UNLIKELY(putRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.12M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.12M]
  |  |  ------------------
  ------------------
 2491|      0|          goto exception;
 2492|      0|        }
 2493|  1.12M|      } else {
 2494|      0|        ++NumPutByIdTransient;
 2495|      0|        assert(!tryProp && "TryPutById can only be used on the global object");
 2496|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2497|      0|            auto retStatus,
 2498|      0|            Interpreter::putByIdTransient_RJS(
 2499|      0|                runtime,
 2500|      0|                Handle<>(&O1REG(PutById)),
 2501|      0|                ID(idVal),
 2502|      0|                Handle<>(&O2REG(PutById)),
 2503|      0|                strictMode));
 2504|      0|        if (retStatus == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2504:13): [True: 0, False: 0]
  ------------------
 2505|      0|          goto exception;
 2506|      0|        }
 2507|      0|      }
 2508|  1.12M|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2509|  1.12M|      ip = nextIP;
 2510|  1.38M|      DISPATCH;
  ------------------
  |  | 1068|  1.12M|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  1.12M|  {                                                                          \
  |  |  |  | 1041|  1.12M|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  1.12M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.12M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  1.12M|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  1.12M|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   277k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   277k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   277k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   277k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   277k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   277k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   277k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   277k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   277k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   277k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   277k|  }
  |  |  ------------------
  |  | 1069|   277k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   277k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2511|  1.38M|    }
 2512|       |
 2513|   662k|      CASE(GetByVal) {
  ------------------
  |  | 1063|   662k|#define CASE(name) case_##name:
  ------------------
 2514|   662k|        if (LLVM_LIKELY(O2REG(GetByVal).isObject())) {
  ------------------
  |  |  188|   662k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 662k, False: 0]
  |  |  ------------------
  ------------------
 2515|   662k|          CAPTURE_IP(
  ------------------
  |  |  912|   662k|  runtime.setCurrentIP(ip);    \
  |  |  913|   662k|  (void)(expr);                \
  |  |  914|   662k|  ip = runtime.getCurrentIP(); \
  |  |  915|   662k|  runtime.invalidateCurrentIP();
  ------------------
 2516|   662k|              resPH = JSObject::getComputed_RJS(
 2517|   662k|                  Handle<JSObject>::vmcast(&O2REG(GetByVal)),
 2518|   662k|                  runtime,
 2519|   662k|                  Handle<>(&O3REG(GetByVal))));
 2520|   662k|          if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   662k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 662k]
  |  |  ------------------
  ------------------
 2521|      0|            goto exception;
 2522|      0|          }
 2523|   662k|        } else {
 2524|       |          // This is the "slow path".
 2525|      0|          CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2526|      0|              resPH = Interpreter::getByValTransient_RJS(
 2527|      0|                  runtime,
 2528|      0|                  Handle<>(&O2REG(GetByVal)),
 2529|      0|                  Handle<>(&O3REG(GetByVal))));
 2530|      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]
  |  |  ------------------
  ------------------
 2531|      0|            goto exception;
 2532|      0|          }
 2533|      0|        }
 2534|   662k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2535|   662k|        O1REG(GetByVal) = resPH->get();
  ------------------
  |  |   31|   662k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.32M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2536|   662k|        ip = NEXTINST(GetByVal);
  ------------------
  |  |   59|   662k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2537|  3.31M|        DISPATCH;
  ------------------
  |  | 1068|   662k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   662k|  {                                                                          \
  |  |  |  | 1041|   662k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   662k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   662k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   662k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   662k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   662k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   662k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   662k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   662k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   662k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   662k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   662k|  }
  |  |  ------------------
  |  | 1069|   662k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   662k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2538|  3.31M|      }
 2539|       |
 2540|   271k|      CASE(PutByVal) {
  ------------------
  |  | 1063|   271k|#define CASE(name) case_##name:
  ------------------
 2541|   271k|        if (LLVM_LIKELY(O1REG(PutByVal).isObject())) {
  ------------------
  |  |  188|   271k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 271k, False: 0]
  |  |  ------------------
  ------------------
 2542|   271k|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   271k|  runtime.setCurrentIP(ip);           \
  |  |  920|   271k|  decl = (expr);                      \
  |  |  921|   271k|  ip = runtime.getCurrentIP();        \
  |  |  922|   271k|  runtime.invalidateCurrentIP();
  ------------------
 2543|   271k|              auto putRes,
 2544|   271k|              JSObject::putComputed_RJS(
 2545|   271k|                  Handle<JSObject>::vmcast(&O1REG(PutByVal)),
 2546|   271k|                  runtime,
 2547|   271k|                  Handle<>(&O2REG(PutByVal)),
 2548|   271k|                  Handle<>(&O3REG(PutByVal)),
 2549|   271k|                  defaultPropOpFlags));
 2550|   271k|          if (LLVM_UNLIKELY(putRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 271k]
  |  |  ------------------
  ------------------
 2551|      0|            goto exception;
 2552|      0|          }
 2553|   271k|        } else {
 2554|       |          // This is the "slow path".
 2555|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2556|      0|              auto retStatus,
 2557|      0|              Interpreter::putByValTransient_RJS(
 2558|      0|                  runtime,
 2559|      0|                  Handle<>(&O1REG(PutByVal)),
 2560|      0|                  Handle<>(&O2REG(PutByVal)),
 2561|      0|                  Handle<>(&O3REG(PutByVal)),
 2562|      0|                  strictMode));
 2563|      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]
  |  |  ------------------
  ------------------
 2564|      0|            goto exception;
 2565|      0|          }
 2566|      0|        }
 2567|   271k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2568|   271k|        ip = NEXTINST(PutByVal);
  ------------------
  |  |   59|   271k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2569|  1.35M|        DISPATCH;
  ------------------
  |  | 1068|   271k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   271k|  {                                                                          \
  |  |  |  | 1041|   271k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   271k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   271k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   271k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   271k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   271k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   271k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   271k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   271k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   271k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   271k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   271k|  }
  |  |  ------------------
  |  | 1069|   271k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   271k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2570|  1.35M|      }
 2571|       |
 2572|   826k|      CASE(PutOwnByIndexL) {
  ------------------
  |  | 1063|   826k|#define CASE(name) case_##name:
  ------------------
 2573|   826k|        nextIP = NEXTINST(PutOwnByIndexL);
  ------------------
  |  |   59|   826k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2574|   826k|        idVal = ip->iPutOwnByIndexL.op3;
 2575|   826k|        goto putOwnByIndex;
 2576|  1.35M|      }
 2577|    480|      CASE(PutOwnByIndex) {
  ------------------
  |  | 1063|    480|#define CASE(name) case_##name:
  ------------------
 2578|    480|        nextIP = NEXTINST(PutOwnByIndex);
  ------------------
  |  |   59|    480|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2579|    480|        idVal = ip->iPutOwnByIndex.op3;
 2580|    480|      }
 2581|   827k|    putOwnByIndex: {
 2582|   827k|      tmpHandle = HermesValue::encodeUntrustedNumberValue(idVal);
 2583|   827k|      CAPTURE_IP(JSObject::defineOwnComputedPrimitive(
  ------------------
  |  |  912|   827k|  runtime.setCurrentIP(ip);    \
  |  |  913|   827k|  (void)(expr);                \
  |  |  914|   827k|  ip = runtime.getCurrentIP(); \
  |  |  915|   827k|  runtime.invalidateCurrentIP();
  ------------------
 2584|   827k|          Handle<JSObject>::vmcast(&O1REG(PutOwnByIndex)),
 2585|   827k|          runtime,
 2586|   827k|          tmpHandle,
 2587|   827k|          DefinePropertyFlags::getDefaultNewPropertyFlags(),
 2588|   827k|          Handle<>(&O2REG(PutOwnByIndex))));
 2589|   827k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2590|   827k|      tmpHandle.clear();
 2591|   827k|      ip = nextIP;
 2592|  4.13M|      DISPATCH;
  ------------------
  |  | 1068|   827k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   827k|  {                                                                          \
  |  |  |  | 1041|   827k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   827k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   827k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   827k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   827k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   827k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   827k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   827k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   827k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   827k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   827k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   827k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   827k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   827k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   827k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   827k|  }
  |  |  ------------------
  |  | 1069|   827k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   827k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2593|  4.13M|    }
 2594|       |
 2595|   827k|      CASE_OUTOFLINE(GetPNameList);
  ------------------
  |  | 1158|     15|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1063|     15|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|     15|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  919|     15|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|     15|  decl = (expr);                      \
  |  |  |  |  921|     15|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|     15|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1160|     15|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
  |  |  ------------------
  |  |  |  |  189|     15|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 15]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1161|      0|      goto exception;                                                \
  |  | 1162|      0|    }                                                                \
  |  | 1163|     15|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1164|     15|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|     15|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|     15|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|     15|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|     15|  {                                                                          \
  |  |  |  |  |  | 1041|     15|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|     15|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     15|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|     15|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|     15|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     15|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|     15|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     15|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|     15|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|     15|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|     15|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     15|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|     15|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|     15|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|     15|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|     15|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|     15|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|     15|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|     15|  }
  ------------------
 2596|       |
 2597|   840k|      CASE(GetNextPName) {
  ------------------
  |  | 1063|   840k|#define CASE(name) case_##name:
  ------------------
 2598|   840k|        {
 2599|   840k|          assert(
 2600|   840k|              vmisa<BigStorage>(O2REG(GetNextPName)) &&
 2601|   840k|              "GetNextPName's second op must be BigStorage");
 2602|   840k|          auto obj = Handle<JSObject>::vmcast(&O3REG(GetNextPName));
  ------------------
  |  |   33|   840k|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|   840k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2603|   840k|          auto arr = Handle<BigStorage>::vmcast(&O2REG(GetNextPName));
  ------------------
  |  |   32|   840k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|   840k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2604|   840k|          uint32_t idx = O4REG(GetNextPName).getNumber();
  ------------------
  |  |   34|   840k|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|   840k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2605|   840k|          uint32_t size = O5REG(GetNextPName).getNumber();
  ------------------
  |  |   35|   840k|#define O5REG(name) REG(ip->i##name.op5)
  |  |  ------------------
  |  |  |  |   16|   840k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2606|   840k|          MutableHandle<JSObject> propObj{runtime};
 2607|   840k|          MutableHandle<SymbolID> tmpPropNameStorage{runtime};
 2608|       |          // Loop until we find a property which is present.
 2609|   840k|          while (idx < size) {
  ------------------
  |  Branch (2609:18): [True: 840k, False: 10]
  ------------------
 2610|   840k|            tmpHandle = arr->at(runtime, idx);
 2611|   840k|            ComputedPropertyDescriptor desc;
 2612|   840k|            CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   840k|  runtime.setCurrentIP(ip);           \
  |  |  920|   840k|  decl = (expr);                      \
  |  |  921|   840k|  ip = runtime.getCurrentIP();        \
  |  |  922|   840k|  runtime.invalidateCurrentIP();
  ------------------
 2613|   840k|                ExecutionStatus status,
 2614|   840k|                JSObject::getComputedPrimitiveDescriptor(
 2615|   840k|                    obj,
 2616|   840k|                    runtime,
 2617|   840k|                    tmpHandle,
 2618|   840k|                    propObj,
 2619|   840k|                    tmpPropNameStorage,
 2620|   840k|                    desc));
 2621|   840k|            if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   840k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 840k]
  |  |  ------------------
  ------------------
 2622|      0|              goto exception;
 2623|      0|            }
 2624|   840k|            if (LLVM_LIKELY(propObj))
  ------------------
  |  |  188|   840k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 840k, False: 0]
  |  |  ------------------
  ------------------
 2625|   840k|              break;
 2626|      0|            ++idx;
 2627|      0|          }
 2628|   840k|          if (idx < size) {
  ------------------
  |  Branch (2628:15): [True: 840k, False: 10]
  ------------------
 2629|       |            // We must return the property as a string
 2630|   840k|            if (tmpHandle->isNumber()) {
  ------------------
  |  Branch (2630:17): [True: 840k, False: 0]
  ------------------
 2631|   840k|              CAPTURE_IP_ASSIGN(auto status, toString_RJS(runtime, tmpHandle));
  ------------------
  |  |  919|   840k|  runtime.setCurrentIP(ip);           \
  |  |  920|   840k|  decl = (expr);                      \
  |  |  921|   840k|  ip = runtime.getCurrentIP();        \
  |  |  922|   840k|  runtime.invalidateCurrentIP();
  ------------------
 2632|   840k|              assert(
 2633|   840k|                  status == ExecutionStatus::RETURNED &&
 2634|   840k|                  "toString on number cannot fail");
 2635|   840k|              tmpHandle = status->getHermesValue();
 2636|   840k|            }
 2637|   840k|            O4REG(GetNextPName) =
  ------------------
  |  |   34|   840k|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|  1.68M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2638|   840k|                HermesValue::encodeUntrustedNumberValue(idx + 1);
 2639|       |            // Write the result last in case it is the same register as O4REG.
 2640|   840k|            O1REG(GetNextPName) = tmpHandle.get();
  ------------------
  |  |   31|   840k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.68M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2641|   840k|          } else {
 2642|     10|            O1REG(GetNextPName) = HermesValue::encodeUndefinedValue();
  ------------------
  |  |   31|     10|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     20|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2643|     10|          }
 2644|   840k|        }
 2645|   840k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2646|   840k|        tmpHandle.clear();
 2647|   840k|        ip = NEXTINST(GetNextPName);
  ------------------
  |  |   59|   840k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2648|  4.20M|        DISPATCH;
  ------------------
  |  | 1068|   840k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   840k|  {                                                                          \
  |  |  |  | 1041|   840k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   840k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   840k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   840k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   840k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   840k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   840k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   840k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   840k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   840k|  }
  |  |  ------------------
  |  | 1069|   840k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   840k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2649|  4.20M|      }
 2650|       |
 2651|     13|      CASE(ToNumber) {
  ------------------
  |  | 1063|     13|#define CASE(name) case_##name:
  ------------------
 2652|     13|        if (LLVM_LIKELY(O2REG(ToNumber).isNumber())) {
  ------------------
  |  |  188|     13|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 13]
  |  |  ------------------
  ------------------
 2653|      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]
  |  |  ------------------
  ------------------
 2654|      0|          ip = NEXTINST(ToNumber);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2655|     13|        } else {
 2656|     13|          CAPTURE_IP(res = toNumber_RJS(runtime, Handle<>(&O2REG(ToNumber))));
  ------------------
  |  |  912|     13|  runtime.setCurrentIP(ip);    \
  |  |  913|     13|  (void)(expr);                \
  |  |  914|     13|  ip = runtime.getCurrentIP(); \
  |  |  915|     13|  runtime.invalidateCurrentIP();
  ------------------
 2657|     13|          if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2657:15): [True: 0, False: 13]
  ------------------
 2658|      0|            goto exception;
 2659|     13|          gcScope.flushToSmallCount(KEEP_HANDLES);
 2660|     13|          O1REG(ToNumber) = res.getValue();
  ------------------
  |  |   31|     13|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     26|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2661|     13|          ip = NEXTINST(ToNumber);
  ------------------
  |  |   59|     13|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2662|     13|        }
 2663|     78|        DISPATCH;
  ------------------
  |  | 1068|     13|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|     13|  {                                                                          \
  |  |  |  | 1041|     13|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|     13|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     13|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|     13|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|     13|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     13|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|     13|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     13|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|     13|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|     13|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|     13|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     13|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|     13|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|     13|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|     13|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|     13|  }
  |  |  ------------------
  |  | 1069|     13|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|     13|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2664|     78|      }
 2665|       |
 2666|      0|      CASE(ToNumeric) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2667|      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]
  |  |  ------------------
  ------------------
 2668|      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]
  |  |  ------------------
  ------------------
 2669|      0|          ip = NEXTINST(ToNumeric);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2670|      0|        } else {
 2671|      0|          CAPTURE_IP(res = toNumeric_RJS(runtime, Handle<>(&O2REG(ToNumeric))));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2672|      0|          if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2672:15): [True: 0, False: 0]
  ------------------
 2673|      0|            goto exception;
 2674|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 2675|      0|          O1REG(ToNumeric) = res.getValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2676|      0|          ip = NEXTINST(ToNumeric);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2677|      0|        }
 2678|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2679|      0|      }
 2680|       |
 2681|      0|      CASE(ToInt32) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2682|      0|        CAPTURE_IP(res = toInt32_RJS(runtime, Handle<>(&O2REG(ToInt32))));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2683|      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]
  |  |  ------------------
  ------------------
 2684|      0|          goto exception;
 2685|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2686|      0|        O1REG(ToInt32) = res.getValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2687|      0|        ip = NEXTINST(ToInt32);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2688|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2689|      0|      }
 2690|       |
 2691|      0|      CASE(AddEmptyString) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2692|      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]
  |  |  ------------------
  ------------------
 2693|      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]
  |  |  ------------------
  ------------------
 2694|      0|          ip = NEXTINST(AddEmptyString);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2695|      0|        } else {
 2696|      0|          CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2697|      0|              res = toPrimitive_RJS(
 2698|      0|                  runtime,
 2699|      0|                  Handle<>(&O2REG(AddEmptyString)),
 2700|      0|                  PreferredType::NONE));
 2701|      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]
  |  |  ------------------
  ------------------
 2702|      0|            goto exception;
 2703|      0|          tmpHandle = res.getValue();
 2704|      0|          CAPTURE_IP_ASSIGN(auto strRes, toString_RJS(runtime, tmpHandle));
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2705|      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]
  |  |  ------------------
  ------------------
 2706|      0|            goto exception;
 2707|      0|          tmpHandle.clear();
 2708|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 2709|      0|          O1REG(AddEmptyString) = strRes->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2710|      0|          ip = NEXTINST(AddEmptyString);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2711|      0|        }
 2712|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2713|      0|      }
 2714|       |
 2715|   840k|      CASE(Jmp) {
  ------------------
  |  | 1063|   840k|#define CASE(name) case_##name:
  ------------------
 2716|   840k|        ip = IPADD(ip->iJmp.op1);
  ------------------
  |  |   52|   840k|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2717|  4.20M|        DISPATCH;
  ------------------
  |  | 1068|   840k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   840k|  {                                                                          \
  |  |  |  | 1041|   840k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   840k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   840k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   840k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   840k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   840k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   840k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   840k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   840k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   840k|  }
  |  |  ------------------
  |  | 1069|   840k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   840k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2718|  4.20M|      }
 2719|      0|      CASE(JmpLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2720|      0|        ip = IPADD(ip->iJmpLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2721|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2722|      0|      }
 2723|  1.12k|      CASE(JmpTrue) {
  ------------------
  |  | 1063|  1.12k|#define CASE(name) case_##name:
  ------------------
 2724|  1.12k|        if (toBoolean(O2REG(JmpTrue)))
  ------------------
  |  |   32|  1.12k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  1.12k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2724:13): [True: 160, False: 960]
  ------------------
 2725|    160|          ip = IPADD(ip->iJmpTrue.op1);
  ------------------
  |  |   52|    160|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2726|    960|        else
 2727|    960|          ip = NEXTINST(JmpTrue);
  ------------------
  |  |   59|    960|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2728|  5.60k|        DISPATCH;
  ------------------
  |  | 1068|  1.12k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  1.12k|  {                                                                          \
  |  |  |  | 1041|  1.12k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  1.12k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.12k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  1.12k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  1.12k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.12k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  1.12k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.12k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  1.12k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  1.12k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  1.12k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.12k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  1.12k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  1.12k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  1.12k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  1.12k|  }
  |  |  ------------------
  |  | 1069|  1.12k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  1.12k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2729|  5.60k|      }
 2730|      0|      CASE(JmpTrueLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2731|      0|        if (toBoolean(O2REG(JmpTrueLong)))
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2731:13): [True: 0, False: 0]
  ------------------
 2732|      0|          ip = IPADD(ip->iJmpTrueLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2733|      0|        else
 2734|      0|          ip = NEXTINST(JmpTrueLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2735|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2736|      0|      }
 2737|    320|      CASE(JmpFalse) {
  ------------------
  |  | 1063|    320|#define CASE(name) case_##name:
  ------------------
 2738|    320|        if (!toBoolean(O2REG(JmpFalse)))
  ------------------
  |  |   32|    320|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|    320|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2738:13): [True: 160, False: 160]
  ------------------
 2739|    160|          ip = IPADD(ip->iJmpFalse.op1);
  ------------------
  |  |   52|    160|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2740|    160|        else
 2741|    160|          ip = NEXTINST(JmpFalse);
  ------------------
  |  |   59|    160|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2742|  1.60k|        DISPATCH;
  ------------------
  |  | 1068|    320|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|    320|  {                                                                          \
  |  |  |  | 1041|    320|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|    320|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|    320|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|    320|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|    320|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|    320|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|    320|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|    320|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|    320|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|    320|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|    320|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|    320|  }
  |  |  ------------------
  |  | 1069|    320|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|    320|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2743|  1.60k|      }
 2744|      0|      CASE(JmpFalseLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2745|      0|        if (!toBoolean(O2REG(JmpFalseLong)))
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2745:13): [True: 0, False: 0]
  ------------------
 2746|      0|          ip = IPADD(ip->iJmpFalseLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2747|      0|        else
 2748|      0|          ip = NEXTINST(JmpFalseLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2749|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2750|      0|      }
 2751|   840k|      CASE(JmpUndefined) {
  ------------------
  |  | 1063|   840k|#define CASE(name) case_##name:
  ------------------
 2752|   840k|        if (O2REG(JmpUndefined).isUndefined())
  ------------------
  |  |   32|   840k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|   840k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2752:13): [True: 10, False: 840k]
  ------------------
 2753|     10|          ip = IPADD(ip->iJmpUndefined.op1);
  ------------------
  |  |   52|     10|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2754|   840k|        else
 2755|   840k|          ip = NEXTINST(JmpUndefined);
  ------------------
  |  |   59|   840k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2756|  4.20M|        DISPATCH;
  ------------------
  |  | 1068|   840k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   840k|  {                                                                          \
  |  |  |  | 1041|   840k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   840k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   840k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   840k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   840k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   840k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   840k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   840k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   840k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   840k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   840k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   840k|  }
  |  |  ------------------
  |  | 1069|   840k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   840k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2757|  4.20M|      }
 2758|      2|      CASE(JmpUndefinedLong) {
  ------------------
  |  | 1063|      2|#define CASE(name) case_##name:
  ------------------
 2759|      2|        if (O2REG(JmpUndefinedLong).isUndefined())
  ------------------
  |  |   32|      2|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2759:13): [True: 0, False: 2]
  ------------------
 2760|      0|          ip = IPADD(ip->iJmpUndefinedLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2761|      2|        else
 2762|      2|          ip = NEXTINST(JmpUndefinedLong);
  ------------------
  |  |   59|      2|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2763|     10|        DISPATCH;
  ------------------
  |  | 1068|      2|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      2|  {                                                                          \
  |  |  |  | 1041|      2|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      2|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      2|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      2|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      2|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      2|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      2|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      2|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      2|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      2|  }
  |  |  ------------------
  |  | 1069|      2|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      2|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2764|     10|      }
 2765|  2.17M|      INCDECOP(Inc)
  ------------------
  |  | 1196|   271k|  CASE(name) {                                                                \
  |  |  ------------------
  |  |  |  | 1063|   271k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1197|   271k|    if (LLVM_LIKELY(O2REG(name).isNumber())) {                                \
  |  |  ------------------
  |  |  |  |  188|   271k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 271k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1198|      0|      O1REG(name) = HermesValue::encodeTrustedNumberValue(                    \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1199|      0|          do##name(O2REG(name).getNumber()));                                 \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1200|      0|      ip = NEXTINST(name);                                                    \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1201|      0|      DISPATCH;                                                               \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1202|      0|    }                                                                         \
  |  | 1203|   271k|    CAPTURE_IP(                                                               \
  |  |  ------------------
  |  |  |  |  912|   271k|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|   271k|  (void)(expr);                \
  |  |  |  |  914|   271k|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|   271k|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1204|   271k|        res =                                                                 \
  |  | 1205|   271k|            doIncDecOperSlowPath<do##name>(runtime, Handle<>(&O2REG(name)))); \
  |  | 1206|   271k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                   \
  |  |  ------------------
  |  |  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 271k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1207|      0|      goto exception;                                                         \
  |  | 1208|      0|    }                                                                         \
  |  | 1209|   271k|    O1REG(name) = *res;                                                       \
  |  |  ------------------
  |  |  |  |   31|   271k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|   543k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1210|   271k|    gcScope.flushToSmallCount(KEEP_HANDLES);                                  \
  |  | 1211|   271k|    ip = NEXTINST(name);                                                      \
  |  |  ------------------
  |  |  |  |   59|   271k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1212|   271k|    DISPATCH;                                                                 \
  |  |  ------------------
  |  |  |  | 1068|   271k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|   271k|  {                                                                          \
  |  |  |  |  |  | 1041|   271k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|   271k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|   271k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|   271k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|   271k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|   271k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|   271k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|   271k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   271k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|   271k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|   271k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|   271k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|   271k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|   271k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|   271k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1213|   271k|  }
  ------------------
 2766|   271k|      INCDECOP(Dec)
  ------------------
  |  | 1196|      0|  CASE(name) {                                                                \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1197|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1198|      0|      O1REG(name) = HermesValue::encodeTrustedNumberValue(                    \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1199|      0|          do##name(O2REG(name).getNumber()));                                 \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1200|      0|      ip = NEXTINST(name);                                                    \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1201|      0|      DISPATCH;                                                               \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1202|      0|    }                                                                         \
  |  | 1203|      0|    CAPTURE_IP(                                                               \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1204|      0|        res =                                                                 \
  |  | 1205|      0|            doIncDecOperSlowPath<do##name>(runtime, Handle<>(&O2REG(name)))); \
  |  | 1206|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1207|      0|      goto exception;                                                         \
  |  | 1208|      0|    }                                                                         \
  |  | 1209|      0|    O1REG(name) = *res;                                                       \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1210|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                  \
  |  | 1211|      0|    ip = NEXTINST(name);                                                      \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1212|      0|    DISPATCH;                                                                 \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1213|      0|  }
  ------------------
 2767|   781k|      CASE(Add) {
  ------------------
  |  | 1063|   781k|#define CASE(name) case_##name:
  ------------------
 2768|   781k|        if (LLVM_LIKELY(
  ------------------
  |  |  188|   781k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 781k]
  |  |  |  Branch (188:51): [True: 19, False: 781k]
  |  |  |  Branch (188:51): [True: 0, False: 19]
  |  |  ------------------
  ------------------
 2769|   781k|                O2REG(Add).isNumber() &&
 2770|   781k|                O3REG(Add).isNumber())) { /* Fast-path. */
 2771|      0|          INTERPRETER_FALLTHROUGH;
 2772|      2|          CASE(AddN) {
  ------------------
  |  | 1063|      2|#define CASE(name) case_##name:
  ------------------
 2773|      2|            O1REG(Add) = HermesValue::encodeTrustedNumberValue(
  ------------------
  |  |   31|      2|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      4|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2774|      2|                O2REG(Add).getNumber() + O3REG(Add).getNumber());
  ------------------
  |  |   32|      2|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                              O2REG(Add).getNumber() + O3REG(Add).getNumber());
  ------------------
  |  |   33|      2|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2775|      2|            ip = NEXTINST(Add);
  ------------------
  |  |   59|      2|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2776|     10|            DISPATCH;
  ------------------
  |  | 1068|      2|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      2|  {                                                                          \
  |  |  |  | 1041|      2|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      2|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      2|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      2|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      2|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      2|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      2|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      2|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      2|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      2|  }
  |  |  ------------------
  |  | 1069|      2|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      2|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2777|     10|          }
 2778|     10|        }
 2779|   781k|        CAPTURE_IP(
  ------------------
  |  |  912|   781k|  runtime.setCurrentIP(ip);    \
  |  |  913|   781k|  (void)(expr);                \
  |  |  914|   781k|  ip = runtime.getCurrentIP(); \
  |  |  915|   781k|  runtime.invalidateCurrentIP();
  ------------------
 2780|   781k|            res = addOp_RJS(
 2781|   781k|                runtime, Handle<>(&O2REG(Add)), Handle<>(&O3REG(Add))));
 2782|   781k|        if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2782:13): [True: 0, False: 781k]
  ------------------
 2783|      0|          goto exception;
 2784|      0|        }
 2785|   781k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2786|   781k|        O1REG(Add) = res.getValue();
  ------------------
  |  |   31|   781k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.56M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2787|   781k|        ip = NEXTINST(Add);
  ------------------
  |  |   59|   781k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2788|  3.90M|        DISPATCH;
  ------------------
  |  | 1068|   781k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   781k|  {                                                                          \
  |  |  |  | 1041|   781k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   781k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   781k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   781k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   781k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   781k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   781k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   781k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   781k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   781k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   781k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   781k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   781k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   781k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   781k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   781k|  }
  |  |  ------------------
  |  | 1069|   781k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   781k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2789|  3.90M|      }
 2790|       |
 2791|      0|      CASE(BitNot) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2792|      0|        if (LLVM_LIKELY(O2REG(BitNot).isNumber())) { /* Fast-path. */
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2793|      0|          O1REG(BitNot) = HermesValue::encodeUntrustedNumberValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2794|      0|              ~hermes::truncateToInt32(O2REG(BitNot).getNumber()));
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2795|      0|          ip = NEXTINST(BitNot);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2796|      0|          DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2797|      0|        }
 2798|      0|        CAPTURE_IP(res = doBitNotSlowPath(runtime, Handle<>(&O2REG(BitNot))));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2799|      0|        if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2799:13): [True: 0, False: 0]
  ------------------
 2800|      0|          goto exception;
 2801|      0|        }
 2802|      0|        O1REG(BitNot) = *res;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2803|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2804|      0|        ip = NEXTINST(BitNot);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2805|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2806|      0|      }
 2807|       |
 2808|      0|      CASE(GetArgumentsLength) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2809|       |        // If the arguments object hasn't been created yet.
 2810|      0|        if (O2REG(GetArgumentsLength).isUndefined()) {
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2810:13): [True: 0, False: 0]
  ------------------
 2811|      0|          O1REG(GetArgumentsLength) =
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2812|      0|              HermesValue::encodeUntrustedNumberValue(FRAME.getArgCount());
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2813|      0|          ip = NEXTINST(GetArgumentsLength);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2814|      0|          DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2815|      0|        }
 2816|       |        // The arguments object has been created, so this is a regular property
 2817|       |        // get.
 2818|      0|        assert(
 2819|      0|            O2REG(GetArgumentsLength).isObject() &&
 2820|      0|            "arguments lazy register is not an object");
 2821|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2822|      0|            resPH = JSObject::getNamed_RJS(
 2823|      0|                Handle<JSObject>::vmcast(&O2REG(GetArgumentsLength)),
 2824|      0|                runtime,
 2825|      0|                Predefined::getSymbolID(Predefined::length)));
 2826|      0|        if (resPH == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2826:13): [True: 0, False: 0]
  ------------------
 2827|      0|          goto exception;
 2828|      0|        }
 2829|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2830|      0|        O1REG(GetArgumentsLength) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2831|      0|        ip = NEXTINST(GetArgumentsLength);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2832|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2833|      0|      }
 2834|       |
 2835|      0|      CASE(GetArgumentsPropByVal) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2836|       |        // If the arguments object hasn't been created yet and we have a
 2837|       |        // valid integer index, we use the fast path.
 2838|      0|        if (O3REG(GetArgumentsPropByVal).isUndefined()) {
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2838:13): [True: 0, False: 0]
  ------------------
 2839|       |          // If this is an integer index.
 2840|      0|          if (auto index = toArrayIndexFastPath(O2REG(GetArgumentsPropByVal))) {
  ------------------
  |  Branch (2840:20): [True: 0, False: 0]
  ------------------
 2841|       |            // Is this an existing argument?
 2842|      0|            if (*index < FRAME.getArgCount()) {
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  |  Branch (2842:17): [True: 0, False: 0]
  ------------------
 2843|      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)
  ------------------
 2844|      0|              ip = NEXTINST(GetArgumentsPropByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2845|      0|              DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2846|      0|            }
 2847|      0|          }
 2848|      0|        }
 2849|       |        // Slow path.
 2850|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 2851|      0|            auto res,
 2852|      0|            getArgumentsPropByValSlowPath_RJS(
 2853|      0|                runtime,
 2854|      0|                &O3REG(GetArgumentsPropByVal),
 2855|      0|                &O2REG(GetArgumentsPropByVal),
 2856|      0|                FRAME.getCalleeClosureHandleUnsafe(),
 2857|      0|                strictMode));
 2858|      0|        if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2858:13): [True: 0, False: 0]
  ------------------
 2859|      0|          goto exception;
 2860|      0|        }
 2861|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2862|      0|        O1REG(GetArgumentsPropByVal) = res->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2863|      0|        ip = NEXTINST(GetArgumentsPropByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2864|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2865|      0|      }
 2866|       |
 2867|      0|      CASE(ReifyArguments) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2868|       |        // If the arguments object was already created, do nothing.
 2869|      0|        if (!O1REG(ReifyArguments).isUndefined()) {
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2869:13): [True: 0, False: 0]
  ------------------
 2870|      0|          assert(
 2871|      0|              O1REG(ReifyArguments).isObject() &&
 2872|      0|              "arguments lazy register is not an object");
 2873|      0|          ip = NEXTINST(ReifyArguments);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2874|      0|          DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2875|      0|        }
 2876|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2877|      0|            resArgs = reifyArgumentsSlowPath(
 2878|      0|                runtime, FRAME.getCalleeClosureHandleUnsafe(), strictMode));
 2879|      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]
  |  |  ------------------
  ------------------
 2880|      0|          goto exception;
 2881|      0|        }
 2882|      0|        O1REG(ReifyArguments) = resArgs->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2883|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2884|      0|        ip = NEXTINST(ReifyArguments);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2885|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2886|      0|      }
 2887|       |
 2888|   355k|      CASE(NewObject) {
  ------------------
  |  | 1063|   355k|#define CASE(name) case_##name:
  ------------------
 2889|       |        // Create a new object using the built-in constructor. Note that the
 2890|       |        // built-in constructor is empty, so we don't actually need to call
 2891|       |        // it.
 2892|   355k|        CAPTURE_IP(
  ------------------
  |  |  912|   355k|  runtime.setCurrentIP(ip);    \
  |  |  913|   355k|  (void)(expr);                \
  |  |  914|   355k|  ip = runtime.getCurrentIP(); \
  |  |  915|   355k|  runtime.invalidateCurrentIP();
  ------------------
 2893|   355k|            O1REG(NewObject) = JSObject::create(runtime).getHermesValue());
 2894|   355k|        assert(
 2895|   355k|            gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2896|   355k|            "Should not create handles.");
 2897|   355k|        ip = NEXTINST(NewObject);
  ------------------
  |  |   59|   355k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2898|  1.77M|        DISPATCH;
  ------------------
  |  | 1068|   355k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   355k|  {                                                                          \
  |  |  |  | 1041|   355k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   355k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   355k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   355k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   355k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   355k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   355k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   355k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   355k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   355k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   355k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   355k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   355k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   355k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   355k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   355k|  }
  |  |  ------------------
  |  | 1069|   355k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   355k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2899|  1.77M|      }
 2900|      0|      CASE(NewObjectWithParent) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2901|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  ------------------
  |  |  |  Branch (913:10): [True: 0, False: 0]
  |  |  |  Branch (913:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2902|      0|            O1REG(NewObjectWithParent) =
 2903|      0|                JSObject::create(
 2904|      0|                    runtime,
 2905|      0|                    O2REG(NewObjectWithParent).isObject()
 2906|      0|                        ? Handle<JSObject>::vmcast(&O2REG(NewObjectWithParent))
 2907|      0|                        : O2REG(NewObjectWithParent).isNull()
 2908|      0|                        ? Runtime::makeNullHandle<JSObject>()
 2909|      0|                        : Handle<JSObject>::vmcast(&runtime.objectPrototype))
 2910|      0|                    .getHermesValue());
 2911|      0|        assert(
 2912|      0|            gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2913|      0|            "Should not create handles.");
 2914|      0|        ip = NEXTINST(NewObjectWithParent);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2915|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2916|      0|      }
 2917|       |
 2918|      0|      CASE(NewObjectWithBuffer) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2919|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2920|      0|            resPH = Interpreter::createObjectFromBuffer(
 2921|      0|                runtime,
 2922|      0|                curCodeBlock,
 2923|      0|                ip->iNewObjectWithBuffer.op3,
 2924|      0|                ip->iNewObjectWithBuffer.op4,
 2925|      0|                ip->iNewObjectWithBuffer.op5));
 2926|      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]
  |  |  ------------------
  ------------------
 2927|      0|          goto exception;
 2928|      0|        }
 2929|      0|        O1REG(NewObjectWithBuffer) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2930|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2931|      0|        ip = NEXTINST(NewObjectWithBuffer);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2932|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2933|      0|      }
 2934|       |
 2935|      0|      CASE(NewObjectWithBufferLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2936|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2937|      0|            resPH = Interpreter::createObjectFromBuffer(
 2938|      0|                runtime,
 2939|      0|                curCodeBlock,
 2940|      0|                ip->iNewObjectWithBufferLong.op3,
 2941|      0|                ip->iNewObjectWithBufferLong.op4,
 2942|      0|                ip->iNewObjectWithBufferLong.op5));
 2943|      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]
  |  |  ------------------
  ------------------
 2944|      0|          goto exception;
 2945|      0|        }
 2946|      0|        O1REG(NewObjectWithBufferLong) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2947|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2948|      0|        ip = NEXTINST(NewObjectWithBufferLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2949|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2950|      0|      }
 2951|       |
 2952|   662k|      CASE(NewArray) {
  ------------------
  |  | 1063|   662k|#define CASE(name) case_##name:
  ------------------
 2953|       |        // Create a new array using the built-in constructor. Note that the
 2954|       |        // built-in constructor is empty, so we don't actually need to call
 2955|       |        // it.
 2956|   662k|        {
 2957|   662k|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   662k|  runtime.setCurrentIP(ip);           \
  |  |  920|   662k|  decl = (expr);                      \
  |  |  921|   662k|  ip = runtime.getCurrentIP();        \
  |  |  922|   662k|  runtime.invalidateCurrentIP();
  ------------------
 2958|   662k|              auto createRes,
 2959|   662k|              JSArray::create(runtime, ip->iNewArray.op2, ip->iNewArray.op2));
 2960|   662k|          if (createRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2960:15): [True: 0, False: 662k]
  ------------------
 2961|      0|            goto exception;
 2962|      0|          }
 2963|   662k|          O1REG(NewArray) = createRes->getHermesValue();
  ------------------
  |  |   31|   662k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.32M|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2964|   662k|        }
 2965|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2966|   662k|        ip = NEXTINST(NewArray);
  ------------------
  |  |   59|   662k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2967|  3.31M|        DISPATCH;
  ------------------
  |  | 1068|   662k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   662k|  {                                                                          \
  |  |  |  | 1041|   662k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   662k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   662k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   662k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   662k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   662k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   662k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   662k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   662k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   662k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   662k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   662k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   662k|  }
  |  |  ------------------
  |  | 1069|   662k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   662k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2968|  3.31M|      }
 2969|       |
 2970|     14|      CASE(NewArrayWithBuffer) {
  ------------------
  |  | 1063|     14|#define CASE(name) case_##name:
  ------------------
 2971|     14|        CAPTURE_IP(
  ------------------
  |  |  912|     14|  runtime.setCurrentIP(ip);    \
  |  |  913|     14|  (void)(expr);                \
  |  |  914|     14|  ip = runtime.getCurrentIP(); \
  |  |  915|     14|  runtime.invalidateCurrentIP();
  ------------------
 2972|     14|            resPH = Interpreter::createArrayFromBuffer(
 2973|     14|                runtime,
 2974|     14|                curCodeBlock,
 2975|     14|                ip->iNewArrayWithBuffer.op2,
 2976|     14|                ip->iNewArrayWithBuffer.op3,
 2977|     14|                ip->iNewArrayWithBuffer.op4));
 2978|     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]
  |  |  ------------------
  ------------------
 2979|      0|          goto exception;
 2980|      0|        }
 2981|     14|        O1REG(NewArrayWithBuffer) = resPH->get();
  ------------------
  |  |   31|     14|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     28|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2982|     14|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2983|     14|        tmpHandle.clear();
 2984|     14|        ip = NEXTINST(NewArrayWithBuffer);
  ------------------
  |  |   59|     14|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2985|     70|        DISPATCH;
  ------------------
  |  | 1068|     14|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|     14|  {                                                                          \
  |  |  |  | 1041|     14|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|     14|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     14|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|     14|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|     14|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     14|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|     14|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     14|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|     14|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|     14|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|     14|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     14|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|     14|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|     14|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|     14|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|     14|  }
  |  |  ------------------
  |  | 1069|     14|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|     14|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2986|     70|      }
 2987|       |
 2988|      0|      CASE(NewArrayWithBufferLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 2989|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 2990|      0|            resPH = Interpreter::createArrayFromBuffer(
 2991|      0|                runtime,
 2992|      0|                curCodeBlock,
 2993|      0|                ip->iNewArrayWithBufferLong.op2,
 2994|      0|                ip->iNewArrayWithBufferLong.op3,
 2995|      0|                ip->iNewArrayWithBufferLong.op4));
 2996|      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]
  |  |  ------------------
  ------------------
 2997|      0|          goto exception;
 2998|      0|        }
 2999|      0|        O1REG(NewArrayWithBufferLong) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3000|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3001|      0|        tmpHandle.clear();
 3002|      0|        ip = NEXTINST(NewArrayWithBufferLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3003|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3004|      0|      }
 3005|       |
 3006|    960|      CASE(CreateThis) {
  ------------------
  |  | 1063|    960|#define CASE(name) case_##name:
  ------------------
 3007|       |        // Registers: output, prototype, closure.
 3008|    960|        if (LLVM_UNLIKELY(!vmisa<Callable>(O3REG(CreateThis)))) {
  ------------------
  |  |  189|    960|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 960]
  |  |  ------------------
  ------------------
 3009|      0|          CAPTURE_IP(runtime.raiseTypeError("constructor is not callable"));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 3010|      0|          goto exception;
 3011|      0|        }
 3012|    960|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|    960|  runtime.setCurrentIP(ip);           \
  |  |  920|  1.92k|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (920:11): [True: 960, False: 0]
  |  |  ------------------
  |  |  921|    960|  ip = runtime.getCurrentIP();        \
  |  |  922|    960|  runtime.invalidateCurrentIP();
  ------------------
 3013|    960|            auto res,
 3014|    960|            Callable::newObject(
 3015|    960|                Handle<Callable>::vmcast(&O3REG(CreateThis)),
 3016|    960|                runtime,
 3017|    960|                Handle<JSObject>::vmcast(
 3018|    960|                    O2REG(CreateThis).isObject() ? &O2REG(CreateThis)
 3019|    960|                                                 : &runtime.objectPrototype)));
 3020|    960|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    960|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 960]
  |  |  ------------------
  ------------------
 3021|      0|          goto exception;
 3022|      0|        }
 3023|    960|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3024|    960|        O1REG(CreateThis) = res->getHermesValue();
  ------------------
  |  |   31|    960|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.92k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3025|    960|        ip = NEXTINST(CreateThis);
  ------------------
  |  |   59|    960|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3026|  4.80k|        DISPATCH;
  ------------------
  |  | 1068|    960|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|    960|  {                                                                          \
  |  |  |  | 1041|    960|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|    960|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|    960|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|    960|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|    960|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|    960|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|    960|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|    960|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|    960|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|    960|  }
  |  |  ------------------
  |  | 1069|    960|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|    960|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3027|  4.80k|      }
 3028|       |
 3029|    960|      CASE(SelectObject) {
  ------------------
  |  | 1063|    960|#define CASE(name) case_##name:
  ------------------
 3030|       |        // Registers: output, thisObject, constructorReturnValue.
 3031|    960|        O1REG(SelectObject) = O3REG(SelectObject).isObject()
  ------------------
  |  |   31|    960|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.92k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(SelectObject) = O3REG(SelectObject).isObject()
  ------------------
  |  |   33|    960|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|    960|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (3031:31): [True: 0, False: 960]
  ------------------
 3032|    960|            ? O3REG(SelectObject)
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3033|    960|            : O2REG(SelectObject);
  ------------------
  |  |   32|    960|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  1.92k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3034|    960|        ip = NEXTINST(SelectObject);
  ------------------
  |  |   59|    960|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3035|  4.80k|        DISPATCH;
  ------------------
  |  | 1068|    960|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|    960|  {                                                                          \
  |  |  |  | 1041|    960|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|    960|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|    960|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|    960|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|    960|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|    960|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|    960|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|    960|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|    960|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|    960|  }
  |  |  ------------------
  |  | 1069|    960|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|    960|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3036|  4.80k|      }
 3037|       |
 3038|    960|      CASE(Eq)
  ------------------
  |  | 1063|    960|#define CASE(name) case_##name:
  ------------------
 3039|    960|      CASE(Neq) {
  ------------------
  |  | 1063|    960|#define CASE(name) case_##name:
  ------------------
 3040|    960|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|    960|  runtime.setCurrentIP(ip);           \
  |  |  920|    960|  decl = (expr);                      \
  |  |  921|    960|  ip = runtime.getCurrentIP();        \
  |  |  922|    960|  runtime.invalidateCurrentIP();
  ------------------
 3041|    960|            auto eqRes,
 3042|    960|            abstractEqualityTest_RJS(
 3043|    960|                runtime, Handle<>(&O2REG(Eq)), Handle<>(&O3REG(Eq))));
 3044|    960|        if (eqRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (3044:13): [True: 0, False: 960]
  ------------------
 3045|      0|          goto exception;
 3046|      0|        }
 3047|    960|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3048|    960|        O1REG(Eq) = HermesValue::encodeBoolValue(
  ------------------
  |  |   31|    960|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.92k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3049|    960|            ip->opCode == OpCode::Eq ? *eqRes : !*eqRes);
  ------------------
  |  Branch (3049:13): [True: 960, False: 0]
  ------------------
 3050|    960|        ip = NEXTINST(Eq);
  ------------------
  |  |   59|    960|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3051|  4.80k|        DISPATCH;
  ------------------
  |  | 1068|    960|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|    960|  {                                                                          \
  |  |  |  | 1041|    960|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|    960|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|    960|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|    960|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|    960|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|    960|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|    960|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|    960|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|    960|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|    960|  }
  |  |  ------------------
  |  | 1069|    960|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|    960|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3052|  4.80k|      }
 3053|      0|      CASE(StrictEq) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3054|      0|        O1REG(StrictEq) = HermesValue::encodeBoolValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3055|      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]
  |  |  ------------------
  ------------------
 3056|      0|        ip = NEXTINST(StrictEq);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3057|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3058|      0|      }
 3059|      0|      CASE(StrictNeq) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3060|      0|        O1REG(StrictNeq) = HermesValue::encodeBoolValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3061|      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]
  |  |  ------------------
  ------------------
 3062|      0|        ip = NEXTINST(StrictNeq);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3063|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3064|      0|      }
 3065|      0|      CASE(Not) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3066|      0|        O1REG(Not) = HermesValue::encodeBoolValue(!toBoolean(O2REG(Not)));
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(Not) = HermesValue::encodeBoolValue(!toBoolean(O2REG(Not)));
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3067|      0|        ip = NEXTINST(Not);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3068|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3069|      0|      }
 3070|   199k|      CASE(Negate) {
  ------------------
  |  | 1063|   199k|#define CASE(name) case_##name:
  ------------------
 3071|   199k|        if (LLVM_LIKELY(O2REG(Negate).isNumber())) {
  ------------------
  |  |  188|   199k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 21.5k, False: 177k]
  |  |  ------------------
  ------------------
 3072|  21.5k|          O1REG(Negate) = HermesValue::encodeUntrustedNumberValue(
  ------------------
  |  |   31|  21.5k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  43.0k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3073|  21.5k|              -O2REG(Negate).getNumber());
  ------------------
  |  |   32|  21.5k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  21.5k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3074|  21.5k|          ip = NEXTINST(Negate);
  ------------------
  |  |   59|  21.5k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3075|   107k|          DISPATCH;
  ------------------
  |  | 1068|  21.5k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  21.5k|  {                                                                          \
  |  |  |  | 1041|  21.5k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  21.5k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  21.5k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  21.5k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  21.5k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  21.5k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  21.5k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  21.5k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  21.5k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  21.5k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  21.5k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  21.5k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  21.5k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  21.5k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  21.5k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  21.5k|  }
  |  |  ------------------
  |  | 1069|  21.5k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  21.5k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3076|   107k|        }
 3077|   199k|        CAPTURE_IP(res = doNegateSlowPath(runtime, Handle<>(&O2REG(Negate))));
  ------------------
  |  |  912|   199k|  runtime.setCurrentIP(ip);    \
  |  |  913|   199k|  (void)(expr);                \
  |  |  914|   199k|  ip = runtime.getCurrentIP(); \
  |  |  915|   199k|  runtime.invalidateCurrentIP();
  ------------------
 3078|   199k|        if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (3078:13): [True: 0, False: 199k]
  ------------------
 3079|      0|          goto exception;
 3080|   199k|        O1REG(Negate) = *res;
  ------------------
  |  |   31|   199k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|   398k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3081|   199k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3082|   199k|        ip = NEXTINST(Negate);
  ------------------
  |  |   59|   199k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3083|   888k|        DISPATCH;
  ------------------
  |  | 1068|   199k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   199k|  {                                                                          \
  |  |  |  | 1041|   199k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   199k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   199k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   199k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   199k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   177k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   177k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   177k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   177k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   177k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   177k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   177k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   177k|  }
  |  |  ------------------
  |  | 1069|   177k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   177k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3084|   888k|      }
 3085|  1.93k|      CASE(TypeOf) {
  ------------------
  |  | 1063|  1.93k|#define CASE(name) case_##name:
  ------------------
 3086|  1.93k|        CAPTURE_IP(O1REG(TypeOf) = typeOf(runtime, Handle<>(&O2REG(TypeOf))));
  ------------------
  |  |  912|  1.93k|  runtime.setCurrentIP(ip);    \
  |  |  913|  1.93k|  (void)(expr);                \
  |  |  914|  1.93k|  ip = runtime.getCurrentIP(); \
  |  |  915|  1.93k|  runtime.invalidateCurrentIP();
  ------------------
 3087|  1.93k|        ip = NEXTINST(TypeOf);
  ------------------
  |  |   59|  1.93k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3088|  9.65k|        DISPATCH;
  ------------------
  |  | 1068|  1.93k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|  1.93k|  {                                                                          \
  |  |  |  | 1041|  1.93k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|  1.93k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.93k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|  1.93k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|  1.93k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.93k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|  1.93k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.93k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|  1.93k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|  1.93k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|  1.93k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.93k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|  1.93k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|  1.93k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|  1.93k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|  1.93k|  }
  |  |  ------------------
  |  | 1069|  1.93k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|  1.93k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3089|  9.65k|      }
 3090|      0|      CASE(Mod) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3091|      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]
  |  |  ------------------
  ------------------
 3092|       |          /* Fast-path. */
 3093|      0|          O1REG(Mod) = HermesValue::encodeUntrustedNumberValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3094|      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]
  |  |  ------------------
  ------------------
 3095|      0|          ip = NEXTINST(Mod);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3096|      0|          DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3097|      0|        }
 3098|      0|        CAPTURE_IP(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 3099|      0|            res = doOperSlowPath<doMod>(
 3100|      0|                runtime, Handle<>(&O2REG(Mod)), Handle<>(&O3REG(Mod))));
 3101|      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]
  |  |  ------------------
  ------------------
 3102|      0|          goto exception;
 3103|      0|        }
 3104|      0|        O1REG(Mod) = *res;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3105|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3106|      0|        ip = NEXTINST(Mod);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3107|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3108|      0|      }
 3109|      0|      CASE(InstanceOf) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3110|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3111|      0|            auto result,
 3112|      0|            instanceOfOperator_RJS(
 3113|      0|                runtime,
 3114|      0|                Handle<>(&O2REG(InstanceOf)),
 3115|      0|                Handle<>(&O3REG(InstanceOf))));
 3116|      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]
  |  |  ------------------
  ------------------
 3117|      0|          goto exception;
 3118|      0|        }
 3119|      0|        O1REG(InstanceOf) = HermesValue::encodeBoolValue(*result);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3120|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3121|      0|        ip = NEXTINST(InstanceOf);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3122|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3123|      0|      }
 3124|      0|      CASE(IsIn) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3125|      0|        {
 3126|      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]
  |  |  ------------------
  ------------------
 3127|      0|            CAPTURE_IP(runtime.raiseTypeError(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 3128|      0|                "right operand of 'in' is not an object"));
 3129|      0|            goto exception;
 3130|      0|          }
 3131|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3132|      0|              auto cr,
 3133|      0|              JSObject::hasComputed(
 3134|      0|                  Handle<JSObject>::vmcast(&O3REG(IsIn)),
 3135|      0|                  runtime,
 3136|      0|                  Handle<>(&O2REG(IsIn))));
 3137|      0|          if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (3137:15): [True: 0, False: 0]
  ------------------
 3138|      0|            goto exception;
 3139|      0|          }
 3140|      0|          O1REG(IsIn) = HermesValue::encodeBoolValue(*cr);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3141|      0|        }
 3142|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3143|      0|        ip = NEXTINST(IsIn);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3144|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3145|      0|      }
 3146|       |
 3147|   177k|      CASE(PutNewOwnByIdShort) {
  ------------------
  |  | 1063|   177k|#define CASE(name) case_##name:
  ------------------
 3148|   177k|        nextIP = NEXTINST(PutNewOwnByIdShort);
  ------------------
  |  |   59|   177k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3149|   177k|        idVal = ip->iPutNewOwnByIdShort.op3;
 3150|   177k|        goto putOwnById;
 3151|      0|      }
 3152|      0|      CASE(PutNewOwnNEByIdLong)
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3153|      0|      CASE(PutNewOwnByIdLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3154|      0|        nextIP = NEXTINST(PutNewOwnByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3155|      0|        idVal = ip->iPutNewOwnByIdLong.op3;
 3156|      0|        goto putOwnById;
 3157|      0|      }
 3158|      0|      CASE(PutNewOwnNEById)
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3159|      0|      CASE(PutNewOwnById) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3160|      0|        nextIP = NEXTINST(PutNewOwnById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3161|      0|        idVal = ip->iPutNewOwnById.op3;
 3162|      0|      }
 3163|   177k|    putOwnById: {
 3164|   177k|      assert(
 3165|   177k|          O1REG(PutNewOwnById).isObject() &&
 3166|   177k|          "Object argument of PutNewOwnById must be an object");
 3167|   177k|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   177k|  runtime.setCurrentIP(ip);           \
  |  |  920|   355k|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (920:11): [True: 177k, False: 0]
  |  |  ------------------
  |  |  921|   177k|  ip = runtime.getCurrentIP();        \
  |  |  922|   177k|  runtime.invalidateCurrentIP();
  ------------------
 3168|   177k|          auto res,
 3169|   177k|          JSObject::defineNewOwnProperty(
 3170|   177k|              Handle<JSObject>::vmcast(&O1REG(PutNewOwnById)),
 3171|   177k|              runtime,
 3172|   177k|              ID(idVal),
 3173|   177k|              ip->opCode <= OpCode::PutNewOwnByIdLong
 3174|   177k|                  ? PropertyFlags::defaultNewNamedPropertyFlags()
 3175|   177k|                  : PropertyFlags::nonEnumerablePropertyFlags(),
 3176|   177k|              Handle<>(&O2REG(PutNewOwnById))));
 3177|   177k|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 177k]
  |  |  ------------------
  ------------------
 3178|      0|        goto exception;
 3179|      0|      }
 3180|   177k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 3181|   177k|      ip = nextIP;
 3182|   889k|      DISPATCH;
  ------------------
  |  | 1068|   177k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   177k|  {                                                                          \
  |  |  |  | 1041|   177k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   177k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   177k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   177k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   177k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   177k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   177k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   177k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   177k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   177k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   177k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   177k|  }
  |  |  ------------------
  |  | 1069|   177k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   177k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3183|   889k|    }
 3184|       |
 3185|      0|      CASE(DelByIdLong) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3186|      0|        idVal = ip->iDelByIdLong.op3;
 3187|      0|        nextIP = NEXTINST(DelByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3188|      0|        goto DelById;
 3189|   889k|      }
 3190|       |
 3191|      0|      CASE(DelById) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3192|      0|        idVal = ip->iDelById.op3;
 3193|      0|        nextIP = NEXTINST(DelById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3194|      0|      }
 3195|      0|    DelById: {
 3196|      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]
  |  |  ------------------
  ------------------
 3197|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3198|      0|            auto status,
 3199|      0|            JSObject::deleteNamed(
 3200|      0|                Handle<JSObject>::vmcast(&O2REG(DelById)),
 3201|      0|                runtime,
 3202|      0|                ID(idVal),
 3203|      0|                defaultPropOpFlags));
 3204|      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]
  |  |  ------------------
  ------------------
 3205|      0|          goto exception;
 3206|      0|        }
 3207|      0|        O1REG(DelById) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3208|      0|      } else {
 3209|       |        // This is the "slow path".
 3210|      0|        CAPTURE_IP(res = toObject(runtime, Handle<>(&O2REG(DelById))));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 3211|      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]
  |  |  ------------------
  ------------------
 3212|       |          // If an exception is thrown, likely we are trying to convert
 3213|       |          // undefined/null to an object. Passing over the name of the property
 3214|       |          // so that we could emit more meaningful error messages.
 3215|      0|          CAPTURE_IP(amendPropAccessErrorMsgWithPropName(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 3216|      0|              runtime, Handle<>(&O2REG(DelById)), "delete", ID(idVal)));
 3217|      0|          goto exception;
 3218|      0|        }
 3219|      0|        tmpHandle = res.getValue();
 3220|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3221|      0|            auto status,
 3222|      0|            JSObject::deleteNamed(
 3223|      0|                Handle<JSObject>::vmcast(tmpHandle),
 3224|      0|                runtime,
 3225|      0|                ID(idVal),
 3226|      0|                defaultPropOpFlags));
 3227|      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]
  |  |  ------------------
  ------------------
 3228|      0|          goto exception;
 3229|      0|        }
 3230|      0|        O1REG(DelById) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3231|      0|        tmpHandle.clear();
 3232|      0|      }
 3233|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 3234|      0|      ip = nextIP;
 3235|      0|      DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3236|      0|    }
 3237|       |
 3238|      0|      CASE(DelByVal) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3239|      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]
  |  |  ------------------
  ------------------
 3240|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3241|      0|              auto status,
 3242|      0|              JSObject::deleteComputed(
 3243|      0|                  Handle<JSObject>::vmcast(&O2REG(DelByVal)),
 3244|      0|                  runtime,
 3245|      0|                  Handle<>(&O3REG(DelByVal)),
 3246|      0|                  defaultPropOpFlags));
 3247|      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]
  |  |  ------------------
  ------------------
 3248|      0|            goto exception;
 3249|      0|          }
 3250|      0|          O1REG(DelByVal) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3251|      0|        } else {
 3252|       |          // This is the "slow path".
 3253|      0|          CAPTURE_IP(res = toObject(runtime, Handle<>(&O2REG(DelByVal))));
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 3254|      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]
  |  |  ------------------
  ------------------
 3255|      0|            goto exception;
 3256|      0|          }
 3257|      0|          tmpHandle = res.getValue();
 3258|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3259|      0|              auto status,
 3260|      0|              JSObject::deleteComputed(
 3261|      0|                  Handle<JSObject>::vmcast(tmpHandle),
 3262|      0|                  runtime,
 3263|      0|                  Handle<>(&O3REG(DelByVal)),
 3264|      0|                  defaultPropOpFlags));
 3265|      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]
  |  |  ------------------
  ------------------
 3266|      0|            goto exception;
 3267|      0|          }
 3268|      0|          O1REG(DelByVal) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3269|      0|        }
 3270|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3271|      0|        tmpHandle.clear();
 3272|      0|        ip = NEXTINST(DelByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3273|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3274|      0|      }
 3275|      7|      CASE(CreateRegExp) {
  ------------------
  |  | 1063|      7|#define CASE(name) case_##name:
  ------------------
 3276|      7|        {
 3277|       |          // Create the RegExp object.
 3278|      7|          CAPTURE_IP(
  ------------------
  |  |  912|      7|  runtime.setCurrentIP(ip);    \
  |  |  913|      7|  (void)(expr);                \
  |  |  914|      7|  ip = runtime.getCurrentIP(); \
  |  |  915|      7|  runtime.invalidateCurrentIP();
  ------------------
 3279|      7|              O1REG(CreateRegExp) = JSRegExp::create(runtime).getHermesValue());
 3280|      7|          auto re = Handle<JSRegExp>::vmcast(&O1REG(CreateRegExp));
  ------------------
  |  |   31|      7|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      7|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3281|       |          // Initialize the regexp.
 3282|      7|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      7|  runtime.setCurrentIP(ip);           \
  |  |  920|      7|  decl = (expr);                      \
  |  |  921|      7|  ip = runtime.getCurrentIP();        \
  |  |  922|      7|  runtime.invalidateCurrentIP();
  ------------------
 3283|      7|              auto pattern,
 3284|      7|              runtime.makeHandle(curCodeBlock->getRuntimeModule()
 3285|      7|                                     ->getStringPrimFromStringIDMayAllocate(
 3286|      7|                                         ip->iCreateRegExp.op2)));
 3287|      7|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      7|  runtime.setCurrentIP(ip);           \
  |  |  920|      7|  decl = (expr);                      \
  |  |  921|      7|  ip = runtime.getCurrentIP();        \
  |  |  922|      7|  runtime.invalidateCurrentIP();
  ------------------
 3288|      7|              auto flags,
 3289|      7|              runtime.makeHandle(curCodeBlock->getRuntimeModule()
 3290|      7|                                     ->getStringPrimFromStringIDMayAllocate(
 3291|      7|                                         ip->iCreateRegExp.op3)));
 3292|      7|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      7|  runtime.setCurrentIP(ip);           \
  |  |  920|      7|  decl = (expr);                      \
  |  |  921|      7|  ip = runtime.getCurrentIP();        \
  |  |  922|      7|  runtime.invalidateCurrentIP();
  ------------------
 3293|      7|              auto bytecode,
 3294|      7|              curCodeBlock->getRuntimeModule()->getRegExpBytecodeFromRegExpID(
 3295|      7|                  ip->iCreateRegExp.op4));
 3296|      7|          CAPTURE_IP(
  ------------------
  |  |  912|      7|  runtime.setCurrentIP(ip);    \
  |  |  913|      7|  (void)(expr);                \
  |  |  914|      7|  ip = runtime.getCurrentIP(); \
  |  |  915|      7|  runtime.invalidateCurrentIP();
  ------------------
 3297|      7|              JSRegExp::initialize(re, runtime, pattern, flags, bytecode));
 3298|      7|        }
 3299|      7|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3300|      7|        ip = NEXTINST(CreateRegExp);
  ------------------
  |  |   59|      7|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3301|     35|        DISPATCH;
  ------------------
  |  | 1068|      7|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      7|  {                                                                          \
  |  |  |  | 1041|      7|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      7|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      7|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      7|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      7|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      7|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      7|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      7|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      7|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      7|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      7|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      7|  }
  |  |  ------------------
  |  | 1069|      7|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      7|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3302|     35|      }
 3303|       |
 3304|      0|      CASE(SwitchImm) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3305|      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]
  |  |  ------------------
  ------------------
 3306|      0|          double numVal = O1REG(SwitchImm).getNumber();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3307|      0|          uint32_t uintVal = (uint32_t)numVal;
 3308|      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]
  |  |  ------------------
  ------------------
 3309|      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]
  |  |  ------------------
  ------------------
 3310|      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]
  |  |  ------------------
  ------------------
 3311|      0|          {
 3312|       |            // Calculate the offset into the bytecode where the jump table for
 3313|       |            // this SwitchImm starts.
 3314|      0|            const uint8_t *tablestart = (const uint8_t *)llvh::alignAddr(
 3315|      0|                (const uint8_t *)ip + ip->iSwitchImm.op2, sizeof(uint32_t));
 3316|       |
 3317|       |            // Read the offset from the table.
 3318|       |            // Must be signed to account for backwards branching.
 3319|      0|            const int32_t *loc =
 3320|      0|                (const int32_t *)tablestart + uintVal - ip->iSwitchImm.op4;
 3321|       |
 3322|      0|            ip = IPADD(*loc);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 3323|      0|            DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3324|      0|          }
 3325|      0|        }
 3326|       |        // Wrong type or out of range, jump to default.
 3327|      0|        ip = IPADD(ip->iSwitchImm.op3);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 3328|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3329|      0|      }
 3330|  4.49M|      LOAD_CONST(
  ------------------
  |  | 1410|   749k|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|   749k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|   749k|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|   749k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.49M|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|   749k|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|   749k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|   749k|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|   749k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|   749k|  {                                                                          \
  |  |  |  |  |  | 1041|   749k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|   749k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   749k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|   749k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|   749k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   749k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|   749k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   749k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|   749k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|   749k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|   749k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   749k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|   749k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|   749k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|   749k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|   749k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|   749k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|   749k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|   749k|  }
  ------------------
 3331|  4.49M|          LoadConstUInt8,
 3332|  4.49M|          HermesValue::encodeTrustedNumberValue(ip->iLoadConstUInt8.op2));
 3333|  4.49M|      LOAD_CONST(
  ------------------
  |  | 1410|   584k|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|   584k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|   584k|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|   584k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.16M|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|   584k|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|   584k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|   584k|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|   584k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|   584k|  {                                                                          \
  |  |  |  |  |  | 1041|   584k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|   584k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   584k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|   584k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|   584k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   584k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|   584k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   584k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|   584k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|   584k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|   584k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   584k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|   584k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|   584k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|   584k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|   584k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|   584k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|   584k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|   584k|  }
  ------------------
 3334|  3.50M|          LoadConstInt,
 3335|  3.50M|          HermesValue::encodeTrustedNumberValue(ip->iLoadConstInt.op2));
 3336|  3.50M|      LOAD_CONST(
  ------------------
  |  | 1410|  21.2k|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|  21.2k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|  21.2k|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|  21.2k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  42.4k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|  21.2k|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|  21.2k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|  21.2k|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|  21.2k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|  21.2k|  {                                                                          \
  |  |  |  |  |  | 1041|  21.2k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|  21.2k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  21.2k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|  21.2k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|  21.2k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  21.2k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|  21.2k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  21.2k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|  21.2k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|  21.2k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|  21.2k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  21.2k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|  21.2k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|  21.2k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|  21.2k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|  21.2k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|  21.2k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|  21.2k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|  21.2k|  }
  ------------------
 3337|   127k|          LoadConstDouble,
 3338|   127k|          HermesValue::encodeUntrustedNumberValue(ip->iLoadConstDouble.op2));
 3339|  4.58M|      LOAD_CONST_CAPTURE_IP(
  ------------------
  |  | 1417|   764k|  CASE(name) {                             \
  |  |  ------------------
  |  |  |  | 1063|   764k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1418|   764k|    CAPTURE_IP(O1REG(name) = value);       \
  |  |  ------------------
  |  |  |  |  912|   764k|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|   764k|  (void)(expr);                \
  |  |  |  |  914|   764k|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|   764k|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1419|   764k|    ip = NEXTINST(name);                   \
  |  |  ------------------
  |  |  |  |   59|   764k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1420|   764k|    DISPATCH;                              \
  |  |  ------------------
  |  |  |  | 1068|   764k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|   764k|  {                                                                          \
  |  |  |  |  |  | 1041|   764k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|   764k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   764k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|   764k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|   764k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   764k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|   764k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   764k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|   764k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|   764k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|   764k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   764k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|   764k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|   764k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|   764k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|   764k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|   764k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|   764k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1421|   764k|  }
  ------------------
 3340|  4.58M|          LoadConstString,
 3341|  4.58M|          HermesValue::encodeStringValue(
 3342|  4.58M|              curCodeBlock->getRuntimeModule()
 3343|  4.58M|                  ->getStringPrimFromStringIDMayAllocate(
 3344|  4.58M|                      ip->iLoadConstString.op2)));
 3345|  4.58M|      LOAD_CONST_CAPTURE_IP(
  ------------------
  |  | 1417|      0|  CASE(name) {                             \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1418|      0|    CAPTURE_IP(O1REG(name) = value);       \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1419|      0|    ip = NEXTINST(name);                   \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1420|      0|    DISPATCH;                              \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1421|      0|  }
  ------------------
 3346|      0|          LoadConstStringLongIndex,
 3347|      0|          HermesValue::encodeStringValue(
 3348|      0|              curCodeBlock->getRuntimeModule()
 3349|      0|                  ->getStringPrimFromStringIDMayAllocate(
 3350|      0|                      ip->iLoadConstStringLongIndex.op2)));
 3351|      0|      LOAD_CONST(LoadConstEmpty, HermesValue::encodeEmptyValue());
  ------------------
  |  | 1410|      0|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|      0|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|      0|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|      0|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|      0|  }
  ------------------
 3352|  2.36M|      LOAD_CONST(LoadConstUndefined, HermesValue::encodeUndefinedValue());
  ------------------
  |  | 1410|   393k|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|   393k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|   393k|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|   393k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|   787k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|   393k|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|   393k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|   393k|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|   393k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|   393k|  {                                                                          \
  |  |  |  |  |  | 1041|   393k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|   393k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   393k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|   393k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|   393k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   393k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|   393k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   393k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|   393k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|   393k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|   393k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   393k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|   393k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|   393k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|   393k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|   393k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|   393k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|   393k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|   393k|  }
  ------------------
 3353|  2.36M|      LOAD_CONST(LoadConstNull, HermesValue::encodeNullValue());
  ------------------
  |  | 1410|  1.28k|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|  1.28k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|  1.28k|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|  1.28k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  2.56k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|  1.28k|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|  1.28k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|  1.28k|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|  1.28k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|  1.28k|  {                                                                          \
  |  |  |  |  |  | 1041|  1.28k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|  1.28k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|  1.28k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|  1.28k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|  1.28k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|  1.28k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|  1.28k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|  1.28k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|  1.28k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|  1.28k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|  1.28k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|  1.28k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|  1.28k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|  1.28k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|  1.28k|  }
  ------------------
 3354|  2.34M|      LOAD_CONST(LoadConstTrue, HermesValue::encodeBoolValue(true));
  ------------------
  |  | 1410|   391k|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|   391k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|   391k|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|   391k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|   782k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|   391k|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|   391k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|   391k|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|   391k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|   391k|  {                                                                          \
  |  |  |  |  |  | 1041|   391k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|   391k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|   391k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|   391k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|   391k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|   391k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|   391k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|   391k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   391k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|   391k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|   391k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|   391k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|   391k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|   391k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|   391k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|   391k|  }
  ------------------
 3355|  2.34M|      LOAD_CONST(LoadConstFalse, HermesValue::encodeBoolValue(false));
  ------------------
  |  | 1410|    164|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|    164|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|    164|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|    164|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    328|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|    164|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|    164|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|    164|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|    164|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|    164|  {                                                                          \
  |  |  |  |  |  | 1041|    164|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|    164|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    164|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|    164|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|    164|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    164|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|    164|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    164|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|    164|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|    164|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|    164|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    164|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|    164|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|    164|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|    164|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|    164|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|    164|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|    164|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|    164|  }
  ------------------
 3356|  6.11M|      LOAD_CONST(LoadConstZero, HermesValue::encodeTrustedNumberValue(0));
  ------------------
  |  | 1410|  1.01M|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1063|  1.01M|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1411|  1.01M|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|  1.01M|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  2.03M|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1412|  1.01M|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|  1.01M|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1413|  1.01M|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1068|  1.01M|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|  1.01M|  {                                                                          \
  |  |  |  |  |  | 1041|  1.01M|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|  1.01M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.01M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|  1.01M|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|  1.01M|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.01M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|  1.01M|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.01M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|  1.01M|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|  1.01M|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|  1.01M|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.01M|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|  1.01M|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|  1.01M|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|  1.01M|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|  1.01M|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|  1.01M|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|  1.01M|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1414|  1.01M|  }
  ------------------
 3357|  6.11M|      CASE(LoadConstBigInt) {
  ------------------
  |  | 1063|   390k|#define CASE(name) case_##name:
  ------------------
 3358|   390k|        idVal = ip->iLoadConstBigInt.op2;
 3359|   390k|        nextIP = NEXTINST(LoadConstBigInt);
  ------------------
  |  |   59|   390k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3360|   390k|        goto doLoadConstBigInt;
 3361|  6.11M|      }
 3362|      0|      CASE(LoadConstBigIntLongIndex) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3363|      0|        idVal = ip->iLoadConstBigIntLongIndex.op2;
 3364|      0|        nextIP = NEXTINST(LoadConstBigIntLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3365|      0|        goto doLoadConstBigInt;
 3366|  6.11M|      }
 3367|   390k|    doLoadConstBigInt: {
 3368|   390k|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|   390k|  runtime.setCurrentIP(ip);           \
  |  |  920|   390k|  decl = (expr);                      \
  |  |  921|   390k|  ip = runtime.getCurrentIP();        \
  |  |  922|   390k|  runtime.invalidateCurrentIP();
  ------------------
 3369|   390k|          auto res,
 3370|   390k|          BigIntPrimitive::fromBytes(
 3371|   390k|              runtime,
 3372|   390k|              curCodeBlock->getRuntimeModule()->getBigIntBytesFromBigIntId(
 3373|   390k|                  idVal)));
 3374|   390k|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
 3375|      0|        goto exception;
 3376|      0|      }
 3377|       |      // It is safe to access O1REG(LoadConstBigInt) or
 3378|       |      // O1REG(LoadConstBigIntLongIndex) here as both instructions' O1 operands
 3379|       |      // are the same size and live in the same offset w.r.t. the start of the
 3380|       |      // instruction.
 3381|   390k|      O1REG(LoadConstBigInt) = std::move(*res);
  ------------------
  |  |   31|   390k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|   781k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3382|   390k|      ip = nextIP;
 3383|  1.95M|      DISPATCH;
  ------------------
  |  | 1068|   390k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|   390k|  {                                                                          \
  |  |  |  | 1041|   390k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|   390k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|   390k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|   390k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|   390k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|   390k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|   390k|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|   390k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   390k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|   390k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|   390k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|   390k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|   390k|  }
  |  |  ------------------
  |  | 1069|   390k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|   390k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3384|  1.95M|    }
 3385|  1.42M|      BINOP(Sub);
  ------------------
  |  | 1173|   177k|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|   177k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1174|   177k|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|   355k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 386, False: 177k]
  |  |  |  |  |  Branch (188:51): [True: 177k, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 386, False: 177k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1175|    386|      /* Fast-path. */                                                   \
  |  | 1176|    386|      INTERPRETER_FALLTHROUGH;                                           \
  |  | 1177|    387|      CASE(name##N) {                                                    \
  |  |  ------------------
  |  |  |  | 1063|    387|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1178|    387|        O1REG(name) = HermesValue::encodeTrustedNumberValue(             \
  |  |  ------------------
  |  |  |  |   31|    387|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    774|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1179|    387|            do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   32|    387|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    387|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                           do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   33|    387|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    387|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1180|    387|        ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|    387|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1181|  1.93k|        DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|    387|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|    387|  {                                                                          \
  |  |  |  |  |  | 1041|    387|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|    387|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    387|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|    387|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|    387|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    387|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|    387|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    387|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|    387|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|    387|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|    387|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    387|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|    387|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|    387|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|    387|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|    387|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|    387|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|    387|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1182|  1.93k|      }                                                                  \
  |  | 1183|  1.93k|    }                                                                    \
  |  | 1184|   177k|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|   177k|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|   177k|  (void)(expr);                \
  |  |  |  |  914|   177k|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|   177k|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1185|   177k|        res = doOperSlowPath<do##name>(                                  \
  |  | 1186|   177k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1187|   177k|    if (res == ExecutionStatus::EXCEPTION)                               \
  |  |  ------------------
  |  |  |  Branch (1187:9): [True: 0, False: 177k]
  |  |  ------------------
  |  | 1188|   177k|      goto exception;                                                    \
  |  | 1189|   177k|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|   177k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|   355k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1190|   177k|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1191|   177k|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|   177k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1192|   177k|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|   177k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|   177k|  {                                                                          \
  |  |  |  |  |  | 1041|   177k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|   177k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|   177k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|   177k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|   177k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|   177k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|   177k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|   177k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|   177k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|   177k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|   177k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|   177k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|   177k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|   177k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|   177k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1193|   177k|  }
  ------------------
 3386|  1.42M|      BINOP(Mul);
  ------------------
  |  | 1173|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1174|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1175|      0|      /* Fast-path. */                                                   \
  |  | 1176|      0|      INTERPRETER_FALLTHROUGH;                                           \
  |  | 1177|      1|      CASE(name##N) {                                                    \
  |  |  ------------------
  |  |  |  | 1063|      1|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1178|      1|        O1REG(name) = HermesValue::encodeTrustedNumberValue(             \
  |  |  ------------------
  |  |  |  |   31|      1|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1179|      1|            do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   32|      1|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      1|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                           do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   33|      1|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      1|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1180|      1|        ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      1|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1181|      5|        DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|      1|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      1|  {                                                                          \
  |  |  |  |  |  | 1041|      1|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      1|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      1|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      1|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      1|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      1|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      1|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      1|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      1|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      1|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      1|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      1|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      1|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      1|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1182|      5|      }                                                                  \
  |  | 1183|      5|    }                                                                    \
  |  | 1184|      1|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      1|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      1|  (void)(expr);                \
  |  |  |  |  914|      1|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      1|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1185|      1|        res = doOperSlowPath<do##name>(                                  \
  |  | 1186|      1|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1187|      1|    if (res == ExecutionStatus::EXCEPTION)                               \
  |  |  ------------------
  |  |  |  Branch (1187:9): [True: 0, False: 1]
  |  |  ------------------
  |  | 1188|      1|      goto exception;                                                    \
  |  | 1189|      1|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      1|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1190|      1|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1191|      1|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      1|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1192|      1|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      1|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      1|  {                                                                          \
  |  |  |  |  |  | 1041|      1|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      1|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      1|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      1|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1193|      0|  }
  ------------------
 3387|      2|      BINOP(Div);
  ------------------
  |  | 1173|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1174|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1175|      0|      /* Fast-path. */                                                   \
  |  | 1176|      0|      INTERPRETER_FALLTHROUGH;                                           \
  |  | 1177|      0|      CASE(name##N) {                                                    \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1178|      0|        O1REG(name) = HermesValue::encodeTrustedNumberValue(             \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1179|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1180|      0|        ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1181|      0|        DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1182|      0|      }                                                                  \
  |  | 1183|      0|    }                                                                    \
  |  | 1184|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1185|      0|        res = doOperSlowPath<do##name>(                                  \
  |  | 1186|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1187|      0|    if (res == ExecutionStatus::EXCEPTION)                               \
  |  |  ------------------
  |  |  |  Branch (1187:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1188|      0|      goto exception;                                                    \
  |  | 1189|      0|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1190|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1191|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1192|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1193|      0|  }
  ------------------
 3388|       |      // Can't do BINOP(Mod) as there's no ModN opcode.
 3389|      8|      BITWISEBINOP(BitAnd);
  ------------------
  |  | 1246|      1|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      1|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1247|      1|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      2|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 1]
  |  |  |  |  |  Branch (188:51): [True: 1, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1248|      0|      /* Fast-path. */                                                   \
  |  | 1249|      0|      O1REG(name) = HermesValue::encodeTrustedNumberValue(do##name(      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1250|      0|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1251|      0|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1252|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1253|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1254|      0|    }                                                                    \
  |  | 1255|      1|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      1|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      1|  (void)(expr);                \
  |  |  |  |  914|      1|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      1|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1256|      1|        res = doBitOperSlowPath<do##name>(                               \
  |  | 1257|      1|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1258|      1|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {              \
  |  |  ------------------
  |  |  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1259|      0|      goto exception;                                                    \
  |  | 1260|      0|    }                                                                    \
  |  | 1261|      1|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      1|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1262|      1|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1263|      1|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      1|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1264|      1|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      1|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      1|  {                                                                          \
  |  |  |  |  |  | 1041|      1|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      1|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      1|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      1|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      1|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      1|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      1|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      1|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      1|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      1|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      1|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      1|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      1|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      1|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1265|      1|  }
  ------------------
 3390|      8|      BITWISEBINOP(BitOr);
  ------------------
  |  | 1246|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1247|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1248|      0|      /* Fast-path. */                                                   \
  |  | 1249|      0|      O1REG(name) = HermesValue::encodeTrustedNumberValue(do##name(      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1250|      0|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1251|      0|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1252|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1253|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1254|      0|    }                                                                    \
  |  | 1255|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1256|      0|        res = doBitOperSlowPath<do##name>(                               \
  |  | 1257|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1258|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1259|      0|      goto exception;                                                    \
  |  | 1260|      0|    }                                                                    \
  |  | 1261|      0|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1262|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1263|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1264|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1265|      0|  }
  ------------------
 3391|      0|      BITWISEBINOP(BitXor);
  ------------------
  |  | 1246|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1247|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1248|      0|      /* Fast-path. */                                                   \
  |  | 1249|      0|      O1REG(name) = HermesValue::encodeTrustedNumberValue(do##name(      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1250|      0|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1251|      0|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1252|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1253|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1254|      0|    }                                                                    \
  |  | 1255|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1256|      0|        res = doBitOperSlowPath<do##name>(                               \
  |  | 1257|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1258|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1259|      0|      goto exception;                                                    \
  |  | 1260|      0|    }                                                                    \
  |  | 1261|      0|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1262|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1263|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1264|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1265|      0|  }
  ------------------
 3392|      0|      SHIFTOP(LShift);
  ------------------
  |  | 1219|      0|  CASE(name) {                                                                 \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1220|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1221|      0|            O2REG(name).isNumber() &&                                          \
  |  | 1222|      0|            O3REG(name).isNumber())) { /* Fast-path. */                        \
  |  | 1223|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1224|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1225|      0|      O1REG(name) =                                                            \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1226|      0|          HermesValue::encodeTrustedNumberValue(do##name(lnum, rnum));         \
  |  | 1227|      0|      ip = NEXTINST(name);                                                     \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1228|      0|      DISPATCH;                                                                \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1229|      0|    }                                                                          \
  |  | 1230|      0|    CAPTURE_IP(                                                                \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1231|      0|        res = doShiftOperSlowPath<do##name>(                                   \
  |  | 1232|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
  |  | 1233|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1234|      0|      goto exception;                                                          \
  |  | 1235|      0|    }                                                                          \
  |  | 1236|      0|    O1REG(name) = *res;                                                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1237|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
  |  | 1238|      0|    ip = NEXTINST(name);                                                       \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1239|      0|    DISPATCH;                                                                  \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1240|      0|  }
  ------------------
 3393|      0|      SHIFTOP(RShift);
  ------------------
  |  | 1219|      0|  CASE(name) {                                                                 \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1220|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1221|      0|            O2REG(name).isNumber() &&                                          \
  |  | 1222|      0|            O3REG(name).isNumber())) { /* Fast-path. */                        \
  |  | 1223|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1224|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1225|      0|      O1REG(name) =                                                            \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1226|      0|          HermesValue::encodeTrustedNumberValue(do##name(lnum, rnum));         \
  |  | 1227|      0|      ip = NEXTINST(name);                                                     \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1228|      0|      DISPATCH;                                                                \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1229|      0|    }                                                                          \
  |  | 1230|      0|    CAPTURE_IP(                                                                \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1231|      0|        res = doShiftOperSlowPath<do##name>(                                   \
  |  | 1232|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
  |  | 1233|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1234|      0|      goto exception;                                                          \
  |  | 1235|      0|    }                                                                          \
  |  | 1236|      0|    O1REG(name) = *res;                                                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1237|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
  |  | 1238|      0|    ip = NEXTINST(name);                                                       \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1239|      0|    DISPATCH;                                                                  \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1240|      0|  }
  ------------------
 3394|      0|      SHIFTOP(URshift);
  ------------------
  |  | 1219|      0|  CASE(name) {                                                                 \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1220|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1221|      0|            O2REG(name).isNumber() &&                                          \
  |  | 1222|      0|            O3REG(name).isNumber())) { /* Fast-path. */                        \
  |  | 1223|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1224|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1225|      0|      O1REG(name) =                                                            \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1226|      0|          HermesValue::encodeTrustedNumberValue(do##name(lnum, rnum));         \
  |  | 1227|      0|      ip = NEXTINST(name);                                                     \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1228|      0|      DISPATCH;                                                                \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1229|      0|    }                                                                          \
  |  | 1230|      0|    CAPTURE_IP(                                                                \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1231|      0|        res = doShiftOperSlowPath<do##name>(                                   \
  |  | 1232|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
  |  | 1233|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1234|      0|      goto exception;                                                          \
  |  | 1235|      0|    }                                                                          \
  |  | 1236|      0|    O1REG(name) = *res;                                                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1237|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
  |  | 1238|      0|    ip = NEXTINST(name);                                                       \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1239|      0|    DISPATCH;                                                                  \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1240|      0|  }
  ------------------
 3395|      0|      CONDOP(Less, <, lessOp_RJS);
  ------------------
  |  | 1273|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1274|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1275|      0|      /* Fast-path. */                                                   \
  |  | 1276|      0|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1277|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1278|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1279|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1280|      0|    }                                                                    \
  |  | 1281|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1282|      0|        boolRes = operFuncName(                                          \
  |  | 1283|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1284|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1284:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1285|      0|      goto exception;                                                    \
  |  | 1286|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1287|      0|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1288|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1289|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1290|      0|  }
  ------------------
 3396|      0|      CONDOP(LessEq, <=, lessEqualOp_RJS);
  ------------------
  |  | 1273|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1274|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1275|      0|      /* Fast-path. */                                                   \
  |  | 1276|      0|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1277|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1278|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1279|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1280|      0|    }                                                                    \
  |  | 1281|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1282|      0|        boolRes = operFuncName(                                          \
  |  | 1283|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1284|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1284:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1285|      0|      goto exception;                                                    \
  |  | 1286|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1287|      0|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1288|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1289|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1290|      0|  }
  ------------------
 3397|      0|      CONDOP(Greater, >, greaterOp_RJS);
  ------------------
  |  | 1273|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1274|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1275|      0|      /* Fast-path. */                                                   \
  |  | 1276|      0|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1277|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1278|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1279|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1280|      0|    }                                                                    \
  |  | 1281|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1282|      0|        boolRes = operFuncName(                                          \
  |  | 1283|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1284|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1284:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1285|      0|      goto exception;                                                    \
  |  | 1286|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1287|      0|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1288|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1289|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1290|      0|  }
  ------------------
 3398|      0|      CONDOP(GreaterEq, >=, greaterEqualOp_RJS);
  ------------------
  |  | 1273|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1274|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1275|      0|      /* Fast-path. */                                                   \
  |  | 1276|      0|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1277|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1278|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1279|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1280|      0|    }                                                                    \
  |  | 1281|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1282|      0|        boolRes = operFuncName(                                          \
  |  | 1283|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1284|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1284:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1285|      0|      goto exception;                                                    \
  |  | 1286|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1287|      0|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1288|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1289|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1290|      0|  }
  ------------------
 3399|      0|      JCOND(Less, <, lessOp_RJS);
  ------------------
  |  | 1378|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1379|      0|      J##name,                          \
  |  | 1380|      0|      ,                                 \
  |  | 1381|      0|      oper,                             \
  |  | 1382|      0|      operFuncName,                     \
  |  | 1383|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1384|      0|      NEXTINST(J##name));               \
  |  | 1385|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1386|      0|      J##name,                          \
  |  | 1387|      0|      Long,                             \
  |  | 1388|      0|      oper,                             \
  |  | 1389|      0|      operFuncName,                     \
  |  | 1390|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1391|      0|      NEXTINST(J##name##Long));         \
  |  | 1392|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1393|      0|      JNot##name,                       \
  |  | 1394|      0|      ,                                 \
  |  | 1395|      0|      oper,                             \
  |  | 1396|      0|      operFuncName,                     \
  |  | 1397|      0|      NEXTINST(JNot##name),             \
  |  | 1398|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1399|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1400|      0|      JNot##name,                       \
  |  | 1401|      0|      Long,                             \
  |  | 1402|      0|      oper,                             \
  |  | 1403|      0|      operFuncName,                     \
  |  | 1404|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1405|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3400|      0|      JCOND(LessEqual, <=, lessEqualOp_RJS);
  ------------------
  |  | 1378|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1379|      0|      J##name,                          \
  |  | 1380|      0|      ,                                 \
  |  | 1381|      0|      oper,                             \
  |  | 1382|      0|      operFuncName,                     \
  |  | 1383|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1384|      0|      NEXTINST(J##name));               \
  |  | 1385|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1386|      0|      J##name,                          \
  |  | 1387|      0|      Long,                             \
  |  | 1388|      0|      oper,                             \
  |  | 1389|      0|      operFuncName,                     \
  |  | 1390|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1391|      0|      NEXTINST(J##name##Long));         \
  |  | 1392|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1393|      0|      JNot##name,                       \
  |  | 1394|      0|      ,                                 \
  |  | 1395|      0|      oper,                             \
  |  | 1396|      0|      operFuncName,                     \
  |  | 1397|      0|      NEXTINST(JNot##name),             \
  |  | 1398|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1399|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1400|      0|      JNot##name,                       \
  |  | 1401|      0|      Long,                             \
  |  | 1402|      0|      oper,                             \
  |  | 1403|      0|      operFuncName,                     \
  |  | 1404|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1405|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3401|      0|      JCOND(Greater, >, greaterOp_RJS);
  ------------------
  |  | 1378|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1379|      0|      J##name,                          \
  |  | 1380|      0|      ,                                 \
  |  | 1381|      0|      oper,                             \
  |  | 1382|      0|      operFuncName,                     \
  |  | 1383|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1384|      0|      NEXTINST(J##name));               \
  |  | 1385|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1386|      0|      J##name,                          \
  |  | 1387|      0|      Long,                             \
  |  | 1388|      0|      oper,                             \
  |  | 1389|      0|      operFuncName,                     \
  |  | 1390|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1391|      0|      NEXTINST(J##name##Long));         \
  |  | 1392|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1393|      0|      JNot##name,                       \
  |  | 1394|      0|      ,                                 \
  |  | 1395|      0|      oper,                             \
  |  | 1396|      0|      operFuncName,                     \
  |  | 1397|      0|      NEXTINST(JNot##name),             \
  |  | 1398|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1399|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1400|      0|      JNot##name,                       \
  |  | 1401|      0|      Long,                             \
  |  | 1402|      0|      oper,                             \
  |  | 1403|      0|      operFuncName,                     \
  |  | 1404|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1405|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3402|      0|      JCOND(GreaterEqual, >=, greaterEqualOp_RJS);
  ------------------
  |  | 1378|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1379|      0|      J##name,                          \
  |  | 1380|      0|      ,                                 \
  |  | 1381|      0|      oper,                             \
  |  | 1382|      0|      operFuncName,                     \
  |  | 1383|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1384|      0|      NEXTINST(J##name));               \
  |  | 1385|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1386|      0|      J##name,                          \
  |  | 1387|      0|      Long,                             \
  |  | 1388|      0|      oper,                             \
  |  | 1389|      0|      operFuncName,                     \
  |  | 1390|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1391|      0|      NEXTINST(J##name##Long));         \
  |  | 1392|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1393|      0|      JNot##name,                       \
  |  | 1394|      0|      ,                                 \
  |  | 1395|      0|      oper,                             \
  |  | 1396|      0|      operFuncName,                     \
  |  | 1397|      0|      NEXTINST(JNot##name),             \
  |  | 1398|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1399|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1303|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1304|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1305|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1306|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1307|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1308|      0|      INTERPRETER_FALLTHROUGH;                                            \
  |  |  |  | 1309|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1310|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1312|      0|                .getNumber()) {                                           \
  |  |  |  | 1313|      0|          ip = trueDest;                                                  \
  |  |  |  | 1314|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1315|      0|        }                                                                 \
  |  |  |  | 1316|      0|        ip = falseDest;                                                   \
  |  |  |  | 1317|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1318|      0|      }                                                                   \
  |  |  |  | 1319|      0|    }                                                                     \
  |  |  |  | 1320|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  913|      0|  (void)(expr);                \
  |  |  |  |  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  915|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1321|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1322|      0|            runtime,                                                      \
  |  |  |  | 1323|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1324|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1325|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1326|      0|      goto exception;                                                     \
  |  |  |  | 1327|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1328|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1328:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1329|      0|      ip = trueDest;                                                      \
  |  |  |  | 1330|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1331|      0|    }                                                                     \
  |  |  |  | 1332|      0|    ip = falseDest;                                                       \
  |  |  |  | 1333|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1073|      0|  }                                             \
  |  |  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1334|      0|  }
  |  |  ------------------
  |  | 1400|      0|      JNot##name,                       \
  |  | 1401|      0|      Long,                             \
  |  | 1402|      0|      oper,                             \
  |  | 1403|      0|      operFuncName,                     \
  |  | 1404|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1405|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3403|       |
 3404|  1.92k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1342|    960|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1063|    960|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1343|    960|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   32|    960|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    960|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   33|    960|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    960|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (1343:9): [True: 960, False: 0]
  |  |  ------------------
  |  | 1344|    960|      ip = trueDest;                                                    \
  |  | 1345|  4.80k|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1068|    960|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|    960|  {                                                                          \
  |  |  |  |  |  | 1041|    960|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|    960|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|    960|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|    960|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|    960|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|    960|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|    960|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|    960|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|    960|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|    960|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|    960|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|    960|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1346|  4.80k|    }                                                                   \
  |  | 1347|    960|    ip = falseDest;                                                     \
  |  | 1348|    960|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1068|    960|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|    960|  {                                                                          \
  |  |  |  |  |  | 1041|    960|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|    960|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    960|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|    960|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|    960|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1349|      0|  }
  ------------------
 3405|  1.92k|          JStrictEqual, , IPADD(ip->iJStrictEqual.op1), NEXTINST(JStrictEqual));
 3406|  1.92k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1342|      0|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1343|      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 (1343:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1344|      0|      ip = trueDest;                                                    \
  |  | 1345|      0|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1346|      0|    }                                                                   \
  |  | 1347|      0|    ip = falseDest;                                                     \
  |  | 1348|      0|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1349|      0|  }
  ------------------
 3407|      0|          JStrictEqual,
 3408|      0|          Long,
 3409|      0|          IPADD(ip->iJStrictEqualLong.op1),
 3410|      0|          NEXTINST(JStrictEqualLong));
 3411|  3.84k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1342|  1.92k|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1063|  1.92k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1343|  1.92k|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   32|  1.92k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.92k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   33|  1.92k|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.92k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (1343:9): [True: 1.92k, False: 0]
  |  |  ------------------
  |  | 1344|  1.92k|      ip = trueDest;                                                    \
  |  | 1345|  9.60k|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1068|  1.92k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|  1.92k|  {                                                                          \
  |  |  |  |  |  | 1041|  1.92k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|  1.92k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.92k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|  1.92k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|  1.92k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.92k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|  1.92k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.92k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|  1.92k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|  1.92k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|  1.92k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.92k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|  1.92k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|  1.92k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|  1.92k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|  1.92k|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|  1.92k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|  1.92k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1346|  9.60k|    }                                                                   \
  |  | 1347|  1.92k|    ip = falseDest;                                                     \
  |  | 1348|  1.92k|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1068|  1.92k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|  1.92k|  {                                                                          \
  |  |  |  |  |  | 1041|  1.92k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|  1.92k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.92k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|  1.92k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|  1.92k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1349|      0|  }
  ------------------
 3412|  3.84k|          JStrictNotEqual,
 3413|  3.84k|          ,
 3414|  3.84k|          NEXTINST(JStrictNotEqual),
 3415|  3.84k|          IPADD(ip->iJStrictNotEqual.op1));
 3416|  3.84k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1342|      0|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1343|      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 (1343:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1344|      0|      ip = trueDest;                                                    \
  |  | 1345|      0|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1346|      0|    }                                                                   \
  |  | 1347|      0|    ip = falseDest;                                                     \
  |  | 1348|      0|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1349|      0|  }
  ------------------
 3417|      0|          JStrictNotEqual,
 3418|      0|          Long,
 3419|      0|          NEXTINST(JStrictNotEqualLong),
 3420|      0|          IPADD(ip->iJStrictNotEqualLong.op1));
 3421|       |
 3422|  2.56k|      JCOND_EQ_IMPL(JEqual, , IPADD(ip->iJEqual.op1), NEXTINST(JEqual));
  ------------------
  |  | 1357|    320|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1063|    320|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1358|    320|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  919|    320|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|    320|  decl = (expr);                      \
  |  |  |  |  921|    320|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|    320|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1359|    320|        auto eqRes,                                      \
  |  | 1360|    320|        abstractEqualityTest_RJS(                        \
  |  | 1361|    320|            runtime,                                     \
  |  | 1362|    320|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1363|    320|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1364|    320|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1364:9): [True: 0, False: 320]
  |  |  ------------------
  |  | 1365|      0|      goto exception;                                    \
  |  | 1366|      0|    }                                                    \
  |  | 1367|    320|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1368|    320|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1368:9): [True: 0, False: 320]
  |  |  ------------------
  |  | 1369|      0|      ip = trueDest;                                     \
  |  | 1370|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1371|      0|    }                                                    \
  |  | 1372|    320|    ip = falseDest;                                      \
  |  | 1373|    320|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1068|    320|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|    320|  {                                                                          \
  |  |  |  |  |  | 1041|    320|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|    320|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|    320|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|    320|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|    320|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|    320|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|    320|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|    320|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    320|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|    320|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|    320|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|    320|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|    320|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|    320|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|    320|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1374|    320|  }
  ------------------
 3423|  2.56k|      JCOND_EQ_IMPL(
  ------------------
  |  | 1357|      0|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1358|      0|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1359|      0|        auto eqRes,                                      \
  |  | 1360|      0|        abstractEqualityTest_RJS(                        \
  |  | 1361|      0|            runtime,                                     \
  |  | 1362|      0|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1363|      0|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1364|      0|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1364:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1365|      0|      goto exception;                                    \
  |  | 1366|      0|    }                                                    \
  |  | 1367|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1368|      0|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1368:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1369|      0|      ip = trueDest;                                     \
  |  | 1370|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1371|      0|    }                                                    \
  |  | 1372|      0|    ip = falseDest;                                      \
  |  | 1373|      0|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1374|      0|  }
  ------------------
 3424|      0|          JEqual, Long, IPADD(ip->iJEqualLong.op1), NEXTINST(JEqualLong));
 3425|      0|      JCOND_EQ_IMPL(
  ------------------
  |  | 1357|      0|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1358|      0|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1359|      0|        auto eqRes,                                      \
  |  | 1360|      0|        abstractEqualityTest_RJS(                        \
  |  | 1361|      0|            runtime,                                     \
  |  | 1362|      0|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1363|      0|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1364|      0|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1364:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1365|      0|      goto exception;                                    \
  |  | 1366|      0|    }                                                    \
  |  | 1367|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1368|      0|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1368:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1369|      0|      ip = trueDest;                                     \
  |  | 1370|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1371|      0|    }                                                    \
  |  | 1372|      0|    ip = falseDest;                                      \
  |  | 1373|      0|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1374|      0|  }
  ------------------
 3426|      0|          JNotEqual, , NEXTINST(JNotEqual), IPADD(ip->iJNotEqual.op1));
 3427|      0|      JCOND_EQ_IMPL(
  ------------------
  |  | 1357|      0|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1358|      0|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1359|      0|        auto eqRes,                                      \
  |  | 1360|      0|        abstractEqualityTest_RJS(                        \
  |  | 1361|      0|            runtime,                                     \
  |  | 1362|      0|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1363|      0|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1364|      0|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1364:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1365|      0|      goto exception;                                    \
  |  | 1366|      0|    }                                                    \
  |  | 1367|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1368|      0|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1368:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1369|      0|      ip = trueDest;                                     \
  |  | 1370|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1371|      0|    }                                                    \
  |  | 1372|      0|    ip = falseDest;                                      \
  |  | 1373|      0|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1374|      0|  }
  ------------------
 3428|      0|          JNotEqual,
 3429|      0|          Long,
 3430|      0|          NEXTINST(JNotEqualLong),
 3431|      0|          IPADD(ip->iJNotEqualLong.op1));
 3432|       |
 3433|      0|      CASE_OUTOFLINE(PutOwnByVal);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1160|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1161|      0|      goto exception;                                                \
  |  | 1162|      0|    }                                                                \
  |  | 1163|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1164|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|  }
  ------------------
 3434|      0|      CASE_OUTOFLINE(PutOwnGetterSetterByVal);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1160|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1161|      0|      goto exception;                                                \
  |  | 1162|      0|    }                                                                \
  |  | 1163|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1164|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|  }
  ------------------
 3435|      0|      CASE_OUTOFLINE(DirectEval);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1160|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1161|      0|      goto exception;                                                \
  |  | 1162|      0|    }                                                                \
  |  | 1163|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1164|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|  }
  ------------------
 3436|       |
 3437|      0|      CASE_OUTOFLINE(IteratorBegin);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1160|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1161|      0|      goto exception;                                                \
  |  | 1162|      0|    }                                                                \
  |  | 1163|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1164|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|  }
  ------------------
 3438|      0|      CASE_OUTOFLINE(IteratorNext);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1063|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  920|      0|  decl = (expr);                      \
  |  |  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  922|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1160|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1161|      0|      goto exception;                                                \
  |  | 1162|      0|    }                                                                \
  |  | 1163|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1164|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  |  |  | 1055|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1073|      0|  }                                             \
  |  |  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|  }
  ------------------
 3439|      0|      CASE(IteratorClose) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3440|      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]
  |  |  ------------------
  ------------------
 3441|       |          // The iterator must be closed if it's still an object.
 3442|       |          // That means it was never an index and is not done iterating (a state
 3443|       |          // which is indicated by `undefined`).
 3444|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3445|      0|              auto res,
 3446|      0|              iteratorClose(
 3447|      0|                  runtime,
 3448|      0|                  Handle<JSObject>::vmcast(&O1REG(IteratorClose)),
 3449|      0|                  Runtime::getEmptyValue()));
 3450|      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]
  |  |  ------------------
  ------------------
 3451|      0|            if (ip->iIteratorClose.op2 &&
  ------------------
  |  Branch (3451:17): [True: 0, False: 0]
  ------------------
 3452|      0|                !isUncatchableError(runtime.thrownValue_)) {
  ------------------
  |  Branch (3452:17): [True: 0, False: 0]
  ------------------
 3453|       |              // Ignore inner exception.
 3454|      0|              runtime.clearThrownValue();
 3455|      0|            } else {
 3456|      0|              goto exception;
 3457|      0|            }
 3458|      0|          }
 3459|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 3460|      0|        }
 3461|      0|        ip = NEXTINST(IteratorClose);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3462|      0|        DISPATCH;
  ------------------
  |  | 1068|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1040|      0|  {                                                                          \
  |  |  |  | 1041|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1042|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1043|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1044|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1045|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1046|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1047|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1048|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1049|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1050|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1051|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1051:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1052|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1053|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1054|      0|    }                                                                        \
  |  |  |  | 1055|      0|  }
  |  |  ------------------
  |  | 1069|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1069:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1070|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1071|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1072|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1073|      0|  }                                             \
  |  | 1074|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3463|      0|      }
 3464|       |
 3465|       |#ifdef HERMES_RUN_WASM
 3466|       |      // Asm.js/Wasm Intrinsics
 3467|       |      CASE(Add32) {
 3468|       |        O1REG(Add32) = HermesValue::encodeUntrustedNumberValue(
 3469|       |            (int32_t)(int64_t)(O2REG(Add32).getNumber() +
 3470|       |                               O3REG(Add32).getNumber()));
 3471|       |        ip = NEXTINST(Add32);
 3472|       |        DISPATCH;
 3473|       |      }
 3474|       |      CASE(Sub32) {
 3475|       |        O1REG(Sub32) = HermesValue::encodeUntrustedNumberValue(
 3476|       |            (int32_t)(int64_t)(O2REG(Sub32).getNumber() -
 3477|       |                               O3REG(Sub32).getNumber()));
 3478|       |        ip = NEXTINST(Sub32);
 3479|       |        DISPATCH;
 3480|       |      }
 3481|       |      CASE(Mul32) {
 3482|       |        // Signedness matters for multiplication, but low 32 bits are the same
 3483|       |        // regardless of signedness.
 3484|       |        const uint32_t arg0 = (uint32_t)(int32_t)(O2REG(Mul32).getNumber());
 3485|       |        const uint32_t arg1 = (uint32_t)(int32_t)(O3REG(Mul32).getNumber());
 3486|       |        O1REG(Mul32) =
 3487|       |            HermesValue::encodeUntrustedNumberValue((int32_t)(arg0 * arg1));
 3488|       |        ip = NEXTINST(Mul32);
 3489|       |        DISPATCH;
 3490|       |      }
 3491|       |      CASE(Divi32) {
 3492|       |        const int32_t arg0 = (int32_t)(O2REG(Divi32).getNumber());
 3493|       |        const int32_t arg1 = (int32_t)(O3REG(Divi32).getNumber());
 3494|       |        O1REG(Divi32) = HermesValue::encodeUntrustedNumberValue(arg0 / arg1);
 3495|       |        ip = NEXTINST(Divi32);
 3496|       |        DISPATCH;
 3497|       |      }
 3498|       |      CASE(Divu32) {
 3499|       |        const uint32_t arg0 = (uint32_t)(int32_t)(O2REG(Divu32).getNumber());
 3500|       |        const uint32_t arg1 = (uint32_t)(int32_t)(O3REG(Divu32).getNumber());
 3501|       |        O1REG(Divu32) =
 3502|       |            HermesValue::encodeUntrustedNumberValue((int32_t)(arg0 / arg1));
 3503|       |        ip = NEXTINST(Divu32);
 3504|       |        DISPATCH;
 3505|       |      }
 3506|       |
 3507|       |      CASE(Loadi8) {
 3508|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadi8));
 3509|       |        int8_t *basePtr = reinterpret_cast<int8_t *>(mem->begin(runtime));
 3510|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadi8).getNumber());
 3511|       |        O1REG(Loadi8) = HermesValue::encodeUntrustedNumberValue(basePtr[addr]);
 3512|       |        ip = NEXTINST(Loadi8);
 3513|       |        DISPATCH;
 3514|       |      }
 3515|       |      CASE(Loadu8) {
 3516|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadu8));
 3517|       |        uint8_t *basePtr = reinterpret_cast<uint8_t *>(mem->begin(runtime));
 3518|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadu8).getNumber());
 3519|       |        O1REG(Loadu8) = HermesValue::encodeUntrustedNumberValue(basePtr[addr]);
 3520|       |        ip = NEXTINST(Loadu8);
 3521|       |        DISPATCH;
 3522|       |      }
 3523|       |      CASE(Loadi16) {
 3524|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadi16));
 3525|       |        int16_t *basePtr = reinterpret_cast<int16_t *>(mem->begin(runtime));
 3526|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadi16).getNumber());
 3527|       |        O1REG(Loadi16) =
 3528|       |            HermesValue::encodeUntrustedNumberValue(basePtr[addr >> 1]);
 3529|       |        ip = NEXTINST(Loadi16);
 3530|       |        DISPATCH;
 3531|       |      }
 3532|       |      CASE(Loadu16) {
 3533|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadu16));
 3534|       |        uint16_t *basePtr = reinterpret_cast<uint16_t *>(mem->begin(runtime));
 3535|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadu16).getNumber());
 3536|       |        O1REG(Loadu16) =
 3537|       |            HermesValue::encodeUntrustedNumberValue(basePtr[addr >> 1]);
 3538|       |        ip = NEXTINST(Loadu16);
 3539|       |        DISPATCH;
 3540|       |      }
 3541|       |      CASE(Loadi32) {
 3542|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadi32));
 3543|       |        int32_t *basePtr = reinterpret_cast<int32_t *>(mem->begin(runtime));
 3544|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadi32).getNumber());
 3545|       |        O1REG(Loadi32) =
 3546|       |            HermesValue::encodeUntrustedNumberValue(basePtr[addr >> 2]);
 3547|       |        ip = NEXTINST(Loadi32);
 3548|       |        DISPATCH;
 3549|       |      }
 3550|       |      CASE(Loadu32) {
 3551|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadu32));
 3552|       |        uint32_t *basePtr = reinterpret_cast<uint32_t *>(mem->begin(runtime));
 3553|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadu32).getNumber());
 3554|       |        O1REG(Loadu32) = HermesValue::encodeUntrustedNumberValue(
 3555|       |            (int32_t)(basePtr[addr >> 2]));
 3556|       |        ip = NEXTINST(Loadu32);
 3557|       |        DISPATCH;
 3558|       |      }
 3559|       |
 3560|       |      CASE(Store8) {
 3561|       |        auto *mem = vmcast<JSTypedArrayBase>(O1REG(Store8));
 3562|       |        int8_t *basePtr = reinterpret_cast<int8_t *>(mem->begin(runtime));
 3563|       |        const uint32_t addr = (uint32_t)(int32_t)(O2REG(Store8).getNumber());
 3564|       |        basePtr[addr] = (int8_t)(int32_t)(O3REG(Store8).getNumber());
 3565|       |        ip = NEXTINST(Store8);
 3566|       |        DISPATCH;
 3567|       |      }
 3568|       |      CASE(Store16) {
 3569|       |        auto *mem = vmcast<JSTypedArrayBase>(O1REG(Store16));
 3570|       |        int16_t *basePtr = reinterpret_cast<int16_t *>(mem->begin(runtime));
 3571|       |        const uint32_t addr = (uint32_t)(int32_t)(O2REG(Store16).getNumber());
 3572|       |        basePtr[addr >> 1] = (int16_t)(int32_t)(O3REG(Store16).getNumber());
 3573|       |        ip = NEXTINST(Store16);
 3574|       |        DISPATCH;
 3575|       |      }
 3576|       |      CASE(Store32) {
 3577|       |        auto *mem = vmcast<JSTypedArrayBase>(O1REG(Store32));
 3578|       |        int32_t *basePtr = reinterpret_cast<int32_t *>(mem->begin(runtime));
 3579|       |        const uint32_t addr = (uint32_t)(int32_t)(O2REG(Store32).getNumber());
 3580|       |        basePtr[addr >> 2] = (int32_t)(O3REG(Store32).getNumber());
 3581|       |        // A nop for now.
 3582|       |        ip = NEXTINST(Store32);
 3583|       |        DISPATCH;
 3584|       |      }
 3585|       |#endif
 3586|       |
 3587|      0|      CASE(_last) {
  ------------------
  |  | 1063|      0|#define CASE(name) case_##name:
  ------------------
 3588|      0|        hermes_fatal("Invalid opcode _last");
 3589|      0|      }
 3590|      0|    }
 3591|       |
 3592|      0|    hermes_fatal(
 3593|      0|        "All opcodes should dispatch to the next and not fallthrough "
 3594|      0|        "to here");
 3595|       |
 3596|       |  // We arrive here if we couldn't allocate the registers for the current frame.
 3597|      0|  stackOverflow:
 3598|      0|    CAPTURE_IP(runtime.raiseStackOverflow(
  ------------------
  |  |  912|      0|  runtime.setCurrentIP(ip);    \
  |  |  913|      0|  (void)(expr);                \
  |  |  914|      0|  ip = runtime.getCurrentIP(); \
  |  |  915|      0|  runtime.invalidateCurrentIP();
  ------------------
 3599|      0|        Runtime::StackOverflowKind::JSRegisterStack));
 3600|       |
 3601|       |  // We arrive here when we raised an exception in a callee, but we don't want
 3602|       |  // the callee to be able to handle it.
 3603|      0|  handleExceptionInParent:
 3604|       |    // Restore the caller code block and IP.
 3605|      0|    curCodeBlock = FRAME.getSavedCodeBlock();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3606|      0|    ip = FRAME.getSavedIP();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3607|       |
 3608|       |    // Pop to the previous frame where technically the error happened.
 3609|      0|    frameRegs = &runtime.restoreStackAndPreviousFrame(FRAME).getFirstLocalRef();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3610|       |
 3611|       |    // If we are coming from native code, return.
 3612|      0|    if (!curCodeBlock)
  ------------------
  |  Branch (3612:9): [True: 0, False: 0]
  ------------------
 3613|      0|      return ExecutionStatus::EXCEPTION;
 3614|       |
 3615|       |  // Handle the exception.
 3616|     52|  exception:
 3617|     52|    UPDATE_OPCODE_TIME_SPENT;
 3618|     52|    assert(
 3619|     52|        !runtime.thrownValue_.isEmpty() &&
 3620|     52|        "thrownValue unavailable at exception");
 3621|       |
 3622|     52|    bool catchable = true;
 3623|       |    // If this is an Error object that was thrown internally, it didn't have
 3624|       |    // access to the current codeblock and IP, so collect the stack trace here.
 3625|     52|    if (auto *jsError = dyn_vmcast<JSError>(runtime.thrownValue_)) {
  ------------------
  |  Branch (3625:15): [True: 52, False: 0]
  ------------------
 3626|     52|      catchable = jsError->catchable();
 3627|     52|      if (!jsError->getStackTrace()) {
  ------------------
  |  Branch (3627:11): [True: 47, False: 5]
  ------------------
 3628|       |        // Temporarily clear the thrown value for following operations.
 3629|     47|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|     47|  runtime.setCurrentIP(ip);           \
  |  |  920|     47|  decl = (expr);                      \
  |  |  921|     47|  ip = runtime.getCurrentIP();        \
  |  |  922|     47|  runtime.invalidateCurrentIP();
  ------------------
 3630|     47|            auto errorHandle,
 3631|     47|            runtime.makeHandle(vmcast<JSError>(runtime.thrownValue_)));
 3632|     47|        runtime.clearThrownValue();
 3633|       |
 3634|     47|        CAPTURE_IP(JSError::recordStackTrace(
  ------------------
  |  |  912|     47|  runtime.setCurrentIP(ip);    \
  |  |  913|     47|  (void)(expr);                \
  |  |  914|     47|  ip = runtime.getCurrentIP(); \
  |  |  915|     47|  runtime.invalidateCurrentIP();
  ------------------
 3635|     47|            errorHandle, runtime, false, curCodeBlock, ip));
 3636|       |
 3637|       |        // Restore the thrown value.
 3638|     47|        runtime.setThrownValue(errorHandle.getHermesValue());
 3639|     47|      }
 3640|     52|    }
 3641|       |
 3642|     52|    gcScope.flushToSmallCount(KEEP_HANDLES);
 3643|     52|    tmpHandle.clear();
 3644|       |
 3645|     52|#ifdef HERMES_ENABLE_DEBUGGER
 3646|     52|    if (SingleStep) {
  ------------------
  |  Branch (3646:9): [Folded - Ignored]
  ------------------
 3647|       |      // If we're single stepping, don't bother with any more checks,
 3648|       |      // and simply signal that we should continue execution with an exception.
 3649|      0|      state.codeBlock = curCodeBlock;
 3650|      0|      state.offset = CUROFFSET;
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 3651|      0|      return ExecutionStatus::EXCEPTION;
 3652|      0|    }
 3653|       |
 3654|     52|    using PauseOnThrowMode = facebook::hermes::debugger::PauseOnThrowMode;
 3655|     52|    auto mode = runtime.debugger_.getPauseOnThrowMode();
 3656|     52|    if (mode != PauseOnThrowMode::None) {
  ------------------
  |  Branch (3656:9): [True: 0, False: 52]
  ------------------
 3657|      0|      if (!runtime.debugger_.isDebugging()) {
  ------------------
  |  Branch (3657:11): [True: 0, False: 0]
  ------------------
 3658|       |        // Determine whether the PauseOnThrowMode requires us to stop here.
 3659|      0|        bool caught =
 3660|      0|            runtime.debugger_
 3661|      0|                .findCatchTarget(InterpreterState(curCodeBlock, CUROFFSET))
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 3662|      0|                .hasValue();
 3663|      0|        bool shouldStop = mode == PauseOnThrowMode::All ||
  ------------------
  |  Branch (3663:27): [True: 0, False: 0]
  ------------------
 3664|      0|            (mode == PauseOnThrowMode::Uncaught && !caught);
  ------------------
  |  Branch (3664:14): [True: 0, False: 0]
  |  Branch (3664:52): [True: 0, False: 0]
  ------------------
 3665|      0|        if (shouldStop) {
  ------------------
  |  Branch (3665:13): [True: 0, False: 0]
  ------------------
 3666|       |          // When runDebugger is invoked after an exception,
 3667|       |          // stepping should never happen internally.
 3668|       |          // Any step is a step to an exception handler, which we do
 3669|       |          // directly here in the interpreter.
 3670|       |          // Thus, the result state should be the same as the input state.
 3671|      0|          InterpreterState tmpState{curCodeBlock, (uint32_t)CUROFFSET};
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 3672|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  919|      0|  runtime.setCurrentIP(ip);           \
  |  |  920|      0|  decl = (expr);                      \
  |  |  921|      0|  ip = runtime.getCurrentIP();        \
  |  |  922|      0|  runtime.invalidateCurrentIP();
  ------------------
 3673|      0|              ExecutionStatus resultStatus,
 3674|      0|              runtime.debugger_.runDebugger(
 3675|      0|                  Debugger::RunReason::Exception, tmpState));
 3676|      0|          (void)resultStatus;
 3677|      0|          assert(
 3678|      0|              tmpState == InterpreterState(curCodeBlock, CUROFFSET) &&
 3679|      0|              "not allowed to step internally in a pauseOnThrow");
 3680|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 3681|      0|        }
 3682|      0|      }
 3683|      0|    }
 3684|     52|#endif
 3685|       |
 3686|     52|    int32_t handlerOffset = 0;
 3687|       |
 3688|       |    // If the exception is not catchable, skip found catch blocks.
 3689|     52|    while (((handlerOffset = curCodeBlock->findCatchTargetOffset(CUROFFSET)) ==
  ------------------
  |  |   55|     52|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
  |  Branch (3689:12): [True: 52, False: 0]
  ------------------
 3690|     52|            -1) ||
 3691|     52|           !catchable) {
  ------------------
  |  Branch (3691:12): [True: 0, False: 0]
  ------------------
 3692|     52|      PROFILER_EXIT_FUNCTION(curCodeBlock);
 3693|       |
 3694|     52|#ifdef HERMES_MEMORY_INSTRUMENTATION
 3695|     52|      runtime.popCallStack();
 3696|     52|#endif
 3697|       |
 3698|       |      // Restore the code block and IP.
 3699|     52|      curCodeBlock = FRAME.getSavedCodeBlock();
  ------------------
  |  |   39|     52|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3700|     52|      ip = FRAME.getSavedIP();
  ------------------
  |  |   39|     52|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3701|       |
 3702|       |      // Pop a stack frame.
 3703|     52|      frameRegs =
 3704|     52|          &runtime.restoreStackAndPreviousFrame(FRAME).getFirstLocalRef();
  ------------------
  |  |   39|     52|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3705|       |
 3706|     52|      SLOW_DEBUG(
  ------------------
  |  |   18|     52|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|     52|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|     52|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 52]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|     52|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3707|     52|          dbgs() << "function exit with exception: restored stackLevel="
 3708|     52|                 << runtime.getStackLevel() << "\n");
 3709|       |
 3710|       |      // Are we returning to native code?
 3711|     52|      if (!curCodeBlock) {
  ------------------
  |  Branch (3711:11): [True: 52, False: 0]
  ------------------
 3712|     52|        SLOW_DEBUG(
  ------------------
  |  |   18|     52|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|     52|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|     52|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 52]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|     52|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3713|     52|            dbgs()
 3714|     52|            << "function exit with exception: returning to native code\n");
 3715|     52|        return ExecutionStatus::EXCEPTION;
 3716|     52|      }
 3717|       |
 3718|      0|      assert(
 3719|      0|          isCallType(ip->opCode) &&
 3720|      0|          "return address is not Call-type instruction");
 3721|      0|    }
 3722|       |
 3723|      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]
  |  |  ------------------
  ------------------
 3724|       |
 3725|      0|    ip = IPADD(handlerOffset - CUROFFSET);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 3726|      0|  }
 3727|  2.75k|}
_ZZN6hermes2vm11Interpreter17interpretFunctionILb0ELb0EEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeERNS0_16InterpreterStateEEN7IPSaverC2ES9_:
  853|    356|        : ip_(runtime.getCurrentIP()), runtime_(runtime) {}
Interpreter.cpp:_ZN6hermes2vmL14printDebugInfoEPNS0_9CodeBlockEPNS0_17PinnedHermesValueEPKNS_4inst4InstE:
  688|  21.8M|    const Inst *ip) {
  689|       |  // Check if LLVm debugging is enabled for us.
  690|  21.8M|  bool debug = false;
  691|  21.8M|  SLOW_DEBUG(debug = true);
  ------------------
  |  |   18|  21.8M|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|  21.8M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|  21.8M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 21.8M]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|  21.8M|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|  21.8M|  if (!debug)
  ------------------
  |  Branch (692:7): [True: 21.8M, False: 0]
  ------------------
  693|  21.8M|    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:
  723|  2.40k|static inline const Inst *nextInstCall(const Inst *ip) {
  724|  2.40k|  HERMES_SLOW_ASSERT(isCallType(ip->opCode) && "ip is not of call type");
  ------------------
  |  |   17|  2.40k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  725|       |
  726|       |  // To avoid needing a large lookup table or switchcase, the following packs
  727|       |  // information about the size of each call opcode into a uint32_t. Each call
  728|       |  // type is represented with two bits, representing how much larger it is than
  729|       |  // the smallest call instruction.
  730|       |  // If we used 64 bits, we could fit the actual size of each call, without
  731|       |  // needing the offset, and this may be necessary if new call instructions are
  732|       |  // added in the future. For now however, due to limitations on loading large
  733|       |  // immediates in ARM, it is significantly more efficient to use a uint32_t
  734|       |  // than a uint64_t.
  735|  2.40k|  constexpr auto firstCall = std::min({
  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  737|  2.40k|#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|  2.40k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  2.40k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  2.40k|#endif
  |  |   12|  2.40k|#ifndef DEFINE_OPCODE_0
  |  |   13|  2.40k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  2.40k|#endif
  |  |   15|  2.40k|#ifndef DEFINE_OPCODE_1
  |  |   16|  2.40k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  2.40k|#endif
  |  |   18|  2.40k|#ifndef DEFINE_OPCODE_2
  |  |   19|  2.40k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  2.40k|#endif
  |  |   21|  2.40k|#ifndef DEFINE_OPCODE_3
  |  |   22|  2.40k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  2.40k|#endif
  |  |   24|  2.40k|#ifndef DEFINE_OPCODE_4
  |  |   25|  2.40k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  2.40k|#endif
  |  |   27|  2.40k|#ifndef DEFINE_OPCODE_5
  |  |   28|  2.40k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  2.40k|#endif
  |  |   30|  2.40k|#ifndef DEFINE_OPCODE_6
  |  |   31|  2.40k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  2.40k|#endif
  |  |   33|  2.40k|#ifndef DEFINE_OPCODE
  |  |   34|  2.40k|#define DEFINE_OPCODE(...)
  |  |   35|  2.40k|#endif
  |  |   36|  2.40k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  2.40k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  2.40k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  2.40k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  2.40k|#endif
  |  |   45|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  2.40k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  2.40k|#endif
  |  |   48|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  2.40k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  2.40k|#endif
  |  |   51|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  2.40k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  2.40k|#endif
  |  |   54|  2.40k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  2.40k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  2.40k|#endif
  |  |   57|  2.40k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  2.40k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  2.40k|#endif
  |  |   60|  2.40k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  2.40k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  2.40k|#endif
  |  |   63|  2.40k|#ifndef OPERAND_STRING_ID
  |  |   64|  2.40k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  2.40k|#endif
  |  |   66|       |
  |  |   67|  2.40k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  2.40k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  2.40k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  2.40k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  2.40k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  2.40k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  2.40k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  2.40k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  2.40k|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|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  2.40k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  2.40k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  2.40k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  2.40k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  2.40k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  2.40k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  2.40k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  2.40k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  2.40k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  2.40k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  2.40k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  2.40k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  2.40k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  2.40k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  2.40k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  2.40k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  2.40k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  2.40k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  2.40k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  2.40k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  2.40k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  2.40k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  2.40k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  2.40k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  2.40k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  2.40k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  2.40k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  2.40k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  2.40k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  2.40k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  2.40k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  2.40k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  2.40k|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|  2.40k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  2.40k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  2.40k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  2.40k|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|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  2.40k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  2.40k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  2.40k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Create a new inner environment, to store values captured by closures.
  |  |  249|       |/// Arg1 is the destination.
  |  |  250|       |/// Arg2 is the parent environment.
  |  |  251|       |/// Arg3 is the number of slots in the environment.
  |  |  252|  2.40k|DEFINE_OPCODE_3(CreateInnerEnvironment, Reg8, Reg8, UInt32)
  |  |  253|       |
  |  |  254|       |/// Declare a global variable by string table index.
  |  |  255|       |/// The variable will be set to undefined.
  |  |  256|  2.40k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  257|  2.40k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  258|       |
  |  |  259|       |/// Checks if globalThis has a restricted global property with the given name.
  |  |  260|       |/// Arg1 is the name to check.
  |  |  261|  2.40k|DEFINE_OPCODE_1(ThrowIfHasRestrictedGlobalProperty, UInt32)
  |  |  262|  2.40k|OPERAND_STRING_ID(ThrowIfHasRestrictedGlobalProperty, 1)
  |  |  263|       |
  |  |  264|       |/// Get an object property by string table index.
  |  |  265|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  266|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  267|  2.40k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  268|  2.40k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  269|  2.40k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  270|  2.40k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  271|  2.40k|OPERAND_STRING_ID(GetById, 4)
  |  |  272|  2.40k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  273|       |
  |  |  274|       |/// Get an object property by string table index, or throw if not found.
  |  |  275|       |/// This is similar to GetById, but intended for use with global variables
  |  |  276|       |/// where Arg2 = GetGlobalObject.
  |  |  277|  2.40k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  278|  2.40k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  279|  2.40k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  280|  2.40k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  281|       |
  |  |  282|       |/// Set an object property by string index.
  |  |  283|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  284|  2.40k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  285|  2.40k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  286|  2.40k|OPERAND_STRING_ID(PutById, 4)
  |  |  287|  2.40k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  288|       |
  |  |  289|       |/// Set an object property by string index, or throw if undeclared.
  |  |  290|       |/// This is similar to PutById, but intended for use with global variables
  |  |  291|       |/// where Arg1 = GetGlobalObject.
  |  |  292|  2.40k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  293|  2.40k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  294|  2.40k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  295|  2.40k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  296|       |
  |  |  297|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  298|       |/// the destination must be an object, it only deals with own properties,
  |  |  299|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  300|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  301|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  302|       |/// Arg2 is the value to write.
  |  |  303|       |/// Arg3 is the string table ID of the property name.
  |  |  304|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  305|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  306|  2.40k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  307|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  308|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  309|  2.40k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  310|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  311|       |
  |  |  312|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  313|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  314|       |/// Arg1 is the destination object.
  |  |  315|       |/// Arg2 is the value to write.
  |  |  316|       |/// Arg3 is the string table ID of the property name.
  |  |  317|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  318|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  319|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  320|  2.40k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  321|  2.40k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  322|       |
  |  |  323|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  324|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  325|  2.40k|    PutNewOwnByIdShort,
  |  |  326|  2.40k|    PutNewOwnById,
  |  |  327|  2.40k|    PutNewOwnByIdLong,
  |  |  328|  2.40k|    PutNewOwnNEById,
  |  |  329|  2.40k|    PutNewOwnNEByIdLong)
  |  |  330|       |
  |  |  331|       |/// Assign a value to a constant integer own property which will be created as
  |  |  332|       |/// enumerable. This is used (potentially in conjunction with
  |  |  333|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  334|       |/// Arg1[Arg3] = Arg2;
  |  |  335|  2.40k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  336|  2.40k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  337|       |
  |  |  338|       |/// Set an own property identified by value.
  |  |  339|       |/// Arg1 is the destination object.
  |  |  340|       |/// Arg2 is the value to write.
  |  |  341|       |/// Arg3 is the property name.
  |  |  342|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  343|       |///        non-enumerable otherwise.
  |  |  344|       |/// Arg1[Arg3] = Arg2;
  |  |  345|  2.40k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  346|       |
  |  |  347|       |/// Delete a property by string table index.
  |  |  348|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  349|  2.40k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  350|  2.40k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  351|  2.40k|OPERAND_STRING_ID(DelById, 3)
  |  |  352|  2.40k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  353|       |
  |  |  354|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  355|       |/// Arg1 = Arg2[Arg3]
  |  |  356|  2.40k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  357|       |
  |  |  358|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  359|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  360|       |/// case this is still the right opcode).
  |  |  361|       |/// Arg1[Arg2] = Arg3
  |  |  362|  2.40k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  363|       |
  |  |  364|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  365|       |/// Arg1 = delete Arg2[Arg3]
  |  |  366|  2.40k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  367|       |
  |  |  368|       |/// Add a getter and a setter for a property by value.
  |  |  369|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  370|       |/// Arg1 is the target object which will have a property defined.
  |  |  371|       |/// Arg2 is the property name
  |  |  372|       |/// Arg3 is the getter closure or undefined
  |  |  373|       |/// Arg4 is the setter closure or undefined
  |  |  374|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  375|  2.40k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  376|       |
  |  |  377|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  378|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  379|       |/// Returns Undefined if the object is null/undefined.
  |  |  380|       |/// Arg2 is the register that holds the object.
  |  |  381|       |/// Arg3 is the register that holds the iterating index.
  |  |  382|       |/// Arg4 is the register that holds the size of the property list.
  |  |  383|  2.40k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  384|       |
  |  |  385|       |/// Get the next property in the for..in iterator.
  |  |  386|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  387|       |/// Arg2 is the register that holds array of properties.
  |  |  388|       |/// Arg3 is the register that holds the object.
  |  |  389|       |/// Arg4 is the register that holds the iterating index.
  |  |  390|       |/// Arg5 is the register that holds the size of the property list.
  |  |  391|  2.40k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  392|       |
  |  |  393|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  394|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  395|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  396|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  397|       |/// wider instructions appearing after narrower ones.
  |  |  398|       |
  |  |  399|       |/// Call a function.
  |  |  400|       |/// Arg1 is the destination of the return value.
  |  |  401|       |/// Arg2 is the closure to invoke.
  |  |  402|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  403|       |///      from the end of the current frame.
  |  |  404|  2.40k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  405|  2.40k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  406|       |
  |  |  407|       |/// Call a constructor, with semantics identical to Call.
  |  |  408|       |/// Arg1 is the destination of the return value.
  |  |  409|       |/// Arg2 is the closure to invoke.
  |  |  410|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  411|       |///      from the end of the current frame. The first argument 'this'
  |  |  412|       |///      is assumed to be created with CreateThis.
  |  |  413|  2.40k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  414|  2.40k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  415|       |
  |  |  416|       |/// Call a function with one arg.
  |  |  417|       |/// Arg1 is the destination of the return value.
  |  |  418|       |/// Arg2 is the closure to invoke.
  |  |  419|       |/// Arg3 is the first argument.
  |  |  420|  2.40k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  421|  2.40k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function directly without a closure.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  426|       |///      from the end of the current frame. The first argument 'this'
  |  |  427|       |///      is assumed to be created with CreateThis.
  |  |  428|       |/// Arg3 is index in the function table.
  |  |  429|       |/// Note that we expect the variable-sized argument to be last.
  |  |  430|  2.40k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  431|  2.40k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  432|  2.40k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  433|       |
  |  |  434|       |/// Call a function with two args.
  |  |  435|       |/// Arg1 is the destination of the return value.
  |  |  436|       |/// Arg2 is the closure to invoke.
  |  |  437|       |/// Arg3 is the first argument.
  |  |  438|       |/// Arg4 is the second argument.
  |  |  439|  2.40k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  440|  2.40k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  441|       |
  |  |  442|       |/// Call a function with three args.
  |  |  443|       |/// Arg1 is the destination of the return value.
  |  |  444|       |/// Arg2 is the closure to invoke.
  |  |  445|       |/// Arg3 is the first argument.
  |  |  446|       |/// Arg4 is the second argument.
  |  |  447|       |/// Arg5 is the third argument.
  |  |  448|  2.40k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  449|  2.40k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  450|       |
  |  |  451|       |/// Call a function with four args.
  |  |  452|       |/// Arg1 is the destination of the return value.
  |  |  453|       |/// Arg2 is the closure to invoke.
  |  |  454|       |/// Arg3 is the first argument.
  |  |  455|       |/// Arg4 is the second argument.
  |  |  456|       |/// Arg5 is the third argument.
  |  |  457|       |/// Arg6 is the fourth argument.
  |  |  458|  2.40k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  459|  2.40k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  460|       |
  |  |  461|       |/// Identical to Call, but allowing more arguments.
  |  |  462|  2.40k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  463|  2.40k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  464|       |
  |  |  465|       |/// Identical to Construct, but allowing more arguments.
  |  |  466|  2.40k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  467|  2.40k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  468|       |
  |  |  469|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  470|  2.40k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  471|  2.40k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  736|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  472|       |
  |  |  473|       |// Enforce the order.
  |  |  474|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  475|  2.40k|    Call,
  |  |  476|  2.40k|    Construct,
  |  |  477|  2.40k|    Call1,
  |  |  478|  2.40k|    CallDirect,
  |  |  479|  2.40k|    Call2,
  |  |  480|  2.40k|    Call3,
  |  |  481|  2.40k|    Call4,
  |  |  482|  2.40k|    CallLong,
  |  |  483|  2.40k|    ConstructLong,
  |  |  484|  2.40k|    CallDirectLongIndex)
  |  |  485|       |
  |  |  486|       |/// Call a builtin function.
  |  |  487|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  488|       |/// and therefore never JS.
  |  |  489|       |/// Arg1 is the destination of the return value.
  |  |  490|       |/// Arg2 is the builtin number.
  |  |  491|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  492|       |///      from the end of the current frame.
  |  |  493|       |/// thisArg is set to "undefined".
  |  |  494|  2.40k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  495|       |
  |  |  496|       |/// Call a builtin function.
  |  |  497|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  498|       |/// and therefore never JS.
  |  |  499|       |/// Arg1 is the destination of the return value.
  |  |  500|       |/// Arg2 is the builtin number.
  |  |  501|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  502|       |///      from the end of the current frame.
  |  |  503|       |/// thisArg is set to "undefined".
  |  |  504|  2.40k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  505|       |
  |  |  506|       |/// Get a closure from a builtin function.
  |  |  507|       |/// Arg1 is the destination of the return value.
  |  |  508|       |/// Arg2 is the builtin number.
  |  |  509|  2.40k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  510|       |
  |  |  511|       |///
  |  |  512|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  513|       |
  |  |  514|       |/// Return a value from the current function.
  |  |  515|       |/// return Arg1;
  |  |  516|  2.40k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  517|       |
  |  |  518|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  519|       |/// } catch(Arg1) {
  |  |  520|  2.40k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  521|       |
  |  |  522|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  523|       |/// Arg1 is the destination of the return value.
  |  |  524|       |/// Arg2 is the value to eval.
  |  |  525|       |/// Arg3 is a boolean which is true if the eval should be performed in strict mode.
  |  |  526|  2.40k|DEFINE_OPCODE_3(DirectEval, Reg8, Reg8, UInt8)
  |  |  527|       |
  |  |  528|       |/// Throw an exception.
  |  |  529|       |/// throw Arg1;
  |  |  530|  2.40k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  531|       |
  |  |  532|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  533|       |/// Arg1 is the destination of the return value
  |  |  534|       |/// Arg2 is the value to check
  |  |  535|  2.40k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  536|       |
  |  |  537|       |/// Implementation dependent debugger action.
  |  |  538|  2.40k|DEFINE_OPCODE_0(Debugger)
  |  |  539|       |
  |  |  540|       |/// Fast check for an async interrupt request.
  |  |  541|  2.40k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  542|       |
  |  |  543|       |/// Define a profile point.
  |  |  544|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  545|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  546|       |/// all the overflowed profile points have index zero.
  |  |  547|  2.40k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  548|       |
  |  |  549|       |/// Create a closure.
  |  |  550|       |/// Arg1 is the register in which to store the closure.
  |  |  551|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  552|       |/// Arg3 is index in the function table.
  |  |  553|  2.40k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  554|  2.40k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  555|  2.40k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  556|  2.40k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  557|       |
  |  |  558|       |/// Create a closure for a GeneratorFunction.
  |  |  559|       |/// Arg1 is the register in which to store the closure.
  |  |  560|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  561|       |/// Arg3 is index in the function table.
  |  |  562|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  563|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  564|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  565|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  566|       |
  |  |  567|       |/// Create a closure for an AsyncFunction.
  |  |  568|       |/// Arg1 is the register in which to store the closure.
  |  |  569|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  570|       |/// Arg3 is index in the function table.
  |  |  571|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  572|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  573|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  574|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  575|       |
  |  |  576|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  577|       |/// Arg1 is the destination register.
  |  |  578|       |/// Arg2 is the prototype to assign it.
  |  |  579|       |/// Arg3 is the constructor closure that will be used*.
  |  |  580|       |/// * To allow internal constructors to have special objects allocated.
  |  |  581|  2.40k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  582|       |
  |  |  583|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  584|       |/// Arg1 is the result.
  |  |  585|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  586|       |/// Arg3 is the constructor's return value.
  |  |  587|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  588|  2.40k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  589|       |
  |  |  590|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  591|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  592|  2.40k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  593|       |
  |  |  594|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  595|  2.40k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  596|       |
  |  |  597|       |/// Load a constant integer value.
  |  |  598|  2.40k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  599|  2.40k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  600|       |
  |  |  601|       |/// Load a constant double value.
  |  |  602|  2.40k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  603|       |
  |  |  604|       |/// Load a constant BigInt value by bigint table index.
  |  |  605|  2.40k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  606|  2.40k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  607|  2.40k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  608|  2.40k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  609|       |
  |  |  610|       |/// Load a constant string value by string table index.
  |  |  611|  2.40k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  612|  2.40k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  613|  2.40k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  614|  2.40k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  615|       |
  |  |  616|       |/// Load common constants.
  |  |  617|  2.40k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  618|  2.40k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  619|  2.40k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  620|  2.40k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  621|  2.40k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  622|  2.40k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  623|       |
  |  |  624|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  625|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  626|       |/// object.
  |  |  627|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  628|  2.40k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  629|       |
  |  |  630|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  631|       |/// \code
  |  |  632|       |///     LoadParam    Arg1, #0
  |  |  633|       |///     CoerceThisNS Arg1, Arg1
  |  |  634|       |/// \endcode
  |  |  635|  2.40k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  636|       |
  |  |  637|       |/// Convert a value to a number.
  |  |  638|       |/// Arg1 = Arg2 - 0
  |  |  639|  2.40k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  640|       |/// Convert a value to a numberic.
  |  |  641|       |/// Arg1 = ToNumeric(Arg2)
  |  |  642|  2.40k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  643|       |/// Convert a value to a 32-bit signed integer.
  |  |  644|       |/// Arg1 = Arg2 | 0
  |  |  645|  2.40k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  646|       |
  |  |  647|       |/// Convert a value to a string as if evaluating the expression:
  |  |  648|       |///     Arg1 = "" + Arg2
  |  |  649|       |/// In practice this means
  |  |  650|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  651|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  652|  2.40k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  653|       |
  |  |  654|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  655|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  656|       |// will be populated and the rest of the instruction will access it directly.
  |  |  657|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  658|       |// instead of doing a full array allocation and property lookup.
  |  |  659|       |
  |  |  660|       |/// Get a property of the 'arguments' array by value.
  |  |  661|       |/// Arg1 is the result.
  |  |  662|       |/// Arg2 is the index.
  |  |  663|       |/// Arg3 is the lazy loaded register.
  |  |  664|       |/// Arg1 = arguments[Arg2]
  |  |  665|  2.40k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  666|       |
  |  |  667|       |/// Get the length of the 'arguments' array.
  |  |  668|       |/// Arg1 is the result.
  |  |  669|       |/// Arg2 is the lazy loaded register.
  |  |  670|       |/// Arg1 = arguments.length
  |  |  671|  2.40k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  672|       |
  |  |  673|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  674|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  675|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  676|  2.40k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  677|       |
  |  |  678|       |/// Create a regular expression.
  |  |  679|       |/// Arg1 is the result.
  |  |  680|       |/// Arg2 is the string index of the pattern.
  |  |  681|       |/// Arg3 is the string index of the flags.
  |  |  682|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  683|  2.40k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  684|  2.40k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  685|  2.40k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  686|       |
  |  |  687|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  688|       |/// input or to the default block if out of range (or not right type)
  |  |  689|       |/// Arg 1 is the value to be branched upon
  |  |  690|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  691|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  692|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  693|       |/// less than this value jmp to
  |  |  694|       |///   default block
  |  |  695|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  696|       |///   default block.
  |  |  697|       |///
  |  |  698|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  699|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  700|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  701|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  702|  2.40k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  703|       |
  |  |  704|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  705|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  706|  2.40k|DEFINE_OPCODE_0(StartGenerator)
  |  |  707|       |
  |  |  708|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  709|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  710|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  711|       |/// - throw(val): Throw val as an error
  |  |  712|       |/// Arg1 is the result provided by the user.
  |  |  713|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  714|  2.40k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  715|       |
  |  |  716|       |/// Set the generator status to complete, but do not return.
  |  |  717|  2.40k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  718|       |
  |  |  719|       |/// Create a generator.
  |  |  720|       |/// Arg1 is the register in which to store the generator.
  |  |  721|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  722|       |/// Arg3 is index in the function table.
  |  |  723|  2.40k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  724|  2.40k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  725|  2.40k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  726|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  727|       |
  |  |  728|       |/// Arg1 [out] is the result iterator or index.
  |  |  729|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  730|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  731|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  732|       |/// method on the iterator.
  |  |  733|       |/// See IR.md for IteratorBeginInst.
  |  |  734|  2.40k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  735|       |
  |  |  736|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  737|       |/// Arg2 [in/out] is the iterator or index.
  |  |  738|       |/// Arg2 [in] is the source or the next method.
  |  |  739|       |/// If iterator is undefined, result = undefined.
  |  |  740|       |/// If iterator is a number:
  |  |  741|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  742|       |///   Else iterator = undefined and result = undefined
  |  |  743|       |/// Else:
  |  |  744|       |///   n = iterator.next()
  |  |  745|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  746|       |///   Else result = n.value
  |  |  747|       |/// See IR.md for IteratorNextInst.
  |  |  748|  2.40k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  749|       |
  |  |  750|       |/// Arg1 [in] is the iterator or array index.
  |  |  751|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  752|       |/// If the iterator is an object, call iterator.return().
  |  |  753|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  754|       |/// See IR.md for IteratorCloseInst.
  |  |  755|  2.40k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  756|       |
  |  |  757|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  758|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  759|       |// The macros will automatically generate two opcodes for each definition,
  |  |  760|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  761|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  762|  2.40k|#define DEFINE_JUMP_1(name)           \
  |  |  763|  2.40k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  764|  2.40k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  765|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  766|       |
  |  |  767|  2.40k|#define DEFINE_JUMP_2(name)                 \
  |  |  768|  2.40k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  769|  2.40k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  770|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  771|       |
  |  |  772|  2.40k|#define DEFINE_JUMP_3(name)                       \
  |  |  773|  2.40k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  774|  2.40k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  775|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  776|       |
  |  |  777|       |/// Unconditional branch to Arg1.
  |  |  778|  2.40k|DEFINE_JUMP_1(Jmp)
  |  |  779|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  780|  2.40k|DEFINE_JUMP_2(JmpTrue)
  |  |  781|  2.40k|DEFINE_JUMP_2(JmpFalse)
  |  |  782|       |/// Jump if the value is undefined.
  |  |  783|  2.40k|DEFINE_JUMP_2(JmpUndefined)
  |  |  784|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  785|       |/// at the provided target.
  |  |  786|  2.40k|DEFINE_JUMP_1(SaveGenerator)
  |  |  787|       |
  |  |  788|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  789|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  790|       |
  |  |  791|       |/// Not conditionals are required for NaN comparisons
  |  |  792|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  793|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  794|       |/// "jump when less than to BB1".
  |  |  795|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  796|  2.40k|DEFINE_JUMP_3(JLess)
  |  |  797|  2.40k|DEFINE_JUMP_3(JNotLess)
  |  |  798|  2.40k|DEFINE_JUMP_3(JLessN)
  |  |  799|  2.40k|DEFINE_JUMP_3(JNotLessN)
  |  |  800|  2.40k|DEFINE_JUMP_3(JLessEqual)
  |  |  801|  2.40k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  802|  2.40k|DEFINE_JUMP_3(JLessEqualN)
  |  |  803|  2.40k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  804|  2.40k|DEFINE_JUMP_3(JGreater)
  |  |  805|  2.40k|DEFINE_JUMP_3(JNotGreater)
  |  |  806|  2.40k|DEFINE_JUMP_3(JGreaterN)
  |  |  807|  2.40k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  808|  2.40k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  809|  2.40k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  810|  2.40k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  811|  2.40k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  812|  2.40k|DEFINE_JUMP_3(JEqual)
  |  |  813|  2.40k|DEFINE_JUMP_3(JNotEqual)
  |  |  814|  2.40k|DEFINE_JUMP_3(JStrictEqual)
  |  |  815|  2.40k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  816|       |
  |  |  817|       |#ifdef HERMES_RUN_WASM
  |  |  818|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  819|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  820|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  821|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  822|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  823|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  824|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  825|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  826|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  827|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  828|       |
  |  |  829|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  830|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  831|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  832|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  833|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  834|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  835|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  836|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  837|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  838|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  839|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  840|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  841|       |
  |  |  842|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  843|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  844|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  845|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  846|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  847|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  848|       |#endif
  |  |  849|       |
  |  |  850|       |// Implementations can rely on the following pairs of instructions having the
  |  |  851|       |// same number and type of operands.
  |  |  852|  2.40k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  853|  2.40k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  854|  2.40k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  855|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  856|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  857|  2.40k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  858|  2.40k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  859|  2.40k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  860|       |
  |  |  861|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  862|  2.40k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  863|  2.40k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  864|       |
  |  |  865|  2.40k|#undef DEFINE_JUMP_1
  |  |  866|  2.40k|#undef DEFINE_JUMP_2
  |  |  867|  2.40k|#undef DEFINE_JUMP_3
  |  |  868|       |
  |  |  869|       |// Undefine all macros used to avoid confusing next include.
  |  |  870|  2.40k|#undef DEFINE_OPERAND_TYPE
  |  |  871|  2.40k|#undef DEFINE_OPCODE_0
  |  |  872|  2.40k|#undef DEFINE_OPCODE_1
  |  |  873|  2.40k|#undef DEFINE_OPCODE_2
  |  |  874|  2.40k|#undef DEFINE_OPCODE_3
  |  |  875|  2.40k|#undef DEFINE_OPCODE_4
  |  |  876|  2.40k|#undef DEFINE_OPCODE_5
  |  |  877|  2.40k|#undef DEFINE_OPCODE_6
  |  |  878|  2.40k|#undef DEFINE_OPCODE
  |  |  879|  2.40k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  880|  2.40k|#undef DEFINE_RET_TARGET
  |  |  881|  2.40k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  882|  2.40k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  883|  2.40k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  884|  2.40k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  885|  2.40k|#undef ASSERT_MONOTONE_INCREASING
  |  |  886|  2.40k|#undef OPERAND_BIGINT_ID
  |  |  887|  2.40k|#undef OPERAND_FUNCTION_ID
  |  |  888|  2.40k|#undef OPERAND_STRING_ID
  ------------------
  738|  2.40k|  });
  739|  2.40k|  constexpr auto lastCall = std::max({
  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  741|  2.40k|#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|  2.40k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  2.40k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  2.40k|#endif
  |  |   12|  2.40k|#ifndef DEFINE_OPCODE_0
  |  |   13|  2.40k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  2.40k|#endif
  |  |   15|  2.40k|#ifndef DEFINE_OPCODE_1
  |  |   16|  2.40k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  2.40k|#endif
  |  |   18|  2.40k|#ifndef DEFINE_OPCODE_2
  |  |   19|  2.40k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  2.40k|#endif
  |  |   21|  2.40k|#ifndef DEFINE_OPCODE_3
  |  |   22|  2.40k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  2.40k|#endif
  |  |   24|  2.40k|#ifndef DEFINE_OPCODE_4
  |  |   25|  2.40k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  2.40k|#endif
  |  |   27|  2.40k|#ifndef DEFINE_OPCODE_5
  |  |   28|  2.40k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  2.40k|#endif
  |  |   30|  2.40k|#ifndef DEFINE_OPCODE_6
  |  |   31|  2.40k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  2.40k|#endif
  |  |   33|  2.40k|#ifndef DEFINE_OPCODE
  |  |   34|  2.40k|#define DEFINE_OPCODE(...)
  |  |   35|  2.40k|#endif
  |  |   36|  2.40k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  2.40k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  2.40k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  2.40k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  2.40k|#endif
  |  |   45|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  2.40k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  2.40k|#endif
  |  |   48|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  2.40k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  2.40k|#endif
  |  |   51|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  2.40k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  2.40k|#endif
  |  |   54|  2.40k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  2.40k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  2.40k|#endif
  |  |   57|  2.40k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  2.40k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  2.40k|#endif
  |  |   60|  2.40k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  2.40k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  2.40k|#endif
  |  |   63|  2.40k|#ifndef OPERAND_STRING_ID
  |  |   64|  2.40k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  2.40k|#endif
  |  |   66|       |
  |  |   67|  2.40k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  2.40k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  2.40k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  2.40k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  2.40k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  2.40k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  2.40k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  2.40k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  2.40k|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|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  2.40k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  2.40k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  2.40k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  2.40k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  2.40k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  2.40k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  2.40k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  2.40k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  2.40k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  2.40k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  2.40k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  2.40k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  2.40k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  2.40k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  2.40k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  2.40k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  2.40k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  2.40k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  2.40k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  2.40k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  2.40k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  2.40k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  2.40k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  2.40k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  2.40k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  2.40k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  2.40k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  2.40k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  2.40k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  2.40k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  2.40k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  2.40k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  2.40k|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|  2.40k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  2.40k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  2.40k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  2.40k|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|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  2.40k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  2.40k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  2.40k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Create a new inner environment, to store values captured by closures.
  |  |  249|       |/// Arg1 is the destination.
  |  |  250|       |/// Arg2 is the parent environment.
  |  |  251|       |/// Arg3 is the number of slots in the environment.
  |  |  252|  2.40k|DEFINE_OPCODE_3(CreateInnerEnvironment, Reg8, Reg8, UInt32)
  |  |  253|       |
  |  |  254|       |/// Declare a global variable by string table index.
  |  |  255|       |/// The variable will be set to undefined.
  |  |  256|  2.40k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  257|  2.40k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  258|       |
  |  |  259|       |/// Checks if globalThis has a restricted global property with the given name.
  |  |  260|       |/// Arg1 is the name to check.
  |  |  261|  2.40k|DEFINE_OPCODE_1(ThrowIfHasRestrictedGlobalProperty, UInt32)
  |  |  262|  2.40k|OPERAND_STRING_ID(ThrowIfHasRestrictedGlobalProperty, 1)
  |  |  263|       |
  |  |  264|       |/// Get an object property by string table index.
  |  |  265|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  266|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  267|  2.40k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  268|  2.40k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  269|  2.40k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  270|  2.40k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  271|  2.40k|OPERAND_STRING_ID(GetById, 4)
  |  |  272|  2.40k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  273|       |
  |  |  274|       |/// Get an object property by string table index, or throw if not found.
  |  |  275|       |/// This is similar to GetById, but intended for use with global variables
  |  |  276|       |/// where Arg2 = GetGlobalObject.
  |  |  277|  2.40k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  278|  2.40k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  279|  2.40k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  280|  2.40k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  281|       |
  |  |  282|       |/// Set an object property by string index.
  |  |  283|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  284|  2.40k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  285|  2.40k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  286|  2.40k|OPERAND_STRING_ID(PutById, 4)
  |  |  287|  2.40k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  288|       |
  |  |  289|       |/// Set an object property by string index, or throw if undeclared.
  |  |  290|       |/// This is similar to PutById, but intended for use with global variables
  |  |  291|       |/// where Arg1 = GetGlobalObject.
  |  |  292|  2.40k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  293|  2.40k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  294|  2.40k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  295|  2.40k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  296|       |
  |  |  297|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  298|       |/// the destination must be an object, it only deals with own properties,
  |  |  299|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  300|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  301|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  302|       |/// Arg2 is the value to write.
  |  |  303|       |/// Arg3 is the string table ID of the property name.
  |  |  304|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  305|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  306|  2.40k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  307|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  308|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  309|  2.40k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  310|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  311|       |
  |  |  312|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  313|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  314|       |/// Arg1 is the destination object.
  |  |  315|       |/// Arg2 is the value to write.
  |  |  316|       |/// Arg3 is the string table ID of the property name.
  |  |  317|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  318|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  319|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  320|  2.40k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  321|  2.40k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  322|       |
  |  |  323|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  324|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  325|  2.40k|    PutNewOwnByIdShort,
  |  |  326|  2.40k|    PutNewOwnById,
  |  |  327|  2.40k|    PutNewOwnByIdLong,
  |  |  328|  2.40k|    PutNewOwnNEById,
  |  |  329|  2.40k|    PutNewOwnNEByIdLong)
  |  |  330|       |
  |  |  331|       |/// Assign a value to a constant integer own property which will be created as
  |  |  332|       |/// enumerable. This is used (potentially in conjunction with
  |  |  333|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  334|       |/// Arg1[Arg3] = Arg2;
  |  |  335|  2.40k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  336|  2.40k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  337|       |
  |  |  338|       |/// Set an own property identified by value.
  |  |  339|       |/// Arg1 is the destination object.
  |  |  340|       |/// Arg2 is the value to write.
  |  |  341|       |/// Arg3 is the property name.
  |  |  342|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  343|       |///        non-enumerable otherwise.
  |  |  344|       |/// Arg1[Arg3] = Arg2;
  |  |  345|  2.40k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  346|       |
  |  |  347|       |/// Delete a property by string table index.
  |  |  348|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  349|  2.40k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  350|  2.40k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  351|  2.40k|OPERAND_STRING_ID(DelById, 3)
  |  |  352|  2.40k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  353|       |
  |  |  354|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  355|       |/// Arg1 = Arg2[Arg3]
  |  |  356|  2.40k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  357|       |
  |  |  358|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  359|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  360|       |/// case this is still the right opcode).
  |  |  361|       |/// Arg1[Arg2] = Arg3
  |  |  362|  2.40k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  363|       |
  |  |  364|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  365|       |/// Arg1 = delete Arg2[Arg3]
  |  |  366|  2.40k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  367|       |
  |  |  368|       |/// Add a getter and a setter for a property by value.
  |  |  369|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  370|       |/// Arg1 is the target object which will have a property defined.
  |  |  371|       |/// Arg2 is the property name
  |  |  372|       |/// Arg3 is the getter closure or undefined
  |  |  373|       |/// Arg4 is the setter closure or undefined
  |  |  374|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  375|  2.40k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  376|       |
  |  |  377|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  378|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  379|       |/// Returns Undefined if the object is null/undefined.
  |  |  380|       |/// Arg2 is the register that holds the object.
  |  |  381|       |/// Arg3 is the register that holds the iterating index.
  |  |  382|       |/// Arg4 is the register that holds the size of the property list.
  |  |  383|  2.40k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  384|       |
  |  |  385|       |/// Get the next property in the for..in iterator.
  |  |  386|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  387|       |/// Arg2 is the register that holds array of properties.
  |  |  388|       |/// Arg3 is the register that holds the object.
  |  |  389|       |/// Arg4 is the register that holds the iterating index.
  |  |  390|       |/// Arg5 is the register that holds the size of the property list.
  |  |  391|  2.40k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  392|       |
  |  |  393|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  394|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  395|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  396|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  397|       |/// wider instructions appearing after narrower ones.
  |  |  398|       |
  |  |  399|       |/// Call a function.
  |  |  400|       |/// Arg1 is the destination of the return value.
  |  |  401|       |/// Arg2 is the closure to invoke.
  |  |  402|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  403|       |///      from the end of the current frame.
  |  |  404|  2.40k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  405|  2.40k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  406|       |
  |  |  407|       |/// Call a constructor, with semantics identical to Call.
  |  |  408|       |/// Arg1 is the destination of the return value.
  |  |  409|       |/// Arg2 is the closure to invoke.
  |  |  410|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  411|       |///      from the end of the current frame. The first argument 'this'
  |  |  412|       |///      is assumed to be created with CreateThis.
  |  |  413|  2.40k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  414|  2.40k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  415|       |
  |  |  416|       |/// Call a function with one arg.
  |  |  417|       |/// Arg1 is the destination of the return value.
  |  |  418|       |/// Arg2 is the closure to invoke.
  |  |  419|       |/// Arg3 is the first argument.
  |  |  420|  2.40k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  421|  2.40k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function directly without a closure.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  426|       |///      from the end of the current frame. The first argument 'this'
  |  |  427|       |///      is assumed to be created with CreateThis.
  |  |  428|       |/// Arg3 is index in the function table.
  |  |  429|       |/// Note that we expect the variable-sized argument to be last.
  |  |  430|  2.40k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  431|  2.40k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  432|  2.40k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  433|       |
  |  |  434|       |/// Call a function with two args.
  |  |  435|       |/// Arg1 is the destination of the return value.
  |  |  436|       |/// Arg2 is the closure to invoke.
  |  |  437|       |/// Arg3 is the first argument.
  |  |  438|       |/// Arg4 is the second argument.
  |  |  439|  2.40k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  440|  2.40k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  441|       |
  |  |  442|       |/// Call a function with three args.
  |  |  443|       |/// Arg1 is the destination of the return value.
  |  |  444|       |/// Arg2 is the closure to invoke.
  |  |  445|       |/// Arg3 is the first argument.
  |  |  446|       |/// Arg4 is the second argument.
  |  |  447|       |/// Arg5 is the third argument.
  |  |  448|  2.40k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  449|  2.40k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  450|       |
  |  |  451|       |/// Call a function with four args.
  |  |  452|       |/// Arg1 is the destination of the return value.
  |  |  453|       |/// Arg2 is the closure to invoke.
  |  |  454|       |/// Arg3 is the first argument.
  |  |  455|       |/// Arg4 is the second argument.
  |  |  456|       |/// Arg5 is the third argument.
  |  |  457|       |/// Arg6 is the fourth argument.
  |  |  458|  2.40k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  459|  2.40k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  460|       |
  |  |  461|       |/// Identical to Call, but allowing more arguments.
  |  |  462|  2.40k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  463|  2.40k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  464|       |
  |  |  465|       |/// Identical to Construct, but allowing more arguments.
  |  |  466|  2.40k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  467|  2.40k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  468|       |
  |  |  469|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  470|  2.40k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  471|  2.40k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  740|  2.40k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  472|       |
  |  |  473|       |// Enforce the order.
  |  |  474|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  475|  2.40k|    Call,
  |  |  476|  2.40k|    Construct,
  |  |  477|  2.40k|    Call1,
  |  |  478|  2.40k|    CallDirect,
  |  |  479|  2.40k|    Call2,
  |  |  480|  2.40k|    Call3,
  |  |  481|  2.40k|    Call4,
  |  |  482|  2.40k|    CallLong,
  |  |  483|  2.40k|    ConstructLong,
  |  |  484|  2.40k|    CallDirectLongIndex)
  |  |  485|       |
  |  |  486|       |/// Call a builtin function.
  |  |  487|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  488|       |/// and therefore never JS.
  |  |  489|       |/// Arg1 is the destination of the return value.
  |  |  490|       |/// Arg2 is the builtin number.
  |  |  491|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  492|       |///      from the end of the current frame.
  |  |  493|       |/// thisArg is set to "undefined".
  |  |  494|  2.40k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  495|       |
  |  |  496|       |/// Call a builtin function.
  |  |  497|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  498|       |/// and therefore never JS.
  |  |  499|       |/// Arg1 is the destination of the return value.
  |  |  500|       |/// Arg2 is the builtin number.
  |  |  501|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  502|       |///      from the end of the current frame.
  |  |  503|       |/// thisArg is set to "undefined".
  |  |  504|  2.40k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  505|       |
  |  |  506|       |/// Get a closure from a builtin function.
  |  |  507|       |/// Arg1 is the destination of the return value.
  |  |  508|       |/// Arg2 is the builtin number.
  |  |  509|  2.40k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  510|       |
  |  |  511|       |///
  |  |  512|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  513|       |
  |  |  514|       |/// Return a value from the current function.
  |  |  515|       |/// return Arg1;
  |  |  516|  2.40k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  517|       |
  |  |  518|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  519|       |/// } catch(Arg1) {
  |  |  520|  2.40k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  521|       |
  |  |  522|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  523|       |/// Arg1 is the destination of the return value.
  |  |  524|       |/// Arg2 is the value to eval.
  |  |  525|       |/// Arg3 is a boolean which is true if the eval should be performed in strict mode.
  |  |  526|  2.40k|DEFINE_OPCODE_3(DirectEval, Reg8, Reg8, UInt8)
  |  |  527|       |
  |  |  528|       |/// Throw an exception.
  |  |  529|       |/// throw Arg1;
  |  |  530|  2.40k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  531|       |
  |  |  532|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  533|       |/// Arg1 is the destination of the return value
  |  |  534|       |/// Arg2 is the value to check
  |  |  535|  2.40k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  536|       |
  |  |  537|       |/// Implementation dependent debugger action.
  |  |  538|  2.40k|DEFINE_OPCODE_0(Debugger)
  |  |  539|       |
  |  |  540|       |/// Fast check for an async interrupt request.
  |  |  541|  2.40k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  542|       |
  |  |  543|       |/// Define a profile point.
  |  |  544|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  545|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  546|       |/// all the overflowed profile points have index zero.
  |  |  547|  2.40k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  548|       |
  |  |  549|       |/// Create a closure.
  |  |  550|       |/// Arg1 is the register in which to store the closure.
  |  |  551|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  552|       |/// Arg3 is index in the function table.
  |  |  553|  2.40k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  554|  2.40k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  555|  2.40k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  556|  2.40k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  557|       |
  |  |  558|       |/// Create a closure for a GeneratorFunction.
  |  |  559|       |/// Arg1 is the register in which to store the closure.
  |  |  560|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  561|       |/// Arg3 is index in the function table.
  |  |  562|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  563|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  564|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  565|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  566|       |
  |  |  567|       |/// Create a closure for an AsyncFunction.
  |  |  568|       |/// Arg1 is the register in which to store the closure.
  |  |  569|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  570|       |/// Arg3 is index in the function table.
  |  |  571|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  572|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  573|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  574|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  575|       |
  |  |  576|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  577|       |/// Arg1 is the destination register.
  |  |  578|       |/// Arg2 is the prototype to assign it.
  |  |  579|       |/// Arg3 is the constructor closure that will be used*.
  |  |  580|       |/// * To allow internal constructors to have special objects allocated.
  |  |  581|  2.40k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  582|       |
  |  |  583|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  584|       |/// Arg1 is the result.
  |  |  585|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  586|       |/// Arg3 is the constructor's return value.
  |  |  587|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  588|  2.40k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  589|       |
  |  |  590|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  591|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  592|  2.40k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  593|       |
  |  |  594|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  595|  2.40k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  596|       |
  |  |  597|       |/// Load a constant integer value.
  |  |  598|  2.40k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  599|  2.40k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  600|       |
  |  |  601|       |/// Load a constant double value.
  |  |  602|  2.40k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  603|       |
  |  |  604|       |/// Load a constant BigInt value by bigint table index.
  |  |  605|  2.40k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  606|  2.40k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  607|  2.40k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  608|  2.40k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  609|       |
  |  |  610|       |/// Load a constant string value by string table index.
  |  |  611|  2.40k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  612|  2.40k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  613|  2.40k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  614|  2.40k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  615|       |
  |  |  616|       |/// Load common constants.
  |  |  617|  2.40k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  618|  2.40k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  619|  2.40k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  620|  2.40k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  621|  2.40k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  622|  2.40k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  623|       |
  |  |  624|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  625|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  626|       |/// object.
  |  |  627|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  628|  2.40k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  629|       |
  |  |  630|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  631|       |/// \code
  |  |  632|       |///     LoadParam    Arg1, #0
  |  |  633|       |///     CoerceThisNS Arg1, Arg1
  |  |  634|       |/// \endcode
  |  |  635|  2.40k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  636|       |
  |  |  637|       |/// Convert a value to a number.
  |  |  638|       |/// Arg1 = Arg2 - 0
  |  |  639|  2.40k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  640|       |/// Convert a value to a numberic.
  |  |  641|       |/// Arg1 = ToNumeric(Arg2)
  |  |  642|  2.40k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  643|       |/// Convert a value to a 32-bit signed integer.
  |  |  644|       |/// Arg1 = Arg2 | 0
  |  |  645|  2.40k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  646|       |
  |  |  647|       |/// Convert a value to a string as if evaluating the expression:
  |  |  648|       |///     Arg1 = "" + Arg2
  |  |  649|       |/// In practice this means
  |  |  650|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  651|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  652|  2.40k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  653|       |
  |  |  654|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  655|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  656|       |// will be populated and the rest of the instruction will access it directly.
  |  |  657|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  658|       |// instead of doing a full array allocation and property lookup.
  |  |  659|       |
  |  |  660|       |/// Get a property of the 'arguments' array by value.
  |  |  661|       |/// Arg1 is the result.
  |  |  662|       |/// Arg2 is the index.
  |  |  663|       |/// Arg3 is the lazy loaded register.
  |  |  664|       |/// Arg1 = arguments[Arg2]
  |  |  665|  2.40k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  666|       |
  |  |  667|       |/// Get the length of the 'arguments' array.
  |  |  668|       |/// Arg1 is the result.
  |  |  669|       |/// Arg2 is the lazy loaded register.
  |  |  670|       |/// Arg1 = arguments.length
  |  |  671|  2.40k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  672|       |
  |  |  673|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  674|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  675|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  676|  2.40k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  677|       |
  |  |  678|       |/// Create a regular expression.
  |  |  679|       |/// Arg1 is the result.
  |  |  680|       |/// Arg2 is the string index of the pattern.
  |  |  681|       |/// Arg3 is the string index of the flags.
  |  |  682|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  683|  2.40k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  684|  2.40k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  685|  2.40k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  686|       |
  |  |  687|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  688|       |/// input or to the default block if out of range (or not right type)
  |  |  689|       |/// Arg 1 is the value to be branched upon
  |  |  690|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  691|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  692|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  693|       |/// less than this value jmp to
  |  |  694|       |///   default block
  |  |  695|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  696|       |///   default block.
  |  |  697|       |///
  |  |  698|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  699|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  700|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  701|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  702|  2.40k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  703|       |
  |  |  704|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  705|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  706|  2.40k|DEFINE_OPCODE_0(StartGenerator)
  |  |  707|       |
  |  |  708|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  709|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  710|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  711|       |/// - throw(val): Throw val as an error
  |  |  712|       |/// Arg1 is the result provided by the user.
  |  |  713|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  714|  2.40k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  715|       |
  |  |  716|       |/// Set the generator status to complete, but do not return.
  |  |  717|  2.40k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  718|       |
  |  |  719|       |/// Create a generator.
  |  |  720|       |/// Arg1 is the register in which to store the generator.
  |  |  721|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  722|       |/// Arg3 is index in the function table.
  |  |  723|  2.40k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  724|  2.40k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  725|  2.40k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  726|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  727|       |
  |  |  728|       |/// Arg1 [out] is the result iterator or index.
  |  |  729|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  730|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  731|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  732|       |/// method on the iterator.
  |  |  733|       |/// See IR.md for IteratorBeginInst.
  |  |  734|  2.40k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  735|       |
  |  |  736|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  737|       |/// Arg2 [in/out] is the iterator or index.
  |  |  738|       |/// Arg2 [in] is the source or the next method.
  |  |  739|       |/// If iterator is undefined, result = undefined.
  |  |  740|       |/// If iterator is a number:
  |  |  741|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  742|       |///   Else iterator = undefined and result = undefined
  |  |  743|       |/// Else:
  |  |  744|       |///   n = iterator.next()
  |  |  745|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  746|       |///   Else result = n.value
  |  |  747|       |/// See IR.md for IteratorNextInst.
  |  |  748|  2.40k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  749|       |
  |  |  750|       |/// Arg1 [in] is the iterator or array index.
  |  |  751|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  752|       |/// If the iterator is an object, call iterator.return().
  |  |  753|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  754|       |/// See IR.md for IteratorCloseInst.
  |  |  755|  2.40k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  756|       |
  |  |  757|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  758|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  759|       |// The macros will automatically generate two opcodes for each definition,
  |  |  760|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  761|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  762|  2.40k|#define DEFINE_JUMP_1(name)           \
  |  |  763|  2.40k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  764|  2.40k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  765|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  766|       |
  |  |  767|  2.40k|#define DEFINE_JUMP_2(name)                 \
  |  |  768|  2.40k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  769|  2.40k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  770|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  771|       |
  |  |  772|  2.40k|#define DEFINE_JUMP_3(name)                       \
  |  |  773|  2.40k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  774|  2.40k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  775|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  776|       |
  |  |  777|       |/// Unconditional branch to Arg1.
  |  |  778|  2.40k|DEFINE_JUMP_1(Jmp)
  |  |  779|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  780|  2.40k|DEFINE_JUMP_2(JmpTrue)
  |  |  781|  2.40k|DEFINE_JUMP_2(JmpFalse)
  |  |  782|       |/// Jump if the value is undefined.
  |  |  783|  2.40k|DEFINE_JUMP_2(JmpUndefined)
  |  |  784|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  785|       |/// at the provided target.
  |  |  786|  2.40k|DEFINE_JUMP_1(SaveGenerator)
  |  |  787|       |
  |  |  788|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  789|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  790|       |
  |  |  791|       |/// Not conditionals are required for NaN comparisons
  |  |  792|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  793|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  794|       |/// "jump when less than to BB1".
  |  |  795|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  796|  2.40k|DEFINE_JUMP_3(JLess)
  |  |  797|  2.40k|DEFINE_JUMP_3(JNotLess)
  |  |  798|  2.40k|DEFINE_JUMP_3(JLessN)
  |  |  799|  2.40k|DEFINE_JUMP_3(JNotLessN)
  |  |  800|  2.40k|DEFINE_JUMP_3(JLessEqual)
  |  |  801|  2.40k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  802|  2.40k|DEFINE_JUMP_3(JLessEqualN)
  |  |  803|  2.40k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  804|  2.40k|DEFINE_JUMP_3(JGreater)
  |  |  805|  2.40k|DEFINE_JUMP_3(JNotGreater)
  |  |  806|  2.40k|DEFINE_JUMP_3(JGreaterN)
  |  |  807|  2.40k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  808|  2.40k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  809|  2.40k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  810|  2.40k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  811|  2.40k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  812|  2.40k|DEFINE_JUMP_3(JEqual)
  |  |  813|  2.40k|DEFINE_JUMP_3(JNotEqual)
  |  |  814|  2.40k|DEFINE_JUMP_3(JStrictEqual)
  |  |  815|  2.40k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  816|       |
  |  |  817|       |#ifdef HERMES_RUN_WASM
  |  |  818|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  819|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  820|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  821|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  822|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  823|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  824|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  825|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  826|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  827|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  828|       |
  |  |  829|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  830|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  831|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  832|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  833|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  834|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  835|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  836|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  837|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  838|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  839|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  840|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  841|       |
  |  |  842|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  843|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  844|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  845|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  846|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  847|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  848|       |#endif
  |  |  849|       |
  |  |  850|       |// Implementations can rely on the following pairs of instructions having the
  |  |  851|       |// same number and type of operands.
  |  |  852|  2.40k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  853|  2.40k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  854|  2.40k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  855|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  856|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  857|  2.40k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  858|  2.40k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  859|  2.40k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  860|       |
  |  |  861|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  862|  2.40k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  863|  2.40k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  864|       |
  |  |  865|  2.40k|#undef DEFINE_JUMP_1
  |  |  866|  2.40k|#undef DEFINE_JUMP_2
  |  |  867|  2.40k|#undef DEFINE_JUMP_3
  |  |  868|       |
  |  |  869|       |// Undefine all macros used to avoid confusing next include.
  |  |  870|  2.40k|#undef DEFINE_OPERAND_TYPE
  |  |  871|  2.40k|#undef DEFINE_OPCODE_0
  |  |  872|  2.40k|#undef DEFINE_OPCODE_1
  |  |  873|  2.40k|#undef DEFINE_OPCODE_2
  |  |  874|  2.40k|#undef DEFINE_OPCODE_3
  |  |  875|  2.40k|#undef DEFINE_OPCODE_4
  |  |  876|  2.40k|#undef DEFINE_OPCODE_5
  |  |  877|  2.40k|#undef DEFINE_OPCODE_6
  |  |  878|  2.40k|#undef DEFINE_OPCODE
  |  |  879|  2.40k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  880|  2.40k|#undef DEFINE_RET_TARGET
  |  |  881|  2.40k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  882|  2.40k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  883|  2.40k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  884|  2.40k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  885|  2.40k|#undef ASSERT_MONOTONE_INCREASING
  |  |  886|  2.40k|#undef OPERAND_BIGINT_ID
  |  |  887|  2.40k|#undef OPERAND_FUNCTION_ID
  |  |  888|  2.40k|#undef OPERAND_STRING_ID
  ------------------
  742|  2.40k|  });
  743|  2.40k|  constexpr auto minSize = std::min({
  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  745|  2.40k|#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|  2.40k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  2.40k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  2.40k|#endif
  |  |   12|  2.40k|#ifndef DEFINE_OPCODE_0
  |  |   13|  2.40k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  2.40k|#endif
  |  |   15|  2.40k|#ifndef DEFINE_OPCODE_1
  |  |   16|  2.40k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  2.40k|#endif
  |  |   18|  2.40k|#ifndef DEFINE_OPCODE_2
  |  |   19|  2.40k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  2.40k|#endif
  |  |   21|  2.40k|#ifndef DEFINE_OPCODE_3
  |  |   22|  2.40k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  2.40k|#endif
  |  |   24|  2.40k|#ifndef DEFINE_OPCODE_4
  |  |   25|  2.40k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  2.40k|#endif
  |  |   27|  2.40k|#ifndef DEFINE_OPCODE_5
  |  |   28|  2.40k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  2.40k|#endif
  |  |   30|  2.40k|#ifndef DEFINE_OPCODE_6
  |  |   31|  2.40k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  2.40k|#endif
  |  |   33|  2.40k|#ifndef DEFINE_OPCODE
  |  |   34|  2.40k|#define DEFINE_OPCODE(...)
  |  |   35|  2.40k|#endif
  |  |   36|  2.40k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  2.40k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  2.40k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  2.40k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  2.40k|#endif
  |  |   45|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  2.40k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  2.40k|#endif
  |  |   48|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  2.40k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  2.40k|#endif
  |  |   51|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  2.40k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  2.40k|#endif
  |  |   54|  2.40k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  2.40k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  2.40k|#endif
  |  |   57|  2.40k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  2.40k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  2.40k|#endif
  |  |   60|  2.40k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  2.40k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  2.40k|#endif
  |  |   63|  2.40k|#ifndef OPERAND_STRING_ID
  |  |   64|  2.40k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  2.40k|#endif
  |  |   66|       |
  |  |   67|  2.40k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  2.40k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  2.40k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  2.40k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  2.40k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  2.40k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  2.40k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  2.40k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  2.40k|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|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  2.40k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  2.40k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  2.40k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  2.40k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  2.40k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  2.40k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  2.40k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  2.40k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  2.40k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  2.40k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  2.40k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  2.40k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  2.40k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  2.40k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  2.40k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  2.40k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  2.40k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  2.40k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  2.40k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  2.40k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  2.40k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  2.40k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  2.40k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  2.40k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  2.40k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  2.40k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  2.40k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  2.40k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  2.40k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  2.40k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  2.40k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  2.40k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  2.40k|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|  2.40k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  2.40k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  2.40k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  2.40k|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|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  2.40k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  2.40k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  2.40k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Create a new inner environment, to store values captured by closures.
  |  |  249|       |/// Arg1 is the destination.
  |  |  250|       |/// Arg2 is the parent environment.
  |  |  251|       |/// Arg3 is the number of slots in the environment.
  |  |  252|  2.40k|DEFINE_OPCODE_3(CreateInnerEnvironment, Reg8, Reg8, UInt32)
  |  |  253|       |
  |  |  254|       |/// Declare a global variable by string table index.
  |  |  255|       |/// The variable will be set to undefined.
  |  |  256|  2.40k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  257|  2.40k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  258|       |
  |  |  259|       |/// Checks if globalThis has a restricted global property with the given name.
  |  |  260|       |/// Arg1 is the name to check.
  |  |  261|  2.40k|DEFINE_OPCODE_1(ThrowIfHasRestrictedGlobalProperty, UInt32)
  |  |  262|  2.40k|OPERAND_STRING_ID(ThrowIfHasRestrictedGlobalProperty, 1)
  |  |  263|       |
  |  |  264|       |/// Get an object property by string table index.
  |  |  265|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  266|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  267|  2.40k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  268|  2.40k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  269|  2.40k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  270|  2.40k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  271|  2.40k|OPERAND_STRING_ID(GetById, 4)
  |  |  272|  2.40k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  273|       |
  |  |  274|       |/// Get an object property by string table index, or throw if not found.
  |  |  275|       |/// This is similar to GetById, but intended for use with global variables
  |  |  276|       |/// where Arg2 = GetGlobalObject.
  |  |  277|  2.40k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  278|  2.40k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  279|  2.40k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  280|  2.40k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  281|       |
  |  |  282|       |/// Set an object property by string index.
  |  |  283|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  284|  2.40k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  285|  2.40k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  286|  2.40k|OPERAND_STRING_ID(PutById, 4)
  |  |  287|  2.40k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  288|       |
  |  |  289|       |/// Set an object property by string index, or throw if undeclared.
  |  |  290|       |/// This is similar to PutById, but intended for use with global variables
  |  |  291|       |/// where Arg1 = GetGlobalObject.
  |  |  292|  2.40k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  293|  2.40k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  294|  2.40k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  295|  2.40k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  296|       |
  |  |  297|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  298|       |/// the destination must be an object, it only deals with own properties,
  |  |  299|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  300|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  301|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  302|       |/// Arg2 is the value to write.
  |  |  303|       |/// Arg3 is the string table ID of the property name.
  |  |  304|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  305|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  306|  2.40k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  307|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  308|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  309|  2.40k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  310|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  311|       |
  |  |  312|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  313|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  314|       |/// Arg1 is the destination object.
  |  |  315|       |/// Arg2 is the value to write.
  |  |  316|       |/// Arg3 is the string table ID of the property name.
  |  |  317|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  318|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  319|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  320|  2.40k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  321|  2.40k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  322|       |
  |  |  323|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  324|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  325|  2.40k|    PutNewOwnByIdShort,
  |  |  326|  2.40k|    PutNewOwnById,
  |  |  327|  2.40k|    PutNewOwnByIdLong,
  |  |  328|  2.40k|    PutNewOwnNEById,
  |  |  329|  2.40k|    PutNewOwnNEByIdLong)
  |  |  330|       |
  |  |  331|       |/// Assign a value to a constant integer own property which will be created as
  |  |  332|       |/// enumerable. This is used (potentially in conjunction with
  |  |  333|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  334|       |/// Arg1[Arg3] = Arg2;
  |  |  335|  2.40k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  336|  2.40k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  337|       |
  |  |  338|       |/// Set an own property identified by value.
  |  |  339|       |/// Arg1 is the destination object.
  |  |  340|       |/// Arg2 is the value to write.
  |  |  341|       |/// Arg3 is the property name.
  |  |  342|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  343|       |///        non-enumerable otherwise.
  |  |  344|       |/// Arg1[Arg3] = Arg2;
  |  |  345|  2.40k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  346|       |
  |  |  347|       |/// Delete a property by string table index.
  |  |  348|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  349|  2.40k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  350|  2.40k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  351|  2.40k|OPERAND_STRING_ID(DelById, 3)
  |  |  352|  2.40k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  353|       |
  |  |  354|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  355|       |/// Arg1 = Arg2[Arg3]
  |  |  356|  2.40k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  357|       |
  |  |  358|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  359|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  360|       |/// case this is still the right opcode).
  |  |  361|       |/// Arg1[Arg2] = Arg3
  |  |  362|  2.40k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  363|       |
  |  |  364|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  365|       |/// Arg1 = delete Arg2[Arg3]
  |  |  366|  2.40k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  367|       |
  |  |  368|       |/// Add a getter and a setter for a property by value.
  |  |  369|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  370|       |/// Arg1 is the target object which will have a property defined.
  |  |  371|       |/// Arg2 is the property name
  |  |  372|       |/// Arg3 is the getter closure or undefined
  |  |  373|       |/// Arg4 is the setter closure or undefined
  |  |  374|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  375|  2.40k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  376|       |
  |  |  377|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  378|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  379|       |/// Returns Undefined if the object is null/undefined.
  |  |  380|       |/// Arg2 is the register that holds the object.
  |  |  381|       |/// Arg3 is the register that holds the iterating index.
  |  |  382|       |/// Arg4 is the register that holds the size of the property list.
  |  |  383|  2.40k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  384|       |
  |  |  385|       |/// Get the next property in the for..in iterator.
  |  |  386|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  387|       |/// Arg2 is the register that holds array of properties.
  |  |  388|       |/// Arg3 is the register that holds the object.
  |  |  389|       |/// Arg4 is the register that holds the iterating index.
  |  |  390|       |/// Arg5 is the register that holds the size of the property list.
  |  |  391|  2.40k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  392|       |
  |  |  393|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  394|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  395|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  396|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  397|       |/// wider instructions appearing after narrower ones.
  |  |  398|       |
  |  |  399|       |/// Call a function.
  |  |  400|       |/// Arg1 is the destination of the return value.
  |  |  401|       |/// Arg2 is the closure to invoke.
  |  |  402|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  403|       |///      from the end of the current frame.
  |  |  404|  2.40k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  405|  2.40k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  406|       |
  |  |  407|       |/// Call a constructor, with semantics identical to Call.
  |  |  408|       |/// Arg1 is the destination of the return value.
  |  |  409|       |/// Arg2 is the closure to invoke.
  |  |  410|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  411|       |///      from the end of the current frame. The first argument 'this'
  |  |  412|       |///      is assumed to be created with CreateThis.
  |  |  413|  2.40k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  414|  2.40k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  415|       |
  |  |  416|       |/// Call a function with one arg.
  |  |  417|       |/// Arg1 is the destination of the return value.
  |  |  418|       |/// Arg2 is the closure to invoke.
  |  |  419|       |/// Arg3 is the first argument.
  |  |  420|  2.40k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  421|  2.40k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function directly without a closure.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  426|       |///      from the end of the current frame. The first argument 'this'
  |  |  427|       |///      is assumed to be created with CreateThis.
  |  |  428|       |/// Arg3 is index in the function table.
  |  |  429|       |/// Note that we expect the variable-sized argument to be last.
  |  |  430|  2.40k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  431|  2.40k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  432|  2.40k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  433|       |
  |  |  434|       |/// Call a function with two args.
  |  |  435|       |/// Arg1 is the destination of the return value.
  |  |  436|       |/// Arg2 is the closure to invoke.
  |  |  437|       |/// Arg3 is the first argument.
  |  |  438|       |/// Arg4 is the second argument.
  |  |  439|  2.40k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  440|  2.40k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  441|       |
  |  |  442|       |/// Call a function with three args.
  |  |  443|       |/// Arg1 is the destination of the return value.
  |  |  444|       |/// Arg2 is the closure to invoke.
  |  |  445|       |/// Arg3 is the first argument.
  |  |  446|       |/// Arg4 is the second argument.
  |  |  447|       |/// Arg5 is the third argument.
  |  |  448|  2.40k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  449|  2.40k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  450|       |
  |  |  451|       |/// Call a function with four args.
  |  |  452|       |/// Arg1 is the destination of the return value.
  |  |  453|       |/// Arg2 is the closure to invoke.
  |  |  454|       |/// Arg3 is the first argument.
  |  |  455|       |/// Arg4 is the second argument.
  |  |  456|       |/// Arg5 is the third argument.
  |  |  457|       |/// Arg6 is the fourth argument.
  |  |  458|  2.40k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  459|  2.40k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  460|       |
  |  |  461|       |/// Identical to Call, but allowing more arguments.
  |  |  462|  2.40k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  463|  2.40k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  464|       |
  |  |  465|       |/// Identical to Construct, but allowing more arguments.
  |  |  466|  2.40k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  467|  2.40k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  468|       |
  |  |  469|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  470|  2.40k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  471|  2.40k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  744|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  472|       |
  |  |  473|       |// Enforce the order.
  |  |  474|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  475|  2.40k|    Call,
  |  |  476|  2.40k|    Construct,
  |  |  477|  2.40k|    Call1,
  |  |  478|  2.40k|    CallDirect,
  |  |  479|  2.40k|    Call2,
  |  |  480|  2.40k|    Call3,
  |  |  481|  2.40k|    Call4,
  |  |  482|  2.40k|    CallLong,
  |  |  483|  2.40k|    ConstructLong,
  |  |  484|  2.40k|    CallDirectLongIndex)
  |  |  485|       |
  |  |  486|       |/// Call a builtin function.
  |  |  487|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  488|       |/// and therefore never JS.
  |  |  489|       |/// Arg1 is the destination of the return value.
  |  |  490|       |/// Arg2 is the builtin number.
  |  |  491|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  492|       |///      from the end of the current frame.
  |  |  493|       |/// thisArg is set to "undefined".
  |  |  494|  2.40k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  495|       |
  |  |  496|       |/// Call a builtin function.
  |  |  497|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  498|       |/// and therefore never JS.
  |  |  499|       |/// Arg1 is the destination of the return value.
  |  |  500|       |/// Arg2 is the builtin number.
  |  |  501|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  502|       |///      from the end of the current frame.
  |  |  503|       |/// thisArg is set to "undefined".
  |  |  504|  2.40k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  505|       |
  |  |  506|       |/// Get a closure from a builtin function.
  |  |  507|       |/// Arg1 is the destination of the return value.
  |  |  508|       |/// Arg2 is the builtin number.
  |  |  509|  2.40k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  510|       |
  |  |  511|       |///
  |  |  512|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  513|       |
  |  |  514|       |/// Return a value from the current function.
  |  |  515|       |/// return Arg1;
  |  |  516|  2.40k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  517|       |
  |  |  518|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  519|       |/// } catch(Arg1) {
  |  |  520|  2.40k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  521|       |
  |  |  522|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  523|       |/// Arg1 is the destination of the return value.
  |  |  524|       |/// Arg2 is the value to eval.
  |  |  525|       |/// Arg3 is a boolean which is true if the eval should be performed in strict mode.
  |  |  526|  2.40k|DEFINE_OPCODE_3(DirectEval, Reg8, Reg8, UInt8)
  |  |  527|       |
  |  |  528|       |/// Throw an exception.
  |  |  529|       |/// throw Arg1;
  |  |  530|  2.40k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  531|       |
  |  |  532|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  533|       |/// Arg1 is the destination of the return value
  |  |  534|       |/// Arg2 is the value to check
  |  |  535|  2.40k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  536|       |
  |  |  537|       |/// Implementation dependent debugger action.
  |  |  538|  2.40k|DEFINE_OPCODE_0(Debugger)
  |  |  539|       |
  |  |  540|       |/// Fast check for an async interrupt request.
  |  |  541|  2.40k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  542|       |
  |  |  543|       |/// Define a profile point.
  |  |  544|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  545|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  546|       |/// all the overflowed profile points have index zero.
  |  |  547|  2.40k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  548|       |
  |  |  549|       |/// Create a closure.
  |  |  550|       |/// Arg1 is the register in which to store the closure.
  |  |  551|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  552|       |/// Arg3 is index in the function table.
  |  |  553|  2.40k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  554|  2.40k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  555|  2.40k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  556|  2.40k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  557|       |
  |  |  558|       |/// Create a closure for a GeneratorFunction.
  |  |  559|       |/// Arg1 is the register in which to store the closure.
  |  |  560|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  561|       |/// Arg3 is index in the function table.
  |  |  562|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  563|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  564|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  565|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  566|       |
  |  |  567|       |/// Create a closure for an AsyncFunction.
  |  |  568|       |/// Arg1 is the register in which to store the closure.
  |  |  569|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  570|       |/// Arg3 is index in the function table.
  |  |  571|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  572|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  573|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  574|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  575|       |
  |  |  576|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  577|       |/// Arg1 is the destination register.
  |  |  578|       |/// Arg2 is the prototype to assign it.
  |  |  579|       |/// Arg3 is the constructor closure that will be used*.
  |  |  580|       |/// * To allow internal constructors to have special objects allocated.
  |  |  581|  2.40k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  582|       |
  |  |  583|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  584|       |/// Arg1 is the result.
  |  |  585|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  586|       |/// Arg3 is the constructor's return value.
  |  |  587|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  588|  2.40k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  589|       |
  |  |  590|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  591|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  592|  2.40k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  593|       |
  |  |  594|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  595|  2.40k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  596|       |
  |  |  597|       |/// Load a constant integer value.
  |  |  598|  2.40k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  599|  2.40k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  600|       |
  |  |  601|       |/// Load a constant double value.
  |  |  602|  2.40k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  603|       |
  |  |  604|       |/// Load a constant BigInt value by bigint table index.
  |  |  605|  2.40k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  606|  2.40k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  607|  2.40k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  608|  2.40k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  609|       |
  |  |  610|       |/// Load a constant string value by string table index.
  |  |  611|  2.40k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  612|  2.40k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  613|  2.40k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  614|  2.40k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  615|       |
  |  |  616|       |/// Load common constants.
  |  |  617|  2.40k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  618|  2.40k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  619|  2.40k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  620|  2.40k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  621|  2.40k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  622|  2.40k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  623|       |
  |  |  624|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  625|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  626|       |/// object.
  |  |  627|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  628|  2.40k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  629|       |
  |  |  630|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  631|       |/// \code
  |  |  632|       |///     LoadParam    Arg1, #0
  |  |  633|       |///     CoerceThisNS Arg1, Arg1
  |  |  634|       |/// \endcode
  |  |  635|  2.40k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  636|       |
  |  |  637|       |/// Convert a value to a number.
  |  |  638|       |/// Arg1 = Arg2 - 0
  |  |  639|  2.40k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  640|       |/// Convert a value to a numberic.
  |  |  641|       |/// Arg1 = ToNumeric(Arg2)
  |  |  642|  2.40k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  643|       |/// Convert a value to a 32-bit signed integer.
  |  |  644|       |/// Arg1 = Arg2 | 0
  |  |  645|  2.40k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  646|       |
  |  |  647|       |/// Convert a value to a string as if evaluating the expression:
  |  |  648|       |///     Arg1 = "" + Arg2
  |  |  649|       |/// In practice this means
  |  |  650|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  651|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  652|  2.40k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  653|       |
  |  |  654|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  655|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  656|       |// will be populated and the rest of the instruction will access it directly.
  |  |  657|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  658|       |// instead of doing a full array allocation and property lookup.
  |  |  659|       |
  |  |  660|       |/// Get a property of the 'arguments' array by value.
  |  |  661|       |/// Arg1 is the result.
  |  |  662|       |/// Arg2 is the index.
  |  |  663|       |/// Arg3 is the lazy loaded register.
  |  |  664|       |/// Arg1 = arguments[Arg2]
  |  |  665|  2.40k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  666|       |
  |  |  667|       |/// Get the length of the 'arguments' array.
  |  |  668|       |/// Arg1 is the result.
  |  |  669|       |/// Arg2 is the lazy loaded register.
  |  |  670|       |/// Arg1 = arguments.length
  |  |  671|  2.40k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  672|       |
  |  |  673|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  674|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  675|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  676|  2.40k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  677|       |
  |  |  678|       |/// Create a regular expression.
  |  |  679|       |/// Arg1 is the result.
  |  |  680|       |/// Arg2 is the string index of the pattern.
  |  |  681|       |/// Arg3 is the string index of the flags.
  |  |  682|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  683|  2.40k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  684|  2.40k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  685|  2.40k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  686|       |
  |  |  687|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  688|       |/// input or to the default block if out of range (or not right type)
  |  |  689|       |/// Arg 1 is the value to be branched upon
  |  |  690|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  691|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  692|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  693|       |/// less than this value jmp to
  |  |  694|       |///   default block
  |  |  695|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  696|       |///   default block.
  |  |  697|       |///
  |  |  698|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  699|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  700|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  701|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  702|  2.40k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  703|       |
  |  |  704|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  705|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  706|  2.40k|DEFINE_OPCODE_0(StartGenerator)
  |  |  707|       |
  |  |  708|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  709|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  710|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  711|       |/// - throw(val): Throw val as an error
  |  |  712|       |/// Arg1 is the result provided by the user.
  |  |  713|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  714|  2.40k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  715|       |
  |  |  716|       |/// Set the generator status to complete, but do not return.
  |  |  717|  2.40k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  718|       |
  |  |  719|       |/// Create a generator.
  |  |  720|       |/// Arg1 is the register in which to store the generator.
  |  |  721|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  722|       |/// Arg3 is index in the function table.
  |  |  723|  2.40k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  724|  2.40k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  725|  2.40k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  726|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  727|       |
  |  |  728|       |/// Arg1 [out] is the result iterator or index.
  |  |  729|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  730|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  731|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  732|       |/// method on the iterator.
  |  |  733|       |/// See IR.md for IteratorBeginInst.
  |  |  734|  2.40k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  735|       |
  |  |  736|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  737|       |/// Arg2 [in/out] is the iterator or index.
  |  |  738|       |/// Arg2 [in] is the source or the next method.
  |  |  739|       |/// If iterator is undefined, result = undefined.
  |  |  740|       |/// If iterator is a number:
  |  |  741|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  742|       |///   Else iterator = undefined and result = undefined
  |  |  743|       |/// Else:
  |  |  744|       |///   n = iterator.next()
  |  |  745|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  746|       |///   Else result = n.value
  |  |  747|       |/// See IR.md for IteratorNextInst.
  |  |  748|  2.40k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  749|       |
  |  |  750|       |/// Arg1 [in] is the iterator or array index.
  |  |  751|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  752|       |/// If the iterator is an object, call iterator.return().
  |  |  753|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  754|       |/// See IR.md for IteratorCloseInst.
  |  |  755|  2.40k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  756|       |
  |  |  757|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  758|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  759|       |// The macros will automatically generate two opcodes for each definition,
  |  |  760|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  761|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  762|  2.40k|#define DEFINE_JUMP_1(name)           \
  |  |  763|  2.40k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  764|  2.40k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  765|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  766|       |
  |  |  767|  2.40k|#define DEFINE_JUMP_2(name)                 \
  |  |  768|  2.40k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  769|  2.40k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  770|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  771|       |
  |  |  772|  2.40k|#define DEFINE_JUMP_3(name)                       \
  |  |  773|  2.40k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  774|  2.40k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  775|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  776|       |
  |  |  777|       |/// Unconditional branch to Arg1.
  |  |  778|  2.40k|DEFINE_JUMP_1(Jmp)
  |  |  779|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  780|  2.40k|DEFINE_JUMP_2(JmpTrue)
  |  |  781|  2.40k|DEFINE_JUMP_2(JmpFalse)
  |  |  782|       |/// Jump if the value is undefined.
  |  |  783|  2.40k|DEFINE_JUMP_2(JmpUndefined)
  |  |  784|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  785|       |/// at the provided target.
  |  |  786|  2.40k|DEFINE_JUMP_1(SaveGenerator)
  |  |  787|       |
  |  |  788|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  789|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  790|       |
  |  |  791|       |/// Not conditionals are required for NaN comparisons
  |  |  792|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  793|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  794|       |/// "jump when less than to BB1".
  |  |  795|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  796|  2.40k|DEFINE_JUMP_3(JLess)
  |  |  797|  2.40k|DEFINE_JUMP_3(JNotLess)
  |  |  798|  2.40k|DEFINE_JUMP_3(JLessN)
  |  |  799|  2.40k|DEFINE_JUMP_3(JNotLessN)
  |  |  800|  2.40k|DEFINE_JUMP_3(JLessEqual)
  |  |  801|  2.40k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  802|  2.40k|DEFINE_JUMP_3(JLessEqualN)
  |  |  803|  2.40k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  804|  2.40k|DEFINE_JUMP_3(JGreater)
  |  |  805|  2.40k|DEFINE_JUMP_3(JNotGreater)
  |  |  806|  2.40k|DEFINE_JUMP_3(JGreaterN)
  |  |  807|  2.40k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  808|  2.40k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  809|  2.40k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  810|  2.40k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  811|  2.40k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  812|  2.40k|DEFINE_JUMP_3(JEqual)
  |  |  813|  2.40k|DEFINE_JUMP_3(JNotEqual)
  |  |  814|  2.40k|DEFINE_JUMP_3(JStrictEqual)
  |  |  815|  2.40k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  816|       |
  |  |  817|       |#ifdef HERMES_RUN_WASM
  |  |  818|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  819|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  820|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  821|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  822|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  823|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  824|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  825|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  826|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  827|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  828|       |
  |  |  829|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  830|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  831|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  832|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  833|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  834|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  835|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  836|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  837|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  838|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  839|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  840|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  841|       |
  |  |  842|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  843|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  844|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  845|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  846|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  847|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  848|       |#endif
  |  |  849|       |
  |  |  850|       |// Implementations can rely on the following pairs of instructions having the
  |  |  851|       |// same number and type of operands.
  |  |  852|  2.40k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  853|  2.40k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  854|  2.40k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  855|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  856|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  857|  2.40k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  858|  2.40k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  859|  2.40k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  860|       |
  |  |  861|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  862|  2.40k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  863|  2.40k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  864|       |
  |  |  865|  2.40k|#undef DEFINE_JUMP_1
  |  |  866|  2.40k|#undef DEFINE_JUMP_2
  |  |  867|  2.40k|#undef DEFINE_JUMP_3
  |  |  868|       |
  |  |  869|       |// Undefine all macros used to avoid confusing next include.
  |  |  870|  2.40k|#undef DEFINE_OPERAND_TYPE
  |  |  871|  2.40k|#undef DEFINE_OPCODE_0
  |  |  872|  2.40k|#undef DEFINE_OPCODE_1
  |  |  873|  2.40k|#undef DEFINE_OPCODE_2
  |  |  874|  2.40k|#undef DEFINE_OPCODE_3
  |  |  875|  2.40k|#undef DEFINE_OPCODE_4
  |  |  876|  2.40k|#undef DEFINE_OPCODE_5
  |  |  877|  2.40k|#undef DEFINE_OPCODE_6
  |  |  878|  2.40k|#undef DEFINE_OPCODE
  |  |  879|  2.40k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  880|  2.40k|#undef DEFINE_RET_TARGET
  |  |  881|  2.40k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  882|  2.40k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  883|  2.40k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  884|  2.40k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  885|  2.40k|#undef ASSERT_MONOTONE_INCREASING
  |  |  886|  2.40k|#undef OPERAND_BIGINT_ID
  |  |  887|  2.40k|#undef OPERAND_FUNCTION_ID
  |  |  888|  2.40k|#undef OPERAND_STRING_ID
  ------------------
  746|  2.40k|  });
  747|  2.40k|  constexpr auto maxSize = std::max({
  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  749|  2.40k|#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|  2.40k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  2.40k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  2.40k|#endif
  |  |   12|  2.40k|#ifndef DEFINE_OPCODE_0
  |  |   13|  2.40k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  2.40k|#endif
  |  |   15|  2.40k|#ifndef DEFINE_OPCODE_1
  |  |   16|  2.40k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  2.40k|#endif
  |  |   18|  2.40k|#ifndef DEFINE_OPCODE_2
  |  |   19|  2.40k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  2.40k|#endif
  |  |   21|  2.40k|#ifndef DEFINE_OPCODE_3
  |  |   22|  2.40k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  2.40k|#endif
  |  |   24|  2.40k|#ifndef DEFINE_OPCODE_4
  |  |   25|  2.40k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  2.40k|#endif
  |  |   27|  2.40k|#ifndef DEFINE_OPCODE_5
  |  |   28|  2.40k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  2.40k|#endif
  |  |   30|  2.40k|#ifndef DEFINE_OPCODE_6
  |  |   31|  2.40k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  2.40k|#endif
  |  |   33|  2.40k|#ifndef DEFINE_OPCODE
  |  |   34|  2.40k|#define DEFINE_OPCODE(...)
  |  |   35|  2.40k|#endif
  |  |   36|  2.40k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  2.40k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  2.40k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  2.40k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  2.40k|#endif
  |  |   45|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  2.40k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  2.40k|#endif
  |  |   48|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  2.40k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  2.40k|#endif
  |  |   51|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  2.40k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  2.40k|#endif
  |  |   54|  2.40k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  2.40k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  2.40k|#endif
  |  |   57|  2.40k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  2.40k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  2.40k|#endif
  |  |   60|  2.40k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  2.40k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  2.40k|#endif
  |  |   63|  2.40k|#ifndef OPERAND_STRING_ID
  |  |   64|  2.40k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  2.40k|#endif
  |  |   66|       |
  |  |   67|  2.40k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  2.40k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  2.40k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  2.40k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  2.40k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  2.40k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  2.40k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  2.40k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  2.40k|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|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  2.40k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  2.40k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  2.40k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  2.40k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  2.40k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  2.40k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  2.40k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  2.40k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  2.40k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  2.40k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  2.40k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  2.40k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  2.40k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  2.40k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  2.40k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  2.40k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  2.40k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  2.40k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  2.40k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  2.40k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  2.40k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  2.40k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  2.40k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  2.40k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  2.40k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  2.40k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  2.40k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  2.40k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  2.40k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  2.40k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  2.40k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  2.40k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  2.40k|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|  2.40k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  2.40k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  2.40k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  2.40k|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|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  2.40k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  2.40k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  2.40k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Create a new inner environment, to store values captured by closures.
  |  |  249|       |/// Arg1 is the destination.
  |  |  250|       |/// Arg2 is the parent environment.
  |  |  251|       |/// Arg3 is the number of slots in the environment.
  |  |  252|  2.40k|DEFINE_OPCODE_3(CreateInnerEnvironment, Reg8, Reg8, UInt32)
  |  |  253|       |
  |  |  254|       |/// Declare a global variable by string table index.
  |  |  255|       |/// The variable will be set to undefined.
  |  |  256|  2.40k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  257|  2.40k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  258|       |
  |  |  259|       |/// Checks if globalThis has a restricted global property with the given name.
  |  |  260|       |/// Arg1 is the name to check.
  |  |  261|  2.40k|DEFINE_OPCODE_1(ThrowIfHasRestrictedGlobalProperty, UInt32)
  |  |  262|  2.40k|OPERAND_STRING_ID(ThrowIfHasRestrictedGlobalProperty, 1)
  |  |  263|       |
  |  |  264|       |/// Get an object property by string table index.
  |  |  265|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  266|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  267|  2.40k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  268|  2.40k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  269|  2.40k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  270|  2.40k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  271|  2.40k|OPERAND_STRING_ID(GetById, 4)
  |  |  272|  2.40k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  273|       |
  |  |  274|       |/// Get an object property by string table index, or throw if not found.
  |  |  275|       |/// This is similar to GetById, but intended for use with global variables
  |  |  276|       |/// where Arg2 = GetGlobalObject.
  |  |  277|  2.40k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  278|  2.40k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  279|  2.40k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  280|  2.40k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  281|       |
  |  |  282|       |/// Set an object property by string index.
  |  |  283|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  284|  2.40k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  285|  2.40k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  286|  2.40k|OPERAND_STRING_ID(PutById, 4)
  |  |  287|  2.40k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  288|       |
  |  |  289|       |/// Set an object property by string index, or throw if undeclared.
  |  |  290|       |/// This is similar to PutById, but intended for use with global variables
  |  |  291|       |/// where Arg1 = GetGlobalObject.
  |  |  292|  2.40k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  293|  2.40k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  294|  2.40k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  295|  2.40k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  296|       |
  |  |  297|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  298|       |/// the destination must be an object, it only deals with own properties,
  |  |  299|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  300|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  301|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  302|       |/// Arg2 is the value to write.
  |  |  303|       |/// Arg3 is the string table ID of the property name.
  |  |  304|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  305|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  306|  2.40k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  307|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  308|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  309|  2.40k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  310|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  311|       |
  |  |  312|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  313|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  314|       |/// Arg1 is the destination object.
  |  |  315|       |/// Arg2 is the value to write.
  |  |  316|       |/// Arg3 is the string table ID of the property name.
  |  |  317|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  318|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  319|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  320|  2.40k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  321|  2.40k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  322|       |
  |  |  323|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  324|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  325|  2.40k|    PutNewOwnByIdShort,
  |  |  326|  2.40k|    PutNewOwnById,
  |  |  327|  2.40k|    PutNewOwnByIdLong,
  |  |  328|  2.40k|    PutNewOwnNEById,
  |  |  329|  2.40k|    PutNewOwnNEByIdLong)
  |  |  330|       |
  |  |  331|       |/// Assign a value to a constant integer own property which will be created as
  |  |  332|       |/// enumerable. This is used (potentially in conjunction with
  |  |  333|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  334|       |/// Arg1[Arg3] = Arg2;
  |  |  335|  2.40k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  336|  2.40k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  337|       |
  |  |  338|       |/// Set an own property identified by value.
  |  |  339|       |/// Arg1 is the destination object.
  |  |  340|       |/// Arg2 is the value to write.
  |  |  341|       |/// Arg3 is the property name.
  |  |  342|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  343|       |///        non-enumerable otherwise.
  |  |  344|       |/// Arg1[Arg3] = Arg2;
  |  |  345|  2.40k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  346|       |
  |  |  347|       |/// Delete a property by string table index.
  |  |  348|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  349|  2.40k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  350|  2.40k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  351|  2.40k|OPERAND_STRING_ID(DelById, 3)
  |  |  352|  2.40k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  353|       |
  |  |  354|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  355|       |/// Arg1 = Arg2[Arg3]
  |  |  356|  2.40k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  357|       |
  |  |  358|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  359|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  360|       |/// case this is still the right opcode).
  |  |  361|       |/// Arg1[Arg2] = Arg3
  |  |  362|  2.40k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  363|       |
  |  |  364|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  365|       |/// Arg1 = delete Arg2[Arg3]
  |  |  366|  2.40k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  367|       |
  |  |  368|       |/// Add a getter and a setter for a property by value.
  |  |  369|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  370|       |/// Arg1 is the target object which will have a property defined.
  |  |  371|       |/// Arg2 is the property name
  |  |  372|       |/// Arg3 is the getter closure or undefined
  |  |  373|       |/// Arg4 is the setter closure or undefined
  |  |  374|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  375|  2.40k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  376|       |
  |  |  377|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  378|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  379|       |/// Returns Undefined if the object is null/undefined.
  |  |  380|       |/// Arg2 is the register that holds the object.
  |  |  381|       |/// Arg3 is the register that holds the iterating index.
  |  |  382|       |/// Arg4 is the register that holds the size of the property list.
  |  |  383|  2.40k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  384|       |
  |  |  385|       |/// Get the next property in the for..in iterator.
  |  |  386|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  387|       |/// Arg2 is the register that holds array of properties.
  |  |  388|       |/// Arg3 is the register that holds the object.
  |  |  389|       |/// Arg4 is the register that holds the iterating index.
  |  |  390|       |/// Arg5 is the register that holds the size of the property list.
  |  |  391|  2.40k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  392|       |
  |  |  393|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  394|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  395|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  396|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  397|       |/// wider instructions appearing after narrower ones.
  |  |  398|       |
  |  |  399|       |/// Call a function.
  |  |  400|       |/// Arg1 is the destination of the return value.
  |  |  401|       |/// Arg2 is the closure to invoke.
  |  |  402|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  403|       |///      from the end of the current frame.
  |  |  404|  2.40k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  405|  2.40k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  406|       |
  |  |  407|       |/// Call a constructor, with semantics identical to Call.
  |  |  408|       |/// Arg1 is the destination of the return value.
  |  |  409|       |/// Arg2 is the closure to invoke.
  |  |  410|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  411|       |///      from the end of the current frame. The first argument 'this'
  |  |  412|       |///      is assumed to be created with CreateThis.
  |  |  413|  2.40k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  414|  2.40k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  415|       |
  |  |  416|       |/// Call a function with one arg.
  |  |  417|       |/// Arg1 is the destination of the return value.
  |  |  418|       |/// Arg2 is the closure to invoke.
  |  |  419|       |/// Arg3 is the first argument.
  |  |  420|  2.40k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  421|  2.40k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function directly without a closure.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  426|       |///      from the end of the current frame. The first argument 'this'
  |  |  427|       |///      is assumed to be created with CreateThis.
  |  |  428|       |/// Arg3 is index in the function table.
  |  |  429|       |/// Note that we expect the variable-sized argument to be last.
  |  |  430|  2.40k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  431|  2.40k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  432|  2.40k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  433|       |
  |  |  434|       |/// Call a function with two args.
  |  |  435|       |/// Arg1 is the destination of the return value.
  |  |  436|       |/// Arg2 is the closure to invoke.
  |  |  437|       |/// Arg3 is the first argument.
  |  |  438|       |/// Arg4 is the second argument.
  |  |  439|  2.40k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  440|  2.40k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  441|       |
  |  |  442|       |/// Call a function with three args.
  |  |  443|       |/// Arg1 is the destination of the return value.
  |  |  444|       |/// Arg2 is the closure to invoke.
  |  |  445|       |/// Arg3 is the first argument.
  |  |  446|       |/// Arg4 is the second argument.
  |  |  447|       |/// Arg5 is the third argument.
  |  |  448|  2.40k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  449|  2.40k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  450|       |
  |  |  451|       |/// Call a function with four args.
  |  |  452|       |/// Arg1 is the destination of the return value.
  |  |  453|       |/// Arg2 is the closure to invoke.
  |  |  454|       |/// Arg3 is the first argument.
  |  |  455|       |/// Arg4 is the second argument.
  |  |  456|       |/// Arg5 is the third argument.
  |  |  457|       |/// Arg6 is the fourth argument.
  |  |  458|  2.40k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  459|  2.40k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  460|       |
  |  |  461|       |/// Identical to Call, but allowing more arguments.
  |  |  462|  2.40k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  463|  2.40k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  464|       |
  |  |  465|       |/// Identical to Construct, but allowing more arguments.
  |  |  466|  2.40k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  467|  2.40k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  468|       |
  |  |  469|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  470|  2.40k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  471|  2.40k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  748|  2.40k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  472|       |
  |  |  473|       |// Enforce the order.
  |  |  474|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  475|  2.40k|    Call,
  |  |  476|  2.40k|    Construct,
  |  |  477|  2.40k|    Call1,
  |  |  478|  2.40k|    CallDirect,
  |  |  479|  2.40k|    Call2,
  |  |  480|  2.40k|    Call3,
  |  |  481|  2.40k|    Call4,
  |  |  482|  2.40k|    CallLong,
  |  |  483|  2.40k|    ConstructLong,
  |  |  484|  2.40k|    CallDirectLongIndex)
  |  |  485|       |
  |  |  486|       |/// Call a builtin function.
  |  |  487|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  488|       |/// and therefore never JS.
  |  |  489|       |/// Arg1 is the destination of the return value.
  |  |  490|       |/// Arg2 is the builtin number.
  |  |  491|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  492|       |///      from the end of the current frame.
  |  |  493|       |/// thisArg is set to "undefined".
  |  |  494|  2.40k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  495|       |
  |  |  496|       |/// Call a builtin function.
  |  |  497|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  498|       |/// and therefore never JS.
  |  |  499|       |/// Arg1 is the destination of the return value.
  |  |  500|       |/// Arg2 is the builtin number.
  |  |  501|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  502|       |///      from the end of the current frame.
  |  |  503|       |/// thisArg is set to "undefined".
  |  |  504|  2.40k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  505|       |
  |  |  506|       |/// Get a closure from a builtin function.
  |  |  507|       |/// Arg1 is the destination of the return value.
  |  |  508|       |/// Arg2 is the builtin number.
  |  |  509|  2.40k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  510|       |
  |  |  511|       |///
  |  |  512|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  513|       |
  |  |  514|       |/// Return a value from the current function.
  |  |  515|       |/// return Arg1;
  |  |  516|  2.40k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  517|       |
  |  |  518|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  519|       |/// } catch(Arg1) {
  |  |  520|  2.40k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  521|       |
  |  |  522|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  523|       |/// Arg1 is the destination of the return value.
  |  |  524|       |/// Arg2 is the value to eval.
  |  |  525|       |/// Arg3 is a boolean which is true if the eval should be performed in strict mode.
  |  |  526|  2.40k|DEFINE_OPCODE_3(DirectEval, Reg8, Reg8, UInt8)
  |  |  527|       |
  |  |  528|       |/// Throw an exception.
  |  |  529|       |/// throw Arg1;
  |  |  530|  2.40k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  531|       |
  |  |  532|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  533|       |/// Arg1 is the destination of the return value
  |  |  534|       |/// Arg2 is the value to check
  |  |  535|  2.40k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  536|       |
  |  |  537|       |/// Implementation dependent debugger action.
  |  |  538|  2.40k|DEFINE_OPCODE_0(Debugger)
  |  |  539|       |
  |  |  540|       |/// Fast check for an async interrupt request.
  |  |  541|  2.40k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  542|       |
  |  |  543|       |/// Define a profile point.
  |  |  544|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  545|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  546|       |/// all the overflowed profile points have index zero.
  |  |  547|  2.40k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  548|       |
  |  |  549|       |/// Create a closure.
  |  |  550|       |/// Arg1 is the register in which to store the closure.
  |  |  551|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  552|       |/// Arg3 is index in the function table.
  |  |  553|  2.40k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  554|  2.40k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  555|  2.40k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  556|  2.40k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  557|       |
  |  |  558|       |/// Create a closure for a GeneratorFunction.
  |  |  559|       |/// Arg1 is the register in which to store the closure.
  |  |  560|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  561|       |/// Arg3 is index in the function table.
  |  |  562|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  563|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  564|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  565|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  566|       |
  |  |  567|       |/// Create a closure for an AsyncFunction.
  |  |  568|       |/// Arg1 is the register in which to store the closure.
  |  |  569|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  570|       |/// Arg3 is index in the function table.
  |  |  571|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  572|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  573|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  574|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  575|       |
  |  |  576|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  577|       |/// Arg1 is the destination register.
  |  |  578|       |/// Arg2 is the prototype to assign it.
  |  |  579|       |/// Arg3 is the constructor closure that will be used*.
  |  |  580|       |/// * To allow internal constructors to have special objects allocated.
  |  |  581|  2.40k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  582|       |
  |  |  583|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  584|       |/// Arg1 is the result.
  |  |  585|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  586|       |/// Arg3 is the constructor's return value.
  |  |  587|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  588|  2.40k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  589|       |
  |  |  590|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  591|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  592|  2.40k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  593|       |
  |  |  594|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  595|  2.40k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  596|       |
  |  |  597|       |/// Load a constant integer value.
  |  |  598|  2.40k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  599|  2.40k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  600|       |
  |  |  601|       |/// Load a constant double value.
  |  |  602|  2.40k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  603|       |
  |  |  604|       |/// Load a constant BigInt value by bigint table index.
  |  |  605|  2.40k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  606|  2.40k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  607|  2.40k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  608|  2.40k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  609|       |
  |  |  610|       |/// Load a constant string value by string table index.
  |  |  611|  2.40k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  612|  2.40k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  613|  2.40k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  614|  2.40k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  615|       |
  |  |  616|       |/// Load common constants.
  |  |  617|  2.40k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  618|  2.40k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  619|  2.40k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  620|  2.40k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  621|  2.40k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  622|  2.40k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  623|       |
  |  |  624|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  625|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  626|       |/// object.
  |  |  627|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  628|  2.40k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  629|       |
  |  |  630|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  631|       |/// \code
  |  |  632|       |///     LoadParam    Arg1, #0
  |  |  633|       |///     CoerceThisNS Arg1, Arg1
  |  |  634|       |/// \endcode
  |  |  635|  2.40k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  636|       |
  |  |  637|       |/// Convert a value to a number.
  |  |  638|       |/// Arg1 = Arg2 - 0
  |  |  639|  2.40k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  640|       |/// Convert a value to a numberic.
  |  |  641|       |/// Arg1 = ToNumeric(Arg2)
  |  |  642|  2.40k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  643|       |/// Convert a value to a 32-bit signed integer.
  |  |  644|       |/// Arg1 = Arg2 | 0
  |  |  645|  2.40k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  646|       |
  |  |  647|       |/// Convert a value to a string as if evaluating the expression:
  |  |  648|       |///     Arg1 = "" + Arg2
  |  |  649|       |/// In practice this means
  |  |  650|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  651|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  652|  2.40k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  653|       |
  |  |  654|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  655|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  656|       |// will be populated and the rest of the instruction will access it directly.
  |  |  657|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  658|       |// instead of doing a full array allocation and property lookup.
  |  |  659|       |
  |  |  660|       |/// Get a property of the 'arguments' array by value.
  |  |  661|       |/// Arg1 is the result.
  |  |  662|       |/// Arg2 is the index.
  |  |  663|       |/// Arg3 is the lazy loaded register.
  |  |  664|       |/// Arg1 = arguments[Arg2]
  |  |  665|  2.40k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  666|       |
  |  |  667|       |/// Get the length of the 'arguments' array.
  |  |  668|       |/// Arg1 is the result.
  |  |  669|       |/// Arg2 is the lazy loaded register.
  |  |  670|       |/// Arg1 = arguments.length
  |  |  671|  2.40k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  672|       |
  |  |  673|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  674|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  675|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  676|  2.40k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  677|       |
  |  |  678|       |/// Create a regular expression.
  |  |  679|       |/// Arg1 is the result.
  |  |  680|       |/// Arg2 is the string index of the pattern.
  |  |  681|       |/// Arg3 is the string index of the flags.
  |  |  682|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  683|  2.40k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  684|  2.40k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  685|  2.40k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  686|       |
  |  |  687|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  688|       |/// input or to the default block if out of range (or not right type)
  |  |  689|       |/// Arg 1 is the value to be branched upon
  |  |  690|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  691|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  692|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  693|       |/// less than this value jmp to
  |  |  694|       |///   default block
  |  |  695|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  696|       |///   default block.
  |  |  697|       |///
  |  |  698|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  699|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  700|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  701|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  702|  2.40k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  703|       |
  |  |  704|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  705|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  706|  2.40k|DEFINE_OPCODE_0(StartGenerator)
  |  |  707|       |
  |  |  708|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  709|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  710|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  711|       |/// - throw(val): Throw val as an error
  |  |  712|       |/// Arg1 is the result provided by the user.
  |  |  713|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  714|  2.40k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  715|       |
  |  |  716|       |/// Set the generator status to complete, but do not return.
  |  |  717|  2.40k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  718|       |
  |  |  719|       |/// Create a generator.
  |  |  720|       |/// Arg1 is the register in which to store the generator.
  |  |  721|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  722|       |/// Arg3 is index in the function table.
  |  |  723|  2.40k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  724|  2.40k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  725|  2.40k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  726|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  727|       |
  |  |  728|       |/// Arg1 [out] is the result iterator or index.
  |  |  729|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  730|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  731|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  732|       |/// method on the iterator.
  |  |  733|       |/// See IR.md for IteratorBeginInst.
  |  |  734|  2.40k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  735|       |
  |  |  736|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  737|       |/// Arg2 [in/out] is the iterator or index.
  |  |  738|       |/// Arg2 [in] is the source or the next method.
  |  |  739|       |/// If iterator is undefined, result = undefined.
  |  |  740|       |/// If iterator is a number:
  |  |  741|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  742|       |///   Else iterator = undefined and result = undefined
  |  |  743|       |/// Else:
  |  |  744|       |///   n = iterator.next()
  |  |  745|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  746|       |///   Else result = n.value
  |  |  747|       |/// See IR.md for IteratorNextInst.
  |  |  748|  2.40k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  749|       |
  |  |  750|       |/// Arg1 [in] is the iterator or array index.
  |  |  751|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  752|       |/// If the iterator is an object, call iterator.return().
  |  |  753|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  754|       |/// See IR.md for IteratorCloseInst.
  |  |  755|  2.40k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  756|       |
  |  |  757|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  758|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  759|       |// The macros will automatically generate two opcodes for each definition,
  |  |  760|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  761|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  762|  2.40k|#define DEFINE_JUMP_1(name)           \
  |  |  763|  2.40k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  764|  2.40k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  765|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  766|       |
  |  |  767|  2.40k|#define DEFINE_JUMP_2(name)                 \
  |  |  768|  2.40k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  769|  2.40k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  770|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  771|       |
  |  |  772|  2.40k|#define DEFINE_JUMP_3(name)                       \
  |  |  773|  2.40k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  774|  2.40k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  775|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  776|       |
  |  |  777|       |/// Unconditional branch to Arg1.
  |  |  778|  2.40k|DEFINE_JUMP_1(Jmp)
  |  |  779|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  780|  2.40k|DEFINE_JUMP_2(JmpTrue)
  |  |  781|  2.40k|DEFINE_JUMP_2(JmpFalse)
  |  |  782|       |/// Jump if the value is undefined.
  |  |  783|  2.40k|DEFINE_JUMP_2(JmpUndefined)
  |  |  784|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  785|       |/// at the provided target.
  |  |  786|  2.40k|DEFINE_JUMP_1(SaveGenerator)
  |  |  787|       |
  |  |  788|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  789|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  790|       |
  |  |  791|       |/// Not conditionals are required for NaN comparisons
  |  |  792|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  793|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  794|       |/// "jump when less than to BB1".
  |  |  795|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  796|  2.40k|DEFINE_JUMP_3(JLess)
  |  |  797|  2.40k|DEFINE_JUMP_3(JNotLess)
  |  |  798|  2.40k|DEFINE_JUMP_3(JLessN)
  |  |  799|  2.40k|DEFINE_JUMP_3(JNotLessN)
  |  |  800|  2.40k|DEFINE_JUMP_3(JLessEqual)
  |  |  801|  2.40k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  802|  2.40k|DEFINE_JUMP_3(JLessEqualN)
  |  |  803|  2.40k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  804|  2.40k|DEFINE_JUMP_3(JGreater)
  |  |  805|  2.40k|DEFINE_JUMP_3(JNotGreater)
  |  |  806|  2.40k|DEFINE_JUMP_3(JGreaterN)
  |  |  807|  2.40k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  808|  2.40k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  809|  2.40k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  810|  2.40k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  811|  2.40k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  812|  2.40k|DEFINE_JUMP_3(JEqual)
  |  |  813|  2.40k|DEFINE_JUMP_3(JNotEqual)
  |  |  814|  2.40k|DEFINE_JUMP_3(JStrictEqual)
  |  |  815|  2.40k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  816|       |
  |  |  817|       |#ifdef HERMES_RUN_WASM
  |  |  818|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  819|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  820|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  821|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  822|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  823|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  824|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  825|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  826|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  827|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  828|       |
  |  |  829|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  830|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  831|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  832|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  833|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  834|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  835|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  836|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  837|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  838|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  839|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  840|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  841|       |
  |  |  842|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  843|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  844|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  845|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  846|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  847|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  848|       |#endif
  |  |  849|       |
  |  |  850|       |// Implementations can rely on the following pairs of instructions having the
  |  |  851|       |// same number and type of operands.
  |  |  852|  2.40k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  853|  2.40k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  854|  2.40k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  855|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  856|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  857|  2.40k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  858|  2.40k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  859|  2.40k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  860|       |
  |  |  861|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  862|  2.40k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  863|  2.40k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  864|       |
  |  |  865|  2.40k|#undef DEFINE_JUMP_1
  |  |  866|  2.40k|#undef DEFINE_JUMP_2
  |  |  867|  2.40k|#undef DEFINE_JUMP_3
  |  |  868|       |
  |  |  869|       |// Undefine all macros used to avoid confusing next include.
  |  |  870|  2.40k|#undef DEFINE_OPERAND_TYPE
  |  |  871|  2.40k|#undef DEFINE_OPCODE_0
  |  |  872|  2.40k|#undef DEFINE_OPCODE_1
  |  |  873|  2.40k|#undef DEFINE_OPCODE_2
  |  |  874|  2.40k|#undef DEFINE_OPCODE_3
  |  |  875|  2.40k|#undef DEFINE_OPCODE_4
  |  |  876|  2.40k|#undef DEFINE_OPCODE_5
  |  |  877|  2.40k|#undef DEFINE_OPCODE_6
  |  |  878|  2.40k|#undef DEFINE_OPCODE
  |  |  879|  2.40k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  880|  2.40k|#undef DEFINE_RET_TARGET
  |  |  881|  2.40k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  882|  2.40k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  883|  2.40k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  884|  2.40k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  885|  2.40k|#undef ASSERT_MONOTONE_INCREASING
  |  |  886|  2.40k|#undef OPERAND_BIGINT_ID
  |  |  887|  2.40k|#undef OPERAND_FUNCTION_ID
  |  |  888|  2.40k|#undef OPERAND_STRING_ID
  ------------------
  750|  2.40k|  });
  751|       |
  752|  2.40k|  constexpr uint32_t W = 2;
  753|  2.40k|  constexpr uint32_t mask = (1 << W) - 1;
  754|       |
  755|  2.40k|  static_assert(llvh::isUInt<W>(maxSize - minSize), "Size range too large.");
  756|  2.40k|  static_assert((lastCall - firstCall + 1) * W <= 32, "Too many call opcodes.");
  757|       |
  758|  2.40k|  constexpr uint32_t callSizes = 0
  759|  2.40k|#define DEFINE_RET_TARGET(name)             \
  760|  2.40k|  |                                         \
  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  763|  2.40k|#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|  2.40k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  2.40k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  2.40k|#endif
  |  |   12|  2.40k|#ifndef DEFINE_OPCODE_0
  |  |   13|  2.40k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  2.40k|#endif
  |  |   15|  2.40k|#ifndef DEFINE_OPCODE_1
  |  |   16|  2.40k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  2.40k|#endif
  |  |   18|  2.40k|#ifndef DEFINE_OPCODE_2
  |  |   19|  2.40k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  2.40k|#endif
  |  |   21|  2.40k|#ifndef DEFINE_OPCODE_3
  |  |   22|  2.40k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  2.40k|#endif
  |  |   24|  2.40k|#ifndef DEFINE_OPCODE_4
  |  |   25|  2.40k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  2.40k|#endif
  |  |   27|  2.40k|#ifndef DEFINE_OPCODE_5
  |  |   28|  2.40k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  2.40k|#endif
  |  |   30|  2.40k|#ifndef DEFINE_OPCODE_6
  |  |   31|  2.40k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  2.40k|#endif
  |  |   33|  2.40k|#ifndef DEFINE_OPCODE
  |  |   34|  2.40k|#define DEFINE_OPCODE(...)
  |  |   35|  2.40k|#endif
  |  |   36|  2.40k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  2.40k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  2.40k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  2.40k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  2.40k|#endif
  |  |   45|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  2.40k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  2.40k|#endif
  |  |   48|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  2.40k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  2.40k|#endif
  |  |   51|  2.40k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  2.40k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  2.40k|#endif
  |  |   54|  2.40k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  2.40k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  2.40k|#endif
  |  |   57|  2.40k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  2.40k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  2.40k|#endif
  |  |   60|  2.40k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  2.40k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  2.40k|#endif
  |  |   63|  2.40k|#ifndef OPERAND_STRING_ID
  |  |   64|  2.40k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  2.40k|#endif
  |  |   66|       |
  |  |   67|  2.40k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  2.40k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  2.40k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  2.40k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  2.40k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  2.40k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  2.40k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  2.40k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  2.40k|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|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  2.40k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  2.40k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  2.40k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  2.40k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  2.40k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  2.40k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  2.40k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  2.40k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  2.40k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  2.40k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  2.40k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  2.40k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  2.40k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  2.40k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  2.40k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  2.40k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  2.40k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  2.40k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  2.40k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  2.40k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  2.40k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  2.40k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  2.40k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  2.40k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  2.40k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  2.40k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  2.40k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  2.40k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  2.40k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  2.40k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  2.40k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  2.40k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  2.40k|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|  2.40k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  2.40k|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|  2.40k|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|  2.40k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  2.40k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  2.40k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  2.40k|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|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  2.40k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  2.40k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  2.40k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  2.40k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Create a new inner environment, to store values captured by closures.
  |  |  249|       |/// Arg1 is the destination.
  |  |  250|       |/// Arg2 is the parent environment.
  |  |  251|       |/// Arg3 is the number of slots in the environment.
  |  |  252|  2.40k|DEFINE_OPCODE_3(CreateInnerEnvironment, Reg8, Reg8, UInt32)
  |  |  253|       |
  |  |  254|       |/// Declare a global variable by string table index.
  |  |  255|       |/// The variable will be set to undefined.
  |  |  256|  2.40k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  257|  2.40k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  258|       |
  |  |  259|       |/// Checks if globalThis has a restricted global property with the given name.
  |  |  260|       |/// Arg1 is the name to check.
  |  |  261|  2.40k|DEFINE_OPCODE_1(ThrowIfHasRestrictedGlobalProperty, UInt32)
  |  |  262|  2.40k|OPERAND_STRING_ID(ThrowIfHasRestrictedGlobalProperty, 1)
  |  |  263|       |
  |  |  264|       |/// Get an object property by string table index.
  |  |  265|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  266|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  267|  2.40k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  268|  2.40k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  269|  2.40k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  270|  2.40k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  271|  2.40k|OPERAND_STRING_ID(GetById, 4)
  |  |  272|  2.40k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  273|       |
  |  |  274|       |/// Get an object property by string table index, or throw if not found.
  |  |  275|       |/// This is similar to GetById, but intended for use with global variables
  |  |  276|       |/// where Arg2 = GetGlobalObject.
  |  |  277|  2.40k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  278|  2.40k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  279|  2.40k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  280|  2.40k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  281|       |
  |  |  282|       |/// Set an object property by string index.
  |  |  283|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  284|  2.40k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  285|  2.40k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  286|  2.40k|OPERAND_STRING_ID(PutById, 4)
  |  |  287|  2.40k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  288|       |
  |  |  289|       |/// Set an object property by string index, or throw if undeclared.
  |  |  290|       |/// This is similar to PutById, but intended for use with global variables
  |  |  291|       |/// where Arg1 = GetGlobalObject.
  |  |  292|  2.40k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  293|  2.40k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  294|  2.40k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  295|  2.40k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  296|       |
  |  |  297|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  298|       |/// the destination must be an object, it only deals with own properties,
  |  |  299|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  300|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  301|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  302|       |/// Arg2 is the value to write.
  |  |  303|       |/// Arg3 is the string table ID of the property name.
  |  |  304|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  305|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  306|  2.40k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  307|  2.40k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  308|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  309|  2.40k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  310|  2.40k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  311|       |
  |  |  312|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  313|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  314|       |/// Arg1 is the destination object.
  |  |  315|       |/// Arg2 is the value to write.
  |  |  316|       |/// Arg3 is the string table ID of the property name.
  |  |  317|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  318|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  319|  2.40k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  320|  2.40k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  321|  2.40k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  322|       |
  |  |  323|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  324|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  325|  2.40k|    PutNewOwnByIdShort,
  |  |  326|  2.40k|    PutNewOwnById,
  |  |  327|  2.40k|    PutNewOwnByIdLong,
  |  |  328|  2.40k|    PutNewOwnNEById,
  |  |  329|  2.40k|    PutNewOwnNEByIdLong)
  |  |  330|       |
  |  |  331|       |/// Assign a value to a constant integer own property which will be created as
  |  |  332|       |/// enumerable. This is used (potentially in conjunction with
  |  |  333|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  334|       |/// Arg1[Arg3] = Arg2;
  |  |  335|  2.40k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  336|  2.40k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  337|       |
  |  |  338|       |/// Set an own property identified by value.
  |  |  339|       |/// Arg1 is the destination object.
  |  |  340|       |/// Arg2 is the value to write.
  |  |  341|       |/// Arg3 is the property name.
  |  |  342|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  343|       |///        non-enumerable otherwise.
  |  |  344|       |/// Arg1[Arg3] = Arg2;
  |  |  345|  2.40k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  346|       |
  |  |  347|       |/// Delete a property by string table index.
  |  |  348|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  349|  2.40k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  350|  2.40k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  351|  2.40k|OPERAND_STRING_ID(DelById, 3)
  |  |  352|  2.40k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  353|       |
  |  |  354|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  355|       |/// Arg1 = Arg2[Arg3]
  |  |  356|  2.40k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  357|       |
  |  |  358|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  359|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  360|       |/// case this is still the right opcode).
  |  |  361|       |/// Arg1[Arg2] = Arg3
  |  |  362|  2.40k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  363|       |
  |  |  364|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  365|       |/// Arg1 = delete Arg2[Arg3]
  |  |  366|  2.40k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  367|       |
  |  |  368|       |/// Add a getter and a setter for a property by value.
  |  |  369|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  370|       |/// Arg1 is the target object which will have a property defined.
  |  |  371|       |/// Arg2 is the property name
  |  |  372|       |/// Arg3 is the getter closure or undefined
  |  |  373|       |/// Arg4 is the setter closure or undefined
  |  |  374|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  375|  2.40k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  376|       |
  |  |  377|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  378|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  379|       |/// Returns Undefined if the object is null/undefined.
  |  |  380|       |/// Arg2 is the register that holds the object.
  |  |  381|       |/// Arg3 is the register that holds the iterating index.
  |  |  382|       |/// Arg4 is the register that holds the size of the property list.
  |  |  383|  2.40k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  384|       |
  |  |  385|       |/// Get the next property in the for..in iterator.
  |  |  386|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  387|       |/// Arg2 is the register that holds array of properties.
  |  |  388|       |/// Arg3 is the register that holds the object.
  |  |  389|       |/// Arg4 is the register that holds the iterating index.
  |  |  390|       |/// Arg5 is the register that holds the size of the property list.
  |  |  391|  2.40k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  392|       |
  |  |  393|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  394|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  395|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  396|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  397|       |/// wider instructions appearing after narrower ones.
  |  |  398|       |
  |  |  399|       |/// Call a function.
  |  |  400|       |/// Arg1 is the destination of the return value.
  |  |  401|       |/// Arg2 is the closure to invoke.
  |  |  402|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  403|       |///      from the end of the current frame.
  |  |  404|  2.40k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  405|  2.40k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  406|       |
  |  |  407|       |/// Call a constructor, with semantics identical to Call.
  |  |  408|       |/// Arg1 is the destination of the return value.
  |  |  409|       |/// Arg2 is the closure to invoke.
  |  |  410|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  411|       |///      from the end of the current frame. The first argument 'this'
  |  |  412|       |///      is assumed to be created with CreateThis.
  |  |  413|  2.40k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  414|  2.40k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  415|       |
  |  |  416|       |/// Call a function with one arg.
  |  |  417|       |/// Arg1 is the destination of the return value.
  |  |  418|       |/// Arg2 is the closure to invoke.
  |  |  419|       |/// Arg3 is the first argument.
  |  |  420|  2.40k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  421|  2.40k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function directly without a closure.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  426|       |///      from the end of the current frame. The first argument 'this'
  |  |  427|       |///      is assumed to be created with CreateThis.
  |  |  428|       |/// Arg3 is index in the function table.
  |  |  429|       |/// Note that we expect the variable-sized argument to be last.
  |  |  430|  2.40k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  431|  2.40k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  432|  2.40k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  433|       |
  |  |  434|       |/// Call a function with two args.
  |  |  435|       |/// Arg1 is the destination of the return value.
  |  |  436|       |/// Arg2 is the closure to invoke.
  |  |  437|       |/// Arg3 is the first argument.
  |  |  438|       |/// Arg4 is the second argument.
  |  |  439|  2.40k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  440|  2.40k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  441|       |
  |  |  442|       |/// Call a function with three args.
  |  |  443|       |/// Arg1 is the destination of the return value.
  |  |  444|       |/// Arg2 is the closure to invoke.
  |  |  445|       |/// Arg3 is the first argument.
  |  |  446|       |/// Arg4 is the second argument.
  |  |  447|       |/// Arg5 is the third argument.
  |  |  448|  2.40k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  449|  2.40k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  450|       |
  |  |  451|       |/// Call a function with four args.
  |  |  452|       |/// Arg1 is the destination of the return value.
  |  |  453|       |/// Arg2 is the closure to invoke.
  |  |  454|       |/// Arg3 is the first argument.
  |  |  455|       |/// Arg4 is the second argument.
  |  |  456|       |/// Arg5 is the third argument.
  |  |  457|       |/// Arg6 is the fourth argument.
  |  |  458|  2.40k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  459|  2.40k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  460|       |
  |  |  461|       |/// Identical to Call, but allowing more arguments.
  |  |  462|  2.40k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  463|  2.40k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  464|       |
  |  |  465|       |/// Identical to Construct, but allowing more arguments.
  |  |  466|  2.40k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  467|  2.40k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  468|       |
  |  |  469|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  470|  2.40k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  471|  2.40k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  760|  2.40k|  |                                         \
  |  |  |  |  761|  2.40k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  762|  2.40k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  472|       |
  |  |  473|       |// Enforce the order.
  |  |  474|  2.40k|ASSERT_MONOTONE_INCREASING(
  |  |  475|  2.40k|    Call,
  |  |  476|  2.40k|    Construct,
  |  |  477|  2.40k|    Call1,
  |  |  478|  2.40k|    CallDirect,
  |  |  479|  2.40k|    Call2,
  |  |  480|  2.40k|    Call3,
  |  |  481|  2.40k|    Call4,
  |  |  482|  2.40k|    CallLong,
  |  |  483|  2.40k|    ConstructLong,
  |  |  484|  2.40k|    CallDirectLongIndex)
  |  |  485|       |
  |  |  486|       |/// Call a builtin function.
  |  |  487|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  488|       |/// and therefore never JS.
  |  |  489|       |/// Arg1 is the destination of the return value.
  |  |  490|       |/// Arg2 is the builtin number.
  |  |  491|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  492|       |///      from the end of the current frame.
  |  |  493|       |/// thisArg is set to "undefined".
  |  |  494|  2.40k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  495|       |
  |  |  496|       |/// Call a builtin function.
  |  |  497|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  498|       |/// and therefore never JS.
  |  |  499|       |/// Arg1 is the destination of the return value.
  |  |  500|       |/// Arg2 is the builtin number.
  |  |  501|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  502|       |///      from the end of the current frame.
  |  |  503|       |/// thisArg is set to "undefined".
  |  |  504|  2.40k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  505|       |
  |  |  506|       |/// Get a closure from a builtin function.
  |  |  507|       |/// Arg1 is the destination of the return value.
  |  |  508|       |/// Arg2 is the builtin number.
  |  |  509|  2.40k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  510|       |
  |  |  511|       |///
  |  |  512|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  513|       |
  |  |  514|       |/// Return a value from the current function.
  |  |  515|       |/// return Arg1;
  |  |  516|  2.40k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  517|       |
  |  |  518|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  519|       |/// } catch(Arg1) {
  |  |  520|  2.40k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  521|       |
  |  |  522|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  523|       |/// Arg1 is the destination of the return value.
  |  |  524|       |/// Arg2 is the value to eval.
  |  |  525|       |/// Arg3 is a boolean which is true if the eval should be performed in strict mode.
  |  |  526|  2.40k|DEFINE_OPCODE_3(DirectEval, Reg8, Reg8, UInt8)
  |  |  527|       |
  |  |  528|       |/// Throw an exception.
  |  |  529|       |/// throw Arg1;
  |  |  530|  2.40k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  531|       |
  |  |  532|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  533|       |/// Arg1 is the destination of the return value
  |  |  534|       |/// Arg2 is the value to check
  |  |  535|  2.40k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  536|       |
  |  |  537|       |/// Implementation dependent debugger action.
  |  |  538|  2.40k|DEFINE_OPCODE_0(Debugger)
  |  |  539|       |
  |  |  540|       |/// Fast check for an async interrupt request.
  |  |  541|  2.40k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  542|       |
  |  |  543|       |/// Define a profile point.
  |  |  544|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  545|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  546|       |/// all the overflowed profile points have index zero.
  |  |  547|  2.40k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  548|       |
  |  |  549|       |/// Create a closure.
  |  |  550|       |/// Arg1 is the register in which to store the closure.
  |  |  551|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  552|       |/// Arg3 is index in the function table.
  |  |  553|  2.40k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  554|  2.40k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  555|  2.40k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  556|  2.40k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  557|       |
  |  |  558|       |/// Create a closure for a GeneratorFunction.
  |  |  559|       |/// Arg1 is the register in which to store the closure.
  |  |  560|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  561|       |/// Arg3 is index in the function table.
  |  |  562|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  563|  2.40k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  564|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  565|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  566|       |
  |  |  567|       |/// Create a closure for an AsyncFunction.
  |  |  568|       |/// Arg1 is the register in which to store the closure.
  |  |  569|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  570|       |/// Arg3 is index in the function table.
  |  |  571|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  572|  2.40k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  573|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  574|  2.40k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  575|       |
  |  |  576|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  577|       |/// Arg1 is the destination register.
  |  |  578|       |/// Arg2 is the prototype to assign it.
  |  |  579|       |/// Arg3 is the constructor closure that will be used*.
  |  |  580|       |/// * To allow internal constructors to have special objects allocated.
  |  |  581|  2.40k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  582|       |
  |  |  583|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  584|       |/// Arg1 is the result.
  |  |  585|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  586|       |/// Arg3 is the constructor's return value.
  |  |  587|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  588|  2.40k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  589|       |
  |  |  590|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  591|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  592|  2.40k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  593|       |
  |  |  594|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  595|  2.40k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  596|       |
  |  |  597|       |/// Load a constant integer value.
  |  |  598|  2.40k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  599|  2.40k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  600|       |
  |  |  601|       |/// Load a constant double value.
  |  |  602|  2.40k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  603|       |
  |  |  604|       |/// Load a constant BigInt value by bigint table index.
  |  |  605|  2.40k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  606|  2.40k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  607|  2.40k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  608|  2.40k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  609|       |
  |  |  610|       |/// Load a constant string value by string table index.
  |  |  611|  2.40k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  612|  2.40k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  613|  2.40k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  614|  2.40k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  615|       |
  |  |  616|       |/// Load common constants.
  |  |  617|  2.40k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  618|  2.40k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  619|  2.40k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  620|  2.40k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  621|  2.40k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  622|  2.40k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  623|       |
  |  |  624|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  625|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  626|       |/// object.
  |  |  627|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  628|  2.40k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  629|       |
  |  |  630|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  631|       |/// \code
  |  |  632|       |///     LoadParam    Arg1, #0
  |  |  633|       |///     CoerceThisNS Arg1, Arg1
  |  |  634|       |/// \endcode
  |  |  635|  2.40k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  636|       |
  |  |  637|       |/// Convert a value to a number.
  |  |  638|       |/// Arg1 = Arg2 - 0
  |  |  639|  2.40k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  640|       |/// Convert a value to a numberic.
  |  |  641|       |/// Arg1 = ToNumeric(Arg2)
  |  |  642|  2.40k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  643|       |/// Convert a value to a 32-bit signed integer.
  |  |  644|       |/// Arg1 = Arg2 | 0
  |  |  645|  2.40k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  646|       |
  |  |  647|       |/// Convert a value to a string as if evaluating the expression:
  |  |  648|       |///     Arg1 = "" + Arg2
  |  |  649|       |/// In practice this means
  |  |  650|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  651|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  652|  2.40k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  653|       |
  |  |  654|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  655|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  656|       |// will be populated and the rest of the instruction will access it directly.
  |  |  657|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  658|       |// instead of doing a full array allocation and property lookup.
  |  |  659|       |
  |  |  660|       |/// Get a property of the 'arguments' array by value.
  |  |  661|       |/// Arg1 is the result.
  |  |  662|       |/// Arg2 is the index.
  |  |  663|       |/// Arg3 is the lazy loaded register.
  |  |  664|       |/// Arg1 = arguments[Arg2]
  |  |  665|  2.40k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  666|       |
  |  |  667|       |/// Get the length of the 'arguments' array.
  |  |  668|       |/// Arg1 is the result.
  |  |  669|       |/// Arg2 is the lazy loaded register.
  |  |  670|       |/// Arg1 = arguments.length
  |  |  671|  2.40k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  672|       |
  |  |  673|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  674|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  675|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  676|  2.40k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  677|       |
  |  |  678|       |/// Create a regular expression.
  |  |  679|       |/// Arg1 is the result.
  |  |  680|       |/// Arg2 is the string index of the pattern.
  |  |  681|       |/// Arg3 is the string index of the flags.
  |  |  682|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  683|  2.40k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  684|  2.40k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  685|  2.40k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  686|       |
  |  |  687|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  688|       |/// input or to the default block if out of range (or not right type)
  |  |  689|       |/// Arg 1 is the value to be branched upon
  |  |  690|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  691|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  692|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  693|       |/// less than this value jmp to
  |  |  694|       |///   default block
  |  |  695|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  696|       |///   default block.
  |  |  697|       |///
  |  |  698|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  699|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  700|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  701|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  702|  2.40k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  703|       |
  |  |  704|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  705|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  706|  2.40k|DEFINE_OPCODE_0(StartGenerator)
  |  |  707|       |
  |  |  708|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  709|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  710|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  711|       |/// - throw(val): Throw val as an error
  |  |  712|       |/// Arg1 is the result provided by the user.
  |  |  713|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  714|  2.40k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  715|       |
  |  |  716|       |/// Set the generator status to complete, but do not return.
  |  |  717|  2.40k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  718|       |
  |  |  719|       |/// Create a generator.
  |  |  720|       |/// Arg1 is the register in which to store the generator.
  |  |  721|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  722|       |/// Arg3 is index in the function table.
  |  |  723|  2.40k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  724|  2.40k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  725|  2.40k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  726|  2.40k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  727|       |
  |  |  728|       |/// Arg1 [out] is the result iterator or index.
  |  |  729|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  730|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  731|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  732|       |/// method on the iterator.
  |  |  733|       |/// See IR.md for IteratorBeginInst.
  |  |  734|  2.40k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  735|       |
  |  |  736|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  737|       |/// Arg2 [in/out] is the iterator or index.
  |  |  738|       |/// Arg2 [in] is the source or the next method.
  |  |  739|       |/// If iterator is undefined, result = undefined.
  |  |  740|       |/// If iterator is a number:
  |  |  741|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  742|       |///   Else iterator = undefined and result = undefined
  |  |  743|       |/// Else:
  |  |  744|       |///   n = iterator.next()
  |  |  745|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  746|       |///   Else result = n.value
  |  |  747|       |/// See IR.md for IteratorNextInst.
  |  |  748|  2.40k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  749|       |
  |  |  750|       |/// Arg1 [in] is the iterator or array index.
  |  |  751|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  752|       |/// If the iterator is an object, call iterator.return().
  |  |  753|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  754|       |/// See IR.md for IteratorCloseInst.
  |  |  755|  2.40k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  756|       |
  |  |  757|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  758|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  759|       |// The macros will automatically generate two opcodes for each definition,
  |  |  760|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  761|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  762|  2.40k|#define DEFINE_JUMP_1(name)           \
  |  |  763|  2.40k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  764|  2.40k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  765|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  766|       |
  |  |  767|  2.40k|#define DEFINE_JUMP_2(name)                 \
  |  |  768|  2.40k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  769|  2.40k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  770|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  771|       |
  |  |  772|  2.40k|#define DEFINE_JUMP_3(name)                       \
  |  |  773|  2.40k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  774|  2.40k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  775|  2.40k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  776|       |
  |  |  777|       |/// Unconditional branch to Arg1.
  |  |  778|  2.40k|DEFINE_JUMP_1(Jmp)
  |  |  779|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  780|  2.40k|DEFINE_JUMP_2(JmpTrue)
  |  |  781|  2.40k|DEFINE_JUMP_2(JmpFalse)
  |  |  782|       |/// Jump if the value is undefined.
  |  |  783|  2.40k|DEFINE_JUMP_2(JmpUndefined)
  |  |  784|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  785|       |/// at the provided target.
  |  |  786|  2.40k|DEFINE_JUMP_1(SaveGenerator)
  |  |  787|       |
  |  |  788|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  789|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  790|       |
  |  |  791|       |/// Not conditionals are required for NaN comparisons
  |  |  792|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  793|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  794|       |/// "jump when less than to BB1".
  |  |  795|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  796|  2.40k|DEFINE_JUMP_3(JLess)
  |  |  797|  2.40k|DEFINE_JUMP_3(JNotLess)
  |  |  798|  2.40k|DEFINE_JUMP_3(JLessN)
  |  |  799|  2.40k|DEFINE_JUMP_3(JNotLessN)
  |  |  800|  2.40k|DEFINE_JUMP_3(JLessEqual)
  |  |  801|  2.40k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  802|  2.40k|DEFINE_JUMP_3(JLessEqualN)
  |  |  803|  2.40k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  804|  2.40k|DEFINE_JUMP_3(JGreater)
  |  |  805|  2.40k|DEFINE_JUMP_3(JNotGreater)
  |  |  806|  2.40k|DEFINE_JUMP_3(JGreaterN)
  |  |  807|  2.40k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  808|  2.40k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  809|  2.40k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  810|  2.40k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  811|  2.40k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  812|  2.40k|DEFINE_JUMP_3(JEqual)
  |  |  813|  2.40k|DEFINE_JUMP_3(JNotEqual)
  |  |  814|  2.40k|DEFINE_JUMP_3(JStrictEqual)
  |  |  815|  2.40k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  816|       |
  |  |  817|       |#ifdef HERMES_RUN_WASM
  |  |  818|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  819|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  820|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  821|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  822|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  823|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  824|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  825|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  826|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  827|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  828|       |
  |  |  829|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  830|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  831|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  832|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  833|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  834|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  835|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  836|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  837|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  838|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  839|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  840|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  841|       |
  |  |  842|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  843|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  844|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  845|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  846|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  847|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  848|       |#endif
  |  |  849|       |
  |  |  850|       |// Implementations can rely on the following pairs of instructions having the
  |  |  851|       |// same number and type of operands.
  |  |  852|  2.40k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  853|  2.40k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  854|  2.40k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  855|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  856|  2.40k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  857|  2.40k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  858|  2.40k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  859|  2.40k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  860|       |
  |  |  861|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  862|  2.40k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  863|  2.40k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  864|       |
  |  |  865|  2.40k|#undef DEFINE_JUMP_1
  |  |  866|  2.40k|#undef DEFINE_JUMP_2
  |  |  867|  2.40k|#undef DEFINE_JUMP_3
  |  |  868|       |
  |  |  869|       |// Undefine all macros used to avoid confusing next include.
  |  |  870|  2.40k|#undef DEFINE_OPERAND_TYPE
  |  |  871|  2.40k|#undef DEFINE_OPCODE_0
  |  |  872|  2.40k|#undef DEFINE_OPCODE_1
  |  |  873|  2.40k|#undef DEFINE_OPCODE_2
  |  |  874|  2.40k|#undef DEFINE_OPCODE_3
  |  |  875|  2.40k|#undef DEFINE_OPCODE_4
  |  |  876|  2.40k|#undef DEFINE_OPCODE_5
  |  |  877|  2.40k|#undef DEFINE_OPCODE_6
  |  |  878|  2.40k|#undef DEFINE_OPCODE
  |  |  879|  2.40k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  880|  2.40k|#undef DEFINE_RET_TARGET
  |  |  881|  2.40k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  882|  2.40k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  883|  2.40k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  884|  2.40k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  885|  2.40k|#undef ASSERT_MONOTONE_INCREASING
  |  |  886|  2.40k|#undef OPERAND_BIGINT_ID
  |  |  887|  2.40k|#undef OPERAND_FUNCTION_ID
  |  |  888|  2.40k|#undef OPERAND_STRING_ID
  ------------------
  764|  2.40k|      ;
  765|  2.40k|#undef DEFINE_RET_TARGET
  766|       |
  767|  2.40k|  const uint8_t offset = static_cast<uint8_t>(ip->opCode) - firstCall;
  768|  2.40k|  return IPADD(((callSizes >> (offset * W)) & mask) + minSize);
  ------------------
  |  |   52|  2.40k|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
  769|  2.40k|}
_ZZN6hermes2vm11Interpreter17interpretFunctionILb0ELb0EEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeERNS0_16InterpreterStateEEN7IPSaverD2Ev:
  855|    356|    ~IPSaver() {
  856|    356|      runtime_.setCurrentIP(ip_);
  857|    356|    }

_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|}
_ZN6hermes2vm9ArrayImpl19_haveOwnIndexedImplEPNS0_8JSObjectERNS0_7RuntimeEj:
   67|   271k|    uint32_t index) {
   68|   271k|  auto *self = vmcast<ArrayImpl>(selfObj);
   69|       |
   70|       |  // Check whether the index is within the storage.
   71|   271k|  if (index >= self->beginIndex_ && index < self->endIndex_)
  ------------------
  |  Branch (71:7): [True: 271k, False: 0]
  |  Branch (71:37): [True: 0, False: 271k]
  ------------------
   72|      0|    return !self->getIndexedStorage(runtime)
   73|      0|                ->at(runtime, index - self->beginIndex_)
   74|      0|                .isEmpty();
   75|       |
   76|   271k|  return false;
   77|   271k|}
_ZN6hermes2vm9ArrayImpl31_getOwnIndexedPropertyFlagsImplEPNS0_8JSObjectERNS0_7RuntimeEj:
   82|  2.61M|    uint32_t index) {
   83|  2.61M|  auto *self = vmcast<ArrayImpl>(selfObj);
   84|       |
   85|       |  // Check whether the index is within the storage.
   86|  2.61M|  if (index >= self->beginIndex_ && index < self->endIndex_ &&
  ------------------
  |  Branch (86:7): [True: 2.61M, False: 0]
  |  Branch (86:7): [True: 0, False: 2.61M]
  |  Branch (86:37): [True: 582k, False: 2.03M]
  ------------------
   87|  2.61M|      !self->getIndexedStorage(runtime)
  ------------------
  |  Branch (87:7): [True: 0, False: 582k]
  ------------------
   88|   582k|           ->at(runtime, index - self->beginIndex_)
   89|   582k|           .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|  2.61M|  return llvh::None;
  105|  2.61M|}
_ZN6hermes2vm9ArrayImpl18_getOwnIndexedImplENS0_12PseudoHandleINS0_8JSObjectEEERNS0_7RuntimeEj:
  117|   271k|    uint32_t index) {
  118|   271k|  NoAllocScope noAllocs{runtime};
  119|       |
  120|   271k|  return vmcast<ArrayImpl>(selfObj.get())
  121|   271k|      ->at(runtime, index)
  122|   271k|      .unboxToHV(runtime);
  123|   271k|}
_ZN6hermes2vm9ArrayImpl18setStorageEndIndexENS0_6HandleIS1_EERNS0_7RuntimeEj:
  128|     14|    uint32_t newLength) {
  129|     14|  auto *self = selfHandle.get();
  130|       |
  131|     14|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     28|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14]
  |  |  |  Branch (189:53): [True: 14, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 14]
  |  |  ------------------
  ------------------
  132|     14|          newLength > self->beginIndex_ &&
  133|     14|          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|     14|  if (LLVM_UNLIKELY(!self->getIndexedStorage(runtime))) {
  ------------------
  |  |  189|     14|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14]
  |  |  ------------------
  ------------------
  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|     14|  auto beginIndex = self->beginIndex_;
  154|       |
  155|     14|  {
  156|     14|    NoAllocScope scope{runtime};
  157|     14|    auto *const indexedStorage = self->getIndexedStorage(runtime);
  158|       |
  159|     14|    if (newLength <= beginIndex) {
  ------------------
  |  Branch (159:9): [True: 0, False: 14]
  ------------------
  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|     14|    } else if (newLength - beginIndex <= indexedStorage->capacity()) {
  ------------------
  |  Branch (165:16): [True: 0, False: 14]
  ------------------
  166|      0|      selfHandle->endIndex_ = newLength;
  167|      0|      StorageType::resizeWithinCapacity(
  168|      0|          indexedStorage, runtime, newLength - beginIndex);
  169|      0|      return ExecutionStatus::RETURNED;
  170|      0|    }
  171|     14|  }
  172|       |
  173|     14|  auto indexedStorage =
  174|     14|      runtime.makeMutableHandle(selfHandle->getIndexedStorage(runtime));
  175|       |
  176|     14|  if (StorageType::resize(indexedStorage, runtime, newLength - beginIndex) ==
  ------------------
  |  Branch (176:7): [True: 0, False: 14]
  ------------------
  177|     14|      ExecutionStatus::EXCEPTION) {
  178|      0|    return ExecutionStatus::EXCEPTION;
  179|      0|  }
  180|     14|  selfHandle->endIndex_ = newLength;
  181|     14|  selfHandle->setIndexedStorage(
  182|     14|      runtime, indexedStorage.get(), runtime.getHeap());
  183|     14|  return ExecutionStatus::RETURNED;
  184|     14|}
_ZN6hermes2vm9ArrayImpl18_setOwnIndexedImplENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
  190|  2.68M|    Handle<> value) {
  191|  2.68M|  auto *self = vmcast<ArrayImpl>(selfHandle.get());
  192|  2.68M|  auto beginIndex = self->beginIndex_;
  193|  2.68M|  auto endIndex = self->endIndex_;
  194|       |
  195|  2.68M|  if (LLVM_UNLIKELY(self->flags_.frozen))
  ------------------
  |  |  189|  2.68M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.68M]
  |  |  ------------------
  ------------------
  196|      0|    return false;
  197|       |
  198|       |  // Check whether the index is within the storage.
  199|  2.68M|  if (LLVM_LIKELY(index >= beginIndex && index < endIndex)) {
  ------------------
  |  |  188|  5.36M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 582k, False: 2.09M]
  |  |  |  Branch (188:51): [True: 2.68M, False: 0]
  |  |  |  Branch (188:51): [True: 582k, False: 2.09M]
  |  |  ------------------
  ------------------
  200|   582k|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  201|   582k|    Handle<ArrayImpl>::vmcast(selfHandle)
  202|   582k|        ->getIndexedStorage(runtime)
  203|   582k|        ->set(runtime, index - beginIndex, shv);
  204|   582k|    return true;
  205|   582k|  }
  206|       |
  207|       |  // If indexedStorage hasn't even been allocated.
  208|  2.09M|  if (LLVM_UNLIKELY(!self->getIndexedStorage(runtime))) {
  ------------------
  |  |  189|  2.09M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1, False: 2.09M]
  |  |  ------------------
  ------------------
  209|       |    // Allocate storage with capacity for 4 elements and length 1.
  210|      1|    auto arrRes = StorageType::create(runtime, 4, 1);
  211|      1|    if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  212|      0|      return ExecutionStatus::EXCEPTION;
  213|      0|    }
  214|      1|    auto newStorage = runtime.makeHandle<StorageType>(std::move(*arrRes));
  215|      1|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  216|      1|    self = vmcast<ArrayImpl>(selfHandle.get());
  217|       |
  218|      1|    self->setIndexedStorage(runtime, newStorage.get(), runtime.getHeap());
  219|      1|    self->beginIndex_ = index;
  220|      1|    self->endIndex_ = index + 1;
  221|      1|    newStorage->set(runtime, 0, shv);
  222|      1|    return true;
  223|      1|  }
  224|       |
  225|  2.09M|  {
  226|  2.09M|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  227|  2.09M|    NoAllocScope scope{runtime};
  228|  2.09M|    self = vmcast<ArrayImpl>(selfHandle.get());
  229|  2.09M|    auto *const indexedStorage = self->getIndexedStorage(runtime);
  230|       |
  231|       |    // Can we do it without reallocation for sure?
  232|  2.09M|    if (index >= endIndex && index - beginIndex < indexedStorage->capacity()) {
  ------------------
  |  Branch (232:9): [True: 2.09M, False: 0]
  |  Branch (232:30): [True: 1.82M, False: 273k]
  ------------------
  233|  1.82M|      self->endIndex_ = index + 1;
  234|  1.82M|      StorageType::resizeWithinCapacity(
  235|  1.82M|          indexedStorage, runtime, index - beginIndex + 1);
  236|       |      // self shouldn't have moved since there haven't been any allocations.
  237|  1.82M|      indexedStorage->set(runtime, index - beginIndex, shv);
  238|  1.82M|      return true;
  239|  1.82M|    }
  240|  2.09M|  }
  241|       |
  242|   273k|  auto indexedStorageHandle =
  243|   273k|      runtime.makeMutableHandle(self->getIndexedStorage(runtime));
  244|       |  // We only shift an array if the shift amount is within the limit.
  245|   273k|  constexpr uint32_t shiftLimit = (1 << 20);
  246|       |
  247|       |  // Is the array empty?
  248|   273k|  if (LLVM_UNLIKELY(endIndex == beginIndex)) {
  ------------------
  |  |  189|   273k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 271k, False: 1.32k]
  |  |  ------------------
  ------------------
  249|   271k|    if (StorageType::resize(indexedStorageHandle, runtime, 1) ==
  ------------------
  |  Branch (249:9): [True: 0, False: 271k]
  ------------------
  250|   271k|        ExecutionStatus::EXCEPTION) {
  251|      0|      return ExecutionStatus::EXCEPTION;
  252|      0|    }
  253|   271k|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  254|   271k|    indexedStorageHandle->set(runtime, 0, shv);
  255|   271k|    self = vmcast<ArrayImpl>(selfHandle.get());
  256|   271k|    self->beginIndex_ = index;
  257|   271k|    self->endIndex_ = index + 1;
  258|   271k|  } else if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  5.28k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.32k]
  |  |  |  Branch (189:53): [True: 4, False: 1.31k]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [True: 0, False: 1.32k]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  259|  1.32k|                 (index > endIndex && index - endIndex > shiftLimit) ||
  260|  1.32k|                 (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,
  268|      0|        runtime.makeHandle(HermesValue::encodeUntrustedNumberValue(index)));
  269|      0|    assert(
  270|      0|        vr != ExecutionStatus::EXCEPTION &&
  271|      0|        "valueToIdentifier() failed for uint32_t value");
  272|       |
  273|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  274|      0|            JSObject::defineNewOwnProperty(
  275|      0|                selfHandle,
  276|      0|                runtime,
  277|      0|                **vr,
  278|      0|                PropertyFlags::defaultNewNamedPropertyFlags(),
  279|      0|                value) == ExecutionStatus::EXCEPTION)) {
  280|      0|      return ExecutionStatus::EXCEPTION;
  281|      0|    }
  282|       |    // self->indexedStorage_ is unmodified, we should return directly.
  283|      0|    return true;
  284|  1.32k|  } else if (index >= endIndex) {
  ------------------
  |  Branch (284:14): [True: 1.32k, False: 0]
  ------------------
  285|       |    // Extending to the right.
  286|  1.32k|    if (StorageType::resize(
  ------------------
  |  Branch (286:9): [True: 0, False: 1.32k]
  ------------------
  287|  1.32k|            indexedStorageHandle, runtime, index - beginIndex + 1) ==
  288|  1.32k|        ExecutionStatus::EXCEPTION) {
  289|      0|      return ExecutionStatus::EXCEPTION;
  290|      0|    }
  291|  1.32k|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  292|  1.32k|    self = vmcast<ArrayImpl>(selfHandle.get());
  293|  1.32k|    self->endIndex_ = index + 1;
  294|  1.32k|    indexedStorageHandle->set(runtime, index - beginIndex, shv);
  295|  1.32k|  } else {
  296|       |    // Extending to the left. 'index' will become the new 'beginIndex'.
  297|      0|    assert(index < beginIndex);
  298|       |
  299|      0|    if (StorageType::resizeLeft(
  ------------------
  |  Branch (299:9): [True: 0, False: 0]
  ------------------
  300|      0|            indexedStorageHandle,
  301|      0|            runtime,
  302|      0|            indexedStorageHandle->size(runtime) + beginIndex - index) ==
  303|      0|        ExecutionStatus::EXCEPTION) {
  304|      0|      return ExecutionStatus::EXCEPTION;
  305|      0|    }
  306|      0|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  307|      0|    self = vmcast<ArrayImpl>(selfHandle.get());
  308|      0|    self->beginIndex_ = index;
  309|      0|    indexedStorageHandle->set(runtime, 0, shv);
  310|      0|  }
  311|       |
  312|       |  // Update the potentially changed pointer.
  313|   273k|  self->setIndexedStorage(
  314|   273k|      runtime, indexedStorageHandle.get(), runtime.getHeap());
  315|   273k|  return true;
  316|   273k|}
_ZN6hermes2vm18ArgumentsBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  388|      1|void ArgumentsBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  389|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<Arguments>());
  390|      1|  ArrayImplBuildMeta(cell, mb);
  391|      1|  mb.setVTable(&Arguments::vt);
  392|      1|}
_ZN6hermes2vm16JSArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  507|      1|void JSArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  508|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSArray>());
  509|      1|  ArrayImplBuildMeta(cell, mb);
  510|      1|  mb.setVTable(&JSArray::vt);
  511|      1|}
_ZN6hermes2vm7JSArray11createClassERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
  515|    320|    Handle<JSObject> prototypeHandle) {
  516|    320|  Handle<HiddenClass> classHandle = runtime.getHiddenClassForPrototype(
  517|    320|      *prototypeHandle, numOverlapSlots<JSArray>());
  518|       |
  519|    320|  PropertyFlags pf{};
  520|    320|  pf.enumerable = 0;
  521|    320|  pf.writable = 1;
  522|    320|  pf.configurable = 0;
  523|    320|  pf.internalSetter = 1;
  524|       |
  525|    320|  auto added = HiddenClass::addProperty(
  526|    320|      classHandle, runtime, Predefined::getSymbolID(Predefined::length), pf);
  527|    320|  assert(
  528|    320|      added != ExecutionStatus::EXCEPTION &&
  529|    320|      "Adding the first properties shouldn't cause overflow");
  530|    320|  assert(
  531|    320|      added->second == lengthPropIndex() && "JSArray.length has invalid index");
  532|    320|  classHandle = added->first;
  533|       |
  534|    320|  assert(
  535|    320|      classHandle->getNumProperties() == jsArrayPropertyCount() &&
  536|    320|      "JSArray class defined with incorrect number of properties");
  537|       |
  538|    320|  return classHandle;
  539|    320|}
_ZN6hermes2vm7JSArray24createNoAllocPropStorageERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEjj:
  546|  1.05M|    size_type length) {
  547|  1.05M|  assert(length <= capacity && "length must be <= capacity");
  548|       |
  549|  1.05M|  assert(
  550|  1.05M|      classHandle->getNumProperties() >= jsArrayPropertyCount() &&
  551|  1.05M|      "invalid number of properties in JSArray hidden class");
  552|       |
  553|  1.05M|  auto self = JSObjectInit::initToHandle(
  554|  1.05M|      runtime,
  555|  1.05M|      runtime.makeAFixed<JSArray>(
  556|  1.05M|          runtime, prototypeHandle, classHandle, GCPointerBase::NoBarriers()));
  557|       |
  558|       |  // Only allocate the storage if capacity is not zero.
  559|  1.05M|  if (capacity) {
  ------------------
  |  Branch (559:7): [True: 663k, False: 390k]
  ------------------
  560|   663k|    if (LLVM_UNLIKELY(capacity > StorageType::maxElements()))
  ------------------
  |  |  189|   663k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 663k]
  |  |  ------------------
  ------------------
  561|      0|      return runtime.raiseRangeError("Out of memory for array elements");
  562|   663k|    auto arrRes = StorageType::create(runtime, capacity);
  563|   663k|    if (arrRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (563:9): [True: 0, False: 663k]
  ------------------
  564|      0|      return ExecutionStatus::EXCEPTION;
  565|      0|    }
  566|   663k|    self->setIndexedStorage(runtime, arrRes->get(), runtime.getHeap());
  567|   663k|  }
  568|  1.05M|  auto shv = SmallHermesValue::encodeNumberValue(length, runtime);
  569|  1.05M|  putLength(self.get(), runtime, shv);
  570|       |
  571|  1.05M|  return self;
  572|  1.05M|}
_ZN6hermes2vm7JSArray6createERNS0_7RuntimeEjj:
  596|  1.05M|JSArray::create(Runtime &runtime, size_type capacity, size_type length) {
  597|  1.05M|  return JSArray::createNoAllocPropStorage(
  598|  1.05M|      runtime,
  599|  1.05M|      Handle<JSObject>::vmcast(&runtime.arrayPrototype),
  600|  1.05M|      Handle<HiddenClass>::vmcast(&runtime.arrayClass),
  601|  1.05M|      capacity,
  602|  1.05M|      length);
  603|  1.05M|}
_ZN6hermes2vm7JSArray9setLengthENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
  609|   543k|    PropOpFlags opFlags) {
  610|       |  // About the truncation of double to uint32: in theory this produces UB,
  611|       |  // however in practice it is well-defined.
  612|       |  // Regardless of what happens in the conversion, 'ulen' can never compare
  613|       |  // equal to 'd' unless 'd' is really an uint32 number, in which case the
  614|       |  // conversion would have succeeded.
  615|       |  // The only way this could fail is if the conversion throws an exception or
  616|       |  // aborts the application, which is not the case on any platform we are
  617|       |  // targeting.
  618|       |
  619|   543k|  uint32_t ulen;
  620|   543k|  double d;
  621|   543k|  if (LLVM_LIKELY(newLength->isNumber())) {
  ------------------
  |  |  188|   543k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 543k, False: 0]
  |  |  ------------------
  ------------------
  622|   543k|    d = newLength->getNumber();
  623|   543k|    ulen = (uint32_t)d;
  624|   543k|  } else {
  625|       |    // According to the spec, toNumber() has to be called twice.
  626|       |    // https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-arraysetlength
  627|       |    // There is a note that says:
  628|       |    // "In steps 3 and 4, if Desc.[[Value]] is an object then its valueOf method
  629|       |    // is called twice. This is legacy behaviour that was specified with this
  630|       |    // effect starting with the 2nd Edition of this specification."
  631|      0|    auto res = toNumber_RJS(runtime, newLength);
  632|      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]
  |  |  ------------------
  ------------------
  633|      0|      return ExecutionStatus::EXCEPTION;
  634|      0|    d = res->getNumber();
  635|      0|    ulen = (uint32_t)d;
  636|       |    // If it is a string, no need to convert again, since it is pretty
  637|       |    // expensive. Other types are not so important, since their conversions are
  638|       |    // either fast (bool) or slow (object).
  639|       |    // We could do the inverse check here - for object - but that is more risky,
  640|       |    // since calling toNumber() twice is always correct, but calling it once
  641|       |    // might be incorrect.
  642|      0|    if (!newLength->isString()) {
  ------------------
  |  Branch (642:9): [True: 0, False: 0]
  ------------------
  643|      0|      res = toNumber_RJS(runtime, newLength);
  644|      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]
  |  |  ------------------
  ------------------
  645|      0|        return ExecutionStatus::EXCEPTION;
  646|      0|      d = res->getNumber();
  647|      0|    }
  648|      0|  }
  649|       |
  650|   543k|  if (ulen != d)
  ------------------
  |  Branch (650:7): [True: 0, False: 543k]
  ------------------
  651|      0|    return runtime.raiseRangeError("Invalid array length");
  652|       |
  653|   543k|  return setLength(selfHandle, runtime, ulen, opFlags);
  654|   543k|}
_ZN6hermes2vm7JSArray9setLengthENS0_6HandleIS1_EERNS0_7RuntimeEjNS0_11PropOpFlagsE:
  660|  1.49M|    PropOpFlags opFlags) {
  661|       |  // Fast-path: if we are enlarging, do nothing.
  662|  1.49M|  const auto currentLength = getLength(*selfHandle, runtime);
  663|  1.49M|  if (LLVM_LIKELY(newLength >= currentLength)) {
  ------------------
  |  |  188|  1.49M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.49M, False: 0]
  |  |  ------------------
  ------------------
  664|  1.49M|    auto shv = SmallHermesValue::encodeNumberValue(newLength, runtime);
  665|  1.49M|    putLength(*selfHandle, runtime, shv);
  666|  1.49M|    return true;
  667|  1.49M|  }
  668|       |
  669|       |  // Length adjusted to the index of the highest non-deletable property + 1.
  670|       |  // Nothing smaller than it can be deleted.
  671|      0|  uint32_t adjustedLength = newLength;
  672|       |
  673|       |  // If we are sealed, we can't shrink past non-empty properties.
  674|      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]
  |  |  ------------------
  ------------------
  675|       |    // We must scan backwards looking for a non-empty property. We only have
  676|       |    // to scan in the intersection between the range of present values and
  677|       |    // the range between the current length and the new length.
  678|       |    //              newLength         currentLength
  679|       |    //                 |                    |
  680|       |    //                 +--------------------+
  681|       |    //       begin                end
  682|       |    //         |                   |
  683|       |    //         +-------------------+
  684|       |    //                 +-----------+
  685|       |    //                 |           |
  686|       |    //          lowestScanLen  highestLen
  687|       |    //
  688|       |
  689|      0|    auto *self = selfHandle.get();
  690|      0|    auto range = _getOwnIndexedRangeImpl(self, runtime);
  691|      0|    uint32_t lowestScanLen = std::max(range.first, newLength);
  692|      0|    uint32_t highestLen = std::min(range.second, currentLength);
  693|       |
  694|      0|    for (; highestLen > lowestScanLen; --highestLen) {
  ------------------
  |  Branch (694:12): [True: 0, False: 0]
  ------------------
  695|      0|      if (!self->unsafeAt(runtime, highestLen - 1).isEmpty()) {
  ------------------
  |  Branch (695:11): [True: 0, False: 0]
  ------------------
  696|      0|        adjustedLength = highestLen;
  697|      0|        break;
  698|      0|      }
  699|      0|    }
  700|      0|  }
  701|       |
  702|      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]
  |  |  ------------------
  ------------------
  703|      0|                        ->getHasIndexLikeProperties())) {
  704|       |    // Uh-oh. We are making the array smaller and we have index-like named
  705|       |    // properties, so we may have to delete some of them: the ones greater or
  706|       |    // equal to 'newLength'.
  707|       |
  708|       |    // We iterate all named properties to find all index-like ones that need to
  709|       |    // be deleted. At the same time we keep track of the highest index of a non-
  710|       |    // deletable property - nothing smaller than that can be deleted because the
  711|       |    // highest non-deletable would have terminated the deletion process.
  712|       |
  713|      0|    using IndexProp = std::pair<uint32_t, SymbolID>;
  714|      0|    llvh::SmallVector<IndexProp, 8> toBeDeleted;
  715|       |
  716|      0|    GCScope scope{runtime};
  717|       |
  718|      0|    HiddenClass::forEachProperty(
  719|      0|        runtime.makeHandle(selfHandle->clazz_),
  720|      0|        runtime,
  721|      0|        [&runtime, &adjustedLength, &toBeDeleted, &scope](
  722|      0|            SymbolID id, NamedPropertyDescriptor desc) {
  723|      0|          GCScopeMarkerRAII marker{scope};
  724|       |          // If this property is not an integer index, or it doesn't need to be
  725|       |          // deleted (it is less than 'adjustedLength'), ignore it.
  726|      0|          auto propNameAsIndex = toArrayIndex(
  727|      0|              runtime.getIdentifierTable().getStringView(runtime, id));
  728|      0|          if (!propNameAsIndex || *propNameAsIndex < adjustedLength)
  729|      0|            return;
  730|       |
  731|      0|          if (!desc.flags.configurable) {
  732|      0|            adjustedLength = *propNameAsIndex + 1;
  733|      0|          } else {
  734|      0|            toBeDeleted.push_back({*propNameAsIndex, id});
  735|      0|          }
  736|      0|        });
  737|       |
  738|       |    // Scan the properties to be deleted in reverse order (to make deletion more
  739|       |    // efficient) and delete those >= adjustedLength.
  740|      0|    for (auto it = toBeDeleted.rbegin(), e = toBeDeleted.rend(); it != e;
  ------------------
  |  Branch (740:66): [True: 0, False: 0]
  ------------------
  741|      0|         ++it) {
  742|      0|      if (it->first >= adjustedLength) {
  ------------------
  |  Branch (742:11): [True: 0, False: 0]
  ------------------
  743|      0|        GCScopeMarkerRAII marker{scope};
  744|      0|        auto cr = JSObject::deleteNamed(selfHandle, runtime, it->second);
  745|      0|        assert(
  746|      0|            cr != ExecutionStatus::EXCEPTION && *cr &&
  747|      0|            "Failed to delete a configurable property");
  748|      0|        (void)cr;
  749|      0|      }
  750|      0|    }
  751|      0|  }
  752|       |
  753|      0|  if (adjustedLength < selfHandle->getEndIndex()) {
  ------------------
  |  Branch (753:7): [True: 0, False: 0]
  ------------------
  754|      0|    auto cr = setStorageEndIndex(selfHandle, runtime, adjustedLength);
  755|      0|    if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (755:9): [True: 0, False: 0]
  ------------------
  756|      0|      return ExecutionStatus::EXCEPTION;
  757|      0|    }
  758|      0|  }
  759|      0|  auto shv = SmallHermesValue::encodeNumberValue(adjustedLength, runtime);
  760|      0|  putLength(*selfHandle, runtime, shv);
  761|       |
  762|      0|  if (adjustedLength != newLength) {
  ------------------
  |  Branch (762:7): [True: 0, False: 0]
  ------------------
  763|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (763:9): [True: 0, False: 0]
  ------------------
  764|      0|      return runtime.raiseTypeError(
  765|      0|          TwineChar16("Cannot delete property '") + (adjustedLength - 1) + "'");
  766|      0|    }
  767|      0|    return false;
  768|      0|  }
  769|       |
  770|      0|  return true;
  771|      0|}
_ZN6hermes2vm24JSArrayIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  787|      1|void JSArrayIteratorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  788|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSArrayIterator>());
  789|      1|  JSObjectBuildMeta(cell, mb);
  790|      1|  const auto *self = static_cast<const JSArrayIterator *>(cell);
  791|      1|  mb.setVTable(&JSArrayIterator::vt);
  792|      1|  mb.addField("iteratedObject", &self->iteratedObject_);
  793|      1|}

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

_ZN6hermes2vm19JSCallSiteBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   28|      1|void JSCallSiteBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   29|      1|  mb.addJSObjectOverlapSlots(JSCallSite::numOverlapSlots<JSCallSite>());
   30|      1|  JSObjectBuildMeta(cell, mb);
   31|      1|  const auto *self = static_cast<const JSCallSite *>(cell);
   32|      1|  mb.setVTable(&JSCallSite::vt);
   33|      1|  mb.addField("error", &self->error_);
   34|      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|     52|    Handle<JSObject> targetHandle) {
   60|     52|  MutableHandle<JSObject> mutHnd =
   61|     52|      runtime.makeMutableHandle<JSObject>(targetHandle.get());
   62|     52|  targetHandle = mutHnd;
   63|       |
   64|     52|  while (targetHandle) {
  ------------------
  |  Branch (64:10): [True: 52, False: 0]
  ------------------
   65|     52|    NamedPropertyDescriptor desc;
   66|     52|    bool exists = JSObject::getOwnNamedDescriptor(
   67|     52|        targetHandle,
   68|     52|        runtime,
   69|     52|        Predefined::getSymbolID(Predefined::InternalPropertyCapturedError),
   70|     52|        desc);
   71|     52|    if (exists) {
  ------------------
  |  Branch (71:9): [True: 0, False: 52]
  ------------------
   72|      0|      auto sv = JSObject::getNamedSlotValueUnsafe(*targetHandle, runtime, desc);
   73|      0|      return runtime.makeHandle(vmcast<JSError>(sv.getObject(runtime)));
   74|      0|    }
   75|     52|    if (vmisa<JSError>(*targetHandle)) {
  ------------------
  |  Branch (75:9): [True: 52, False: 0]
  ------------------
   76|     52|      return Handle<JSError>::vmcast(targetHandle);
   77|     52|    }
   78|       |
   79|      0|    mutHnd.set(targetHandle->getParent(runtime));
   80|      0|  }
   81|      0|  return runtime.raiseTypeError(
   82|      0|      "Error.stack getter called with an invalid receiver");
   83|     52|}
_ZN6hermes2vm16errorStackGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
   86|     52|errorStackGetter(void *, Runtime &runtime, NativeArgs args) {
   87|     52|  GCScope gcScope(runtime);
   88|       |
   89|     52|  auto targetHandle = args.dyncastThis<JSObject>();
   90|     52|  auto errorHandleRes = JSError::getErrorFromStackTarget(runtime, targetHandle);
   91|     52|  if (errorHandleRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (91:7): [True: 0, False: 52]
  ------------------
   92|      0|    return ExecutionStatus::EXCEPTION;
   93|      0|  }
   94|     52|  auto errorHandle = *errorHandleRes;
   95|     52|  if (!errorHandle->stacktrace_) {
  ------------------
  |  Branch (95:7): [True: 0, False: 52]
  ------------------
   96|       |    // Stacktrace has not been set, we simply return empty string.
   97|       |    // This is different from other VMs where stacktrace is created when
   98|       |    // the error object is created. We only set it when the error
   99|       |    // is raised.
  100|      0|    return HermesValue::encodeStringValue(
  101|      0|        runtime.getPredefinedString(Predefined::emptyString));
  102|      0|  }
  103|       |  // It's possible we're getting the stack for a stack overflow
  104|       |  // RangeError.  Allow ourselves a little extra room to do this.
  105|     52|  vm::ScopedNativeDepthReducer reducer(runtime);
  106|     52|  SmallU16String<32> stack;
  107|       |
  108|     52|  auto errorCtor = Handle<JSObject>::vmcast(&runtime.errorConstructor);
  109|       |
  110|     52|  auto prepareStackTraceRes = JSObject::getNamed_RJS(
  111|     52|      errorCtor,
  112|     52|      runtime,
  113|     52|      Predefined::getSymbolID(Predefined::prepareStackTrace),
  114|     52|      PropOpFlags().plusThrowOnError());
  115|       |
  116|     52|  if (prepareStackTraceRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (116:7): [True: 0, False: 52]
  ------------------
  117|      0|    return ExecutionStatus::EXCEPTION;
  118|      0|  }
  119|       |
  120|     52|  MutableHandle<> stackTraceFormatted{runtime};
  121|       |
  122|     52|  auto prepareStackTrace = Handle<Callable>::dyn_vmcast(
  123|     52|      runtime.makeHandle(std::move(*prepareStackTraceRes)));
  124|     52|  if (LLVM_UNLIKELY(prepareStackTrace && !runtime.formattingStackTrace())) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  |  Branch (189:53): [True: 0, False: 52]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  125|      0|    const auto &recursionGuard = llvh::make_scope_exit(
  126|      0|        [&runtime]() { runtime.setFormattingStackTrace(false); });
  127|      0|    (void)recursionGuard;
  128|       |
  129|      0|    runtime.setFormattingStackTrace(true);
  130|       |
  131|      0|    auto callSitesRes = JSError::constructCallSitesArray(runtime, errorHandle);
  132|       |
  133|      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]
  |  |  ------------------
  ------------------
  134|      0|      return ExecutionStatus::EXCEPTION;
  135|      0|    }
  136|      0|    auto prepareRes = Callable::executeCall2(
  137|      0|        prepareStackTrace,
  138|      0|        runtime,
  139|      0|        runtime.getNullValue(),
  140|      0|        targetHandle.getHermesValue(),
  141|      0|        *callSitesRes);
  142|      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]
  |  |  ------------------
  ------------------
  143|      0|      return ExecutionStatus::EXCEPTION;
  144|      0|    }
  145|      0|    stackTraceFormatted = std::move(*prepareRes);
  146|     52|  } else {
  147|     52|    if (JSError::constructStackTraceString_RJS(
  ------------------
  |  Branch (147:9): [True: 0, False: 52]
  ------------------
  148|     52|            runtime, errorHandle, targetHandle, stack) ==
  149|     52|        ExecutionStatus::EXCEPTION) {
  150|      0|      return ExecutionStatus::EXCEPTION;
  151|      0|    }
  152|       |
  153|     52|    auto strRes = StringPrimitive::create(runtime, stack);
  154|     52|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  155|       |      // StringPrimitive creation can throw if the stacktrace string is too
  156|       |      // long. In that case, we replace it with a predefined string.
  157|      0|      stackTraceFormatted = HermesValue::encodeStringValue(
  158|      0|          runtime.getPredefinedString(Predefined::stacktraceTooLong));
  159|      0|      runtime.clearThrownValue();
  160|     52|    } else {
  161|     52|      stackTraceFormatted = std::move(*strRes);
  162|     52|    }
  163|     52|  }
  164|       |
  165|       |  // We no longer need the accessor. Redefine the stack property to a regular
  166|       |  // property.
  167|     52|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  168|     52|  if (JSObject::defineOwnProperty(
  ------------------
  |  Branch (168:7): [True: 0, False: 52]
  ------------------
  169|     52|          targetHandle,
  170|     52|          runtime,
  171|     52|          Predefined::getSymbolID(Predefined::stack),
  172|     52|          dpf,
  173|     52|          stackTraceFormatted) == ExecutionStatus::EXCEPTION) {
  174|      0|    return ExecutionStatus::EXCEPTION;
  175|      0|  }
  176|     52|  return *stackTraceFormatted;
  177|     52|}
_ZN6hermes2vm7JSError6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
  203|     53|    Handle<JSObject> parentHandle) {
  204|     53|  return create(runtime, parentHandle, /*catchable*/ true);
  205|     53|}
_ZN6hermes2vm7JSError6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEb:
  216|     53|    bool catchable) {
  217|     53|  auto *cell = runtime.makeAFixed<JSError, HasFinalizer::Yes>(
  218|     53|      runtime,
  219|     53|      parentHandle,
  220|     53|      runtime.getHiddenClassForPrototype(
  221|     53|          *parentHandle, numOverlapSlots<JSError>()),
  222|     53|      catchable);
  223|     53|  return JSObjectInit::initToPseudoHandle(runtime, cell);
  224|     53|}
_ZN6hermes2vm7JSError8toStringENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeE:
  228|     52|    Runtime &runtime) {
  229|       |  // 20.5.3.4 Error.prototype.toString ( )
  230|       |
  231|       |  // 1. and 2. don't apply -- O is already an Object.
  232|       |
  233|       |  // 3. Let name be ? Get(O, "name").
  234|     52|  auto propRes = JSObject::getNamed_RJS(
  235|     52|      O, runtime, Predefined::getSymbolID(Predefined::name), PropOpFlags());
  236|     52|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  237|      0|    return ExecutionStatus::EXCEPTION;
  238|      0|  }
  239|     52|  Handle<> name = runtime.makeHandle(std::move(*propRes));
  240|       |
  241|       |  // 4. If name is undefined, set name to "Error"; otherwise set name to ?
  242|       |  // ToString(name).
  243|     52|  MutableHandle<StringPrimitive> nameStr{runtime};
  244|     52|  if (name->isUndefined()) {
  ------------------
  |  Branch (244:7): [True: 0, False: 52]
  ------------------
  245|      0|    nameStr = runtime.getPredefinedString(Predefined::Error);
  246|     52|  } else {
  247|     52|    auto strRes = toString_RJS(runtime, name);
  248|     52|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  249|      0|      return ExecutionStatus::EXCEPTION;
  250|      0|    }
  251|     52|    nameStr = strRes->get();
  252|     52|  }
  253|       |
  254|       |  // 5. Let msg be ? Get(O, "message").
  255|     52|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  256|     52|          (propRes = JSObject::getNamed_RJS(
  257|     52|               O,
  258|     52|               runtime,
  259|     52|               Predefined::getSymbolID(Predefined::message),
  260|     52|               PropOpFlags())) == ExecutionStatus::EXCEPTION)) {
  261|      0|    return ExecutionStatus::EXCEPTION;
  262|      0|  }
  263|     52|  Handle<> msg = runtime.makeHandle(std::move(*propRes));
  264|       |
  265|       |  // 6. If msg is undefined, set msg to the empty String;
  266|       |  //    otherwise set msg to ? ToString(msg).
  267|     52|  MutableHandle<StringPrimitive> msgStr{runtime};
  268|     52|  if (msg->isUndefined()) {
  ------------------
  |  Branch (268:7): [True: 0, False: 52]
  ------------------
  269|       |    // If msg is undefined, then let msg be the empty String.
  270|      0|    msgStr = runtime.getPredefinedString(Predefined::emptyString);
  271|     52|  } else {
  272|     52|    auto strRes = toString_RJS(runtime, msg);
  273|     52|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  274|      0|      return ExecutionStatus::EXCEPTION;
  275|      0|    }
  276|     52|    msgStr = strRes->get();
  277|     52|  }
  278|       |
  279|       |  // 7. If name is the empty String, return msg.
  280|     52|  if (nameStr->getStringLength() == 0) {
  ------------------
  |  Branch (280:7): [True: 0, False: 52]
  ------------------
  281|      0|    return msgStr;
  282|      0|  }
  283|       |
  284|       |  // 8. If msg is the empty String, return name.
  285|     52|  if (msgStr->getStringLength() == 0) {
  ------------------
  |  Branch (285:7): [True: 0, False: 52]
  ------------------
  286|      0|    return nameStr;
  287|      0|  }
  288|       |
  289|       |  // 9. Return the string-concatenation of name, the code unit 0x003A (COLON),
  290|       |  // the code unit 0x0020 (SPACE), and msg.
  291|     52|  SafeUInt32 length{nameStr->getStringLength()};
  292|     52|  length.add(2);
  293|     52|  length.add(msgStr->getStringLength());
  294|     52|  CallResult<StringBuilder> builderRes =
  295|     52|      StringBuilder::createStringBuilder(runtime, length);
  296|     52|  if (LLVM_UNLIKELY(builderRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  297|      0|    return ExecutionStatus::EXCEPTION;
  298|      0|  }
  299|     52|  auto builder = std::move(*builderRes);
  300|     52|  builder.appendStringPrim(nameStr);
  301|     52|  builder.appendASCIIRef({": ", 2});
  302|     52|  builder.appendStringPrim(msgStr);
  303|     52|  return builder.getStringPrimitive();
  304|     52|}
_ZN6hermes2vm7JSError10setMessageENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEE:
  309|     53|    Handle<> message) {
  310|     53|  auto stringMessage = Handle<StringPrimitive>::dyn_vmcast(message);
  311|     53|  if (LLVM_UNLIKELY(!stringMessage)) {
  ------------------
  |  |  189|     53|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 53]
  |  |  ------------------
  ------------------
  312|      0|    auto strRes = toString_RJS(runtime, message);
  313|      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]
  |  |  ------------------
  ------------------
  314|      0|      return ExecutionStatus::EXCEPTION;
  315|      0|    }
  316|      0|    stringMessage = runtime.makeHandle(std::move(*strRes));
  317|      0|  }
  318|       |
  319|     53|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  320|     53|  return JSObject::defineOwnProperty(
  321|     53|             selfHandle,
  322|     53|             runtime,
  323|     53|             Predefined::getSymbolID(Predefined::message),
  324|     53|             dpf,
  325|     53|             stringMessage)
  326|     53|      .getStatus();
  327|     53|}
_ZN6hermes2vm7JSError16recordStackTraceENS0_6HandleIS1_EERNS0_7RuntimeEbPNS0_9CodeBlockEPKNS_4inst4InstE:
  407|    100|    const Inst *ip) {
  408|    100|  if (selfHandle->stacktrace_)
  ------------------
  |  Branch (408:7): [True: 0, False: 100]
  ------------------
  409|      0|    return ExecutionStatus::RETURNED;
  410|       |
  411|    100|  auto frames = runtime.getStackFrames();
  412|       |
  413|       |  // Check if the top frame is a JSFunction and we don't have the current
  414|       |  // CodeBlock, do nothing.
  415|    100|  if (!skipTopFrame && !codeBlock && frames.begin() != frames.end() &&
  ------------------
  |  Branch (415:7): [True: 100, False: 0]
  |  Branch (415:7): [True: 48, False: 52]
  |  Branch (415:24): [True: 53, False: 47]
  |  Branch (415:38): [True: 53, False: 0]
  ------------------
  416|    100|      frames.begin()->getCalleeCodeBlock(runtime)) {
  ------------------
  |  Branch (416:7): [True: 48, False: 5]
  ------------------
  417|     48|    return ExecutionStatus::RETURNED;
  418|     48|  }
  419|       |
  420|     52|  StackTracePtr stack{new StackTrace()};
  421|     52|  auto domainsRes = ArrayStorageSmall::create(runtime, 1);
  422|     52|  if (LLVM_UNLIKELY(domainsRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  423|      0|    return ExecutionStatus::EXCEPTION;
  424|      0|  }
  425|     52|  auto domains = runtime.makeMutableHandle<ArrayStorageSmall>(
  426|     52|      vmcast<ArrayStorageSmall>(*domainsRes));
  427|       |
  428|       |  // Add the domain to the domains list, provided that it's not the same as the
  429|       |  // last domain in the list. This allows us to save storage with a constant
  430|       |  // time check, but we don't have to loop through and check every domain to
  431|       |  // deduplicate.
  432|     52|  auto addDomain = [&domains,
  433|     52|                    &runtime](CodeBlock *codeBlock) -> ExecutionStatus {
  434|     52|    GCScopeMarkerRAII marker{runtime};
  435|     52|    Handle<Domain> domain = codeBlock->getRuntimeModule()->getDomain(runtime);
  436|     52|    if (domains->size() > 0 &&
  437|     52|        vmcast<Domain>(domains->at(domains->size() - 1).getObject(runtime)) ==
  438|     52|            domain.get()) {
  439|     52|      return ExecutionStatus::RETURNED;
  440|     52|    }
  441|     52|    return ArrayStorageSmall::push_back(domains, runtime, domain);
  442|     52|  };
  443|       |
  444|     52|  if (!skipTopFrame) {
  ------------------
  |  Branch (444:7): [True: 52, False: 0]
  ------------------
  445|     52|    if (codeBlock) {
  ------------------
  |  Branch (445:9): [True: 47, False: 5]
  ------------------
  446|     47|      stack->emplace_back(codeBlock, codeBlock->getOffsetOf(ip));
  447|     47|      if (LLVM_UNLIKELY(addDomain(codeBlock) == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     47|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 47]
  |  |  ------------------
  ------------------
  448|      0|        return ExecutionStatus::EXCEPTION;
  449|      0|      }
  450|     47|    } else {
  451|      5|      stack->emplace_back(nullptr, 0);
  452|      5|    }
  453|     52|  }
  454|       |
  455|     52|  const StackFramePtr framesEnd = *runtime.getStackFrames().end();
  456|       |
  457|       |  // Fill in the call stack.
  458|       |  // Each stack frame tracks information about the caller.
  459|     57|  for (StackFramePtr cf : runtime.getStackFrames()) {
  ------------------
  |  Branch (459:25): [True: 57, False: 52]
  ------------------
  460|     57|    CodeBlock *savedCodeBlock = cf.getSavedCodeBlock();
  461|     57|    const Inst *const savedIP = cf.getSavedIP();
  462|       |    // Go up one frame and get the callee code block but use the current
  463|       |    // frame's saved IP. This also allows us to account for bound functions,
  464|       |    // which have savedCodeBlock == nullptr in order to allow proper returns in
  465|       |    // the interpreter.
  466|     57|    StackFramePtr prev = cf->getPreviousFrame();
  467|     57|    if (prev != framesEnd) {
  ------------------
  |  Branch (467:9): [True: 5, False: 52]
  ------------------
  468|      5|      if (CodeBlock *parentCB = prev->getCalleeCodeBlock(runtime)) {
  ------------------
  |  Branch (468:22): [True: 5, False: 0]
  ------------------
  469|      5|        savedCodeBlock = parentCB;
  470|      5|      }
  471|      5|    }
  472|     57|    if (savedCodeBlock && savedIP) {
  ------------------
  |  Branch (472:9): [True: 5, False: 52]
  |  Branch (472:27): [True: 5, False: 0]
  ------------------
  473|      5|      stack->emplace_back(savedCodeBlock, savedCodeBlock->getOffsetOf(savedIP));
  474|      5|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  475|      5|              addDomain(savedCodeBlock) == ExecutionStatus::EXCEPTION)) {
  476|      0|        return ExecutionStatus::EXCEPTION;
  477|      0|      }
  478|     52|    } else {
  479|     52|      stack->emplace_back(nullptr, 0);
  480|     52|    }
  481|     57|  }
  482|     52|  selfHandle->domains_.set(runtime, domains.get(), runtime.getHeap());
  483|       |
  484|       |  // Remove the last entry.
  485|     52|  stack->pop_back();
  486|       |
  487|     52|  auto funcNames =
  488|     52|      getCallStackFunctionNames(runtime, skipTopFrame, stack->size());
  489|       |
  490|       |  // Either the function names is empty, or they have the same count.
  491|     52|  assert(
  492|     52|      (!funcNames || funcNames->size() == stack->size()) &&
  493|     52|      "Function names and stack trace must have same size.");
  494|       |
  495|     52|  selfHandle->stacktrace_ = std::move(stack);
  496|     52|  selfHandle->funcNames_.set(runtime, *funcNames, runtime.getHeap());
  497|     52|  return ExecutionStatus::RETURNED;
  498|     52|}
_ZN6hermes2vm7JSError12getDebugInfoEPNS0_9CodeBlockEj:
  503|     52|    uint32_t bytecodeOffset) {
  504|     52|  auto offset = codeBlock->getDebugSourceLocationsOffset();
  505|     52|  if (!offset.hasValue()) {
  ------------------
  |  Branch (505:7): [True: 0, False: 52]
  ------------------
  506|      0|    return llvh::None;
  507|      0|  }
  508|       |
  509|     52|  return codeBlock->getRuntimeModule()
  510|     52|      ->getBytecode()
  511|     52|      ->getDebugInfo()
  512|     52|      ->getLocationForAddress(offset.getValue(), bytecodeOffset);
  513|     52|}
_ZN6hermes2vm7JSError22getFunctionNameAtIndexERNS0_7RuntimeENS0_6HandleIS1_EEm:
  518|     57|    size_t index) {
  519|     57|  IdentifierTable &idt = runtime.getIdentifierTable();
  520|     57|  MutableHandle<StringPrimitive> name{
  521|     57|      runtime, runtime.getPredefinedString(Predefined::emptyString)};
  522|       |
  523|       |  // If funcNames_ is set and contains a string primitive, use that.
  524|     57|  if (selfHandle->funcNames_) {
  ------------------
  |  Branch (524:7): [True: 57, False: 0]
  ------------------
  525|     57|    assert(
  526|     57|        index < selfHandle->funcNames_.getNonNull(runtime)->size() &&
  527|     57|        "Index out of bounds");
  528|     57|    name = dyn_vmcast<StringPrimitive>(
  529|     57|        selfHandle->funcNames_.getNonNull(runtime)->at(index).unboxToHV(
  530|     57|            runtime));
  531|     57|  }
  532|       |
  533|     57|  if (!name || name->getStringLength() == 0) {
  ------------------
  |  Branch (533:7): [True: 0, False: 57]
  |  Branch (533:16): [True: 0, False: 57]
  ------------------
  534|       |    // We did not have an explicit function name, or it was not a nonempty
  535|       |    // string. If we have a code block, try its debug info.
  536|      0|    if (const CodeBlock *codeBlock =
  ------------------
  |  Branch (536:26): [True: 0, False: 0]
  ------------------
  537|      0|            selfHandle->stacktrace_->at(index).codeBlock) {
  538|      0|      name = idt.getStringPrim(runtime, codeBlock->getNameMayAllocate());
  539|      0|    }
  540|      0|  }
  541|       |
  542|     57|  if (!name || name->getStringLength() == 0) {
  ------------------
  |  Branch (542:7): [True: 0, False: 57]
  |  Branch (542:16): [True: 0, False: 57]
  ------------------
  543|      0|    return runtime.makeNullHandle<StringPrimitive>();
  544|      0|  }
  545|       |
  546|     57|  return std::move(name);
  547|     57|}
_ZN6hermes2vm7JSError25appendFunctionNameAtIndexERNS0_7RuntimeENS0_6HandleIS1_EEmRN4llvh15SmallVectorImplIDsEE:
  553|     57|    llvh::SmallVectorImpl<char16_t> &str) {
  554|     57|  auto name = getFunctionNameAtIndex(runtime, selfHandle, index);
  555|       |
  556|     57|  if (!name)
  ------------------
  |  Branch (556:7): [True: 0, False: 57]
  ------------------
  557|      0|    return false;
  558|       |
  559|     57|  name->appendUTF16String(str);
  560|     57|  return true;
  561|     57|}
_ZN6hermes2vm7JSError29constructStackTraceString_RJSERNS0_7RuntimeENS0_6HandleIS1_EENS4_INS0_8JSObjectEEERNS0_12SmallXStringIDsLj32EEE:
  567|     52|    SmallU16String<32> &stack) {
  568|       |  // This method potentially runs javascript, so we need to protect it agains
  569|       |  // stack overflow.
  570|     52|  ScopedNativeDepthTracker depthTracker(runtime);
  571|     52|  if (LLVM_UNLIKELY(depthTracker.overflowed())) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  572|      0|    return runtime.raiseStackOverflow(Runtime::StackOverflowKind::NativeStack);
  573|      0|  }
  574|       |
  575|     52|  GCScope gcScope(runtime);
  576|       |  // First of all, the stacktrace string starts with
  577|       |  // %Error.prototype.toString%(target).
  578|     52|  CallResult<Handle<StringPrimitive>> res =
  579|     52|      JSError::toString(targetHandle, runtime);
  580|       |  // Keep track whether targetHandle.toString() threw. If it did, the error
  581|       |  // message will contain a string letting the user know that something went
  582|       |  // awry.
  583|     52|  const bool targetHandleToStringThrew = res == ExecutionStatus::EXCEPTION;
  584|       |
  585|     52|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  586|       |    // target.toString() threw an exception; if it is a catchable error try to
  587|       |    // toString() it so the user has some indication of what went wrong.
  588|      0|    if (!isUncatchableError(runtime.getThrownValue())) {
  ------------------
  |  Branch (588:9): [True: 0, False: 0]
  ------------------
  589|      0|      HermesValue thrownValue = runtime.getThrownValue();
  590|      0|      if (thrownValue.isObject()) {
  ------------------
  |  Branch (590:11): [True: 0, False: 0]
  ------------------
  591|       |        // Clear the pending exception, and try to convert thrownValue to string
  592|       |        // with %Error.prototype.toString%(thrownValue).
  593|      0|        runtime.clearThrownValue();
  594|      0|        res = JSError::toString(
  595|      0|            runtime.makeHandle<JSObject>(thrownValue), runtime);
  596|      0|      }
  597|      0|    }
  598|      0|  }
  599|       |
  600|     52|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  601|       |    // An exception happened while trying to get the description for the error.
  602|      0|    if (isUncatchableError(runtime.getThrownValue())) {
  ------------------
  |  Branch (602:9): [True: 0, False: 0]
  ------------------
  603|       |      // If JSError::toString throws an uncatchable exception, bubble it up.
  604|      0|      return ExecutionStatus::EXCEPTION;
  605|      0|    }
  606|       |    // Clear the pending exception so the caller doesn't observe this side
  607|       |    // effect.
  608|      0|    runtime.clearThrownValue();
  609|       |    // Append a generic <error> string and move on.
  610|      0|    stack.append(u"<error>");
  611|     52|  } else {
  612|     52|    if (targetHandleToStringThrew) {
  ------------------
  |  Branch (612:9): [True: 0, False: 52]
  ------------------
  613|      0|      stack.append(u"<while converting error to string: ");
  614|      0|    }
  615|     52|    res->get()->appendUTF16String(stack);
  616|     52|    if (targetHandleToStringThrew) {
  ------------------
  |  Branch (616:9): [True: 0, False: 52]
  ------------------
  617|      0|      stack.append(u">");
  618|      0|    }
  619|     52|  }
  620|       |
  621|       |  // Virtual offsets are computed by walking the list of bytecode functions. If
  622|       |  // we have an extremely deep stack, this could get expensive. Assume that very
  623|       |  // deep stacks are most likely due to runaway recursion and so use a local
  624|       |  // cache of virtual offsets.
  625|     52|  llvh::DenseMap<const CodeBlock *, uint32_t> virtualOffsetCache;
  626|       |
  627|       |  // Append each function location in the call stack to stack trace.
  628|     52|  auto marker = gcScope.createMarker();
  629|     52|  for (size_t index = 0,
  630|     52|              max = selfHandle->stacktrace_->size() -
  631|     52|           selfHandle->firstExposedFrameIndex_;
  632|    109|       index < max;
  ------------------
  |  Branch (632:8): [True: 57, False: 52]
  ------------------
  633|     57|       index++) {
  634|     57|    char buf[NUMBER_TO_STRING_BUF_SIZE];
  635|       |
  636|       |    // If the trace contains more than 100 entries, limit the string to the
  637|       |    // first 50 and the last 50 entries and include a line about the truncation.
  638|     57|    static constexpr unsigned PRINT_HEAD = 50;
  639|     57|    static constexpr unsigned PRINT_TAIL = 50;
  640|     57|    if (LLVM_UNLIKELY(max > PRINT_HEAD + PRINT_TAIL)) {
  ------------------
  |  |  189|     57|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 57]
  |  |  ------------------
  ------------------
  641|      0|      if (index == PRINT_HEAD) {
  ------------------
  |  Branch (641:11): [True: 0, False: 0]
  ------------------
  642|      0|        stack.append("\n    ... skipping ");
  643|      0|        numberToString(max - PRINT_HEAD - PRINT_TAIL, buf, sizeof(buf));
  644|      0|        stack.append(buf);
  645|      0|        stack.append(" frames");
  646|      0|        continue;
  647|      0|      }
  648|       |
  649|       |      // Skip the middle frames.
  650|      0|      if (index > PRINT_HEAD && index < max - PRINT_TAIL) {
  ------------------
  |  Branch (650:11): [True: 0, False: 0]
  |  Branch (650:33): [True: 0, False: 0]
  ------------------
  651|      0|        index = max - PRINT_TAIL;
  652|      0|      }
  653|      0|    }
  654|       |
  655|     57|    const size_t absIndex = index + selfHandle->firstExposedFrameIndex_;
  656|     57|    const StackTraceInfo &sti = selfHandle->stacktrace_->at(absIndex);
  657|     57|    gcScope.flushToMarker(marker);
  658|       |    // For each stacktrace entry, we add a line with the following format:
  659|       |    // at <functionName> (<fileName>:<lineNo>:<columnNo>)
  660|       |
  661|     57|    stack.append(u"\n    at ");
  662|       |
  663|     57|    if (!appendFunctionNameAtIndex(runtime, selfHandle, absIndex, stack))
  ------------------
  |  Branch (663:9): [True: 0, False: 57]
  ------------------
  664|      0|      stack.append(u"anonymous");
  665|       |
  666|       |    // If we have a null codeBlock, it's a native function, which do not have
  667|       |    // lines and columns.
  668|     57|    if (!sti.codeBlock) {
  ------------------
  |  Branch (668:9): [True: 5, False: 52]
  ------------------
  669|      5|      stack.append(u" (native)");
  670|      5|      continue;
  671|      5|    }
  672|       |
  673|       |    // We are not a native function.
  674|     52|    int32_t lineNo;
  675|     52|    int32_t columnNo;
  676|     52|    OptValue<SymbolID> fileName;
  677|     52|    bool isAddress = false;
  678|     52|    OptValue<hbc::DebugSourceLocation> location =
  679|     52|        getDebugInfo(sti.codeBlock, sti.bytecodeOffset);
  680|     52|    if (location) {
  ------------------
  |  Branch (680:9): [True: 52, False: 0]
  ------------------
  681|       |      // Use the line and column from the debug info.
  682|     52|      lineNo = location->line;
  683|     52|      columnNo = location->column;
  684|     52|    } else {
  685|       |      // Use a "line" and "column" synthesized from the bytecode.
  686|       |      // In our synthesized stack trace, a line corresponds to a bytecode
  687|       |      // module. This matches the interpretation in DebugInfo.cpp. Currently we
  688|       |      // can only have one bytecode module without debug information, namely the
  689|       |      // one loaded from disk, which is always at index 1.
  690|       |      // TODO: find a way to track the bytecode modules explicitly.
  691|       |      // TODO: we do not yet have a way of getting the file name separate from
  692|       |      // the debug info. For now we end up leaving it as "unknown".
  693|      0|      auto pair = virtualOffsetCache.insert({sti.codeBlock, 0});
  694|      0|      uint32_t &virtualOffset = pair.first->second;
  695|      0|      if (pair.second) {
  ------------------
  |  Branch (695:11): [True: 0, False: 0]
  ------------------
  696|       |        // Code block was not in the cache, update the cache.
  697|      0|        virtualOffset = sti.codeBlock->getVirtualOffset();
  698|      0|      }
  699|       |      // Add 1 to the SegmentID to account for 1-based indexing of
  700|       |      // symbolication tools.
  701|      0|      lineNo =
  702|      0|          sti.codeBlock->getRuntimeModule()->getBytecode()->getSegmentID() + 1;
  703|      0|      columnNo = sti.bytecodeOffset + virtualOffset;
  704|      0|      isAddress = true;
  705|      0|    }
  706|       |
  707|     52|    stack.append(u" (");
  708|     52|    if (isAddress)
  ------------------
  |  Branch (708:9): [True: 0, False: 52]
  ------------------
  709|      0|      stack.append(u"address at ");
  710|       |
  711|       |    // Append the filename. If we have a source location, use the filename from
  712|       |    // that location; otherwise use the RuntimeModule's sourceURL; otherwise
  713|       |    // report unknown.
  714|     52|    RuntimeModule *runtimeModule = sti.codeBlock->getRuntimeModule();
  715|     52|    if (location) {
  ------------------
  |  Branch (715:9): [True: 52, False: 0]
  ------------------
  716|     52|      stack.append(
  717|     52|          runtimeModule->getBytecode()->getDebugInfo()->getFilenameByID(
  718|     52|              location->filenameId));
  719|     52|    } else {
  720|      0|      auto sourceURL = runtimeModule->getSourceURL();
  721|      0|      stack.append(sourceURL.empty() ? "unknown" : sourceURL);
  ------------------
  |  Branch (721:20): [True: 0, False: 0]
  ------------------
  722|      0|    }
  723|     52|    stack.push_back(u':');
  724|       |
  725|     52|    numberToString(lineNo, buf, NUMBER_TO_STRING_BUF_SIZE);
  726|     52|    stack.append(buf);
  727|       |
  728|     52|    stack.push_back(u':');
  729|       |
  730|     52|    numberToString(columnNo, buf, NUMBER_TO_STRING_BUF_SIZE);
  731|     52|    stack.append(buf);
  732|       |
  733|     52|    stack.push_back(u')');
  734|     52|  }
  735|     52|  return ExecutionStatus::RETURNED;
  736|     52|}
_ZN6hermes2vm7JSError13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  832|     53|void JSError::_finalizeImpl(GCCell *cell, GC &) {
  833|     53|  JSError *self = vmcast<JSError>(cell);
  834|     53|  self->~JSError();
  835|     53|}
JSError.cpp:_ZZN6hermes2vm7JSError16recordStackTraceENS0_6HandleIS1_EERNS0_7RuntimeEbPNS0_9CodeBlockEPKNS_4inst4InstEENK3$_0clES7_:
  433|     52|                    &runtime](CodeBlock *codeBlock) -> ExecutionStatus {
  434|     52|    GCScopeMarkerRAII marker{runtime};
  435|     52|    Handle<Domain> domain = codeBlock->getRuntimeModule()->getDomain(runtime);
  436|     52|    if (domains->size() > 0 &&
  ------------------
  |  Branch (436:9): [True: 0, False: 52]
  |  Branch (436:9): [True: 0, False: 52]
  ------------------
  437|     52|        vmcast<Domain>(domains->at(domains->size() - 1).getObject(runtime)) ==
  ------------------
  |  Branch (437:9): [True: 0, False: 0]
  ------------------
  438|      0|            domain.get()) {
  439|      0|      return ExecutionStatus::RETURNED;
  440|      0|    }
  441|     52|    return ArrayStorageSmall::push_back(domains, runtime, domain);
  442|     52|  };
JSError.cpp:_ZN6hermes2vmL25getCallStackFunctionNamesERNS0_7RuntimeEbm:
  339|     52|    size_t sizeHint) {
  340|     52|  auto arrRes = PropStorage::create(runtime, sizeHint);
  341|     52|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     52|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 52]
  |  |  ------------------
  ------------------
  342|      0|    runtime.clearThrownValue();
  343|      0|    return Runtime::makeNullHandle<PropStorage>();
  344|      0|  }
  345|     52|  MutableHandle<PropStorage> names{runtime, vmcast<PropStorage>(*arrRes)};
  346|       |
  347|     52|  GCScope gcScope(runtime);
  348|     52|  MutableHandle<> name{runtime};
  349|     52|  auto marker = gcScope.createMarker();
  350|       |
  351|     52|  uint32_t frameIndex = 0;
  352|     52|  uint32_t namesIndex = 0;
  353|     57|  for (StackFramePtr cf : runtime.getStackFrames()) {
  ------------------
  |  Branch (353:25): [True: 57, False: 52]
  ------------------
  354|     57|    if (frameIndex++ == 0 && skipTopFrame)
  ------------------
  |  Branch (354:9): [True: 52, False: 5]
  |  Branch (354:30): [True: 0, False: 52]
  ------------------
  355|      0|      continue;
  356|       |
  357|     57|    name = HermesValue::encodeUndefinedValue();
  358|     57|    if (auto callableHandle = Handle<Callable>::dyn_vmcast(
  ------------------
  |  Branch (358:14): [True: 57, False: 0]
  ------------------
  359|     57|            Handle<>(&cf.getCalleeClosureOrCBRef()))) {
  360|     57|      NamedPropertyDescriptor desc;
  361|     57|      JSObject *propObj = JSObject::getNamedDescriptorPredefined(
  362|     57|          callableHandle, runtime, Predefined::displayName, desc);
  363|       |
  364|     57|      if (!propObj) {
  ------------------
  |  Branch (364:11): [True: 57, False: 0]
  ------------------
  365|     57|        propObj = JSObject::getNamedDescriptorPredefined(
  366|     57|            callableHandle, runtime, Predefined::name, desc);
  367|     57|      }
  368|       |
  369|     57|      if (propObj && !desc.flags.accessor &&
  ------------------
  |  Branch (369:11): [True: 57, False: 0]
  |  Branch (369:22): [True: 57, False: 0]
  ------------------
  370|     57|          LLVM_LIKELY(!desc.flags.proxyObject) &&
  ------------------
  |  |  188|    114|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 57, False: 0]
  |  |  ------------------
  ------------------
  371|     57|          LLVM_LIKELY(!desc.flags.hostObject)) {
  ------------------
  |  |  188|     57|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 57, False: 0]
  |  |  ------------------
  ------------------
  372|     57|        name = JSObject::getNamedSlotValueUnsafe(propObj, runtime, desc)
  373|     57|                   .unboxToHV(runtime);
  374|     57|      } else if (desc.flags.proxyObject) {
  ------------------
  |  Branch (374:18): [True: 0, False: 0]
  ------------------
  375|      0|        name = HermesValue::encodeStringValue(
  376|      0|            runtime.getPredefinedString(Predefined::proxyTrap));
  377|      0|      }
  378|     57|    } else if (!cf.getCalleeClosureOrCBRef().isObject()) {
  ------------------
  |  Branch (378:16): [True: 0, False: 0]
  ------------------
  379|       |      // If CalleeClosureOrCB is not an object pointer, then it must be a native
  380|       |      // pointer to a CodeBlock.
  381|      0|      auto *cb =
  382|      0|          cf.getCalleeClosureOrCBRef().getNativePointer<const CodeBlock>();
  383|      0|      if (cb->getNameMayAllocate().isValid())
  ------------------
  |  Branch (383:11): [True: 0, False: 0]
  ------------------
  384|      0|        name = HermesValue::encodeStringValue(
  385|      0|            runtime.getStringPrimFromSymbolID(cb->getNameMayAllocate()));
  386|      0|    }
  387|     57|    if (PropStorage::resize(names, runtime, namesIndex + 1) ==
  ------------------
  |  Branch (387:9): [True: 0, False: 57]
  ------------------
  388|     57|        ExecutionStatus::EXCEPTION) {
  389|      0|      runtime.clearThrownValue();
  390|      0|      return Runtime::makeNullHandle<PropStorage>();
  391|      0|    }
  392|     57|    auto shv =
  393|     57|        SmallHermesValue::encodeHermesValue(name.getHermesValue(), runtime);
  394|     57|    names->set(namesIndex, shv, runtime.getHeap());
  395|     57|    ++namesIndex;
  396|     57|    gcScope.flushToMarker(marker);
  397|     57|  }
  398|       |
  399|     52|  return std::move(names);
  400|     52|}

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

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

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

_ZN6hermes2vm30createAsyncFunctionConstructorERNS0_7RuntimeE:
   24|    160|Handle<JSObject> createAsyncFunctionConstructor(Runtime &runtime) {
   25|    160|  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|    160|  auto cons = runtime.makeHandle(NativeConstructor::create(
   30|    160|      runtime,
   31|    160|      Handle<JSObject>::vmcast(&runtime.functionConstructor),
   32|    160|      nullptr,
   33|    160|      asyncFunctionConstructor,
   34|    160|      1,
   35|    160|      NativeConstructor::creatorFunction<JSAsyncFunction>,
   36|    160|      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|    160|  auto st = Callable::defineNameLengthAndPrototype(
   42|    160|      cons,
   43|    160|      runtime,
   44|    160|      Predefined::getSymbolID(Predefined::AsyncFunction),
   45|    160|      1,
   46|    160|      proto,
   47|    160|      Callable::WritablePrototype::No,
   48|    160|      false);
   49|    160|  (void)st;
   50|    160|  assert(
   51|    160|      st != ExecutionStatus::EXCEPTION && "defineLengthAndPrototype() failed");
   52|       |
   53|    160|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   54|    160|  dpf.writable = 0;
   55|    160|  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|    160|  defineProperty(
   62|    160|      runtime,
   63|    160|      proto,
   64|    160|      Predefined::getSymbolID(Predefined::constructor),
   65|    160|      cons,
   66|    160|      dpf);
   67|       |
   68|       |  /// 26.7.3.2 AsyncFunction.prototype [ @@toStringTag ]
   69|       |  /// The initial value is the String value "AsyncFunction".
   70|    160|  defineProperty(
   71|    160|      runtime,
   72|    160|      proto,
   73|    160|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   74|    160|      runtime.getPredefinedStringHandle(Predefined::AsyncFunction),
   75|    160|      dpf);
   76|       |
   77|    160|  return cons;
   78|    160|}

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

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

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

_ZN6hermes2vm25createDataViewConstructorERNS0_7RuntimeE:
  223|    160|Handle<JSObject> createDataViewConstructor(Runtime &runtime) {
  224|    160|  auto proto = Handle<JSObject>::vmcast(&runtime.dataViewPrototype);
  225|    160|  auto cons = defineSystemConstructor<JSDataView>(
  226|    160|      runtime,
  227|    160|      Predefined::getSymbolID(Predefined::DataView),
  228|    160|      dataViewConstructor,
  229|    160|      proto,
  230|    160|      1,
  231|    160|      CellKind::JSDataViewKind);
  232|       |
  233|       |  // DataView.prototype.xxx() methods.
  234|    160|  defineAccessor(
  235|    160|      runtime,
  236|    160|      proto,
  237|    160|      Predefined::getSymbolID(Predefined::buffer),
  238|    160|      nullptr,
  239|    160|      dataViewPrototypeBuffer,
  240|    160|      nullptr,
  241|    160|      false,
  242|    160|      true);
  243|    160|  defineAccessor(
  244|    160|      runtime,
  245|    160|      proto,
  246|    160|      Predefined::getSymbolID(Predefined::byteLength),
  247|    160|      nullptr,
  248|    160|      dataViewPrototypeByteLength,
  249|    160|      nullptr,
  250|    160|      false,
  251|    160|      true);
  252|    160|  defineAccessor(
  253|    160|      runtime,
  254|    160|      proto,
  255|    160|      Predefined::getSymbolID(Predefined::byteOffset),
  256|    160|      nullptr,
  257|    160|      dataViewPrototypeByteOffset,
  258|    160|      nullptr,
  259|    160|      false,
  260|    160|      true);
  261|       |
  262|    160|#define TYPED_ARRAY(name, type)                       \
  263|    160|  defineMethod(                                       \
  264|    160|      runtime,                                        \
  265|    160|      proto,                                          \
  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  267|    160|      nullptr,                                        \
  268|    160|      dataViewPrototypeGet##name,                     \
  269|    160|      1);                                             \
  270|    160|  defineMethod(                                       \
  271|    160|      runtime,                                        \
  272|    160|      proto,                                          \
  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  274|    160|      nullptr,                                        \
  275|    160|      dataViewPrototypeSet##name,                     \
  276|    160|      2);
  277|    160|#define TYPED_ARRAY_NO_CLAMP
  278|    160|#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|    160|TYPED_ARRAY(Int8, int8_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   15|    160|TYPED_ARRAY(Int16, int16_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   16|    160|TYPED_ARRAY(Int32, int32_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   17|    160|TYPED_ARRAY(Uint8, uint8_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   18|       |#ifndef TYPED_ARRAY_NO_CLAMP
  |  |   19|       |TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |   20|       |#else
  |  |   21|    160|#undef TYPED_ARRAY_NO_CLAMP
  |  |   22|    160|#endif
  |  |   23|    160|TYPED_ARRAY(Uint16, uint16_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   24|    160|TYPED_ARRAY(Uint32, uint32_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   25|    160|TYPED_ARRAY(Float32, float)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   26|    160|TYPED_ARRAY(Float64, double)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   27|    160|TYPED_ARRAY(BigInt64, int64_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   28|    160|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  ------------------
  |  |  |  |  263|    160|  defineMethod(                                       \
  |  |  |  |  264|    160|      runtime,                                        \
  |  |  |  |  265|    160|      proto,                                          \
  |  |  |  |  266|    160|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|    160|      nullptr,                                        \
  |  |  |  |  268|    160|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|    160|      1);                                             \
  |  |  |  |  270|    160|  defineMethod(                                       \
  |  |  |  |  271|    160|      runtime,                                        \
  |  |  |  |  272|    160|      proto,                                          \
  |  |  |  |  273|    160|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|    160|      nullptr,                                        \
  |  |  |  |  275|    160|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|    160|      2);
  |  |  ------------------
  |  |   29|       |
  |  |   30|    160|#undef TYPED_ARRAY
  ------------------
  279|       |
  280|    160|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  281|    160|  dpf.writable = 0;
  282|    160|  dpf.enumerable = 0;
  283|    160|  defineProperty(
  284|    160|      runtime,
  285|    160|      proto,
  286|    160|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  287|    160|      runtime.getPredefinedStringHandle(Predefined::DataView),
  288|    160|      dpf);
  289|       |
  290|       |  // DataView.xxx() methods.
  291|       |
  292|    160|  return cons;
  293|    160|}

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

_ZN6hermes2vm8localTZAEv:
  215|    160|double localTZA() {
  216|       |#ifdef _WINDOWS
  217|       |
  218|       |  // TODO(T173336959): We should use a thread-safe API, and also be consistent
  219|       |  // with daylightSavingTA().
  220|       |  _tzset();
  221|       |
  222|       |  long gmtoff;
  223|       |  int err = _get_timezone(&gmtoff);
  224|       |  if (err)
  225|       |    return 0;
  226|       |
  227|       |  // The result of _get_timezone is negated
  228|       |  return -gmtoff * MS_PER_SECOND;
  229|       |
  230|       |#else
  231|       |
  232|       |  // Get the current time in seconds (might have DST adjustment included).
  233|    160|  std::time_t currentWithDST = std::time(nullptr);
  234|       |
  235|       |  // Deconstruct the time into localTime.
  236|       |  // Note that localtime_r uses cached timezone information on Linux (glibc), so
  237|       |  // the returned local time may not be computed using an updated timezone if
  238|       |  // the timezone changes after this process has started.
  239|    160|  std::tm tm;
  240|    160|  std::tm *local = ::localtime_r(&currentWithDST, &tm);
  241|    160|  if (!local)
  ------------------
  |  Branch (241:7): [True: 0, False: 160]
  ------------------
  242|      0|    return 0;
  243|       |
  244|    160|  long gmtoff = local->tm_gmtoff;
  245|       |
  246|       |  // Use the gmtoff field and subtract an hour if currently in DST.
  247|    160|  return (gmtoff * MS_PER_SECOND) - (local->tm_isdst ? MS_PER_HOUR : 0);
  ------------------
  |  Branch (247:38): [True: 0, False: 160]
  ------------------
  248|       |
  249|    160|#endif
  250|    160|}

_ZN6hermes2vm28createDebuggerInternalObjectERNS0_7RuntimeE:
   17|    160|Handle<JSObject> createDebuggerInternalObject(Runtime &runtime) {
   18|    160|  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|    160|  defineAccessor(
   23|    160|      runtime,
   24|    160|      intern,
   25|    160|      runtime.getIdentifierTable().registerLazyIdentifier(
   26|    160|          createASCIIRef("isDebuggerAttached")),
   27|    160|      nullptr,
   28|    160|      isDebuggerAttached,
   29|    160|      nullptr,
   30|    160|      true,
   31|    160|      false);
   32|       |
   33|       |  // Configurable property to poll whether
   34|       |  // the VM will pause the debugger on exceptions.
   35|    160|  defineAccessor(
   36|    160|      runtime,
   37|    160|      intern,
   38|    160|      runtime.getIdentifierTable().registerLazyIdentifier(
   39|    160|          createASCIIRef("shouldPauseOnThrow")),
   40|    160|      nullptr,
   41|    160|      shouldPauseOnThrow,
   42|    160|      nullptr,
   43|    160|      true,
   44|    160|      false);
   45|       |
   46|    160|  JSObject::preventExtensions(*intern);
   47|    160|  runtime.debuggerInternalObject_ = intern.getHermesValue();
   48|       |
   49|    160|  return intern;
   50|    160|}

_ZN6hermes2vm22createErrorConstructorERNS0_7RuntimeE:
   27|    160|Handle<JSObject> createErrorConstructor(Runtime &runtime) {
   28|    160|  auto errorPrototype = Handle<JSObject>::vmcast(&runtime.ErrorPrototype);
   29|       |
   30|       |  // Error.prototype.xxx methods.
   31|    160|  defineMethod(
   32|    160|      runtime,
   33|    160|      errorPrototype,
   34|    160|      Predefined::getSymbolID(Predefined::toString),
   35|    160|      nullptr,
   36|    160|      errorPrototypeToString,
   37|    160|      0);
   38|       |
   39|       |  // Error.prototype.xxx properties.
   40|       |  // Error.prototype has three own properties: name, message, and stack.
   41|    160|  auto defaultName = runtime.getPredefinedString(Predefined::Error);
   42|    160|  defineProperty(
   43|    160|      runtime,
   44|    160|      errorPrototype,
   45|    160|      Predefined::getSymbolID(Predefined::name),
   46|    160|      runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));
   47|       |
   48|    160|  auto defaultMessage = runtime.getPredefinedString(Predefined::emptyString);
   49|    160|  defineProperty(
   50|    160|      runtime,
   51|    160|      errorPrototype,
   52|    160|      Predefined::getSymbolID(Predefined::message),
   53|    160|      runtime.makeHandle(HermesValue::encodeStringValue(defaultMessage)));
   54|       |
   55|    160|  auto getter = NativeFunction::create(
   56|    160|      runtime,
   57|    160|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
   58|    160|      nullptr,
   59|    160|      errorStackGetter,
   60|    160|      Predefined::getSymbolID(Predefined::emptyString),
   61|    160|      0,
   62|    160|      Runtime::makeNullHandle<JSObject>());
   63|       |
   64|    160|  auto setter = NativeFunction::create(
   65|    160|      runtime,
   66|    160|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
   67|    160|      nullptr,
   68|    160|      errorStackSetter,
   69|    160|      Predefined::getSymbolID(Predefined::emptyString),
   70|    160|      1,
   71|    160|      Runtime::makeNullHandle<JSObject>());
   72|       |
   73|       |  // Save the accessors on the runtime so we can use them for captureStackTrace.
   74|    160|  runtime.jsErrorStackAccessor =
   75|    160|      PropertyAccessor::create(runtime, getter, setter);
   76|       |
   77|    160|  auto accessor =
   78|    160|      Handle<PropertyAccessor>::vmcast(&runtime.jsErrorStackAccessor);
   79|       |
   80|    160|  DefinePropertyFlags dpf{};
   81|    160|  dpf.setEnumerable = 1;
   82|    160|  dpf.setConfigurable = 1;
   83|    160|  dpf.setGetter = 1;
   84|    160|  dpf.setSetter = 1;
   85|    160|  dpf.enumerable = 0;
   86|    160|  dpf.configurable = 1;
   87|       |
   88|    160|  auto stackRes = JSObject::defineOwnProperty(
   89|    160|      errorPrototype,
   90|    160|      runtime,
   91|    160|      Predefined::getSymbolID(Predefined::stack),
   92|    160|      dpf,
   93|    160|      accessor);
   94|    160|  (void)stackRes;
   95|       |
   96|    160|  assert(*stackRes && "Failed to define stack accessor");
   97|       |
   98|    160|  auto cons = defineSystemConstructor<JSError>(
   99|    160|      runtime,
  100|    160|      Predefined::getSymbolID(Predefined::Error),
  101|    160|      ErrorConstructor,
  102|    160|      errorPrototype,
  103|    160|      1,
  104|    160|      CellKind::JSErrorKind);
  105|       |
  106|    160|  defineMethod(
  107|    160|      runtime,
  108|    160|      cons,
  109|    160|      Predefined::getSymbolID(Predefined::captureStackTrace),
  110|    160|      nullptr,
  111|    160|      errorCaptureStackTrace,
  112|    160|      2);
  113|       |
  114|    160|  return cons;
  115|    160|}
_ZN6hermes2vm31createAggregateErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm26createEvalErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm27createRangeErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm31createReferenceErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm28createSyntaxErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm26createTypeErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm25createURIErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm29createTimeoutErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }
_ZN6hermes2vm26createQuitErrorConstructorERNS0_7RuntimeE:
  120|    160|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
  121|    160|    auto errorPrototype =                                                   \
  122|    160|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
  123|    160|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
  124|    160|    defineProperty(                                                         \
  125|    160|        runtime,                                                            \
  126|    160|        errorPrototype,                                                     \
  127|    160|        Predefined::getSymbolID(Predefined::name),                          \
  128|    160|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
  129|    160|    defineProperty(                                                         \
  130|    160|        runtime,                                                            \
  131|    160|        errorPrototype,                                                     \
  132|    160|        Predefined::getSymbolID(Predefined::message),                       \
  133|    160|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
  134|    160|    return defineSystemConstructor(                                         \
  135|    160|        runtime,                                                            \
  136|    160|        Predefined::getSymbolID(Predefined::error_name),                    \
  137|    160|        error_name##Constructor,                                            \
  138|    160|        errorPrototype,                                                     \
  139|    160|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
  140|    160|        argCount,                                                           \
  141|    160|        NativeConstructor::creatorFunction<JSError>,                        \
  142|    160|        CellKind::JSErrorKind);                                             \
  143|    160|  }

_ZN6hermes2vm25createFunctionConstructorERNS0_7RuntimeE:
   28|    160|Handle<JSObject> createFunctionConstructor(Runtime &runtime) {
   29|    160|  auto functionPrototype = Handle<Callable>::vmcast(&runtime.functionPrototype);
   30|       |
   31|    160|  auto cons = defineSystemConstructor<JSFunction>(
   32|    160|      runtime,
   33|    160|      Predefined::getSymbolID(Predefined::Function),
   34|    160|      functionConstructor,
   35|    160|      functionPrototype,
   36|    160|      1,
   37|    160|      CellKind::JSFunctionKind);
   38|       |
   39|       |  // Function.prototype.xxx() methods.
   40|    160|  defineMethod(
   41|    160|      runtime,
   42|    160|      functionPrototype,
   43|    160|      Predefined::getSymbolID(Predefined::toString),
   44|    160|      nullptr,
   45|    160|      functionPrototypeToString,
   46|    160|      0);
   47|    160|  defineMethod(
   48|    160|      runtime,
   49|    160|      functionPrototype,
   50|    160|      Predefined::getSymbolID(Predefined::apply),
   51|    160|      nullptr,
   52|    160|      functionPrototypeApply,
   53|    160|      2);
   54|    160|  defineMethod(
   55|    160|      runtime,
   56|    160|      functionPrototype,
   57|    160|      Predefined::getSymbolID(Predefined::call),
   58|    160|      nullptr,
   59|    160|      functionPrototypeCall,
   60|    160|      1);
   61|    160|  defineMethod(
   62|    160|      runtime,
   63|    160|      functionPrototype,
   64|    160|      Predefined::getSymbolID(Predefined::bind),
   65|    160|      nullptr,
   66|    160|      functionPrototypeBind,
   67|    160|      1);
   68|       |
   69|    160|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   70|    160|  dpf.writable = 0;
   71|    160|  dpf.enumerable = 0;
   72|    160|  dpf.configurable = 0;
   73|    160|  (void)defineMethod(
   74|    160|      runtime,
   75|    160|      functionPrototype,
   76|    160|      Predefined::getSymbolID(Predefined::SymbolHasInstance),
   77|    160|      Predefined::getSymbolID(Predefined::squareSymbolHasInstance),
   78|    160|      nullptr,
   79|    160|      functionPrototypeSymbolHasInstance,
   80|    160|      1,
   81|    160|      dpf);
   82|       |
   83|    160|  return cons;
   84|    160|}
_ZN6hermes2vm19functionConstructorEPvRNS0_7RuntimeENS0_10NativeArgsE:
   87|     87|functionConstructor(void *, Runtime &runtime, NativeArgs args) {
   88|     87|  return createDynamicFunction(runtime, args, DynamicFunctionKind::Normal);
   89|     87|}
_ZN6hermes2vm25functionPrototypeToStringEPvRNS0_7RuntimeENS0_10NativeArgsE:
   92|     85|functionPrototypeToString(void *, Runtime &runtime, NativeArgs args) {
   93|     85|  GCScope gcScope{runtime};
   94|       |
   95|     85|  auto func = args.dyncastThis<Callable>();
   96|     85|  if (!func) {
  ------------------
  |  Branch (96:7): [True: 0, False: 85]
  ------------------
   97|      0|    return runtime.raiseTypeError(
   98|      0|        "Can't call Function.prototype.toString() on non-callable");
   99|      0|  }
  100|       |
  101|       |  /// Append the current function name to the \p strBuf.
  102|     85|  auto appendFunctionName = [&func, &runtime](SmallU16String<64> &strBuf) {
  103|       |    // Extract the name.
  104|     85|    auto propRes = JSObject::getNamed_RJS(
  105|     85|        func, runtime, Predefined::getSymbolID(Predefined::name));
  106|     85|    if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  107|     85|      return ExecutionStatus::EXCEPTION;
  108|     85|    }
  109|       |
  110|       |    // Convert the name to string, unless it is undefined.
  111|     85|    if (!(*propRes)->isUndefined()) {
  112|     85|      auto strRes =
  113|     85|          toString_RJS(runtime, runtime.makeHandle(std::move(*propRes)));
  114|     85|      if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  115|     85|        return ExecutionStatus::EXCEPTION;
  116|     85|      }
  117|     85|      strRes->get()->appendUTF16String(strBuf);
  118|     85|    }
  119|     85|    return ExecutionStatus::RETURNED;
  120|     85|  };
  121|       |
  122|       |  // Deal with JSFunctions that has a source String ID. That implies this
  123|       |  // function need a non-default toString implementation.
  124|     85|  if (auto jsFunc = dyn_vmcast<JSFunction>(*func)) {
  ------------------
  |  Branch (124:12): [True: 81, False: 4]
  ------------------
  125|     81|    if (auto sourceID = jsFunc->getCodeBlock(runtime)->getFunctionSourceID()) {
  ------------------
  |  Branch (125:14): [True: 0, False: 81]
  ------------------
  126|      0|      StringPrimitive *source =
  127|      0|          jsFunc->getCodeBlock(runtime)
  128|      0|              ->getRuntimeModule()
  129|      0|              ->getLazyRootModule()
  130|      0|              ->getStringPrimFromStringIDMayAllocate(*sourceID);
  131|       |      // Empty source marks implementation-hidden function, fabricate a source
  132|       |      // code string that imitate a NativeFunction.
  133|      0|      if (source->getStringLength() == 0) {
  ------------------
  |  Branch (133:11): [True: 0, False: 0]
  ------------------
  134|      0|        SmallU16String<64> strBuf{};
  135|      0|        strBuf.append("function ");
  136|      0|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  137|      0|                appendFunctionName(strBuf) == ExecutionStatus::EXCEPTION)) {
  138|      0|          return ExecutionStatus::EXCEPTION;
  139|      0|        }
  140|      0|        strBuf.append("() { [native code] }");
  141|      0|        return StringPrimitive::create(runtime, strBuf);
  142|      0|      } else {
  143|       |        // Otherwise, it's the preserved source code.
  144|      0|        return HermesValue::encodeStringValue(source);
  145|      0|      }
  146|     81|    };
  147|     81|  }
  148|       |
  149|     85|  SmallU16String<64> strBuf{};
  150|     85|  if (vmisa<JSAsyncFunction>(*func)) {
  ------------------
  |  Branch (150:7): [True: 0, False: 85]
  ------------------
  151|      0|    strBuf.append("async function ");
  152|     85|  } else if (vmisa<JSGeneratorFunction>(*func)) {
  ------------------
  |  Branch (152:14): [True: 0, False: 85]
  ------------------
  153|      0|    strBuf.append("function *");
  154|     85|  } else {
  155|     85|    strBuf.append("function ");
  156|     85|  }
  157|       |
  158|     85|  if (LLVM_UNLIKELY(appendFunctionName(strBuf) == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     85|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 85]
  |  |  ------------------
  ------------------
  159|      0|    return ExecutionStatus::EXCEPTION;
  160|      0|  }
  161|       |
  162|       |  // Formal parameters and the rest of the body.
  163|     85|  if (vmisa<NativeFunction>(*func)) {
  ------------------
  |  Branch (163:7): [True: 4, False: 81]
  ------------------
  164|       |    // Use [native code] here because we want to work with tools like Babel
  165|       |    // which detect the string "[native code]" and use it to alter behavior
  166|       |    // during the class transform.
  167|       |    // Also print without synthesized formal parameters to avoid breaking
  168|       |    // heuristics that detect the string "() { [native code] }".
  169|       |    // \see https://github.com/facebook/hermes/issues/471
  170|      4|    strBuf.append("() { [native code] }");
  171|     81|  } else {
  172|       |    // Append the synthesized formal parameters.
  173|     81|    strBuf.append('(');
  174|       |
  175|       |    // Extract ".length".
  176|     81|    auto lengthProp = Callable::extractOwnLengthProperty_RJS(func, runtime);
  177|     81|    if (lengthProp == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (177:9): [True: 0, False: 81]
  ------------------
  178|      0|      return ExecutionStatus::EXCEPTION;
  179|       |
  180|       |    // The value of the property is not guaranteed to be meaningful, so clamp it
  181|       |    // to [0..65535] for sanity.
  182|     81|    uint32_t paramCount =
  183|     81|        (uint32_t)std::min(65535.0, std::max(0.0, *lengthProp));
  184|       |
  185|     81|    for (uint32_t i = 0; i < paramCount; ++i) {
  ------------------
  |  Branch (185:26): [True: 0, False: 81]
  ------------------
  186|      0|      if (i != 0)
  ------------------
  |  Branch (186:11): [True: 0, False: 0]
  ------------------
  187|      0|        strBuf.append(", ");
  188|      0|      char buf[16];
  189|      0|      ::snprintf(buf, sizeof(buf), "a%u", i);
  190|      0|      strBuf.append(buf);
  191|      0|    }
  192|       |
  193|       |    // Avoid using the [native code] string to prevent extra wrapping overhead
  194|       |    // in, e.g., Babel's class extension mechanism.
  195|     81|    strBuf.append(") { [bytecode] }");
  196|     81|  }
  197|       |
  198|       |  // Finally allocate a StringPrimitive.
  199|     85|  return StringPrimitive::create(runtime, strBuf);
  200|     85|} // namespace vm
_ZN6hermes2vm21functionPrototypeBindEPvRNS0_7RuntimeENS0_10NativeArgsE:
  256|    160|functionPrototypeBind(void *, Runtime &runtime, NativeArgs args) {
  257|    160|  auto target = Handle<Callable>::dyn_vmcast(args.getThisHandle());
  258|    160|  if (!target) {
  ------------------
  |  Branch (258:7): [True: 0, False: 160]
  ------------------
  259|      0|    return runtime.raiseTypeError("Can't bind() a non-callable");
  260|      0|  }
  261|       |
  262|    160|  return BoundFunction::create(
  263|    160|      runtime, target, args.getArgCount(), args.begin());
  264|    160|}
Function.cpp:_ZZN6hermes2vm25functionPrototypeToStringEPvRNS0_7RuntimeENS0_10NativeArgsEENK3$_0clERNS0_12SmallXStringIDsLj64EEE:
  102|     85|  auto appendFunctionName = [&func, &runtime](SmallU16String<64> &strBuf) {
  103|       |    // Extract the name.
  104|     85|    auto propRes = JSObject::getNamed_RJS(
  105|     85|        func, runtime, Predefined::getSymbolID(Predefined::name));
  106|     85|    if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     85|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 85]
  |  |  ------------------
  ------------------
  107|      0|      return ExecutionStatus::EXCEPTION;
  108|      0|    }
  109|       |
  110|       |    // Convert the name to string, unless it is undefined.
  111|     85|    if (!(*propRes)->isUndefined()) {
  ------------------
  |  Branch (111:9): [True: 85, False: 0]
  ------------------
  112|     85|      auto strRes =
  113|     85|          toString_RJS(runtime, runtime.makeHandle(std::move(*propRes)));
  114|     85|      if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     85|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 85]
  |  |  ------------------
  ------------------
  115|      0|        return ExecutionStatus::EXCEPTION;
  116|      0|      }
  117|     85|      strRes->get()->appendUTF16String(strBuf);
  118|     85|    }
  119|     85|    return ExecutionStatus::RETURNED;
  120|     85|  };

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

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

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

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

_ZN6hermes2vm24hermesInternalHasPromiseEPvRNS0_7RuntimeENS0_10NativeArgsE:
  372|    320|hermesInternalHasPromise(void *, Runtime &runtime, NativeArgs args) {
  373|    320|  return HermesValue::encodeBoolValue(runtime.hasES6Promise());
  374|    320|}
_ZN6hermes2vm25hermesInternalHasES6ClassEPvRNS0_7RuntimeENS0_10NativeArgsE:
  377|    160|hermesInternalHasES6Class(void *, Runtime &runtime, NativeArgs args) {
  378|    160|  return HermesValue::encodeBoolValue(runtime.hasES6Class());
  379|    160|}
_ZN6hermes2vm28hermesInternalUseEngineQueueEPvRNS0_7RuntimeENS0_10NativeArgsE:
  382|    160|hermesInternalUseEngineQueue(void *, Runtime &runtime, NativeArgs args) {
  383|    160|  return HermesValue::encodeBoolValue(runtime.hasMicrotaskQueue());
  384|    160|}
_ZN6hermes2vm45hermesInternalSetPromiseRejectionTrackingHookEPvRNS0_7RuntimeENS0_10NativeArgsE:
  578|    160|    NativeArgs args) {
  579|    160|  runtime.promiseRejectionTrackingHook_ = args.getArg(0);
  580|    160|  return HermesValue::encodeUndefinedValue();
  581|    160|}
_ZN6hermes2vm26createHermesInternalObjectERNS0_7RuntimeERKNS0_10JSLibFlagsE:
  700|    160|    const JSLibFlags &flags) {
  701|    160|  namespace P = Predefined;
  702|    160|  Handle<JSObject> intern = runtime.makeHandle(JSObject::create(runtime));
  703|    160|  GCScope gcScope{runtime};
  704|       |
  705|    160|  DefinePropertyFlags constantDPF =
  706|    160|      DefinePropertyFlags::getDefaultNewPropertyFlags();
  707|    160|  constantDPF.enumerable = 0;
  708|    160|  constantDPF.writable = 0;
  709|    160|  constantDPF.configurable = 0;
  710|       |
  711|    160|  auto defineInternMethod =
  712|    160|      [&](Predefined::Str symID, NativeFunctionPtr func, uint8_t count = 0) {
  713|    160|        (void)defineMethod(
  714|    160|            runtime,
  715|    160|            intern,
  716|    160|            Predefined::getSymbolID(symID),
  717|    160|            nullptr /* context */,
  718|    160|            func,
  719|    160|            count,
  720|    160|            constantDPF);
  721|    160|      };
  722|       |
  723|    160|  auto defineInternMethodAndSymbol =
  724|    160|      [&](const char *name, NativeFunctionPtr func, uint8_t count = 0) {
  725|    160|        ASCIIRef ref = createASCIIRef(name);
  726|    160|        Handle<SymbolID> symHandle = runtime.ignoreAllocationFailure(
  727|    160|            runtime.getIdentifierTable().getSymbolHandle(runtime, ref));
  728|    160|        (void)defineMethod(
  729|    160|            runtime,
  730|    160|            intern,
  731|    160|            *symHandle,
  732|    160|            nullptr /* context */,
  733|    160|            func,
  734|    160|            count,
  735|    160|            constantDPF);
  736|    160|      };
  737|       |
  738|       |  // suppress unused-variable warning
  739|    160|  (void)defineInternMethodAndSymbol;
  740|       |
  741|       |  // Make a copy of the original String.prototype.concat implementation that we
  742|       |  // can use internally.
  743|       |  // TODO: we can't make HermesInternal.concat a static builtin method now
  744|       |  // because this method should be called with a meaningful `this`, but
  745|       |  // CallBuiltin instruction does not support it.
  746|    160|  auto propRes = JSObject::getNamed_RJS(
  747|    160|      runtime.makeHandle<JSObject>(runtime.stringPrototype),
  748|    160|      runtime,
  749|    160|      Predefined::getSymbolID(Predefined::concat));
  750|    160|  assert(
  751|    160|      propRes != ExecutionStatus::EXCEPTION && !(*propRes)->isUndefined() &&
  752|    160|      "Failed to get String.prototype.concat.");
  753|    160|  auto putRes = JSObject::defineOwnProperty(
  754|    160|      intern,
  755|    160|      runtime,
  756|    160|      Predefined::getSymbolID(Predefined::concat),
  757|    160|      constantDPF,
  758|    160|      runtime.makeHandle(std::move(*propRes)));
  759|    160|  assert(
  760|    160|      putRes != ExecutionStatus::EXCEPTION && *putRes &&
  761|    160|      "Failed to set HermesInternal.concat.");
  762|    160|  (void)putRes;
  763|       |
  764|       |  // HermesInternal functions that are known to be safe and are required to be
  765|       |  // present by the VM internals even under a security-sensitive environment
  766|       |  // where HermesInternal might be explicitly disabled.
  767|    160|  defineInternMethod(P::hasPromise, hermesInternalHasPromise);
  768|    160|  defineInternMethod(P::hasES6Class, hermesInternalHasES6Class);
  769|    160|  defineInternMethod(P::enqueueJob, hermesInternalEnqueueJob);
  770|    160|  defineInternMethod(
  771|    160|      P::setPromiseRejectionTrackingHook,
  772|    160|      hermesInternalSetPromiseRejectionTrackingHook);
  773|    160|  defineInternMethod(
  774|    160|      P::enablePromiseRejectionTracker,
  775|    160|      hermesInternalEnablePromiseRejectionTracker);
  776|    160|  defineInternMethod(P::useEngineQueue, hermesInternalUseEngineQueue);
  777|       |
  778|       |#ifdef HERMES_ENABLE_FUZZILLI
  779|       |  defineInternMethod(P::fuzzilli, hermesInternalFuzzilli);
  780|       |#endif
  781|       |
  782|       |  // All functions are known to be safe can be defined above this flag check.
  783|    160|  if (!flags.enableHermesInternal) {
  ------------------
  |  Branch (783:7): [True: 0, False: 160]
  ------------------
  784|      0|    JSObject::preventExtensions(*intern);
  785|      0|    return intern;
  786|      0|  }
  787|       |
  788|       |  // HermesInternal functions that are not necessarily required but are
  789|       |  // generally considered harmless to be exposed by default.
  790|    160|  defineInternMethod(P::getEpilogues, hermesInternalGetEpilogues);
  791|    160|  defineInternMethod(
  792|    160|      P::getRuntimeProperties, hermesInternalGetRuntimeProperties);
  793|    160|  defineInternMethod(P::ttiReached, hermesInternalTTIReached);
  794|    160|  defineInternMethod(P::ttrcReached, hermesInternalTTRCReached);
  795|    160|  defineInternMethod(P::getFunctionLocation, hermesInternalGetFunctionLocation);
  796|       |
  797|    160|  if (LLVM_UNLIKELY(runtime.traceMode != SynthTraceMode::None)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  798|       |    // Use getNewNonEnumerableFlags() so that getInstrumentedStats can be
  799|       |    // overridden for synth trace case. See TracingRuntime.cpp.
  800|      0|    (void)defineMethod(
  801|      0|        runtime,
  802|      0|        intern,
  803|      0|        Predefined::getSymbolID(P::getInstrumentedStats),
  804|      0|        nullptr /* context */,
  805|      0|        hermesInternalGetInstrumentedStats,
  806|      0|        0,
  807|      0|        DefinePropertyFlags::getNewNonEnumerableFlags());
  808|    160|  } else {
  809|    160|    defineInternMethod(
  810|    160|        P::getInstrumentedStats, hermesInternalGetInstrumentedStats);
  811|    160|  }
  812|       |
  813|       |  // HermesInternal function that are only meant to be used for testing purpose.
  814|       |  // They can change language semantics and are security risks.
  815|    160|  if (flags.enableHermesInternalTestMethods) {
  ------------------
  |  Branch (815:7): [True: 0, False: 160]
  ------------------
  816|      0|    defineInternMethod(
  817|      0|        P::detachArrayBuffer, hermesInternalDetachArrayBuffer, 1);
  818|      0|    defineInternMethod(P::getWeakSize, hermesInternalGetWeakSize);
  819|      0|    defineInternMethod(
  820|      0|        P::copyDataProperties, hermesBuiltinCopyDataProperties, 3);
  821|      0|    defineInternMethodAndSymbol("isProxy", hermesInternalIsProxy);
  822|      0|    defineInternMethodAndSymbol("isLazy", hermesInternalIsLazy);
  823|      0|    defineInternMethod(P::drainJobs, hermesInternalDrainJobs);
  824|      0|  }
  825|       |
  826|       |#ifdef HERMESVM_EXCEPTION_ON_OOM
  827|       |  defineInternMethodAndSymbol("getCallStack", hermesInternalGetCallStack, 0);
  828|       |#endif // HERMESVM_EXCEPTION_ON_OOM
  829|       |
  830|    160|  JSObject::preventExtensions(*intern);
  831|       |
  832|    160|  return intern;
  833|    160|}
HermesInternal.cpp:_ZZN6hermes2vm26createHermesInternalObjectERNS0_7RuntimeERKNS0_10JSLibFlagsEENK3$_0clENS0_10Predefined3StrEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEEh:
  712|  1.92k|      [&](Predefined::Str symID, NativeFunctionPtr func, uint8_t count = 0) {
  713|  1.92k|        (void)defineMethod(
  714|  1.92k|            runtime,
  715|  1.92k|            intern,
  716|  1.92k|            Predefined::getSymbolID(symID),
  717|  1.92k|            nullptr /* context */,
  718|  1.92k|            func,
  719|  1.92k|            count,
  720|  1.92k|            constantDPF);
  721|  1.92k|      };

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

_ZN6hermes2vm23defineSystemConstructorERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEENS0_6HandleINS0_8JSObjectEEESF_jPFNS4_INS0_12PseudoHandleISE_EELS7_6EEES2_SF_S9_ENS0_8CellKindE:
   34|  6.24k|    CellKind targetKind) {
   35|  6.24k|  auto constructor = runtime.makeHandle(NativeConstructor::create(
   36|  6.24k|      runtime,
   37|  6.24k|      constructorProtoObjectHandle,
   38|  6.24k|      nullptr,
   39|  6.24k|      nativeFunctionPtr,
   40|  6.24k|      paramCount,
   41|  6.24k|      creator,
   42|  6.24k|      targetKind));
   43|       |
   44|  6.24k|  auto st = Callable::defineNameLengthAndPrototype(
   45|  6.24k|      constructor,
   46|  6.24k|      runtime,
   47|  6.24k|      name,
   48|  6.24k|      paramCount,
   49|  6.24k|      prototypeObjectHandle,
   50|  6.24k|      Callable::WritablePrototype::No,
   51|  6.24k|      false);
   52|  6.24k|  (void)st;
   53|  6.24k|  assert(
   54|  6.24k|      st != ExecutionStatus::EXCEPTION && "defineLengthAndPrototype() failed");
   55|       |
   56|       |  // Define the global.
   57|  6.24k|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
   58|       |
   59|  6.24k|  auto res = JSObject::defineOwnProperty(
   60|  6.24k|      runtime.getGlobal(), runtime, name, dpf, constructor);
   61|  6.24k|  assert(
   62|  6.24k|      res != ExecutionStatus::EXCEPTION && *res &&
   63|  6.24k|      "defineOwnProperty() failed");
   64|  6.24k|  (void)res;
   65|       |
   66|  6.24k|  return constructor;
   67|  6.24k|}
_ZN6hermes2vm12defineMethodERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDES6_PvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEEjNS0_19DefinePropertyFlagsE:
   77|  57.6k|    DefinePropertyFlags dpf) {
   78|  57.6k|  GCScope gcScope{runtime};
   79|       |
   80|  57.6k|  auto method = NativeFunction::create(
   81|  57.6k|      runtime,
   82|  57.6k|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
   83|  57.6k|      context,
   84|  57.6k|      nativeFunctionPtr,
   85|  57.6k|      methodName,
   86|  57.6k|      paramCount,
   87|  57.6k|      Runtime::makeNullHandle<JSObject>());
   88|       |
   89|  57.6k|  auto res = JSObject::defineOwnProperty(
   90|  57.6k|      objectHandle, runtime, propertyName, dpf, method);
   91|  57.6k|  (void)res;
   92|  57.6k|  assert(
   93|  57.6k|      res != ExecutionStatus::EXCEPTION && *res &&
   94|  57.6k|      "defineOwnProperty() failed");
   95|       |
   96|  57.6k|  return method.getHermesValue();
   97|  57.6k|}
_ZN6hermes2vm23defineSystemConstructorERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEENS0_6HandleINS0_8JSObjectEEEjPFNS4_INS0_12PseudoHandleISE_EELS7_6EEES2_SF_S9_ENS0_8CellKindE:
  106|  3.04k|    CellKind targetKind) {
  107|  3.04k|  return defineSystemConstructor(
  108|  3.04k|      runtime,
  109|  3.04k|      name,
  110|  3.04k|      nativeFunctionPtr,
  111|  3.04k|      prototypeObjectHandle,
  112|  3.04k|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
  113|  3.04k|      paramCount,
  114|  3.04k|      creator,
  115|  3.04k|      targetKind);
  116|  3.04k|}
_ZN6hermes2vm12defineMethodERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEEj:
  124|  53.9k|    unsigned paramCount) {
  125|  53.9k|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  126|  53.9k|  (void)defineMethod(
  127|  53.9k|      runtime, objectHandle, name, context, nativeFunctionPtr, paramCount, dpf);
  128|  53.9k|}
_ZN6hermes2vm14defineAccessorERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDES6_PvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEESF_bb:
  139|  7.04k|    bool configurable) {
  140|  7.04k|  assert(
  141|  7.04k|      (getterFunc || setterFunc) &&
  142|  7.04k|      "at least a getter or a setter must be specified");
  143|  7.04k|  ExecutionStatus status{};
  144|  7.04k|  (void)status;
  145|       |
  146|  7.04k|  GCScope gcScope{runtime};
  147|       |
  148|  7.04k|  StringView nameView =
  149|  7.04k|      runtime.getIdentifierTable().getStringView(runtime, methodName);
  150|  7.04k|  assert(nameView.isASCII() && "Only ASCII accessors are supported");
  151|       |
  152|  7.04k|  MutableHandle<NativeFunction> getter{runtime};
  153|  7.04k|  if (getterFunc) {
  ------------------
  |  Branch (153:7): [True: 7.04k, False: 0]
  ------------------
  154|       |    // Set the name by prepending "get ".
  155|  7.04k|    llvh::SmallString<32> getterName{"get "};
  156|  7.04k|    llvh::raw_svector_ostream os{getterName};
  157|  7.04k|    os << nameView;
  158|       |
  159|  7.04k|    auto strRes = runtime.ignoreAllocationFailure(
  160|  7.04k|        StringPrimitive::create(runtime, getterName));
  161|  7.04k|    SymbolID getterFuncName =
  162|  7.04k|        runtime
  163|  7.04k|            .ignoreAllocationFailure(
  164|  7.04k|                runtime.getIdentifierTable().getSymbolHandleFromPrimitive(
  165|  7.04k|                    runtime,
  166|  7.04k|                    createPseudoHandle(vmcast<StringPrimitive>(strRes))))
  167|  7.04k|            .get();
  168|       |
  169|  7.04k|    auto funcRes = NativeFunction::create(
  170|  7.04k|        runtime,
  171|  7.04k|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  172|  7.04k|        context,
  173|  7.04k|        getterFunc,
  174|  7.04k|        getterFuncName,
  175|  7.04k|        0,
  176|  7.04k|        Runtime::makeNullHandle<JSObject>());
  177|  7.04k|    getter = funcRes.get();
  178|  7.04k|  }
  179|       |
  180|  7.04k|  MutableHandle<NativeFunction> setter{runtime};
  181|  7.04k|  if (setterFunc) {
  ------------------
  |  Branch (181:7): [True: 160, False: 6.88k]
  ------------------
  182|       |    // Set the name by prepending "set ".
  183|    160|    llvh::SmallString<32> setterName{"set "};
  184|    160|    llvh::raw_svector_ostream os{setterName};
  185|    160|    os << nameView;
  186|       |
  187|    160|    auto strRes = runtime.ignoreAllocationFailure(
  188|    160|        StringPrimitive::create(runtime, setterName));
  189|    160|    SymbolID setterFuncName =
  190|    160|        runtime
  191|    160|            .ignoreAllocationFailure(
  192|    160|                runtime.getIdentifierTable().getSymbolHandleFromPrimitive(
  193|    160|                    runtime,
  194|    160|                    createPseudoHandle(vmcast<StringPrimitive>(strRes))))
  195|    160|            .get();
  196|       |
  197|    160|    auto funcRes = NativeFunction::create(
  198|    160|        runtime,
  199|    160|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  200|    160|        context,
  201|    160|        setterFunc,
  202|    160|        setterFuncName,
  203|    160|        1,
  204|    160|        Runtime::makeNullHandle<JSObject>());
  205|    160|    setter = funcRes.get();
  206|    160|  }
  207|       |
  208|  7.04k|  auto accessor = runtime.makeHandle<PropertyAccessor>(
  209|  7.04k|      PropertyAccessor::create(runtime, getter, setter));
  210|       |
  211|  7.04k|  DefinePropertyFlags dpf{};
  212|  7.04k|  dpf.setEnumerable = 1;
  213|  7.04k|  dpf.setConfigurable = 1;
  214|  7.04k|  dpf.setGetter = 1;
  215|  7.04k|  dpf.setSetter = 1;
  216|  7.04k|  dpf.enumerable = enumerable;
  217|  7.04k|  dpf.configurable = configurable;
  218|       |
  219|  7.04k|  auto res = JSObject::defineOwnProperty(
  220|  7.04k|      objectHandle, runtime, propertyName, dpf, accessor);
  221|  7.04k|  (void)res;
  222|  7.04k|  assert(
  223|  7.04k|      res != ExecutionStatus::EXCEPTION && *res &&
  224|  7.04k|      "defineOwnProperty() failed");
  225|  7.04k|}
_ZN6hermes2vm14definePropertyERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDENS3_INS0_11HermesValueEEENS0_19DefinePropertyFlagsE:
  232|  13.6k|    DefinePropertyFlags dpf) {
  233|  13.6k|  auto res = JSObject::defineOwnProperty(
  234|  13.6k|      objectHandle, runtime, name, dpf, value, PropOpFlags());
  235|  13.6k|  (void)res;
  236|  13.6k|  assert(
  237|  13.6k|      res != ExecutionStatus::EXCEPTION && *res &&
  238|  13.6k|      "defineOwnProperty() failed");
  239|  13.6k|}
_ZN6hermes2vm14definePropertyERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDENS3_INS0_11HermesValueEEE:
  245|  4.48k|    Handle<> value) {
  246|  4.48k|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  247|       |
  248|  4.48k|  return defineProperty(runtime, objectHandle, name, value, dpf);
  249|  4.48k|}
_ZN6hermes2vm21createDynamicFunctionERNS0_7RuntimeENS0_10NativeArgsENS0_19DynamicFunctionKindE:
  312|     87|    DynamicFunctionKind kind) {
  313|     87|  GCScope gcScope(runtime);
  314|       |
  315|       |  // Number of arguments supplied to Function().
  316|     87|  uint32_t argCount = args.getArgCount();
  317|       |
  318|       |  // Number of parameters in the resultant function.
  319|     87|  uint32_t paramCount = argCount > 0 ? argCount - 1 : 0;
  ------------------
  |  Branch (319:25): [True: 87, False: 0]
  ------------------
  320|       |
  321|       |  // List of the parameter strings for the resultant function..
  322|     87|  auto arrRes = JSArray::create(runtime, paramCount, paramCount);
  323|     87|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     87|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 87]
  |  |  ------------------
  ------------------
  324|      0|    return ExecutionStatus::EXCEPTION;
  325|      0|  }
  326|     87|  auto params = *arrRes;
  327|       |
  328|       |  // Body of the resultant function.
  329|     87|  MutableHandle<StringPrimitive> body{runtime};
  330|       |
  331|       |  // String length of the function in its entirety.
  332|       |  // Account for commas in the argument list initially.
  333|       |  // If at least two arguments to the function (3 in total), there's a comma.
  334|     87|  SafeUInt32 size{paramCount > 0 ? paramCount - 1 : 0};
  ------------------
  |  Branch (334:19): [True: 1, False: 86]
  ------------------
  335|       |
  336|       |  // es2020 19.2.1.1.1 Runtime Semantics: CreateDynamicFunction: If
  337|       |  // NewTarget is given, such as with Reflect.construct, use
  338|       |  // NewParent.prototype as the parent.  The prototype on NewParent
  339|       |  // has already been looked up to use as the parent of 'this', so
  340|       |  // instead of looking it up again, just use this's parent.  If
  341|       |  // NewTarget isn't given, fall back to a default.
  342|     87|  MutableHandle<JSObject> fallbackProto{runtime};
  343|     87|  switch (kind) {
  344|     87|    case DynamicFunctionKind::Normal:
  ------------------
  |  Branch (344:5): [True: 87, False: 0]
  ------------------
  345|     87|      fallbackProto = Handle<JSObject>::vmcast(&runtime.functionPrototype);
  346|     87|      break;
  347|      0|    case DynamicFunctionKind::Generator:
  ------------------
  |  Branch (347:5): [True: 0, False: 87]
  ------------------
  348|      0|      fallbackProto =
  349|      0|          Handle<JSObject>::vmcast(&runtime.generatorFunctionPrototype);
  350|      0|      break;
  351|      0|    case DynamicFunctionKind::Async:
  ------------------
  |  Branch (351:5): [True: 0, False: 87]
  ------------------
  352|      0|      fallbackProto = Handle<JSObject>::vmcast(&runtime.asyncFunctionPrototype);
  353|      0|      break;
  354|      0|    default:
  ------------------
  |  Branch (354:5): [True: 0, False: 87]
  ------------------
  355|      0|      llvm_unreachable("unknown kind for CreateDynamicFunction.");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  356|     87|  }
  357|       |
  358|     87|  Handle<JSObject> parent = !args.getNewTarget().isUndefined()
  ------------------
  |  Branch (358:29): [True: 0, False: 87]
  ------------------
  359|     87|      ? runtime.makeHandle(
  360|      0|            vmcast<JSObject>(args.getThisArg())->getParent(runtime))
  361|     87|      : fallbackProto;
  362|       |
  363|     87|  if (argCount == 0) {
  ------------------
  |  Branch (363:7): [True: 0, False: 87]
  ------------------
  364|       |    // No arguments, just set body to be the empty string.
  365|      0|    body = runtime.getPredefinedString(Predefined::emptyString);
  366|     87|  } else {
  367|       |    // If there's arguments, store the parameters and the provided body.
  368|     87|    auto marker = gcScope.createMarker();
  369|  13.3k|    for (uint32_t i = 0; i < paramCount; ++i) {
  ------------------
  |  Branch (369:26): [True: 13.2k, False: 87]
  ------------------
  370|  13.2k|      gcScope.flushToMarker(marker);
  371|  13.2k|      auto strRes = toString_RJS(runtime, args.getArgHandle(i));
  372|  13.2k|      if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  13.2k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 13.2k]
  |  |  ------------------
  ------------------
  373|      0|        return ExecutionStatus::EXCEPTION;
  374|      0|      }
  375|  13.2k|      auto param = runtime.makeHandle(std::move(*strRes));
  376|  13.2k|      JSArray::setElementAt(params, runtime, i, param);
  377|  13.2k|      size.add(param->getStringLength());
  378|  13.2k|    }
  379|       |
  380|       |    // Last parameter is the body.
  381|     87|    auto strRes = toString_RJS(runtime, args.getArgHandle(paramCount));
  382|     87|    if (strRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (382:9): [True: 0, False: 87]
  ------------------
  383|      0|      return ExecutionStatus::EXCEPTION;
  384|      0|    }
  385|     87|    body = strRes->get();
  386|     87|    size.add(body->getStringLength());
  387|       |
  388|     87|    if (kind == DynamicFunctionKind::Normal && argCount == 1 &&
  ------------------
  |  Branch (388:9): [True: 87, False: 0]
  |  Branch (388:9): [True: 0, False: 87]
  |  Branch (388:48): [True: 86, False: 1]
  ------------------
  389|     87|        isReturnThis(body, runtime)) {
  ------------------
  |  Branch (389:9): [True: 0, False: 86]
  ------------------
  390|       |      // If this raises an exception, we still return immediately.
  391|      0|      return JSFunction::create(
  392|      0|                 runtime,
  393|      0|                 runtime.makeHandle(Domain::create(runtime)),
  394|      0|                 parent,
  395|      0|                 Handle<Environment>(runtime, nullptr),
  396|      0|                 runtime.getReturnThisCodeBlock())
  397|      0|          .getHermesValue();
  398|      0|    }
  399|     87|  }
  400|       |
  401|       |  // Constant parts of the function.
  402|     87|  ASCIIRef functionHeader;
  403|     87|  switch (kind) {
  404|     87|    case DynamicFunctionKind::Normal:
  ------------------
  |  Branch (404:5): [True: 87, False: 0]
  ------------------
  405|     87|      functionHeader = createASCIIRef("(function (");
  406|     87|      break;
  407|      0|    case DynamicFunctionKind::Generator:
  ------------------
  |  Branch (407:5): [True: 0, False: 87]
  ------------------
  408|      0|      functionHeader = createASCIIRef("(function*(");
  409|      0|      break;
  410|      0|    case DynamicFunctionKind::Async:
  ------------------
  |  Branch (410:5): [True: 0, False: 87]
  ------------------
  411|      0|      functionHeader = createASCIIRef("(async function (");
  412|      0|      break;
  413|      0|    default:
  ------------------
  |  Branch (413:5): [True: 0, False: 87]
  ------------------
  414|      0|      llvm_unreachable("unknown kind for CreateDynamicFunction.");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  415|     87|  };
  416|     87|  size.add(functionHeader.size());
  417|       |
  418|     87|  auto bodyHeader = createASCIIRef("){");
  419|     87|  size.add(bodyHeader.size());
  420|       |
  421|       |  // Note: add a \n before the closing '}' in case the
  422|       |  // function body ends with a line comment.
  423|     87|  auto functionFooter = createASCIIRef("\n})");
  424|     87|  size.add(functionFooter.size());
  425|       |
  426|     87|  auto separator = createASCIIRef(",");
  427|       |
  428|     87|  auto builder = StringBuilder::createStringBuilder(runtime, size);
  429|     87|  if (builder == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (429:7): [True: 0, False: 87]
  ------------------
  430|      0|    return ExecutionStatus::EXCEPTION;
  431|      0|  }
  432|     87|  builder->appendASCIIRef(functionHeader);
  433|     87|  MutableHandle<StringPrimitive> element{runtime};
  434|  13.3k|  for (uint32_t i = 0; i < paramCount; ++i) {
  ------------------
  |  Branch (434:24): [True: 13.2k, False: 87]
  ------------------
  435|       |    // Copy params into str.
  436|  13.2k|    element = params->at(runtime, i).getString(runtime);
  437|  13.2k|    builder->appendStringPrim(element);
  438|  13.2k|    if (i < paramCount - 1) {
  ------------------
  |  Branch (438:9): [True: 13.2k, False: 1]
  ------------------
  439|       |      // If there's more params left to put, need to add a comma.
  440|       |      // We wouldn't have entered the loop if paramCount == 0,
  441|       |      // so there's no overflow here.
  442|  13.2k|      builder->appendASCIIRef(separator);
  443|  13.2k|    }
  444|  13.2k|  }
  445|     87|  builder->appendASCIIRef(bodyHeader);
  446|     87|  builder->appendStringPrim(body);
  447|     87|  builder->appendASCIIRef(functionFooter);
  448|       |
  449|     87|  auto evalRes =
  450|     87|      directEval(runtime, builder->getStringPrimitive(), {}, false, true);
  451|     87|  if (evalRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (451:7): [True: 5, False: 82]
  ------------------
  452|      5|    return ExecutionStatus::EXCEPTION;
  453|      5|  }
  454|       |
  455|     82|  Handle<JSFunction> function =
  456|     82|      runtime.makeHandle(vmcast<JSFunction>(evalRes.getValue()));
  457|       |
  458|     82|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  459|     82|  dpf.enumerable = 0;
  460|     82|  dpf.writable = 0;
  461|       |
  462|       |  // Define the `name` correctly.
  463|     82|  if (JSObject::defineOwnProperty(
  ------------------
  |  Branch (463:7): [True: 0, False: 82]
  ------------------
  464|     82|          function,
  465|     82|          runtime,
  466|     82|          Predefined::getSymbolID(Predefined::name),
  467|     82|          dpf,
  468|     82|          runtime.makeHandle(runtime.getStringPrimFromSymbolID(
  469|     82|              Predefined::getSymbolID(Predefined::anonymous)))) ==
  470|     82|      ExecutionStatus::EXCEPTION) {
  471|      0|    return ExecutionStatus::EXCEPTION;
  472|      0|  }
  473|       |
  474|       |  // Set the parent.  This could be done by threading the argument
  475|       |  // through to Runtime::runBytecode where the object is actually
  476|       |  // created, but this is the only place we need to do this so it
  477|       |  // keeps the code simpler.
  478|     82|  CallResult<bool> parentRes = JSObject::setParent(*function, runtime, *parent);
  479|     82|  if (LLVM_UNLIKELY(parentRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     82|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 82]
  |  |  ------------------
  ------------------
  480|      0|    return ExecutionStatus::EXCEPTION;
  481|      0|  }
  482|     82|  assert(
  483|     82|      *parentRes && "Setting prototype on new dynamic function returned false");
  484|       |
  485|     82|  return function.getHermesValue();
  486|     82|}
JSLibInternal.cpp:_ZN6hermes2vmL12isReturnThisENS0_6HandleINS0_15StringPrimitiveEEERNS0_7RuntimeE:
  273|     86|static bool isReturnThis(Handle<StringPrimitive> str, Runtime &runtime) {
  274|       |  // Fast check for minimal version.
  275|     86|  {
  276|     86|    auto minimal = runtime.getPredefinedString(Predefined::returnThis);
  277|     86|    if (str->equals(minimal)) {
  ------------------
  |  Branch (277:9): [True: 0, False: 86]
  ------------------
  278|      0|      return true;
  279|      0|    }
  280|     86|  }
  281|       |  // Regex match for variants.
  282|     86|  auto input = StringPrimitive::createStringView(runtime, str);
  283|     86|  static auto bytecode = getReturnThisRegexBytecode();
  284|     86|  auto result = regex::MatchRuntimeResult::NoMatch;
  285|     86|  if (input.isASCII()) {
  ------------------
  |  Branch (285:7): [True: 0, False: 86]
  ------------------
  286|      0|    const char *begin = input.castToCharPtr();
  287|      0|    result = regex::searchWithBytecode(
  288|      0|        bytecode,
  289|      0|        begin,
  290|      0|        0,
  291|      0|        input.length(),
  292|      0|        nullptr,
  293|      0|        regex::constants::matchDefault | regex::constants::matchInputAllAscii,
  294|      0|        runtime.getOverflowGuardForRegex());
  295|     86|  } else {
  296|     86|    const char16_t *begin = input.castToChar16Ptr();
  297|     86|    result = regex::searchWithBytecode(
  298|     86|        bytecode,
  299|     86|        begin,
  300|     86|        0,
  301|     86|        input.length(),
  302|     86|        nullptr,
  303|     86|        regex::constants::matchDefault,
  304|     86|        runtime.getOverflowGuardForRegex());
  305|     86|  }
  306|     86|  return result == regex::MatchRuntimeResult::Match;
  307|     86|}
JSLibInternal.cpp:_ZN6hermes2vmL26getReturnThisRegexBytecodeEv:
  268|      1|static std::vector<uint8_t> getReturnThisRegexBytecode() {
  269|      1|  const char16_t *returnThisRE = uR"X(^\s*return[ \t]+this\s*;?\s*$)X";
  270|      1|  return regex::Regex<regex::UTF16RegexTraits>(returnThisRE).compile();
  271|      1|}

_ZN6hermes2vm12defineMethodERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEEjNS0_19DefinePropertyFlagsE:
  121|  56.1k|    DefinePropertyFlags dpf) {
  122|  56.1k|  return defineMethod(
  123|  56.1k|      runtime,
  124|  56.1k|      objectHandle,
  125|  56.1k|      name,
  126|  56.1k|      name,
  127|  56.1k|      context,
  128|  56.1k|      nativeFunctionPtr,
  129|  56.1k|      paramCount,
  130|  56.1k|      dpf);
  131|  56.1k|}
_ZN6hermes2vm14defineAccessorERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEESF_bb:
  179|  6.88k|    bool configurable) {
  180|  6.88k|  defineAccessor(
  181|  6.88k|      runtime,
  182|  6.88k|      objectHandle,
  183|  6.88k|      name,
  184|  6.88k|      name,
  185|  6.88k|      context,
  186|  6.88k|      getterFunc,
  187|  6.88k|      setterFunc,
  188|  6.88k|      enumerable,
  189|  6.88k|      configurable);
  190|  6.88k|}
_ZN6hermes2vm23defineSystemConstructorINS0_7JSArrayEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_13JSArrayBufferEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSBigIntEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_10JSDataViewEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_7JSErrorEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_9JSMapImplILNS0_8CellKindE48EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSObjectEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_IS2_EEjNS0_8CellKindE:
   70|    320|    CellKind targetKind) {
   71|    320|  return defineSystemConstructor(
   72|    320|      runtime,
   73|    320|      name,
   74|    320|      nativeFunctionPtr,
   75|    320|      prototypeObjectHandle,
   76|    320|      paramCount,
   77|    320|      NativeConstructor::creatorFunction<NativeClass>,
   78|    320|      targetKind);
   79|    320|}
_ZN6hermes2vm23defineSystemConstructorINS0_7JSProxyEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_9JSMapImplILNS0_8CellKindE47EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSStringEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_10JSFunctionEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSNumberEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_9JSBooleanEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSRegExpEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSSymbolEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_6JSDateEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_13JSWeakMapImplILNS0_8CellKindE51EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}
_ZN6hermes2vm23defineSystemConstructorINS0_13JSWeakMapImplILNS0_8CellKindE52EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|    160|    CellKind targetKind) {
   71|    160|  return defineSystemConstructor(
   72|    160|      runtime,
   73|    160|      name,
   74|    160|      nativeFunctionPtr,
   75|    160|      prototypeObjectHandle,
   76|    160|      paramCount,
   77|    160|      NativeConstructor::creatorFunction<NativeClass>,
   78|    160|      targetKind);
   79|    160|}

_ZN6hermes2vm18createJSLibStorageEv:
   17|    160|std::unique_ptr<JSLibStorage> createJSLibStorage() {
   18|    160|  return std::make_unique<JSLibStorage>();
   19|    160|}
_ZN6hermes2vm12JSLibStorageC2Ev:
   21|    160|JSLibStorage::JSLibStorage() = default;
_ZN6hermes2vm12JSLibStorageD2Ev:
   22|    160|JSLibStorage::~JSLibStorage() = default;

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

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

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

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

_ZN6hermes2vm23createObjectConstructorERNS0_7RuntimeE:
   27|    160|Handle<JSObject> createObjectConstructor(Runtime &runtime) {
   28|    160|  auto objectPrototype = Handle<JSObject>::vmcast(&runtime.objectPrototype);
   29|       |
   30|    160|  auto cons = defineSystemConstructor<JSObject>(
   31|    160|      runtime,
   32|    160|      Predefined::getSymbolID(Predefined::Object),
   33|    160|      objectConstructor,
   34|    160|      Handle<JSObject>::vmcast(&runtime.objectPrototype),
   35|    160|      1,
   36|    160|      CellKind::JSObjectKind);
   37|    160|  void *ctx = nullptr;
   38|       |
   39|       |  // Object.prototype.xxx methods.
   40|    160|  defineMethod(
   41|    160|      runtime,
   42|    160|      objectPrototype,
   43|    160|      Predefined::getSymbolID(Predefined::toString),
   44|    160|      ctx,
   45|    160|      objectPrototypeToString,
   46|    160|      0);
   47|    160|  defineMethod(
   48|    160|      runtime,
   49|    160|      objectPrototype,
   50|    160|      Predefined::getSymbolID(Predefined::toLocaleString),
   51|    160|      ctx,
   52|    160|      objectPrototypeToLocaleString,
   53|    160|      0);
   54|    160|  defineMethod(
   55|    160|      runtime,
   56|    160|      objectPrototype,
   57|    160|      Predefined::getSymbolID(Predefined::valueOf),
   58|    160|      ctx,
   59|    160|      objectPrototypeValueOf,
   60|    160|      0);
   61|    160|  defineMethod(
   62|    160|      runtime,
   63|    160|      objectPrototype,
   64|    160|      Predefined::getSymbolID(Predefined::hasOwnProperty),
   65|    160|      ctx,
   66|    160|      objectPrototypeHasOwnProperty,
   67|    160|      1);
   68|    160|  defineMethod(
   69|    160|      runtime,
   70|    160|      objectPrototype,
   71|    160|      Predefined::getSymbolID(Predefined::isPrototypeOf),
   72|    160|      ctx,
   73|    160|      objectPrototypeIsPrototypeOf,
   74|    160|      1);
   75|    160|  defineMethod(
   76|    160|      runtime,
   77|    160|      objectPrototype,
   78|    160|      Predefined::getSymbolID(Predefined::propertyIsEnumerable),
   79|    160|      ctx,
   80|    160|      objectPrototypePropertyIsEnumerable,
   81|    160|      1);
   82|    160|  defineAccessor(
   83|    160|      runtime,
   84|    160|      objectPrototype,
   85|    160|      Predefined::getSymbolID(Predefined::underscore_proto),
   86|    160|      ctx,
   87|    160|      objectPrototypeProto_getter,
   88|    160|      objectPrototypeProto_setter,
   89|    160|      false,
   90|    160|      true);
   91|    160|  defineMethod(
   92|    160|      runtime,
   93|    160|      objectPrototype,
   94|    160|      Predefined::getSymbolID(Predefined::__defineGetter__),
   95|    160|      ctx,
   96|    160|      objectPrototypeDefineGetter,
   97|    160|      2);
   98|    160|  defineMethod(
   99|    160|      runtime,
  100|    160|      objectPrototype,
  101|    160|      Predefined::getSymbolID(Predefined::__defineSetter__),
  102|    160|      ctx,
  103|    160|      objectPrototypeDefineSetter,
  104|    160|      2);
  105|    160|  defineMethod(
  106|    160|      runtime,
  107|    160|      objectPrototype,
  108|    160|      Predefined::getSymbolID(Predefined::__lookupGetter__),
  109|    160|      ctx,
  110|    160|      objectPrototypeLookupGetter,
  111|    160|      1);
  112|    160|  defineMethod(
  113|    160|      runtime,
  114|    160|      objectPrototype,
  115|    160|      Predefined::getSymbolID(Predefined::__lookupSetter__),
  116|    160|      ctx,
  117|    160|      objectPrototypeLookupSetter,
  118|    160|      1);
  119|       |
  120|       |  // Object.xxx() methods.
  121|    160|  defineMethod(
  122|    160|      runtime,
  123|    160|      cons,
  124|    160|      Predefined::getSymbolID(Predefined::getPrototypeOf),
  125|    160|      ctx,
  126|    160|      objectGetPrototypeOf,
  127|    160|      1);
  128|    160|  defineMethod(
  129|    160|      runtime,
  130|    160|      cons,
  131|    160|      Predefined::getSymbolID(Predefined::getOwnPropertyDescriptor),
  132|    160|      ctx,
  133|    160|      objectGetOwnPropertyDescriptor,
  134|    160|      2);
  135|    160|  defineMethod(
  136|    160|      runtime,
  137|    160|      cons,
  138|    160|      Predefined::getSymbolID(Predefined::getOwnPropertyDescriptors),
  139|    160|      ctx,
  140|    160|      objectGetOwnPropertyDescriptors,
  141|    160|      1);
  142|    160|  defineMethod(
  143|    160|      runtime,
  144|    160|      cons,
  145|    160|      Predefined::getSymbolID(Predefined::getOwnPropertyNames),
  146|    160|      ctx,
  147|    160|      objectGetOwnPropertyNames,
  148|    160|      1);
  149|    160|  defineMethod(
  150|    160|      runtime,
  151|    160|      cons,
  152|    160|      Predefined::getSymbolID(Predefined::getOwnPropertySymbols),
  153|    160|      ctx,
  154|    160|      objectGetOwnPropertySymbols,
  155|    160|      1);
  156|    160|  defineMethod(
  157|    160|      runtime,
  158|    160|      cons,
  159|    160|      Predefined::getSymbolID(Predefined::hasOwn),
  160|    160|      ctx,
  161|    160|      objectHasOwn,
  162|    160|      2);
  163|    160|  defineMethod(
  164|    160|      runtime,
  165|    160|      cons,
  166|    160|      Predefined::getSymbolID(Predefined::seal),
  167|    160|      ctx,
  168|    160|      objectSeal,
  169|    160|      1);
  170|    160|  defineMethod(
  171|    160|      runtime,
  172|    160|      cons,
  173|    160|      Predefined::getSymbolID(Predefined::freeze),
  174|    160|      ctx,
  175|    160|      objectFreeze,
  176|    160|      1);
  177|    160|  defineMethod(
  178|    160|      runtime,
  179|    160|      cons,
  180|    160|      Predefined::getSymbolID(Predefined::fromEntries),
  181|    160|      ctx,
  182|    160|      objectFromEntries,
  183|    160|      1);
  184|    160|  defineMethod(
  185|    160|      runtime,
  186|    160|      cons,
  187|    160|      Predefined::getSymbolID(Predefined::preventExtensions),
  188|    160|      ctx,
  189|    160|      objectPreventExtensions,
  190|    160|      1);
  191|       |
  192|    160|  defineMethod(
  193|    160|      runtime, cons, Predefined::getSymbolID(Predefined::is), ctx, objectIs, 2);
  194|    160|  defineMethod(
  195|    160|      runtime,
  196|    160|      cons,
  197|    160|      Predefined::getSymbolID(Predefined::isSealed),
  198|    160|      ctx,
  199|    160|      objectIsSealed,
  200|    160|      1);
  201|    160|  defineMethod(
  202|    160|      runtime,
  203|    160|      cons,
  204|    160|      Predefined::getSymbolID(Predefined::isFrozen),
  205|    160|      ctx,
  206|    160|      objectIsFrozen,
  207|    160|      1);
  208|    160|  defineMethod(
  209|    160|      runtime,
  210|    160|      cons,
  211|    160|      Predefined::getSymbolID(Predefined::isExtensible),
  212|    160|      ctx,
  213|    160|      objectIsExtensible,
  214|    160|      1);
  215|    160|  defineMethod(
  216|    160|      runtime,
  217|    160|      cons,
  218|    160|      Predefined::getSymbolID(Predefined::keys),
  219|    160|      ctx,
  220|    160|      objectKeys,
  221|    160|      1);
  222|    160|  defineMethod(
  223|    160|      runtime,
  224|    160|      cons,
  225|    160|      Predefined::getSymbolID(Predefined::values),
  226|    160|      ctx,
  227|    160|      objectValues,
  228|    160|      1);
  229|    160|  defineMethod(
  230|    160|      runtime,
  231|    160|      cons,
  232|    160|      Predefined::getSymbolID(Predefined::entries),
  233|    160|      ctx,
  234|    160|      objectEntries,
  235|    160|      1);
  236|    160|  defineMethod(
  237|    160|      runtime,
  238|    160|      cons,
  239|    160|      Predefined::getSymbolID(Predefined::create),
  240|    160|      ctx,
  241|    160|      objectCreate,
  242|    160|      2);
  243|    160|  defineMethod(
  244|    160|      runtime,
  245|    160|      cons,
  246|    160|      Predefined::getSymbolID(Predefined::defineProperty),
  247|    160|      ctx,
  248|    160|      objectDefineProperty,
  249|    160|      3);
  250|    160|  defineMethod(
  251|    160|      runtime,
  252|    160|      cons,
  253|    160|      Predefined::getSymbolID(Predefined::defineProperties),
  254|    160|      ctx,
  255|    160|      objectDefineProperties,
  256|    160|      2);
  257|    160|  defineMethod(
  258|    160|      runtime,
  259|    160|      cons,
  260|    160|      Predefined::getSymbolID(Predefined::assign),
  261|    160|      ctx,
  262|    160|      objectAssign,
  263|    160|      2);
  264|    160|  defineMethod(
  265|    160|      runtime,
  266|    160|      cons,
  267|    160|      Predefined::getSymbolID(Predefined::setPrototypeOf),
  268|    160|      ctx,
  269|    160|      objectSetPrototypeOf,
  270|    160|      2);
  271|       |
  272|    160|  return cons;
  273|    160|}
_ZN6hermes2vm29directObjectPrototypeToStringERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
 1158|   355k|    Handle<> arg) {
 1159|   355k|  StringPrimitive *str;
 1160|       |
 1161|   355k|  if (arg->isUndefined()) {
  ------------------
  |  Branch (1161:7): [True: 0, False: 355k]
  ------------------
 1162|      0|    str = runtime.getPredefinedString(Predefined::squareObjectUndefined);
 1163|   355k|  } else if (arg->isNull()) {
  ------------------
  |  Branch (1163:14): [True: 0, False: 355k]
  ------------------
 1164|      0|    str = runtime.getPredefinedString(Predefined::squareObjectNull);
 1165|   355k|  } else if (arg->getRaw() == runtime.getGlobal().getHermesValue().getRaw()) {
  ------------------
  |  Branch (1165:14): [True: 0, False: 355k]
  ------------------
 1166|      0|    str = runtime.getPredefinedString(Predefined::squareObjectGlobal);
 1167|   355k|  } else {
 1168|   355k|    auto res = toObject(runtime, arg);
 1169|   355k|    if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1169:9): [True: 0, False: 355k]
  ------------------
 1170|      0|      return ExecutionStatus::EXCEPTION;
 1171|      0|    }
 1172|       |
 1173|   355k|    auto O = runtime.makeHandle<JSObject>(res.getValue());
 1174|       |    // 16. Let tag be Get (O, @@toStringTag).
 1175|   355k|    auto tagRes = JSObject::getNamed_RJS(
 1176|   355k|        O, runtime, Predefined::getSymbolID(Predefined::SymbolToStringTag));
 1177|   355k|    if (LLVM_UNLIKELY(tagRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   355k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 355k]
  |  |  ------------------
  ------------------
 1178|      0|      return ExecutionStatus::EXCEPTION;
 1179|      0|    }
 1180|       |
 1181|   355k|    if ((*tagRes)->isString()) {
  ------------------
  |  Branch (1181:9): [True: 0, False: 355k]
  ------------------
 1182|      0|      auto tag = runtime.makeHandle(
 1183|      0|          PseudoHandle<StringPrimitive>::vmcast(std::move(*tagRes)));
 1184|      0|      SafeUInt32 tagLen(tag->getStringLength());
 1185|      0|      tagLen.add(9);
 1186|      0|      CallResult<StringBuilder> builder =
 1187|      0|          StringBuilder::createStringBuilder(runtime, tagLen);
 1188|      0|      if (LLVM_UNLIKELY(builder == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1189|      0|        return ExecutionStatus::EXCEPTION;
 1190|      0|      }
 1191|       |      // 19. Return the String that is the result of concatenating
 1192|       |      // "[object ", tag, and "]".
 1193|      0|      builder->appendASCIIRef(ASCIIRef{"[object ", 8});
 1194|      0|      builder->appendStringPrim(tag);
 1195|      0|      builder->appendCharacter(']');
 1196|      0|      return builder->getStringPrimitive().getHermesValue();
 1197|      0|    }
 1198|       |
 1199|       |    // 18. If Type(tag) is not String, let tag be builtinTag.
 1200|   355k|    CallResult<bool> isArrayRes = isArray(runtime, *O);
 1201|   355k|    if (LLVM_UNLIKELY(isArrayRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   355k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 355k]
  |  |  ------------------
  ------------------
 1202|      0|      return ExecutionStatus::EXCEPTION;
 1203|      0|    }
 1204|   355k|    if (*isArrayRes) {
  ------------------
  |  Branch (1204:9): [True: 0, False: 355k]
  ------------------
 1205|       |      // 6. If isArray is true, let builtinTag be "Array".
 1206|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSArray);
 1207|   355k|    } else if (vmisa<JSString>(O.getHermesValue())) {
  ------------------
  |  Branch (1207:16): [True: 0, False: 355k]
  ------------------
 1208|       |      // 7. Else, if O is an exotic String object, let builtinTag be "String".
 1209|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSString);
 1210|   355k|    } else if (vmisa<Arguments>(O.getHermesValue())) {
  ------------------
  |  Branch (1210:16): [True: 0, False: 355k]
  ------------------
 1211|       |      // 8. Else, if O has an [[ParameterMap]] internal slot, let builtinTag be
 1212|       |      // "Arguments".
 1213|      0|      str = runtime.getPredefinedString(Predefined::squareObject_Arguments);
 1214|   355k|    } else if (vmisa<Callable>(O.getHermesValue())) {
  ------------------
  |  Branch (1214:16): [True: 0, False: 355k]
  ------------------
 1215|       |      // 9. Else, if O has a [[Call]] internal method, let builtinTag be
 1216|       |      // "Function".
 1217|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSFunction);
 1218|   355k|    } else if (vmisa<JSError>(O.getHermesValue())) {
  ------------------
  |  Branch (1218:16): [True: 0, False: 355k]
  ------------------
 1219|       |      // 10. Else, if O has an [[ErrorData]] internal slot, let builtinTag be
 1220|       |      // "Error".
 1221|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSError);
 1222|   355k|    } else if (vmisa<JSBoolean>(O.getHermesValue())) {
  ------------------
  |  Branch (1222:16): [True: 0, False: 355k]
  ------------------
 1223|       |      // 11. Else, if O has a [[BooleanData]] internal slot, let builtinTag be
 1224|       |      // "Boolean".
 1225|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSBoolean);
 1226|   355k|    } else if (vmisa<JSNumber>(O.getHermesValue())) {
  ------------------
  |  Branch (1226:16): [True: 0, False: 355k]
  ------------------
 1227|       |      // 12. Else, if O has a [[NumberData]] internal slot, let builtinTag be
 1228|       |      // "Number".
 1229|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSNumber);
 1230|   355k|    } else if (vmisa<JSDate>(O.getHermesValue())) {
  ------------------
  |  Branch (1230:16): [True: 0, False: 355k]
  ------------------
 1231|       |      // 13. Else, if O has a [[DateValue]] internal slot, let builtinTag be
 1232|       |      // "Date".
 1233|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSDate);
 1234|   355k|    } else if (vmisa<JSRegExp>(O.getHermesValue())) {
  ------------------
  |  Branch (1234:16): [True: 0, False: 355k]
  ------------------
 1235|       |      // 14. Else, if O has a [[RegExpMatcher]] internal slot, let builtinTag be
 1236|       |      // "RegExp".
 1237|      0|      str = runtime.getPredefinedString(Predefined::squareObject_JSRegExp);
 1238|   355k|    } else {
 1239|   355k|      str = runtime.getPredefinedString(Predefined::squareObject_JSObject);
 1240|   355k|    }
 1241|   355k|  }
 1242|       |
 1243|   355k|  return HermesValue::encodeStringValue(str);
 1244|   355k|}
_ZN6hermes2vm23objectPrototypeToStringEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1247|   355k|objectPrototypeToString(void *, Runtime &runtime, NativeArgs args) {
 1248|   355k|  return directObjectPrototypeToString(runtime, args.getThisHandle());
 1249|   355k|}
_ZN6hermes2vm22objectPrototypeValueOfEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1273|   746k|objectPrototypeValueOf(void *, Runtime &runtime, NativeArgs args) {
 1274|   746k|  auto res = toObject(runtime, args.getThisHandle());
 1275|   746k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   746k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 746k]
  |  |  ------------------
  ------------------
 1276|      0|    return ExecutionStatus::EXCEPTION;
 1277|      0|  }
 1278|   746k|  return res;
 1279|   746k|}

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

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

_ZN6hermes2vm23createRegExpConstructorERNS0_7RuntimeE:
   59|    160|Handle<JSObject> createRegExpConstructor(Runtime &runtime) {
   60|    160|  auto proto = Handle<JSObject>::vmcast(&runtime.regExpPrototype);
   61|       |
   62|    160|  auto cons = defineSystemConstructor<JSRegExp>(
   63|    160|      runtime,
   64|    160|      Predefined::getSymbolID(Predefined::RegExp),
   65|    160|      regExpConstructor,
   66|    160|      proto,
   67|    160|      2,
   68|    160|      CellKind::JSRegExpKind);
   69|       |
   70|    160|  defineMethod(
   71|    160|      runtime,
   72|    160|      proto,
   73|    160|      Predefined::getSymbolID(Predefined::exec),
   74|    160|      nullptr,
   75|    160|      regExpPrototypeExec,
   76|    160|      1);
   77|       |
   78|    160|  defineMethod(
   79|    160|      runtime,
   80|    160|      proto,
   81|    160|      Predefined::getSymbolID(Predefined::test),
   82|    160|      nullptr,
   83|    160|      regExpPrototypeTest,
   84|    160|      1);
   85|       |
   86|    160|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
   87|       |
   88|    160|  (void)defineMethod(
   89|    160|      runtime,
   90|    160|      proto,
   91|    160|      Predefined::getSymbolID(Predefined::SymbolMatchAll),
   92|    160|      Predefined::getSymbolID(Predefined::squareSymbolMatchAll),
   93|    160|      nullptr,
   94|    160|      regExpPrototypeSymbolMatchAll,
   95|    160|      1,
   96|    160|      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|    160|  auto defineGetter = [&](Handle<JSObject> obj,
  102|    160|                          Predefined::Str sym,
  103|    160|                          NativeFunctionPtr getter,
  104|    160|                          intptr_t ctx = 0) {
  105|    160|    defineAccessor(
  106|    160|        runtime,
  107|    160|        obj,
  108|    160|        Predefined::getSymbolID(sym),
  109|    160|        ctx ? reinterpret_cast<void *>(ctx) : nullptr,
  110|    160|        getter,
  111|    160|        nullptr,
  112|    160|        false,
  113|    160|        true);
  114|    160|  };
  115|       |
  116|    160|  defineGetter(proto, Predefined::source, regExpSourceGetter);
  117|    160|  defineGetter(proto, Predefined::multiline, regExpFlagPropertyGetter, 'm');
  118|    160|  defineGetter(proto, Predefined::ignoreCase, regExpFlagPropertyGetter, 'i');
  119|    160|  defineGetter(proto, Predefined::global, regExpFlagPropertyGetter, 'g');
  120|    160|  defineGetter(proto, Predefined::unicode, regExpFlagPropertyGetter, 'u');
  121|    160|  defineGetter(proto, Predefined::sticky, regExpFlagPropertyGetter, 'y');
  122|    160|  defineGetter(proto, Predefined::dotAll, regExpFlagPropertyGetter, 's');
  123|    160|  defineGetter(proto, Predefined::hasIndices, regExpFlagPropertyGetter, 'd');
  124|       |
  125|    160|  defineGetter(cons, Predefined::dollar1, regExpDollarNumberGetter, 1);
  126|    160|  defineGetter(cons, Predefined::dollar2, regExpDollarNumberGetter, 2);
  127|    160|  defineGetter(cons, Predefined::dollar3, regExpDollarNumberGetter, 3);
  128|    160|  defineGetter(cons, Predefined::dollar4, regExpDollarNumberGetter, 4);
  129|    160|  defineGetter(cons, Predefined::dollar5, regExpDollarNumberGetter, 5);
  130|    160|  defineGetter(cons, Predefined::dollar6, regExpDollarNumberGetter, 6);
  131|    160|  defineGetter(cons, Predefined::dollar7, regExpDollarNumberGetter, 7);
  132|    160|  defineGetter(cons, Predefined::dollar8, regExpDollarNumberGetter, 8);
  133|    160|  defineGetter(cons, Predefined::dollar9, regExpDollarNumberGetter, 9);
  134|    160|  defineGetter(cons, Predefined::leftContext, regExpLeftContextGetter);
  135|    160|  defineGetter(cons, Predefined::dollarBacktick, regExpLeftContextGetter);
  136|    160|  defineGetter(cons, Predefined::rightContext, regExpRightContextGetter);
  137|    160|  defineGetter(cons, Predefined::dollarApostrophe, regExpRightContextGetter);
  138|    160|  defineGetter(cons, Predefined::dollarUnderscore, regExpInputGetter);
  139|    160|  defineGetter(cons, Predefined::input, regExpInputGetter);
  140|    160|  defineGetter(cons, Predefined::dollarAmpersand, regExpLastMatchGetter);
  141|    160|  defineGetter(cons, Predefined::lastMatch, regExpLastMatchGetter);
  142|    160|  defineGetter(cons, Predefined::dollarPlus, regExpLastParenGetter);
  143|    160|  defineGetter(cons, Predefined::lastParen, regExpLastParenGetter);
  144|       |
  145|    160|  defineMethod(
  146|    160|      runtime,
  147|    160|      proto,
  148|    160|      Predefined::getSymbolID(Predefined::toString),
  149|    160|      nullptr,
  150|    160|      regExpPrototypeToString,
  151|    160|      0);
  152|    160|  (void)defineMethod(
  153|    160|      runtime,
  154|    160|      proto,
  155|    160|      Predefined::getSymbolID(Predefined::SymbolMatch),
  156|    160|      Predefined::getSymbolID(Predefined::squareSymbolMatch),
  157|    160|      nullptr,
  158|    160|      regExpPrototypeSymbolMatch,
  159|    160|      1,
  160|    160|      dpf);
  161|    160|  (void)defineMethod(
  162|    160|      runtime,
  163|    160|      proto,
  164|    160|      Predefined::getSymbolID(Predefined::SymbolSearch),
  165|    160|      Predefined::getSymbolID(Predefined::squareSymbolSearch),
  166|    160|      nullptr,
  167|    160|      regExpPrototypeSymbolSearch,
  168|    160|      1,
  169|    160|      dpf);
  170|    160|  (void)defineMethod(
  171|    160|      runtime,
  172|    160|      proto,
  173|    160|      Predefined::getSymbolID(Predefined::SymbolReplace),
  174|    160|      Predefined::getSymbolID(Predefined::squareSymbolReplace),
  175|    160|      nullptr,
  176|    160|      regExpPrototypeSymbolReplace,
  177|    160|      2,
  178|    160|      dpf);
  179|    160|  (void)defineMethod(
  180|    160|      runtime,
  181|    160|      proto,
  182|    160|      Predefined::getSymbolID(Predefined::SymbolSplit),
  183|    160|      Predefined::getSymbolID(Predefined::squareSymbolSplit),
  184|    160|      nullptr,
  185|    160|      regExpPrototypeSymbolSplit,
  186|    160|      2,
  187|    160|      dpf);
  188|       |
  189|    160|  defineGetter(proto, Predefined::flags, regExpFlagsGetter);
  190|       |
  191|    160|  return cons;
  192|    160|}
_ZN6hermes2vm17regExpConstructorEPvRNS0_7RuntimeENS0_10NativeArgsE:
  402|      1|regExpConstructor(void *, Runtime &runtime, NativeArgs args) {
  403|      1|  Handle<> pattern = args.getArgHandle(0);
  404|      1|  Handle<> flags = args.getArgHandle(1);
  405|      1|  auto regExpRes = regExpConstructorInternal(
  406|      1|      runtime, pattern, flags, args.isConstructorCall());
  407|      1|  if (LLVM_UNLIKELY(regExpRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  408|      0|    return ExecutionStatus::EXCEPTION;
  409|      0|  }
  410|      1|  return regExpRes->getHermesValue();
  411|      1|}
_ZN6hermes2vm18regExpSourceGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
  911|      2|regExpSourceGetter(void *ctx, Runtime &runtime, NativeArgs args) {
  912|       |  // "If Type(R) is not Object, throw a TypeError exception"
  913|      2|  if (!args.dyncastThis<JSObject>()) {
  ------------------
  |  Branch (913:7): [True: 0, False: 2]
  ------------------
  914|      0|    return runtime.raiseTypeError(
  915|      0|        "RegExp.prototype.source getter called on non-RegExp");
  916|      0|  }
  917|       |
  918|      2|  Handle<JSRegExp> R = args.dyncastThis<JSRegExp>();
  919|      2|  if (!R) {
  ------------------
  |  Branch (919:7): [True: 0, False: 2]
  ------------------
  920|       |    // "If SameValue(R, %RegExpPrototype%) is true, return "(?:)". Otherwise,
  921|       |    // throw a TypeError exception.
  922|      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]
  |  |  ------------------
  ------------------
  923|       |      // Note we don't bother to predefine this string because this should
  924|       |      // hardly ever be encountered.
  925|      0|      const char *emptyPattern = "(?:)";
  926|      0|      return StringPrimitive::create(
  927|      0|          runtime, ASCIIRef{emptyPattern, strlen(emptyPattern)});
  928|      0|    }
  929|      0|    return runtime.raiseTypeError(
  930|      0|        "RegExp.prototype.source getter called on non-RegExp");
  931|      0|  }
  932|       |
  933|       |  // "Let src be the value of R’s [[OriginalSource]] internal slot."
  934|       |  // "Let flags be the value of R’s [[OriginalFlags]] internal slot."
  935|       |  // "Return EscapeRegExpPattern(src, flags)."
  936|       |  // Note that ES6 specifies that we provide the flags to EscapeRegExpPattern,
  937|       |  // however this is only to distinguish a Unicode from a non-Unicode regexp.
  938|       |  // Beacuse we do not yet support Unicode regexps we can omit the flags.
  939|      2|  return JSRegExp::escapePattern(
  940|      2|      runtime.makeHandle(JSRegExp::getPattern(R.get(), runtime)), runtime);
  941|      2|}
_ZN6hermes2vm24regExpFlagPropertyGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
  945|     14|regExpFlagPropertyGetter(void *ctx, Runtime &runtime, NativeArgs args) {
  946|       |  // Note in ES8, the standard specifies that the RegExp prototype object is not
  947|       |  // a RegExp but that these accessors check for it as a special case.
  948|       |
  949|       |  // "Let R be the this value."
  950|       |  // "If Type(R) is not Object, throw a TypeError exception."
  951|       |  // "If R does not have an [[OriginalFlags]] internal slot, throw a TypeError
  952|       |  // exception." (Combine these two checks into a dyncast to JSRegExp).
  953|     14|  Handle<JSRegExp> R = args.dyncastThis<JSRegExp>();
  954|     14|  if (!R) {
  ------------------
  |  Branch (954:7): [True: 0, False: 14]
  ------------------
  955|       |    // "If SameValue(R, %RegExpPrototype%) is true, return undefined. Otherwise,
  956|       |    // throw a TypeError exception"
  957|      0|    if (thisIsRegExpProto(runtime, args)) {
  ------------------
  |  Branch (957:9): [True: 0, False: 0]
  ------------------
  958|      0|      return HermesValue::encodeUndefinedValue();
  959|      0|    }
  960|      0|    return runtime.raiseTypeError("RegExp getter called on non-RegExp");
  961|      0|  }
  962|       |
  963|       |  // "Let flags be the value of R’s [[OriginalFlags]] internal slot."
  964|       |  // "If flags contains the code unit "i/m/g", return true."
  965|       |  // "Return false."
  966|     14|  auto syntaxFlags = JSRegExp::getSyntaxFlags(R.get());
  967|     14|  switch ((intptr_t)ctx) {
  968|      2|    case 'i':
  ------------------
  |  Branch (968:5): [True: 2, False: 12]
  ------------------
  969|      2|      return HermesValue::encodeBoolValue(syntaxFlags.ignoreCase);
  970|      2|    case 'm':
  ------------------
  |  Branch (970:5): [True: 2, False: 12]
  ------------------
  971|      2|      return HermesValue::encodeBoolValue(syntaxFlags.multiline);
  972|      2|    case 'g':
  ------------------
  |  Branch (972:5): [True: 2, False: 12]
  ------------------
  973|      2|      return HermesValue::encodeBoolValue(syntaxFlags.global);
  974|      2|    case 'u':
  ------------------
  |  Branch (974:5): [True: 2, False: 12]
  ------------------
  975|      2|      return HermesValue::encodeBoolValue(syntaxFlags.unicode);
  976|      2|    case 'y':
  ------------------
  |  Branch (976:5): [True: 2, False: 12]
  ------------------
  977|      2|      return HermesValue::encodeBoolValue(syntaxFlags.sticky);
  978|      2|    case 's':
  ------------------
  |  Branch (978:5): [True: 2, False: 12]
  ------------------
  979|      2|      return HermesValue::encodeBoolValue(syntaxFlags.dotAll);
  980|      2|    case 'd':
  ------------------
  |  Branch (980:5): [True: 2, False: 12]
  ------------------
  981|      2|      return HermesValue::encodeBoolValue(syntaxFlags.hasIndices);
  982|      0|    default:
  ------------------
  |  Branch (982:5): [True: 0, False: 14]
  ------------------
  983|      0|      llvm_unreachable("Invalid flag passed to regExpFlagPropertyGetter");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  984|      0|      return HermesValue::encodeEmptyValue();
  985|     14|  }
  986|     14|}
_ZN6hermes2vm23regExpPrototypeToStringEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1335|      2|regExpPrototypeToString(void *, Runtime &runtime, NativeArgs args) {
 1336|      2|  Handle<JSObject> regexp = args.dyncastThis<JSObject>();
 1337|      2|  if (!regexp) {
  ------------------
  |  Branch (1337:7): [True: 0, False: 2]
  ------------------
 1338|      0|    return runtime.raiseTypeError(
 1339|      0|        "RegExp.prototype.toString() called on non-object");
 1340|      0|  }
 1341|       |
 1342|       |  // Let pattern be ToString(Get(R, "source"))
 1343|      2|  auto source = JSObject::getNamed_RJS(
 1344|      2|      regexp, runtime, Predefined::getSymbolID(Predefined::source));
 1345|      2|  if (LLVM_UNLIKELY(source == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 1346|      0|    return ExecutionStatus::EXCEPTION;
 1347|      0|  }
 1348|      2|  auto patternRes =
 1349|      2|      toString_RJS(runtime, runtime.makeHandle(std::move(*source)));
 1350|      2|  if (LLVM_UNLIKELY(patternRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 1351|      0|    return ExecutionStatus::EXCEPTION;
 1352|      0|  }
 1353|      2|  Handle<StringPrimitive> pattern = runtime.makeHandle(std::move(*patternRes));
 1354|       |
 1355|       |  // Let flags be ToString(Get(R, "flags"))
 1356|      2|  auto flagsObj = JSObject::getNamed_RJS(
 1357|      2|      regexp, runtime, Predefined::getSymbolID(Predefined::flags));
 1358|      2|  if (LLVM_UNLIKELY(flagsObj == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 1359|      0|    return ExecutionStatus::EXCEPTION;
 1360|      0|  }
 1361|      2|  auto flagsRes =
 1362|      2|      toString_RJS(runtime, runtime.makeHandle(std::move(*flagsObj)));
 1363|      2|  if (LLVM_UNLIKELY(flagsRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 1364|      0|    return ExecutionStatus::EXCEPTION;
 1365|      0|  }
 1366|      2|  Handle<StringPrimitive> flags = runtime.makeHandle(std::move(*flagsRes));
 1367|       |
 1368|       |  // 'Let result be the String value formed by concatenating "/", pattern, and
 1369|       |  // "/", and flags.' We expect 2 slashes plus at most 5 flags.
 1370|      2|  SmallU16String<32> result;
 1371|      2|  result.reserve(pattern->getStringLength() + 2 + 5);
 1372|       |
 1373|      2|  result.push_back(u'/');
 1374|      2|  pattern->appendUTF16String(result);
 1375|      2|  result.push_back(u'/');
 1376|      2|  flags->appendUTF16String(result);
 1377|      2|  return StringPrimitive::create(runtime, result);
 1378|      2|}
_ZN6hermes2vm17regExpFlagsGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
 2225|      2|regExpFlagsGetter(void *ctx, Runtime &runtime, NativeArgs args) {
 2226|       |  // Let R be the this value.
 2227|       |  // If Type(R) is not Object, throw a TypeError exception
 2228|      2|  Handle<JSObject> R = args.dyncastThis<JSObject>();
 2229|      2|  if (!R) {
  ------------------
  |  Branch (2229:7): [True: 0, False: 2]
  ------------------
 2230|      0|    return runtime.raiseTypeError(
 2231|      0|        "RegExp.prototype.flags getter called on non-object");
 2232|      0|  }
 2233|       |
 2234|      2|  llvh::SmallString<7> result;
 2235|      2|  static const struct FlagProp {
 2236|      2|    char flagChar;
 2237|      2|    Predefined::Str name;
 2238|      2|  } flagProps[] = {
 2239|      2|      {'d', Predefined::hasIndices},
 2240|      2|      {'g', Predefined::global},
 2241|      2|      {'i', Predefined::ignoreCase},
 2242|      2|      {'m', Predefined::multiline},
 2243|      2|      {'s', Predefined::dotAll},
 2244|      2|      {'u', Predefined::unicode},
 2245|      2|      {'y', Predefined::sticky},
 2246|      2|  };
 2247|     14|  for (FlagProp f : flagProps) {
  ------------------
  |  Branch (2247:19): [True: 14, False: 2]
  ------------------
 2248|     14|    auto flagVal =
 2249|     14|        JSObject::getNamed_RJS(R, runtime, Predefined::getSymbolID(f.name));
 2250|     14|    if (LLVM_UNLIKELY(flagVal == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     14|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14]
  |  |  ------------------
  ------------------
 2251|      0|      return ExecutionStatus::EXCEPTION;
 2252|      0|    }
 2253|     14|    if (toBoolean(flagVal->get())) {
  ------------------
  |  Branch (2253:9): [True: 0, False: 14]
  ------------------
 2254|      0|      result.push_back(f.flagChar);
 2255|      0|    }
 2256|     14|  }
 2257|      2|  return StringPrimitive::create(runtime, result);
 2258|      2|}
RegExp.cpp:_ZZN6hermes2vm23createRegExpConstructorERNS0_7RuntimeEENK3$_0clENS0_6HandleINS0_8JSObjectEEENS0_10Predefined3StrEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEEl:
  104|  4.48k|                          intptr_t ctx = 0) {
  105|  4.48k|    defineAccessor(
  106|  4.48k|        runtime,
  107|  4.48k|        obj,
  108|  4.48k|        Predefined::getSymbolID(sym),
  109|  4.48k|        ctx ? reinterpret_cast<void *>(ctx) : nullptr,
  ------------------
  |  Branch (109:9): [True: 2.56k, False: 1.92k]
  ------------------
  110|  4.48k|        getter,
  111|  4.48k|        nullptr,
  112|  4.48k|        false,
  113|  4.48k|        true);
  114|  4.48k|  };
RegExp.cpp:_ZN6hermes2vmL11regExpAllocERNS0_7RuntimeENS0_12PseudoHandleINS0_11HermesValueEEE:
  217|      1|    PseudoHandle<> /* newTarget */) {
  218|      1|  return JSRegExp::create(runtime).getHermesValue();
  219|      1|}
RegExp.cpp:_ZN6hermes2vmL16regExpInitializeERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_S5_:
  226|      1|    Handle<> flags) {
  227|      1|  auto regExpObj = Handle<JSRegExp>::dyn_vmcast(obj);
  228|      1|  if (LLVM_UNLIKELY(!regExpObj)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  229|      0|    return ExecutionStatus::EXCEPTION;
  230|      0|  }
  231|       |  // 1. If pattern is undefined, let P be the empty String.
  232|       |  // 2. Else, let P be ? ToString(pattern).
  233|      1|  MutableHandle<StringPrimitive> P = runtime.makeMutableHandle(
  234|      1|      runtime.getPredefinedString(Predefined::emptyString));
  235|      1|  if (!pattern->isUndefined()) {
  ------------------
  |  Branch (235:7): [True: 1, False: 0]
  ------------------
  236|      1|    auto strRes = toString_RJS(runtime, pattern);
  237|      1|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  238|      0|      return ExecutionStatus::EXCEPTION;
  239|      0|    }
  240|      1|    P = strRes->get();
  241|      1|  }
  242|       |  // 3. If flags is undefined, let F be the empty String.
  243|       |  // 4. Else, let F be ? ToString(flags).
  244|      1|  MutableHandle<StringPrimitive> F = runtime.makeMutableHandle(
  245|      1|      runtime.getPredefinedString(Predefined::emptyString));
  246|      1|  if (!flags->isUndefined()) {
  ------------------
  |  Branch (246:7): [True: 0, False: 1]
  ------------------
  247|      0|    auto strRes = toString_RJS(runtime, flags);
  248|      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]
  |  |  ------------------
  ------------------
  249|      0|      return ExecutionStatus::EXCEPTION;
  250|      0|    }
  251|      0|    F = strRes->get();
  252|      0|  }
  253|      1|  if (JSRegExp::initialize(regExpObj, runtime, P, F) ==
  ------------------
  |  Branch (253:7): [True: 0, False: 1]
  ------------------
  254|      1|      ExecutionStatus::EXCEPTION) {
  255|      0|    return ExecutionStatus::EXCEPTION;
  256|      0|  }
  257|      1|  return regExpObj;
  258|      1|}
RegExp.cpp:_ZN6hermes2vmL25regExpConstructorInternalERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_b:
  282|      1|    bool isConstructorCall) {
  283|       |  // 1. Let patternIsRegExp be IsRegExp(pattern).
  284|       |  // 2. ReturnIfAbrupt(patternIsRegExp).
  285|      1|  auto callRes = isRegExp(runtime, pattern);
  286|      1|  if (LLVM_UNLIKELY(callRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  287|      0|    return ExecutionStatus::EXCEPTION;
  288|      0|  }
  289|      1|  bool patternIsRegExp = callRes.getValue();
  290|       |  // 3. If NewTarget is not undefined, let newTarget be NewTarget.
  291|       |  // Note: "NewTarget is not undefined" means we are in a constructor call.
  292|       |  // TODO: right now the NewTarget can only be the RegExp constructor itself,
  293|       |  // after supporting subclassing, NewTarget could be the constructor of the
  294|       |  // derived class.
  295|      1|  auto propRes = JSObject::getNamed_RJS(
  296|      1|      runtime.getGlobal(),
  297|      1|      runtime,
  298|      1|      Predefined::getSymbolID(Predefined::RegExp));
  299|      1|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  300|      0|    return ExecutionStatus::EXCEPTION;
  301|      0|  }
  302|      1|  Handle<> newTarget = runtime.makeHandle(std::move(*propRes));
  303|       |  // 4. Else,
  304|       |  // This is not a constructor call.
  305|      1|  if (!isConstructorCall) {
  ------------------
  |  Branch (305:7): [True: 1, False: 0]
  ------------------
  306|       |    // a. Let newTarget be the active function object.
  307|       |    // Note: newTarget is the RegExp constructor, which is already set.
  308|       |    // b. If patternIsRegExp is true and flags is undefined, then
  309|      1|    if (patternIsRegExp && flags->isUndefined()) {
  ------------------
  |  Branch (309:9): [True: 0, False: 1]
  |  Branch (309:28): [True: 0, False: 0]
  ------------------
  310|       |      // i. Let patternConstructor be Get(pattern, "constructor").
  311|       |      // ii. ReturnIfAbrupt(patternConstructor).
  312|      0|      auto patternObj = Handle<JSObject>::vmcast(pattern);
  313|      0|      auto patternConstructor = JSObject::getNamed_RJS(
  314|      0|          patternObj,
  315|      0|          runtime,
  316|      0|          Predefined::getSymbolID(Predefined::constructor));
  317|      0|      if (LLVM_UNLIKELY(patternConstructor == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  318|      0|        return ExecutionStatus::EXCEPTION;
  319|      0|      }
  320|       |      // iii. If SameValue(newTarget, patternConstructor) is true, return
  321|       |      // pattern.
  322|      0|      if (isSameValue(newTarget.getHermesValue(), patternConstructor->get())) {
  ------------------
  |  Branch (322:11): [True: 0, False: 0]
  ------------------
  323|       |        // Note: unfortunately, even at this point it's still unsafe to assume
  324|       |        // pattern is a JSRegExp, see the objWithRegExpCons from
  325|       |        // test/hermes/regexp.js for an example of how such assumptions falls.
  326|      0|        return patternObj;
  327|      0|      }
  328|      0|    }
  329|      1|  }
  330|       |
  331|      1|  MutableHandle<> P{runtime};
  332|      1|  MutableHandle<> F{runtime};
  333|       |  // 5. If Type(pattern) is Object and pattern has a [[RegExpMatcher]] internal
  334|       |  // slot, then
  335|      1|  if (auto patternAsRegExp = Handle<JSRegExp>::dyn_vmcast(pattern)) {
  ------------------
  |  Branch (335:12): [True: 0, False: 1]
  ------------------
  336|       |    // a. Let P be the value of pattern’s [[OriginalSource]] internal slot.
  337|      0|    P = JSRegExp::getPattern(patternAsRegExp.get(), runtime).getHermesValue();
  338|       |    // b. If flags is undefined, let F be the value of pattern’s
  339|       |    // [[OriginalFlags]] internal slot.
  340|      0|    if (flags->isUndefined()) {
  ------------------
  |  Branch (340:9): [True: 0, False: 0]
  ------------------
  341|      0|      auto flagsStr =
  342|      0|          JSRegExp::getSyntaxFlags(patternAsRegExp.get()).toString();
  343|      0|      auto strRes = StringPrimitive::create(runtime, flagsStr);
  344|      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]
  |  |  ------------------
  ------------------
  345|      0|        return ExecutionStatus::EXCEPTION;
  346|      0|      }
  347|      0|      F = strRes.getValue();
  348|      0|    } else {
  349|       |      // c. Else, let F be flags.
  350|      0|      F = flags.getHermesValue();
  351|      0|    }
  352|      1|  } else if (patternIsRegExp) {
  ------------------
  |  Branch (352:14): [True: 0, False: 1]
  ------------------
  353|       |    // 6. Else if patternIsRegExp is true, then
  354|       |    //   a. Let P be Get(pattern, "source").
  355|       |    //   b. ReturnIfAbrupt(P).
  356|      0|    Handle<JSObject> patternObj = Handle<JSObject>::vmcast(pattern);
  357|      0|    propRes = JSObject::getNamed_RJS(
  358|      0|        patternObj, runtime, Predefined::getSymbolID(Predefined::source));
  359|      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]
  |  |  ------------------
  ------------------
  360|      0|      return ExecutionStatus::EXCEPTION;
  361|      0|    }
  362|      0|    P = std::move(propRes.getValue());
  363|       |    //   c. If flags is undefined, then
  364|      0|    if (flags->isUndefined()) {
  ------------------
  |  Branch (364:9): [True: 0, False: 0]
  ------------------
  365|       |      //   i. Let F be Get(pattern, "flags").
  366|       |      //   ii. ReturnIfAbrupt(F).
  367|      0|      propRes = JSObject::getNamed_RJS(
  368|      0|          patternObj, runtime, Predefined::getSymbolID(Predefined::flags));
  369|      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]
  |  |  ------------------
  ------------------
  370|      0|        return ExecutionStatus::EXCEPTION;
  371|      0|      }
  372|      0|      F = std::move(propRes.getValue());
  373|      0|    } else {
  374|       |      //   d. Else, let F be flags.
  375|      0|      F = flags.getHermesValue();
  376|      0|    }
  377|      1|  } else {
  378|       |    // 7. Else,
  379|       |    //   a. Let P be pattern.
  380|      1|    P = pattern.getHermesValue();
  381|       |    //   b. Let F be flags.
  382|      1|    F = flags.getHermesValue();
  383|      1|  }
  384|       |  // 8. Let O be RegExpAlloc(newTarget).
  385|       |  // 9. ReturnIfAbrupt(O).
  386|      1|  auto objRes = regExpAlloc(runtime, newTarget);
  387|      1|  if (LLVM_UNLIKELY(objRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  388|      0|    return ExecutionStatus::EXCEPTION;
  389|      0|  }
  390|       |  // 10. Return RegExpInitialize(O, P, F).
  391|      1|  auto regExpRes =
  392|      1|      regExpInitialize(runtime, runtime.makeHandle(objRes.getValue()), P, F);
  393|      1|  if (LLVM_UNLIKELY(regExpRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  394|      0|    return ExecutionStatus::EXCEPTION;
  395|      0|  }
  396|      1|  return Handle<JSObject>::vmcast(*regExpRes);
  397|      1|}

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

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

_ZN6hermes2vm23createStringConstructorERNS0_7RuntimeE:
   42|    160|Handle<JSObject> createStringConstructor(Runtime &runtime) {
   43|    160|  auto stringPrototype = Handle<JSString>::vmcast(&runtime.stringPrototype);
   44|       |
   45|    160|  auto cons = defineSystemConstructor<JSString>(
   46|    160|      runtime,
   47|    160|      Predefined::getSymbolID(Predefined::String),
   48|    160|      stringConstructor,
   49|    160|      stringPrototype,
   50|    160|      1,
   51|    160|      CellKind::JSStringKind);
   52|       |
   53|       |  // String.prototype.xxx methods.
   54|    160|  void *ctx = nullptr;
   55|    160|  defineMethod(
   56|    160|      runtime,
   57|    160|      stringPrototype,
   58|    160|      Predefined::getSymbolID(Predefined::toString),
   59|    160|      ctx,
   60|    160|      stringPrototypeToString,
   61|    160|      0);
   62|    160|  defineMethod(
   63|    160|      runtime,
   64|    160|      stringPrototype,
   65|    160|      Predefined::getSymbolID(Predefined::at),
   66|    160|      ctx,
   67|    160|      stringPrototypeAt,
   68|    160|      1);
   69|    160|  defineMethod(
   70|    160|      runtime,
   71|    160|      stringPrototype,
   72|    160|      Predefined::getSymbolID(Predefined::valueOf),
   73|    160|      ctx,
   74|    160|      stringPrototypeToString,
   75|    160|      0);
   76|    160|  defineMethod(
   77|    160|      runtime,
   78|    160|      stringPrototype,
   79|    160|      Predefined::getSymbolID(Predefined::charCodeAt),
   80|    160|      ctx,
   81|    160|      stringPrototypeCharCodeAt,
   82|    160|      1);
   83|    160|  defineMethod(
   84|    160|      runtime,
   85|    160|      stringPrototype,
   86|    160|      Predefined::getSymbolID(Predefined::codePointAt),
   87|    160|      ctx,
   88|    160|      stringPrototypeCodePointAt,
   89|    160|      1);
   90|    160|  defineMethod(
   91|    160|      runtime,
   92|    160|      stringPrototype,
   93|    160|      Predefined::getSymbolID(Predefined::concat),
   94|    160|      ctx,
   95|    160|      stringPrototypeConcat,
   96|    160|      1);
   97|    160|  defineMethod(
   98|    160|      runtime,
   99|    160|      stringPrototype,
  100|    160|      Predefined::getSymbolID(Predefined::substring),
  101|    160|      ctx,
  102|    160|      stringPrototypeSubstring,
  103|    160|      2);
  104|    160|  defineMethod(
  105|    160|      runtime,
  106|    160|      stringPrototype,
  107|    160|      Predefined::getSymbolID(Predefined::toLowerCase),
  108|    160|      ctx,
  109|    160|      stringPrototypeToLowerCase,
  110|    160|      0);
  111|    160|  defineMethod(
  112|    160|      runtime,
  113|    160|      stringPrototype,
  114|    160|      Predefined::getSymbolID(Predefined::toLocaleLowerCase),
  115|    160|      ctx,
  116|    160|      stringPrototypeToLocaleLowerCase,
  117|    160|      0);
  118|    160|  defineMethod(
  119|    160|      runtime,
  120|    160|      stringPrototype,
  121|    160|      Predefined::getSymbolID(Predefined::toUpperCase),
  122|    160|      ctx,
  123|    160|      stringPrototypeToUpperCase,
  124|    160|      0);
  125|    160|  defineMethod(
  126|    160|      runtime,
  127|    160|      stringPrototype,
  128|    160|      Predefined::getSymbolID(Predefined::toLocaleUpperCase),
  129|    160|      ctx,
  130|    160|      stringPrototypeToLocaleUpperCase,
  131|    160|      0);
  132|    160|  defineMethod(
  133|    160|      runtime,
  134|    160|      stringPrototype,
  135|    160|      Predefined::getSymbolID(Predefined::substr),
  136|    160|      ctx,
  137|    160|      stringPrototypeSubstr,
  138|    160|      2);
  139|    160|  defineMethod(
  140|    160|      runtime,
  141|    160|      stringPrototype,
  142|    160|      Predefined::getSymbolID(Predefined::trim),
  143|    160|      ctx,
  144|    160|      stringPrototypeTrim,
  145|    160|      0);
  146|    160|  defineMethod(
  147|    160|      runtime,
  148|    160|      stringPrototype,
  149|    160|      Predefined::getSymbolID(Predefined::localeCompare),
  150|    160|      ctx,
  151|    160|      stringPrototypeLocaleCompare,
  152|    160|      1);
  153|    160|  defineMethod(
  154|    160|      runtime,
  155|    160|      stringPrototype,
  156|    160|      Predefined::getSymbolID(Predefined::normalize),
  157|    160|      ctx,
  158|    160|      stringPrototypeNormalize,
  159|    160|      0);
  160|    160|  defineMethod(
  161|    160|      runtime,
  162|    160|      stringPrototype,
  163|    160|      Predefined::getSymbolID(Predefined::repeat),
  164|    160|      ctx,
  165|    160|      stringPrototypeRepeat,
  166|    160|      1);
  167|       |
  168|    160|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  169|    160|  auto trimStartRes =
  170|    160|      runtime.makeHandle<Callable>(runtime.ignoreAllocationFailure(defineMethod(
  171|    160|          runtime,
  172|    160|          stringPrototype,
  173|    160|          Predefined::getSymbolID(Predefined::trimStart),
  174|    160|          ctx,
  175|    160|          stringPrototypeTrimStart,
  176|    160|          0,
  177|    160|          dpf)));
  178|    160|  auto trimEndRes =
  179|    160|      runtime.makeHandle<Callable>(runtime.ignoreAllocationFailure(defineMethod(
  180|    160|          runtime,
  181|    160|          stringPrototype,
  182|    160|          Predefined::getSymbolID(Predefined::trimEnd),
  183|    160|          ctx,
  184|    160|          stringPrototypeTrimEnd,
  185|    160|          0,
  186|    160|          dpf)));
  187|       |
  188|    160|  defineProperty(
  189|    160|      runtime,
  190|    160|      stringPrototype,
  191|    160|      Predefined::getSymbolID(Predefined::trimLeft),
  192|    160|      trimStartRes);
  193|    160|  defineProperty(
  194|    160|      runtime,
  195|    160|      stringPrototype,
  196|    160|      Predefined::getSymbolID(Predefined::trimRight),
  197|    160|      trimEndRes);
  198|       |
  199|    160|  (void)defineMethod(
  200|    160|      runtime,
  201|    160|      stringPrototype,
  202|    160|      Predefined::getSymbolID(Predefined::SymbolIterator),
  203|    160|      Predefined::getSymbolID(Predefined::squareSymbolIterator),
  204|    160|      ctx,
  205|    160|      stringPrototypeSymbolIterator,
  206|    160|      0,
  207|    160|      dpf);
  208|       |
  209|       |  // String.xxx() methods.
  210|    160|  defineMethod(
  211|    160|      runtime,
  212|    160|      cons,
  213|    160|      Predefined::getSymbolID(Predefined::fromCharCode),
  214|    160|      ctx,
  215|    160|      stringFromCharCode,
  216|    160|      1);
  217|    160|  defineMethod(
  218|    160|      runtime,
  219|    160|      cons,
  220|    160|      Predefined::getSymbolID(Predefined::fromCodePoint),
  221|    160|      ctx,
  222|    160|      stringFromCodePoint,
  223|    160|      1);
  224|    160|  defineMethod(
  225|    160|      runtime,
  226|    160|      cons,
  227|    160|      Predefined::getSymbolID(Predefined::raw),
  228|    160|      ctx,
  229|    160|      stringRaw,
  230|    160|      1);
  231|    160|  defineMethod(
  232|    160|      runtime,
  233|    160|      stringPrototype,
  234|    160|      Predefined::getSymbolID(Predefined::matchAll),
  235|    160|      ctx,
  236|    160|      stringPrototypeMatchAll,
  237|    160|      1);
  238|    160|  defineMethod(
  239|    160|      runtime,
  240|    160|      stringPrototype,
  241|    160|      Predefined::getSymbolID(Predefined::replaceAll),
  242|    160|      ctx,
  243|    160|      stringPrototypeReplaceAll,
  244|    160|      2);
  245|    160|  defineMethod(
  246|    160|      runtime,
  247|    160|      stringPrototype,
  248|    160|      Predefined::getSymbolID(Predefined::match),
  249|    160|      ctx,
  250|    160|      stringPrototypeMatch,
  251|    160|      1);
  252|    160|  defineMethod(
  253|    160|      runtime,
  254|    160|      stringPrototype,
  255|    160|      Predefined::getSymbolID(Predefined::padEnd),
  256|    160|      (void *)false,
  257|    160|      stringPrototypePad,
  258|    160|      1);
  259|    160|  defineMethod(
  260|    160|      runtime,
  261|    160|      stringPrototype,
  262|    160|      Predefined::getSymbolID(Predefined::padStart),
  263|    160|      (void *)true,
  264|    160|      stringPrototypePad,
  265|    160|      1);
  266|    160|  defineMethod(
  267|    160|      runtime,
  268|    160|      stringPrototype,
  269|    160|      Predefined::getSymbolID(Predefined::replace),
  270|    160|      ctx,
  271|    160|      stringPrototypeReplace,
  272|    160|      2);
  273|    160|  defineMethod(
  274|    160|      runtime,
  275|    160|      stringPrototype,
  276|    160|      Predefined::getSymbolID(Predefined::search),
  277|    160|      ctx,
  278|    160|      stringPrototypeSearch,
  279|    160|      1);
  280|    160|  defineMethod(
  281|    160|      runtime,
  282|    160|      stringPrototype,
  283|    160|      Predefined::getSymbolID(Predefined::charAt),
  284|    160|      ctx,
  285|    160|      stringPrototypeCharAt,
  286|    160|      1);
  287|    160|  defineMethod(
  288|    160|      runtime,
  289|    160|      stringPrototype,
  290|    160|      Predefined::getSymbolID(Predefined::endsWith),
  291|    160|      ctx,
  292|    160|      stringPrototypeEndsWith,
  293|    160|      1);
  294|    160|  defineMethod(
  295|    160|      runtime,
  296|    160|      stringPrototype,
  297|    160|      Predefined::getSymbolID(Predefined::slice),
  298|    160|      ctx,
  299|    160|      stringPrototypeSlice,
  300|    160|      2);
  301|    160|  defineMethod(
  302|    160|      runtime,
  303|    160|      stringPrototype,
  304|    160|      Predefined::getSymbolID(Predefined::split),
  305|    160|      ctx,
  306|    160|      stringPrototypeSplit,
  307|    160|      2);
  308|    160|  defineMethod(
  309|    160|      runtime,
  310|    160|      stringPrototype,
  311|    160|      Predefined::getSymbolID(Predefined::includes),
  312|    160|      (void *)false,
  313|    160|      stringPrototypeIncludesOrStartsWith,
  314|    160|      1);
  315|    160|  defineMethod(
  316|    160|      runtime,
  317|    160|      stringPrototype,
  318|    160|      Predefined::getSymbolID(Predefined::indexOf),
  319|    160|      ctx,
  320|    160|      stringPrototypeIndexOf,
  321|    160|      1);
  322|    160|  defineMethod(
  323|    160|      runtime,
  324|    160|      stringPrototype,
  325|    160|      Predefined::getSymbolID(Predefined::lastIndexOf),
  326|    160|      ctx,
  327|    160|      stringPrototypeLastIndexOf,
  328|    160|      1);
  329|    160|  defineMethod(
  330|    160|      runtime,
  331|    160|      stringPrototype,
  332|    160|      Predefined::getSymbolID(Predefined::startsWith),
  333|    160|      (void *)true,
  334|    160|      stringPrototypeIncludesOrStartsWith,
  335|    160|      1);
  336|       |
  337|    160|  return cons;
  338|    160|}
_ZN6hermes2vm20stringPrototypeSplitEPvRNS0_7RuntimeENS0_10NativeArgsE:
 2346|      1|stringPrototypeSplit(void *, Runtime &runtime, NativeArgs args) {
 2347|      1|  GCScope gcScope{runtime};
 2348|       |
 2349|       |  // 1. Let O be ? RequireObjectCoercible(this value).
 2350|      1|  auto O = args.getThisHandle();
 2351|      1|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2352|      1|          checkObjectCoercible(runtime, O) == ExecutionStatus::EXCEPTION)) {
 2353|      0|    return ExecutionStatus::EXCEPTION;
 2354|      0|  }
 2355|       |  // 2. If separator is neither undefined nor null, then
 2356|      1|  auto separator = args.getArgHandle(0);
 2357|      1|  if (!separator->isUndefined() && !separator->isNull()) {
  ------------------
  |  Branch (2357:7): [True: 1, False: 0]
  |  Branch (2357:36): [True: 1, False: 0]
  ------------------
 2358|       |    // a. Let splitter be ? GetMethod(separator, @@split).
 2359|      1|    auto methodRes = getMethod(
 2360|      1|        runtime,
 2361|      1|        separator,
 2362|      1|        runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolSplit)));
 2363|      1|    if (LLVM_UNLIKELY(methodRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2364|      0|      return ExecutionStatus::EXCEPTION;
 2365|      0|    }
 2366|       |    // b. If splitter is not undefined, then
 2367|       |    // i. Return ? Call(splitter, separator, «‍O, limit»).
 2368|      1|    if (!methodRes->getHermesValue().isUndefined()) {
  ------------------
  |  Branch (2368:9): [True: 0, False: 1]
  ------------------
 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|      1|  }
 2380|       |
 2381|       |  // 3. Let S be ? ToString(O).
 2382|      1|  auto strRes = toString_RJS(runtime, args.getThisHandle());
 2383|      1|  if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2384|      0|    return ExecutionStatus::EXCEPTION;
 2385|      0|  }
 2386|      1|  auto S = runtime.makeHandle(std::move(*strRes));
 2387|       |
 2388|       |  // 4. Let A be ! ArrayCreate(0).
 2389|      1|  auto arrRes = JSArray::create(runtime, 0, 0);
 2390|      1|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2391|      0|    return ExecutionStatus::EXCEPTION;
 2392|      0|  }
 2393|      1|  auto A = *arrRes;
 2394|       |  // 5. Let lengthA be 0.
 2395|      1|  uint32_t lengthA = 0;
 2396|       |
 2397|       |  // 6. If limit is undefined, let lim be 232 - 1; else let lim be ?
 2398|       |  // ToUint32(limit).
 2399|      1|  auto limit = args.getArgHandle(1);
 2400|      1|  uint32_t lim;
 2401|      1|  if (limit->isUndefined()) {
  ------------------
  |  Branch (2401:7): [True: 1, False: 0]
  ------------------
 2402|       |    // No limit supplied, make it max.
 2403|      1|    lim = 0xffffffff; // 2 ^ 32 - 1
 2404|      1|  } 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|      1|  uint32_t s = S->getStringLength();
 2414|       |  // 8. Let p be 0.
 2415|       |  // End of the last match.
 2416|      1|  uint32_t p = 0;
 2417|       |
 2418|       |  // 9. Let R be ? ToString(separator).
 2419|       |  // The pattern which we want to separate on.
 2420|      1|  auto sepRes = toString_RJS(runtime, args.getArgHandle(0));
 2421|      1|  if (LLVM_UNLIKELY(sepRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2422|      0|    return ExecutionStatus::EXCEPTION;
 2423|      0|  }
 2424|      1|  Handle<StringPrimitive> R = runtime.makeHandle(std::move(sepRes.getValue()));
 2425|       |
 2426|       |  // 10. If lim = 0, return A.
 2427|      1|  if (lim == 0) {
  ------------------
  |  Branch (2427:7): [True: 0, False: 1]
  ------------------
 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|      1|  if (LLVM_UNLIKELY(separator->isUndefined())) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 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|      1|  if (s == 0) {
  ------------------
  |  Branch (2445:7): [True: 0, False: 1]
  ------------------
 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|      1|  uint32_t q = p;
 2466|       |
 2467|      1|  MutableHandle<> tmpHandle{runtime};
 2468|      1|  auto marker = gcScope.createMarker();
 2469|       |
 2470|       |  // 18. Repeat, while q ≠ s
 2471|       |  // Main loop: continue while we have space to find another match.
 2472|      5|  while (q != s) {
  ------------------
  |  Branch (2472:10): [True: 5, False: 0]
  ------------------
 2473|      5|    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|      5|    auto matchResult = splitMatch(runtime, S, q, R);
 2483|       |    // If we did find a match, fast-forward q to the start of that match.
 2484|      5|    if (matchResult) {
  ------------------
  |  Branch (2484:9): [True: 4, False: 1]
  ------------------
 2485|      4|      q = *matchResult - R->getStringLength();
 2486|      4|    }
 2487|      5|    if (!matchResult || q >= s) {
  ------------------
  |  Branch (2487:9): [True: 1, False: 4]
  |  Branch (2487:25): [True: 0, False: 4]
  ------------------
 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|      1|      break;
 2494|      1|    }
 2495|       |    // c. Else,
 2496|       |    // Found a match, so go ahead and update e, such that the match is the range
 2497|       |    // [q,e).
 2498|      4|    uint32_t e = *matchResult;
 2499|       |    // i. If e = p, set q to q + 1.
 2500|      4|    if (e == p) {
  ------------------
  |  Branch (2500:9): [True: 0, False: 4]
  ------------------
 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|      4|    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|      4|      auto strRes = StringPrimitive::slice(runtime, S, p, q - p);
 2517|      4|      if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 2518|      0|        return ExecutionStatus::EXCEPTION;
 2519|      0|      }
 2520|      4|      tmpHandle = *strRes;
 2521|       |      // 2. Perform ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T)
 2522|      4|      JSArray::setElementAt(A, runtime, lengthA, tmpHandle);
 2523|       |      // 3. Set lengthA to lengthA + 1.
 2524|      4|      ++lengthA;
 2525|       |
 2526|       |      // 4. If lengthA = lim, return A.
 2527|      4|      if (lengthA == lim) {
  ------------------
  |  Branch (2527:11): [True: 0, False: 4]
  ------------------
 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|      4|      p = e;
 2539|       |      // 6. Set q to p.
 2540|       |      // Start position of the next search is updated to the end of this match.
 2541|      4|      q = p;
 2542|      4|    }
 2543|      4|  }
 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|      1|  auto elementStrRes = StringPrimitive::slice(runtime, S, p, s - p);
 2549|      1|  if (LLVM_UNLIKELY(elementStrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2550|      0|    return ExecutionStatus::EXCEPTION;
 2551|      0|  }
 2552|      1|  tmpHandle = *elementStrRes;
 2553|       |  // 16. Perform ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T).
 2554|      1|  JSArray::setElementAt(A, runtime, lengthA, tmpHandle);
 2555|      1|  ++lengthA;
 2556|       |
 2557|      1|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2558|      1|          JSArray::setLengthProperty(A, runtime, lengthA) ==
 2559|      1|          ExecutionStatus::EXCEPTION))
 2560|      0|    return ExecutionStatus::EXCEPTION;
 2561|       |
 2562|       |  // 27. Return A.
 2563|      1|  return A.getHermesValue();
 2564|      1|}
String.cpp:_ZN6hermes2vmL10splitMatchERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEEjS5_:
 2314|      5|    Handle<StringPrimitive> R) {
 2315|       |  // 2. Let r be the number of code units in R.
 2316|      5|  auto r = R->getStringLength();
 2317|       |  // 3. Let s be the number of code units in S.
 2318|      5|  auto s = S->getStringLength();
 2319|       |  // 4. If q+r > s, return false.
 2320|      5|  if (q + r > s) {
  ------------------
  |  Branch (2320:7): [True: 0, False: 5]
  ------------------
 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|      5|  if (q == s) {
  ------------------
  |  Branch (2327:7): [True: 0, False: 5]
  ------------------
 2328|      0|    return q;
 2329|      0|  }
 2330|       |
 2331|      5|  auto SStr = StringPrimitive::createStringView(runtime, S);
 2332|      5|  auto RStr = StringPrimitive::createStringView(runtime, R);
 2333|       |
 2334|      5|  auto sliced = SStr.slice(q);
 2335|      5|  auto searchResult =
 2336|      5|      std::search(sliced.begin(), sliced.end(), RStr.begin(), RStr.end());
 2337|       |
 2338|      5|  if (searchResult != sliced.end()) {
  ------------------
  |  Branch (2338:7): [True: 4, False: 1]
  ------------------
 2339|      4|    return q + (searchResult - sliced.begin()) + r;
 2340|      4|  }
 2341|      1|  return llvh::None;
 2342|      5|}

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

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

_ZN6hermes2vm28createTextEncoderConstructorERNS0_7RuntimeE:
   17|    160|Handle<JSObject> createTextEncoderConstructor(Runtime &runtime) {
   18|    160|  auto textEncoderPrototype =
   19|    160|      Handle<JSObject>::vmcast(&runtime.textEncoderPrototype);
   20|       |
   21|       |  // Per https://webidl.spec.whatwg.org/#javascript-binding, @@toStringTag
   22|       |  // should be writable=false, enumerable=false, and configurable=true.
   23|    160|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
   24|    160|  dpf.writable = 0;
   25|    160|  defineProperty(
   26|    160|      runtime,
   27|    160|      textEncoderPrototype,
   28|    160|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   29|    160|      runtime.getPredefinedStringHandle(Predefined::TextEncoder),
   30|    160|      dpf);
   31|       |
   32|       |  // Based on
   33|       |  // Object.getOwnPropertyDescriptor(TextEncoder.prototype, 'encoding'), both
   34|       |  // Chrome and Safari have the 'encoding' property as enumerable and
   35|       |  // configurable. We set things up to be the same.
   36|    160|  defineAccessor(
   37|    160|      runtime,
   38|    160|      textEncoderPrototype,
   39|    160|      Predefined::getSymbolID(Predefined::encoding),
   40|    160|      nullptr,
   41|    160|      textEncoderPrototypeEncoding,
   42|    160|      nullptr,
   43|    160|      /* enumerable */ true,
   44|    160|      /* configurable */ true);
   45|       |
   46|    160|  defineMethod(
   47|    160|      runtime,
   48|    160|      textEncoderPrototype,
   49|    160|      Predefined::getSymbolID(Predefined::encode),
   50|    160|      nullptr,
   51|    160|      textEncoderPrototypeEncode,
   52|    160|      1);
   53|       |
   54|    160|  defineMethod(
   55|    160|      runtime,
   56|    160|      textEncoderPrototype,
   57|    160|      Predefined::getSymbolID(Predefined::encodeInto),
   58|    160|      nullptr,
   59|    160|      textEncoderPrototypeEncodeInto,
   60|    160|      2);
   61|       |
   62|    160|  auto cons = defineSystemConstructor<JSObject>(
   63|    160|      runtime,
   64|    160|      Predefined::getSymbolID(Predefined::TextEncoder),
   65|    160|      textEncoderConstructor,
   66|    160|      textEncoderPrototype,
   67|    160|      0,
   68|    160|      CellKind::JSObjectKind);
   69|       |
   70|    160|  defineProperty(
   71|    160|      runtime,
   72|    160|      textEncoderPrototype,
   73|    160|      Predefined::getSymbolID(Predefined::constructor),
   74|    160|      cons);
   75|       |
   76|    160|  return cons;
   77|    160|}

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

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

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

_ZN6hermes2vm6escapeEPvRNS0_7RuntimeENS0_10NativeArgsE:
   65|     18|CallResult<HermesValue> escape(void *, Runtime &runtime, NativeArgs args) {
   66|     18|  auto res = toString_RJS(runtime, args.getArgHandle(0));
   67|     18|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
   68|      0|    return ExecutionStatus::EXCEPTION;
   69|      0|  }
   70|     18|  auto string = runtime.makeHandle(std::move(*res));
   71|     18|  auto len = string->getStringLength();
   72|     18|  SmallU16String<32> R{};
   73|     18|  R.reserve(len);
   74|       |
   75|  4.11M|  for (char16_t c : StringPrimitive::createStringView(runtime, string)) {
  ------------------
  |  Branch (75:19): [True: 4.11M, False: 18]
  ------------------
   76|  4.11M|    if (noEscape(c)) {
  ------------------
  |  Branch (76:9): [True: 4.11M, False: 576]
  ------------------
   77|       |      // Just append.
   78|  4.11M|      R.push_back(c);
   79|  4.11M|    } else if (c < 256) {
  ------------------
  |  Branch (79:16): [True: 540, False: 36]
  ------------------
   80|       |      // R += "%xy" where xy is the 2 bytes of c.
   81|    540|      R.push_back(u'%');
   82|    540|      R.push_back(toHexChar((c >> 4) & 0xf));
   83|    540|      R.push_back(toHexChar(c & 0xf));
   84|    540|    } else {
   85|       |      // R += "%uwxyz" where wxyz is the 4 bytes of c.
   86|     36|      R.append(u"%u");
   87|     36|      R.push_back(toHexChar((c >> 12) & 0xf));
   88|     36|      R.push_back(toHexChar((c >> 8) & 0xf));
   89|     36|      R.push_back(toHexChar((c >> 4) & 0xf));
   90|     36|      R.push_back(toHexChar(c & 0xf));
   91|     36|    }
   92|  4.11M|  }
   93|       |
   94|     18|  return StringPrimitive::create(runtime, R);
   95|     18|}
_ZN6hermes2vm8unescapeEPvRNS0_7RuntimeENS0_10NativeArgsE:
   98|      1|CallResult<HermesValue> unescape(void *, Runtime &runtime, NativeArgs args) {
   99|      1|  auto res = toString_RJS(runtime, args.getArgHandle(0));
  100|      1|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  101|      0|    return ExecutionStatus::EXCEPTION;
  102|      0|  }
  103|      1|  auto strPrim = runtime.makeHandle(std::move(*res));
  104|      1|  auto len = strPrim->getStringLength();
  105|      1|  SmallU16String<32> R{};
  106|      1|  R.reserve(len);
  107|       |
  108|      1|  uint32_t k = 0;
  109|      1|  auto str = StringPrimitive::createStringView(runtime, strPrim);
  110|   213k|  while (k < len) {
  ------------------
  |  Branch (110:10): [True: 213k, False: 1]
  ------------------
  111|   213k|    char16_t c = str[k];
  112|       |    // Resultant char to append to R.
  113|   213k|    char16_t r = c;
  114|   213k|    if (c == u'%') {
  ------------------
  |  Branch (114:9): [True: 34, False: 213k]
  ------------------
  115|       |      // Try to read a hex string instead.
  116|     34|      if (k + 6 <= len && str[k + 1] == u'u' &&
  ------------------
  |  Branch (116:11): [True: 34, False: 0]
  |  Branch (116:11): [True: 0, False: 34]
  |  Branch (116:27): [True: 0, False: 34]
  ------------------
  117|     34|          std::all_of(str.begin() + k + 2, str.begin() + k + 6, isHexChar)) {
  ------------------
  |  Branch (117:11): [True: 0, False: 0]
  ------------------
  118|       |        // Long form %uwxyz
  119|      0|        r = (fromHexChar(str[k + 2]) << 12) | (fromHexChar(str[k + 3]) << 8) |
  120|      0|            (fromHexChar(str[k + 4]) << 4) | fromHexChar(str[k + 5]);
  121|      0|        k += 5;
  122|     34|      } else if (
  123|     34|          k + 3 <= len && isHexChar(str[k + 1]) && isHexChar(str[k + 2])) {
  ------------------
  |  Branch (123:11): [True: 34, False: 0]
  |  Branch (123:27): [True: 9, False: 25]
  |  Branch (123:52): [True: 0, False: 9]
  ------------------
  124|       |        // Short form %xy
  125|      0|        r = (fromHexChar(str[k + 1]) << 4) | fromHexChar(str[k + 2]);
  126|      0|        k += 2;
  127|      0|      }
  128|     34|    }
  129|   213k|    R.push_back(r);
  130|   213k|    ++k;
  131|   213k|  }
  132|       |
  133|      1|  return StringPrimitive::create(runtime, R);
  134|      1|}
_ZN6hermes2vm9encodeURIEPvRNS0_7RuntimeENS0_10NativeArgsE:
  233|   390k|CallResult<HermesValue> encodeURI(void *, Runtime &runtime, NativeArgs args) {
  234|   390k|  auto strRes = toString_RJS(runtime, args.getArgHandle(0));
  235|   390k|  if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
  236|      0|    return ExecutionStatus::EXCEPTION;
  237|      0|  }
  238|   390k|  auto res =
  239|   390k|      encode(runtime, runtime.makeHandle(std::move(*strRes)), unescapedURISet);
  240|   390k|  if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (240:7): [True: 0, False: 390k]
  ------------------
  241|      0|    return ExecutionStatus::EXCEPTION;
  242|   390k|  return res->getHermesValue();
  243|   390k|}
escape.cpp:_ZN6hermes2vmL8noEscapeEDs:
   29|  4.11M|static inline bool noEscape(char16_t c) {
   30|  4.11M|  return (u'A' <= c && c <= u'Z') || (u'a' <= c && c <= u'z') ||
  ------------------
  |  Branch (30:11): [True: 1.85k, False: 4.11M]
  |  Branch (30:24): [True: 1.38k, False: 468]
  |  Branch (30:39): [True: 468, False: 4.11M]
  |  Branch (30:52): [True: 414, False: 54]
  ------------------
   31|  4.11M|      (u'0' <= c && c <= u'9') || c == u'@' || c == u'*' || c == u'_' ||
  ------------------
  |  Branch (31:8): [True: 4.11M, False: 648]
  |  Branch (31:21): [True: 4.11M, False: 126]
  |  Branch (31:35): [True: 36, False: 738]
  |  Branch (31:48): [True: 0, False: 738]
  |  Branch (31:61): [True: 0, False: 738]
  ------------------
   32|  4.11M|      c == u'+' || c == u'-' || c == u'.' || c == '/';
  ------------------
  |  Branch (32:7): [True: 0, False: 738]
  |  Branch (32:20): [True: 0, False: 738]
  |  Branch (32:33): [True: 162, False: 576]
  |  Branch (32:46): [True: 0, False: 576]
  ------------------
   33|  4.11M|}
escape.cpp:_ZN6hermes2vmL9toHexCharEi:
   37|  3.12M|static inline char16_t toHexChar(int x) {
   38|  3.12M|  assert(0 <= x && x <= 15 && "toHexChar argument out of bounds");
   39|  3.12M|  if (0 <= x && x <= 9) {
  ------------------
  |  Branch (39:7): [True: 3.12M, False: 0]
  |  Branch (39:17): [True: 1.56M, False: 1.56M]
  ------------------
   40|  1.56M|    return x + u'0';
   41|  1.56M|  }
   42|  1.56M|  return x - 10 + u'A';
   43|  3.12M|}
escape.cpp:_ZN6hermes2vmL9isHexCharEDs:
   46|     43|static inline bool isHexChar(char16_t c) {
   47|       |  // Convert to lowercase.
   48|     43|  char16_t cLow = c | 32;
   49|     43|  return (u'0' <= c && c <= u'9') || (u'a' <= cLow && cLow <= 'f');
  ------------------
  |  Branch (49:11): [True: 34, False: 9]
  |  Branch (49:24): [True: 0, False: 34]
  |  Branch (49:39): [True: 33, False: 10]
  |  Branch (49:55): [True: 9, False: 24]
  ------------------
   50|     43|}
escape.cpp:_ZN6hermes2vmL6encodeERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEEPFbDsE:
  182|   390k|    CharSetFn unescapedSet) {
  183|   390k|  auto str = StringPrimitive::createStringView(runtime, strHandle);
  184|   390k|  auto strLen = str.length();
  185|   390k|  SmallU16String<32> R{};
  186|   390k|  R.reserve(strLen);
  187|  6.64M|  for (auto itr = str.begin(), e = str.end(); itr != e;) {
  ------------------
  |  Branch (187:47): [True: 6.25M, False: 390k]
  ------------------
  188|       |    // Use int32_t to allow for arithmetic past 16 bits.
  189|  6.25M|    uint32_t C = *itr;
  190|  6.25M|    if (unescapedSet(C)) {
  ------------------
  |  Branch (190:9): [True: 5.86M, False: 390k]
  ------------------
  191|  5.86M|      R.push_back(C);
  192|  5.86M|    } else {
  193|   390k|      if (C >= 0xdc00 && C <= 0xdfff) {
  ------------------
  |  Branch (193:11): [True: 0, False: 390k]
  |  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|   390k|      uint32_t V;
  198|   390k|      if (C < 0xd800 || C > 0xdbff) {
  ------------------
  |  Branch (198:11): [True: 0, False: 390k]
  |  Branch (198:25): [True: 0, False: 390k]
  ------------------
  199|      0|        V = C;
  200|   390k|      } else {
  201|   390k|        ++itr;
  202|   390k|        if (itr == e) {
  ------------------
  |  Branch (202:13): [True: 0, False: 390k]
  ------------------
  203|      0|          return runtime.raiseURIError("Malformed encodeURI input");
  204|      0|        }
  205|   390k|        uint32_t kChar = *itr;
  206|   390k|        if (kChar < 0xdc00 || kChar > 0xdfff) {
  ------------------
  |  Branch (206:13): [True: 0, False: 390k]
  |  Branch (206:31): [True: 0, False: 390k]
  ------------------
  207|      0|          return runtime.raiseURIError("Malformed encodeURI input");
  208|      0|        }
  209|   390k|        V = (C - 0xd800) * 0x400 + (kChar - 0xdc00) + 0x10000;
  210|   390k|      }
  211|   390k|      char octets[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
  212|   390k|      char *targetStart = octets;
  213|   390k|      hermes::encodeUTF8(targetStart, V);
  214|       |      // Length of the octets array.
  215|   390k|      uint32_t L = targetStart - octets;
  216|  1.95M|      for (uint32_t j = 0; j < L; ++j) {
  ------------------
  |  Branch (216:28): [True: 1.56M, False: 390k]
  ------------------
  217|  1.56M|        auto jOctet = octets[j];
  218|  1.56M|        R.push_back(u'%');
  219|  1.56M|        R.push_back(toHexChar((jOctet >> 4) & 0xf));
  220|  1.56M|        R.push_back(toHexChar(jOctet & 0xf));
  221|  1.56M|      }
  222|   390k|    }
  223|  6.25M|    ++itr;
  224|  6.25M|  }
  225|       |
  226|   390k|  auto finalStr = StringPrimitive::create(runtime, R);
  227|   390k|  if (LLVM_UNLIKELY(finalStr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
  228|      0|    return ExecutionStatus::EXCEPTION;
  229|      0|  }
  230|   390k|  return runtime.makeHandle<StringPrimitive>(*finalStr);
  231|   390k|}
escape.cpp:_ZN6hermes2vmL15unescapedURISetEDs:
  167|  6.25M|static bool unescapedURISet(char16_t c) {
  168|  6.25M|  return uriReserved(c) || uriUnescaped(c) || c == '#';
  ------------------
  |  Branch (168:10): [True: 781k, False: 5.47M]
  |  Branch (168:28): [True: 5.07M, False: 390k]
  |  Branch (168:47): [True: 0, False: 390k]
  ------------------
  169|  6.25M|}
escape.cpp:_ZN6hermes2vmL11uriReservedEDs:
  161|  6.25M|static bool uriReserved(char16_t c) {
  162|  6.25M|  const UTF16Ref reserved = removeNullTerminator(u";/?:@&=+$,");
  163|  6.25M|  return std::find(reserved.begin(), reserved.end(), c) != reserved.end();
  164|  6.25M|}
escape.cpp:_ZN6hermes2vmL20removeNullTerminatorEN4llvh8ArrayRefIDsEE:
  139|  11.7M|static inline UTF16Ref removeNullTerminator(const UTF16Ref str) {
  140|  11.7M|  return str.slice(0, str.size() - 1);
  141|  11.7M|}
escape.cpp:_ZN6hermes2vmL12uriUnescapedEDs:
  147|  5.47M|static bool uriUnescaped(char16_t c) {
  148|  5.47M|  const UTF16Ref marks = removeNullTerminator(u"-_.!~*'()");
  149|  5.47M|  if (std::find(marks.begin(), marks.end(), c) != marks.end()) {
  ------------------
  |  Branch (149:7): [True: 781k, False: 4.68M]
  ------------------
  150|   781k|    return true;
  151|   781k|  }
  152|  4.68M|  if (u'0' <= c && c <= u'9') {
  ------------------
  |  Branch (152:7): [True: 4.68M, False: 0]
  |  Branch (152:20): [True: 0, False: 4.68M]
  ------------------
  153|      0|    return true;
  154|      0|  }
  155|       |  // Convert to lowercase and see if it's alphabetic.
  156|  4.68M|  c |= 32;
  157|  4.68M|  return u'a' <= c && c <= u'z';
  ------------------
  |  Branch (157:10): [True: 4.68M, False: 0]
  |  Branch (157:23): [True: 4.29M, False: 390k]
  ------------------
  158|  4.68M|}

_ZN6hermes2vm17evalInEnvironmentERNS0_7RuntimeEN4llvh9StringRefENS0_6HandleINS0_11EnvironmentEEERKNS_10ScopeChainENS5_INS0_11HermesValueEEEbb:
   35|     87|    bool singleFunction) {
   36|       |#ifdef HERMESVM_LEAN
   37|       |  return runtime.raiseEvalUnsupported(utf8code);
   38|       |#else
   39|     87|  if (!runtime.enableEval) {
  ------------------
  |  Branch (39:7): [True: 0, False: 87]
  ------------------
   40|      0|    return runtime.raiseEvalUnsupported(utf8code);
   41|      0|  }
   42|       |
   43|     87|  hbc::CompileFlags compileFlags;
   44|     87|  compileFlags.strict = isStrict;
   45|     87|  compileFlags.includeLibHermes = false;
   46|     87|  compileFlags.verifyIR = runtime.verifyEvalIR;
   47|     87|  compileFlags.emitAsyncBreakCheck = runtime.asyncBreakCheckInEval;
   48|     87|  compileFlags.enableBlockScoping = runtime.enableBlockScopingInEval;
   49|     87|  compileFlags.lazy =
   50|     87|      utf8code.size() >= compileFlags.preemptiveFileCompilationThreshold;
   51|     87|  compileFlags.enableES6Classes = runtime.hasES6Class();
   52|     87|#ifdef HERMES_ENABLE_DEBUGGER
   53|       |  // Required to allow stepping and examining local variables in eval'd code
   54|     87|  compileFlags.debug = true;
   55|     87|#endif
   56|       |
   57|     87|  std::function<void(Module &)> runOptimizationPasses;
   58|       |#ifdef HERMESVM_ENABLE_OPTIMIZATION_AT_RUNTIME
   59|       |  if (runtime.optimizedEval)
   60|       |    runOptimizationPasses = runFullOptimizationPasses;
   61|       |#endif
   62|       |
   63|     87|  std::unique_ptr<hbc::BCProviderFromSrc> bytecode;
   64|     87|  {
   65|     87|    std::unique_ptr<hermes::Buffer> buffer;
   66|     87|    if (compileFlags.lazy) {
  ------------------
  |  Branch (66:9): [True: 84, False: 3]
  ------------------
   67|     84|      buffer.reset(new hermes::OwnedMemoryBuffer(
   68|     84|          llvh::MemoryBuffer::getMemBufferCopy(utf8code)));
   69|     84|    } else {
   70|      3|      buffer.reset(new hermes::OwnedMemoryBuffer(
   71|      3|          llvh::MemoryBuffer::getMemBuffer(utf8code)));
   72|      3|    }
   73|       |
   74|     87|    auto bytecode_err = hbc::BCProviderFromSrc::createBCProviderFromSrc(
   75|     87|        std::move(buffer),
   76|     87|        "",
   77|     87|        nullptr,
   78|     87|        compileFlags,
   79|     87|        scopeChain,
   80|     87|        {},
   81|     87|        nullptr,
   82|     87|        runOptimizationPasses);
   83|     87|    if (!bytecode_err.first) {
  ------------------
  |  Branch (83:9): [True: 5, False: 82]
  ------------------
   84|      5|      return runtime.raiseSyntaxError(TwineChar16(bytecode_err.second));
   85|      5|    }
   86|     82|    if (singleFunction && !bytecode_err.first->isSingleFunction()) {
  ------------------
  |  Branch (86:9): [True: 82, False: 0]
  |  Branch (86:27): [True: 0, False: 82]
  ------------------
   87|      0|      return runtime.raiseSyntaxError("Invalid function expression");
   88|      0|    }
   89|     82|    bytecode = std::move(bytecode_err.first);
   90|     82|  }
   91|       |
   92|       |  // TODO: pass a sourceURL derived from a '//# sourceURL' comment.
   93|      0|  llvh::StringRef sourceURL{};
   94|     82|  return runtime.runBytecode(
   95|     82|      std::move(bytecode),
   96|     82|      RuntimeModuleFlags{},
   97|     82|      sourceURL,
   98|     82|      environment,
   99|     82|      thisArg);
  100|     82|#endif
  101|     82|}
_ZN6hermes2vm10directEvalERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEERKNS_10ScopeChainEbb:
  108|     87|    bool singleFunction) {
  109|       |  // Convert the code into UTF8.
  110|     87|  std::string code;
  111|     87|  auto view = StringPrimitive::createStringView(runtime, str);
  112|     87|  if (view.isASCII()) {
  ------------------
  |  Branch (112:7): [True: 0, False: 87]
  ------------------
  113|      0|    code = std::string(view.begin(), view.end());
  114|     87|  } else {
  115|     87|    SmallU16String<4> allocator;
  116|     87|    convertUTF16ToUTF8WithReplacements(code, view.getUTF16Ref(allocator));
  117|     87|  }
  118|       |
  119|     87|  return evalInEnvironment(
  120|     87|      runtime,
  121|     87|      code,
  122|     87|      Runtime::makeNullHandle<Environment>(),
  123|     87|      scopeChain,
  124|     87|      runtime.getGlobal(),
  125|     87|      isStrict,
  126|     87|      singleFunction);
  127|     87|}

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

_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|   364k|    Handle<JSObject> parentHandle) {
   82|   364k|  auto *cell = runtime.makeAFixed<JSObject>(
   83|   364k|      runtime,
   84|   364k|      parentHandle,
   85|   364k|      runtime.getHiddenClassForPrototype(
   86|   364k|          *parentHandle, numOverlapSlots<JSObject>()),
   87|   364k|      GCPointerBase::NoBarriers());
   88|   364k|  return JSObjectInit::initToPseudoHandle(runtime, cell);
   89|   364k|}
_ZN6hermes2vm8JSObject6createERNS0_7RuntimeE:
   91|   357k|PseudoHandle<JSObject> JSObject::create(Runtime &runtime) {
   92|   357k|  return create(runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype));
   93|   357k|}
_ZN6hermes2vm8JSObject20initializeLazyObjectERNS0_7RuntimeENS0_6HandleIS1_EE:
  128|    454|    Handle<JSObject> lazyObject) {
  129|    454|  assert(lazyObject->flags_.lazyObject && "object must be lazy");
  130|       |  // object is now assumed to be a regular object.
  131|    454|  lazyObject->flags_.lazyObject = 0;
  132|       |
  133|       |  // only functions can be lazy.
  134|    454|  assert(vmisa<Callable>(lazyObject.get()) && "unexpected lazy object");
  135|    454|  Callable::defineLazyProperties(Handle<Callable>::vmcast(lazyObject), runtime);
  136|    454|}
_ZN6hermes2vm8JSObject14getPrototypeOfENS0_12PseudoHandleIS1_EERNS0_7RuntimeE:
  152|     45|    Runtime &runtime) {
  153|     45|  if (LLVM_LIKELY(!selfHandle->isProxyObject())) {
  ------------------
  |  |  188|     45|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 45, False: 0]
  |  |  ------------------
  ------------------
  154|     45|    return createPseudoHandle(selfHandle->getParent(runtime));
  155|     45|  }
  156|       |
  157|      0|  return JSProxy::getPrototypeOf(
  158|      0|      runtime.makeHandle(std::move(selfHandle)), runtime);
  159|     45|}
_ZN6hermes2vm8JSObject9setParentEPS1_RNS0_7RuntimeES2_NS0_11PropOpFlagsE:
  183|    242|    PropOpFlags opFlags) {
  184|    242|  if (LLVM_UNLIKELY(self->isProxyObject())) {
  ------------------
  |  |  189|    242|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 242]
  |  |  ------------------
  ------------------
  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|    242|  if (self->parent_.get(runtime) == parent)
  ------------------
  |  Branch (194:7): [True: 82, False: 160]
  ------------------
  195|     82|    return true;
  196|       |  // ES2022 10.4.7 Immutable Prototype Exotic Objects
  197|       |  // The [[SetPrototypeOf]] for %Object.prototype% is supposed to be
  198|       |  // SetImmutablePrototype, which returns false and subsequently throws
  199|       |  // when the argument isn't the same as the existing prototype,
  200|       |  // which we've already checked above.
  201|       |  // %Object.prototype% is the only object in the spec which is an immutable
  202|       |  // prototype exotic object.
  203|    160|  if (LLVM_UNLIKELY(self == runtime.objectPrototypeRawPtr)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  204|      0|    return runtime.raiseTypeError(
  205|      0|        "Cannot set prototype of immutable prototype object");
  206|      0|  }
  207|       |  // 5.
  208|    160|  if (!self->isExtensible()) {
  ------------------
  |  Branch (208:7): [True: 0, False: 160]
  ------------------
  209|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (209:9): [True: 0, False: 0]
  ------------------
  210|      0|      return runtime.raiseTypeError("Object is not extensible.");
  211|      0|    } else {
  212|      0|      return false;
  213|      0|    }
  214|      0|  }
  215|       |  // 6-8. Check for a prototype cycle.
  216|    320|  for (JSObject *cur = parent; cur; cur = cur->parent_.get(runtime)) {
  ------------------
  |  Branch (216:32): [True: 160, False: 160]
  ------------------
  217|    160|    if (cur == self) {
  ------------------
  |  Branch (217:9): [True: 0, False: 160]
  ------------------
  218|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (218:11): [True: 0, False: 0]
  ------------------
  219|      0|        return runtime.raiseTypeError("Prototype cycle detected");
  220|      0|      } else {
  221|      0|        return false;
  222|      0|      }
  223|    160|    } else if (LLVM_UNLIKELY(cur->isProxyObject())) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  224|       |      // TODO this branch should also be used for module namespace and
  225|       |      // immutable prototype exotic objects.
  226|      0|      break;
  227|      0|    }
  228|    160|  }
  229|       |  // 9.
  230|    160|  self->parent_.set(runtime, parent, runtime.getHeap());
  231|       |  // 10.
  232|    160|  return true;
  233|    160|}
_ZN6hermes2vm8JSObject22allocateNewSlotStorageENS0_6HandleIS1_EERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
  239|  1.14M|    Handle<> valueHandle) {
  240|       |  // If it is a direct property, just store the value and we are done.
  241|  1.14M|  if (LLVM_LIKELY(newSlotIndex < DIRECT_PROPERTY_SLOTS)) {
  ------------------
  |  |  188|  1.14M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 211k, False: 938k]
  |  |  ------------------
  ------------------
  242|   211k|    auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
  243|   211k|    selfHandle->directProps()[newSlotIndex].set(shv, runtime.getHeap());
  244|   211k|    return;
  245|   211k|  }
  246|       |
  247|       |  // Make the slot index relative to the indirect storage.
  248|   938k|  newSlotIndex -= DIRECT_PROPERTY_SLOTS;
  249|       |
  250|       |  // Allocate a new property storage if not already allocated.
  251|   938k|  if (LLVM_UNLIKELY(!selfHandle->propStorage_)) {
  ------------------
  |  |  189|   938k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 80.7k, False: 857k]
  |  |  ------------------
  ------------------
  252|       |    // Allocate new storage.
  253|  80.7k|    assert(newSlotIndex == 0 && "allocated slot must be at end");
  254|  80.7k|    auto arrRes = runtime.ignoreAllocationFailure(
  255|  80.7k|        PropStorage::create(runtime, DEFAULT_PROPERTY_CAPACITY));
  256|  80.7k|    selfHandle->propStorage_.setNonNull(
  257|  80.7k|        runtime, vmcast<PropStorage>(arrRes), runtime.getHeap());
  258|   857k|  } else if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   857k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 9.60k, False: 847k]
  |  |  ------------------
  ------------------
  259|   857k|                 newSlotIndex >=
  260|   857k|                 selfHandle->propStorage_.getNonNull(runtime)->capacity())) {
  261|       |    // Reallocate the existing one.
  262|  9.60k|    assert(
  263|  9.60k|        newSlotIndex == selfHandle->propStorage_.getNonNull(runtime)->size() &&
  264|  9.60k|        "allocated slot must be at end");
  265|  9.60k|    auto hnd = runtime.makeMutableHandle(selfHandle->propStorage_);
  266|  9.60k|    PropStorage::resize(hnd, runtime, newSlotIndex + 1);
  267|  9.60k|    selfHandle->propStorage_.setNonNull(runtime, *hnd, runtime.getHeap());
  268|  9.60k|  }
  269|       |
  270|   938k|  {
  271|   938k|    NoAllocScope scope{runtime};
  272|   938k|    auto *const propStorage = selfHandle->propStorage_.getNonNull(runtime);
  273|   938k|    if (newSlotIndex >= propStorage->size()) {
  ------------------
  |  Branch (273:9): [True: 928k, False: 9.60k]
  ------------------
  274|   928k|      assert(
  275|   928k|          newSlotIndex == propStorage->size() &&
  276|   928k|          "allocated slot must be at end");
  277|   928k|      PropStorage::resizeWithinCapacity(propStorage, runtime, newSlotIndex + 1);
  278|   928k|    }
  279|   938k|  }
  280|       |  // This must be done after the call to resizeWithinCapacity, since
  281|       |  // encodeHermesValue may allocate and cause the ArrayStorage to be trimmed.
  282|   938k|  auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
  283|       |  // If we don't need to resize, just store it directly.
  284|   938k|  selfHandle->propStorage_.getNonNull(runtime)->set(
  285|   938k|      newSlotIndex, shv, runtime.getHeap());
  286|   938k|}
_ZN6hermes2vm8JSObject25getNamedPropertyValue_RJSENS0_6HandleIS1_EERNS0_7RuntimeES3_NS0_23NamedPropertyDescriptorE:
  292|    241|    NamedPropertyDescriptor desc) {
  293|    241|  if (LLVM_LIKELY(!desc.flags.accessor))
  ------------------
  |  |  188|    241|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 241, False: 0]
  |  |  ------------------
  ------------------
  294|    241|    return getNamedSlotValue(propObj, runtime, desc);
  295|       |
  296|       |  // It's now valid to use the Internal variant because we know it's an
  297|       |  // accessor.
  298|      0|  auto *accessor = vmcast<PropertyAccessor>(
  299|      0|      getNamedSlotValueUnsafe(propObj.get(), runtime, desc).getObject(runtime));
  300|      0|  if (!accessor->getter)
  ------------------
  |  Branch (300:7): [True: 0, False: 0]
  ------------------
  301|      0|    return createPseudoHandle(HermesValue::encodeUndefinedValue());
  302|       |
  303|       |  // Execute the accessor on this object.
  304|      0|  return accessor->getter.getNonNull(runtime)->executeCall0(
  305|      0|      runtime.makeHandle(accessor->getter), runtime, selfHandle);
  306|      0|}
_ZN6hermes2vm8JSObject18getOwnPropertyKeysENS0_6HandleIS1_EERNS0_7RuntimeENS0_12OwnKeysFlagsE:
  364|     45|    OwnKeysFlags okFlags) {
  365|     45|  assert(
  366|     45|      (okFlags.getIncludeNonSymbols() || okFlags.getIncludeSymbols()) &&
  367|     45|      "Can't exclude symbols and strings");
  368|     45|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     90|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 45]
  |  |  |  Branch (189:53): [True: 0, False: 45]
  |  |  |  Branch (189:53): [True: 0, False: 45]
  |  |  ------------------
  ------------------
  369|     45|          selfHandle->flags_.lazyObject || selfHandle->flags_.proxyObject)) {
  370|      0|    if (selfHandle->flags_.proxyObject) {
  ------------------
  |  Branch (370:9): [True: 0, False: 0]
  ------------------
  371|      0|      CallResult<PseudoHandle<JSArray>> proxyRes =
  372|      0|          JSProxy::ownPropertyKeys(selfHandle, runtime, okFlags);
  373|      0|      if (LLVM_UNLIKELY(proxyRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  374|      0|        return ExecutionStatus::EXCEPTION;
  375|      0|      }
  376|      0|      return runtime.makeHandle(std::move(*proxyRes));
  377|      0|    }
  378|      0|    assert(selfHandle->flags_.lazyObject && "descriptor flags are impossible");
  379|      0|    initializeLazyObject(runtime, selfHandle);
  380|      0|  }
  381|       |
  382|     45|  auto range = getOwnIndexedRange(selfHandle.get(), runtime);
  383|       |
  384|       |  // Estimate the capacity of the output array.  This estimate is only
  385|       |  // reasonable for the non-symbol case.
  386|     45|  const uint32_t capacity = okFlags.getIncludeNonSymbols()
  ------------------
  |  Branch (386:29): [True: 45, False: 0]
  ------------------
  387|     45|      ? (selfHandle->clazz_.getNonNull(runtime)->getNumProperties() +
  388|     45|         range.second - range.first)
  389|     45|      : 0;
  390|       |
  391|     45|  auto arrayRes = JSArray::create(runtime, capacity, 0);
  392|     45|  if (LLVM_UNLIKELY(arrayRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     45|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 45]
  |  |  ------------------
  ------------------
  393|      0|    return ExecutionStatus::EXCEPTION;
  394|      0|  }
  395|     45|  auto array = *arrayRes;
  396|       |
  397|       |  // Optional array of SymbolIDs reported via host object API
  398|     45|  llvh::Optional<Handle<JSArray>> hostObjectSymbols;
  399|     45|  size_t hostObjectSymbolCount = 0;
  400|       |
  401|       |  // If current object is a host object we need to deduplicate its properties
  402|     45|  llvh::SmallSet<SymbolID::RawType, 16> dedupSet;
  403|       |
  404|       |  // Output index.
  405|     45|  uint32_t index = 0;
  406|       |
  407|       |  // Avoid allocating a new handle per element.
  408|     45|  MutableHandle<> tmpHandle{runtime};
  409|       |
  410|       |  // Number of indexed properties.
  411|     45|  uint32_t numIndexed = 0;
  412|       |
  413|       |  // Regular properties with names that are array indexes are stashed here, if
  414|       |  // encountered.
  415|     45|  llvh::SmallVector<uint32_t, 8> indexNames{};
  416|       |
  417|       |  // Iterate the named properties excluding those which use Symbols.
  418|     45|  if (okFlags.getIncludeNonSymbols()) {
  ------------------
  |  Branch (418:7): [True: 45, False: 0]
  ------------------
  419|       |    // Get host object property names
  420|     45|    if (LLVM_UNLIKELY(selfHandle->flags_.hostObject)) {
  ------------------
  |  |  189|     45|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 45]
  |  |  ------------------
  ------------------
  421|      0|      assert(
  422|      0|          range.first == range.second &&
  423|      0|          "Host objects cannot own indexed range");
  424|      0|      auto hostSymbolsRes =
  425|      0|          vmcast<HostObject>(selfHandle.get())->getHostPropertyNames();
  426|      0|      if (hostSymbolsRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (426:11): [True: 0, False: 0]
  ------------------
  427|      0|        return ExecutionStatus::EXCEPTION;
  428|      0|      }
  429|      0|      if ((hostObjectSymbolCount = (**hostSymbolsRes)->getEndIndex()) != 0) {
  ------------------
  |  Branch (429:11): [True: 0, False: 0]
  ------------------
  430|      0|        Handle<JSArray> hostSymbols = *hostSymbolsRes;
  431|      0|        hostObjectSymbols = std::move(hostSymbols);
  432|      0|      }
  433|      0|    }
  434|       |
  435|       |    // Iterate the indexed properties.
  436|     45|    GCScopeMarkerRAII marker{runtime};
  437|   840k|    for (auto i = range.first; i != range.second; ++i) {
  ------------------
  |  Branch (437:32): [True: 840k, False: 45]
  ------------------
  438|   840k|      auto res = getOwnIndexedPropertyFlags(selfHandle.get(), runtime, i);
  439|   840k|      if (!res)
  ------------------
  |  Branch (439:11): [True: 0, False: 840k]
  ------------------
  440|      0|        continue;
  441|       |
  442|       |      // If specified, check whether it is enumerable.
  443|   840k|      if (!okFlags.getIncludeNonEnumerable() && !res->enumerable)
  ------------------
  |  Branch (443:11): [True: 840k, False: 0]
  |  Branch (443:49): [True: 0, False: 840k]
  ------------------
  444|      0|        continue;
  445|       |
  446|   840k|      tmpHandle = HermesValue::encodeUntrustedNumberValue(i);
  447|   840k|      JSArray::setElementAt(array, runtime, index++, tmpHandle);
  448|   840k|      marker.flush();
  449|   840k|    }
  450|       |
  451|     45|    numIndexed = index;
  452|       |
  453|     45|    HiddenClass::forEachProperty(
  454|     45|        runtime.makeHandle(selfHandle->clazz_),
  455|     45|        runtime,
  456|     45|        [&runtime,
  457|     45|         okFlags,
  458|     45|         array,
  459|     45|         hostObjectSymbolCount,
  460|     45|         &index,
  461|     45|         &indexNames,
  462|     45|         &tmpHandle,
  463|     45|         &dedupSet](SymbolID id, NamedPropertyDescriptor desc) {
  464|     45|          if (!isPropertyNamePrimitive(id)) {
  465|     45|            return;
  466|     45|          }
  467|       |
  468|       |          // If specified, check whether it is enumerable.
  469|     45|          if (!okFlags.getIncludeNonEnumerable()) {
  470|     45|            if (!desc.flags.enumerable)
  471|     45|              return;
  472|     45|          }
  473|       |
  474|       |          // Host properties might overlap with the ones recognized by the
  475|       |          // hidden class. If we're dealing with a host object then keep track
  476|       |          // of hidden class properties for the deduplication purposes.
  477|     45|          if (LLVM_UNLIKELY(hostObjectSymbolCount > 0)) {
  478|     45|            dedupSet.insert(id.unsafeGetRaw());
  479|     45|          }
  480|       |
  481|       |          // Check if this property is an integer index. If it is, we stash it
  482|       |          // away to deal with it later. This check should be fast since most
  483|       |          // property names don't start with a digit.
  484|     45|          auto propNameAsIndex = toArrayIndex(
  485|     45|              runtime.getIdentifierTable().getStringView(runtime, id));
  486|     45|          if (LLVM_UNLIKELY(propNameAsIndex)) {
  487|     45|            indexNames.push_back(*propNameAsIndex);
  488|     45|            return;
  489|     45|          }
  490|       |
  491|     45|          tmpHandle = HermesValue::encodeStringValue(
  492|     45|              runtime.getStringPrimFromSymbolID(id));
  493|     45|          JSArray::setElementAt(array, runtime, index++, tmpHandle);
  494|     45|        });
  495|       |
  496|       |    // Iterate over HostObject properties and append them to the array. Do not
  497|       |    // append duplicates.
  498|     45|    if (LLVM_UNLIKELY(hostObjectSymbols)) {
  ------------------
  |  |  189|     45|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 45]
  |  |  ------------------
  ------------------
  499|      0|      for (size_t i = 0; i < hostObjectSymbolCount; ++i) {
  ------------------
  |  Branch (499:26): [True: 0, False: 0]
  ------------------
  500|      0|        assert(
  501|      0|            (*hostObjectSymbols)->at(runtime, i).isSymbol() &&
  502|      0|            "Host object needs to return array of SymbolIDs");
  503|      0|        marker.flush();
  504|      0|        SymbolID id = (*hostObjectSymbols)->at(runtime, i).getSymbol();
  505|      0|        if (dedupSet.count(id.unsafeGetRaw()) == 0) {
  ------------------
  |  Branch (505:13): [True: 0, False: 0]
  ------------------
  506|      0|          dedupSet.insert(id.unsafeGetRaw());
  507|       |
  508|      0|          assert(
  509|      0|              !InternalProperty::isInternal(id) &&
  510|      0|              "host object returned reserved symbol");
  511|      0|          auto propNameAsIndex = toArrayIndex(
  512|      0|              runtime.getIdentifierTable().getStringView(runtime, id));
  513|      0|          if (LLVM_UNLIKELY(propNameAsIndex)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  514|      0|            indexNames.push_back(*propNameAsIndex);
  515|      0|            continue;
  516|      0|          }
  517|      0|          tmpHandle = HermesValue::encodeStringValue(
  518|      0|              runtime.getStringPrimFromSymbolID(id));
  519|      0|          JSArray::setElementAt(array, runtime, index++, tmpHandle);
  520|      0|        }
  521|      0|      }
  522|      0|    }
  523|     45|  }
  524|       |
  525|       |  // Now iterate the named properties again, including only Symbols.
  526|       |  // We could iterate only once, if we chose to ignore (and disallow)
  527|       |  // own properties on HostObjects, as we do with Proxies.
  528|     45|  if (okFlags.getIncludeSymbols()) {
  ------------------
  |  Branch (528:7): [True: 0, False: 45]
  ------------------
  529|      0|    MutableHandle<SymbolID> idHandle{runtime};
  530|      0|    HiddenClass::forEachProperty(
  531|      0|        runtime.makeHandle(selfHandle->clazz_),
  532|      0|        runtime,
  533|      0|        [&runtime, okFlags, array, &index, &idHandle](
  534|      0|            SymbolID id, NamedPropertyDescriptor desc) {
  535|      0|          if (!isSymbolPrimitive(id)) {
  536|      0|            return;
  537|      0|          }
  538|       |          // If specified, check whether it is enumerable.
  539|      0|          if (!okFlags.getIncludeNonEnumerable()) {
  540|      0|            if (!desc.flags.enumerable)
  541|      0|              return;
  542|      0|          }
  543|      0|          idHandle = id;
  544|      0|          JSArray::setElementAt(array, runtime, index++, idHandle);
  545|      0|        });
  546|      0|  }
  547|       |
  548|       |  // The end (exclusive) of the named properties.
  549|     45|  uint32_t endNamed = index;
  550|       |
  551|       |  // Properly set the length of the array.
  552|     45|  auto cr = JSArray::setLength(
  553|     45|      array, runtime, endNamed + indexNames.size(), PropOpFlags{});
  554|     45|  (void)cr;
  555|     45|  assert(
  556|     45|      cr != ExecutionStatus::EXCEPTION && *cr && "JSArray::setLength() failed");
  557|       |
  558|       |  // If we have no index-like names, we are done.
  559|     45|  if (LLVM_LIKELY(indexNames.empty()))
  ------------------
  |  |  188|     45|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 45, False: 0]
  |  |  ------------------
  ------------------
  560|     45|    return array;
  561|       |
  562|       |  // In the unlikely event that we encountered index-like names, we need to sort
  563|       |  // them and merge them with the real indexed properties. Note that it is
  564|       |  // guaranteed that there are no clashes.
  565|      0|  std::sort(indexNames.begin(), indexNames.end());
  566|       |
  567|       |  // Also make space for the new elements by shifting all the named properties
  568|       |  // to the right. First, resize the array.
  569|      0|  JSArray::setStorageEndIndex(array, runtime, endNamed + indexNames.size());
  570|       |
  571|       |  // Shift the non-index property names. The region [numIndexed..endNamed) is
  572|       |  // moved to [numIndexed+indexNames.size()..array->size()).
  573|       |  // TODO: optimize this by implementing memcpy-like functionality in ArrayImpl.
  574|      0|  for (uint32_t last = endNamed, toLast = array->getEndIndex();
  575|      0|       last != numIndexed;) {
  ------------------
  |  Branch (575:8): [True: 0, False: 0]
  ------------------
  576|      0|    --last;
  577|      0|    --toLast;
  578|      0|    tmpHandle = array->at(runtime, last).unboxToHV(runtime);
  579|      0|    JSArray::setElementAt(array, runtime, toLast, tmpHandle);
  580|      0|  }
  581|       |
  582|       |  // Now we need to merge the indexes in indexNames and the array
  583|       |  // [0..numIndexed). We start from the end and copy the larger element from
  584|       |  // either array.
  585|       |  // 1+ the destination position to copy into.
  586|      0|  for (uint32_t toLast = numIndexed + indexNames.size(),
  587|      0|                indexNamesLast = indexNames.size();
  588|      0|       toLast != 0;) {
  ------------------
  |  Branch (588:8): [True: 0, False: 0]
  ------------------
  589|      0|    if (numIndexed) {
  ------------------
  |  Branch (589:9): [True: 0, False: 0]
  ------------------
  590|      0|      uint32_t a =
  591|      0|          (uint32_t)array->at(runtime, numIndexed - 1).getNumber(runtime);
  592|      0|      uint32_t b;
  593|       |
  594|      0|      if (indexNamesLast && (b = indexNames[indexNamesLast - 1]) > a) {
  ------------------
  |  Branch (594:11): [True: 0, False: 0]
  |  Branch (594:29): [True: 0, False: 0]
  ------------------
  595|      0|        tmpHandle = HermesValue::encodeTrustedNumberValue(b);
  596|      0|        --indexNamesLast;
  597|      0|      } else {
  598|      0|        tmpHandle = HermesValue::encodeTrustedNumberValue(a);
  599|      0|        --numIndexed;
  600|      0|      }
  601|      0|    } else {
  602|      0|      assert(indexNamesLast && "prematurely ran out of source values");
  603|      0|      tmpHandle = HermesValue::encodeUntrustedNumberValue(
  604|      0|          indexNames[indexNamesLast - 1]);
  605|      0|      --indexNamesLast;
  606|      0|    }
  607|       |
  608|      0|    --toLast;
  609|      0|    JSArray::setElementAt(array, runtime, toLast, tmpHandle);
  610|      0|  }
  611|       |
  612|      0|  return array;
  613|      0|}
_ZN6hermes2vm8JSObject24getNamedDescriptorUnsafeENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsERNS0_23NamedPropertyDescriptorE:
  883|  4.35M|    NamedPropertyDescriptor &desc) {
  884|  4.35M|  if (findProperty(selfHandle, runtime, name, expectedFlags, desc))
  ------------------
  |  Branch (884:7): [True: 1.33M, False: 3.02M]
  ------------------
  885|  1.33M|    return *selfHandle;
  886|       |
  887|       |  // Check here for host object flag.  This means that "normal" own
  888|       |  // properties above win over host-defined properties, but there's no
  889|       |  // cost imposed on own property lookups.  This should do what we
  890|       |  // need in practice, and we can define host vs js property
  891|       |  // disambiguation however we want.  This is here in order to avoid
  892|       |  // impacting perf for the common case where an own property exists
  893|       |  // in normal storage.
  894|  3.02M|  if (LLVM_UNLIKELY(selfHandle->flags_.hostObject)) {
  ------------------
  |  |  189|  3.02M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 12, False: 3.02M]
  |  |  ------------------
  ------------------
  895|     12|    desc.flags.hostObject = true;
  896|     12|    desc.flags.writable = true;
  897|     12|    desc.slot = name.unsafeGetRaw();
  898|     12|    return *selfHandle;
  899|     12|  }
  900|       |
  901|  3.02M|  if (LLVM_UNLIKELY(selfHandle->flags_.lazyObject)) {
  ------------------
  |  |  189|  3.02M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 372, False: 3.02M]
  |  |  ------------------
  ------------------
  902|    372|    assert(
  903|    372|        !selfHandle->flags_.proxyObject &&
  904|    372|        "Proxy objects should never be lazy");
  905|       |    // Initialize the object and perform the lookup again.
  906|    372|    JSObject::initializeLazyObject(runtime, selfHandle);
  907|       |
  908|    372|    if (findProperty(selfHandle, runtime, name, expectedFlags, desc))
  ------------------
  |  Branch (908:9): [True: 0, False: 372]
  ------------------
  909|      0|      return *selfHandle;
  910|    372|  }
  911|       |
  912|  3.02M|  if (LLVM_UNLIKELY(selfHandle->flags_.proxyObject)) {
  ------------------
  |  |  189|  3.02M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.02M]
  |  |  ------------------
  ------------------
  913|      0|    desc.flags.proxyObject = true;
  914|      0|    desc.slot = name.unsafeGetRaw();
  915|      0|    return *selfHandle;
  916|      0|  }
  917|       |
  918|  3.02M|  if (selfHandle->parent_) {
  ------------------
  |  Branch (918:7): [True: 3.02M, False: 0]
  ------------------
  919|  3.02M|    MutableHandle<JSObject> mutableSelfHandle{
  920|  3.02M|        runtime, selfHandle->parent_.getNonNull(runtime)};
  921|       |
  922|  3.42M|    do {
  923|       |      // Check the most common case first, at the cost of some code duplication.
  924|  3.42M|      if (LLVM_LIKELY(
  ------------------
  |  |  188|  13.6M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.42M, False: 0]
  |  |  |  Branch (188:51): [True: 3.42M, False: 0]
  |  |  |  Branch (188:51): [True: 3.42M, False: 0]
  |  |  |  Branch (188:51): [True: 3.42M, False: 0]
  |  |  ------------------
  ------------------
  925|  3.42M|              !mutableSelfHandle->flags_.lazyObject &&
  926|  3.42M|              !mutableSelfHandle->flags_.hostObject &&
  927|  3.42M|              !mutableSelfHandle->flags_.proxyObject)) {
  928|  3.42M|      findProp:
  929|  3.42M|        if (findProperty(
  ------------------
  |  Branch (929:13): [True: 2.66M, False: 757k]
  ------------------
  930|  3.42M|                mutableSelfHandle,
  931|  3.42M|                runtime,
  932|  3.42M|                name,
  933|  3.42M|                PropertyFlags::invalid(),
  934|  3.42M|                desc)) {
  935|  2.66M|          assert(
  936|  2.66M|              !selfHandle->flags_.proxyObject &&
  937|  2.66M|              "Proxy object parents should never have own properties");
  938|  2.66M|          return *mutableSelfHandle;
  939|  2.66M|        }
  940|  3.42M|      } 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]
  |  |  ------------------
  ------------------
  941|      0|        JSObject::initializeLazyObject(runtime, mutableSelfHandle);
  942|      0|        goto findProp;
  943|      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]
  |  |  ------------------
  ------------------
  944|      0|        desc.flags.hostObject = true;
  945|      0|        desc.flags.writable = true;
  946|      0|        desc.slot = name.unsafeGetRaw();
  947|      0|        return *mutableSelfHandle;
  948|      0|      } else {
  949|      0|        assert(
  950|      0|            mutableSelfHandle->flags_.proxyObject &&
  951|      0|            "descriptor flags are impossible");
  952|      0|        desc.flags.proxyObject = true;
  953|      0|        desc.slot = name.unsafeGetRaw();
  954|      0|        return *mutableSelfHandle;
  955|      0|      }
  956|  3.42M|    } while ((mutableSelfHandle = mutableSelfHandle->parent_.get(runtime)));
  ------------------
  |  Branch (956:14): [True: 396k, False: 361k]
  ------------------
  957|  3.02M|  }
  958|       |
  959|   361k|  return nullptr;
  960|  3.02M|}
_ZN6hermes2vm8JSObject30getComputedPrimitiveDescriptorENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEERNS0_13MutableHandleIS1_EERNS8_INS0_8SymbolIDEEERNS0_26ComputedPropertyDescriptorE:
  968|  3.64M|    ComputedPropertyDescriptor &desc) {
  969|  3.64M|  assert(
  970|  3.64M|      !nameValHandle->isObject() &&
  971|  3.64M|      "nameValHandle passed to "
  972|  3.64M|      "getComputedPrimitiveDescriptor cannot "
  973|  3.64M|      "be an object");
  974|       |
  975|  3.64M|  propObj = selfHandle.get();
  976|       |
  977|  3.64M|  SymbolID id{};
  978|       |
  979|  3.64M|  GCScopeMarkerRAII marker{runtime};
  980|  6.64M|  do {
  981|       |    // A proxy is ignored here so we can check the bit later and
  982|       |    // return it back to the caller for additional processing.
  983|       |
  984|  6.64M|    Handle<JSObject> loopHandle = propObj;
  985|       |
  986|  6.64M|    CallResult<bool> res = getOwnComputedPrimitiveDescriptorImpl(
  987|  6.64M|        loopHandle,
  988|  6.64M|        runtime,
  989|  6.64M|        nameValHandle,
  990|  6.64M|        IgnoreProxy::Yes,
  991|  6.64M|        id,
  992|  6.64M|        tmpSymbolStorage,
  993|  6.64M|        desc);
  994|  6.64M|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  6.64M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6.64M]
  |  |  ------------------
  ------------------
  995|      0|      return ExecutionStatus::EXCEPTION;
  996|      0|    }
  997|  6.64M|    if (*res) {
  ------------------
  |  Branch (997:9): [True: 1.57M, False: 5.07M]
  ------------------
  998|  1.57M|      return ExecutionStatus::RETURNED;
  999|  1.57M|    }
 1000|       |
 1001|  5.07M|    if (LLVM_UNLIKELY(propObj->flags_.hostObject)) {
  ------------------
  |  |  189|  5.07M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 390k, False: 4.68M]
  |  |  ------------------
  ------------------
 1002|   390k|      desc.flags.hostObject = true;
 1003|   390k|      desc.flags.writable = true;
 1004|   390k|      desc.slot = id.unsafeGetRaw();
 1005|   390k|      tmpSymbolStorage = id;
 1006|   390k|      return ExecutionStatus::RETURNED;
 1007|   390k|    }
 1008|  4.68M|    if (LLVM_UNLIKELY(propObj->flags_.proxyObject)) {
  ------------------
  |  |  189|  4.68M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.68M]
  |  |  ------------------
  ------------------
 1009|      0|      desc.flags.proxyObject = true;
 1010|      0|      desc.slot = id.unsafeGetRaw();
 1011|      0|      tmpSymbolStorage = id;
 1012|      0|      return ExecutionStatus::RETURNED;
 1013|      0|    }
 1014|       |    // This isn't a proxy, so use the faster getParent() instead of
 1015|       |    // getPrototypeOf.
 1016|  4.68M|    propObj = propObj->getParent(runtime);
 1017|       |    // Flush at the end of the loop to allow first iteration to be as fast as
 1018|       |    // possible.
 1019|  4.68M|    marker.flush();
 1020|  4.68M|  } while (propObj);
  ------------------
  |  Branch (1020:12): [True: 3.00M, False: 1.68M]
  ------------------
 1021|  1.68M|  return ExecutionStatus::RETURNED;
 1022|  3.64M|}
_ZN6hermes2vm8JSObject24getNamedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS2_INS0_11HermesValueEEENS0_11PropOpFlagsEPNS0_18PropertyCacheEntryE:
 1045|  3.80M|    PropertyCacheEntry *cacheEntry) {
 1046|  3.80M|  NamedPropertyDescriptor desc;
 1047|       |  // Locate the descriptor. propObj contains the object which may be anywhere
 1048|       |  // along the prototype chain.
 1049|  3.80M|  JSObject *propObj = getNamedDescriptorUnsafe(selfHandle, runtime, name, desc);
 1050|  3.80M|  if (!propObj) {
  ------------------
  |  Branch (1050:7): [True: 355k, False: 3.45M]
  ------------------
 1051|   355k|    if (LLVM_UNLIKELY(opFlags.getMustExist())) {
  ------------------
  |  |  189|   355k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 45, False: 355k]
  |  |  ------------------
  ------------------
 1052|     45|      return runtime.raiseReferenceError(
 1053|     45|          TwineChar16("Property '") +
 1054|     45|          runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1055|     45|          "' doesn't exist");
 1056|     45|    }
 1057|   355k|    return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1058|   355k|  }
 1059|       |
 1060|  3.45M|  if (LLVM_LIKELY(
  ------------------
  |  |  188|  13.8M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.45M, False: 76]
  |  |  |  Branch (188:51): [True: 3.45M, False: 70]
  |  |  |  Branch (188:51): [True: 3.45M, False: 6]
  |  |  |  Branch (188:51): [True: 3.45M, False: 0]
  |  |  ------------------
  ------------------
 1061|  3.45M|          !desc.flags.accessor && !desc.flags.hostObject &&
 1062|  3.45M|          !desc.flags.proxyObject)) {
 1063|       |    // Populate the cache if requested.
 1064|  3.45M|    if (cacheEntry && !propObj->getClass(runtime)->isDictionaryNoCache()) {
  ------------------
  |  Branch (1064:9): [True: 324, False: 3.45M]
  |  Branch (1064:23): [True: 324, False: 0]
  ------------------
 1065|    324|      cacheEntry->clazz = propObj->getClassGCPtr();
 1066|    324|      cacheEntry->slot = desc.slot;
 1067|    324|    }
 1068|  3.45M|    return createPseudoHandle(
 1069|  3.45M|        getNamedSlotValueUnsafe(propObj, runtime, desc).unboxToHV(runtime));
 1070|  3.45M|  }
 1071|       |
 1072|     76|  if (desc.flags.accessor) {
  ------------------
  |  Branch (1072:7): [True: 70, False: 6]
  ------------------
 1073|     70|    auto *accessor = vmcast<PropertyAccessor>(
 1074|     70|        getNamedSlotValueUnsafe(propObj, runtime, desc).getPointer(runtime));
 1075|     70|    if (!accessor->getter)
  ------------------
  |  Branch (1075:9): [True: 0, False: 70]
  ------------------
 1076|      0|      return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1077|       |
 1078|       |    // Execute the accessor on this object.
 1079|     70|    return Callable::executeCall0(
 1080|     70|        runtime.makeHandle(accessor->getter), runtime, receiver);
 1081|     70|  } else if (desc.flags.hostObject) {
  ------------------
  |  Branch (1081:14): [True: 6, False: 0]
  ------------------
 1082|      6|    auto res = vmcast<HostObject>(propObj)->get(name);
 1083|      6|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      6|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6]
  |  |  ------------------
  ------------------
 1084|      0|      return ExecutionStatus::EXCEPTION;
 1085|      0|    }
 1086|      6|    return createPseudoHandle(*res);
 1087|      6|  } else {
 1088|      0|    assert(desc.flags.proxyObject && "descriptor flags are impossible");
 1089|      0|    return JSProxy::getNamed(
 1090|      0|        runtime.makeHandle(propObj), runtime, name, receiver);
 1091|      0|  }
 1092|     76|}
_ZN6hermes2vm8JSObject27getComputedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEES7_:
 1121|  2.52M|    Handle<> receiver) {
 1122|       |  // Try the fast-path first: no "index-like" properties and the "name" already
 1123|       |  // is a valid integer index.
 1124|  2.52M|  if (selfHandle->flags_.fastIndexProperties) {
  ------------------
  |  Branch (1124:7): [True: 662k, False: 1.86M]
  ------------------
 1125|   662k|    if (auto arrayIndex = toArrayIndexFastPath(*nameValHandle)) {
  ------------------
  |  Branch (1125:14): [True: 271k, False: 390k]
  ------------------
 1126|       |      // Do we have this value present in our array storage? If so, return it.
 1127|   271k|      PseudoHandle<> ourValue =
 1128|   271k|          createPseudoHandle(getOwnIndexed(selfHandle, runtime, *arrayIndex));
 1129|   271k|      if (LLVM_LIKELY(!ourValue->isEmpty()))
  ------------------
  |  |  188|   271k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 271k]
  |  |  ------------------
  ------------------
 1130|      0|        return ourValue;
 1131|   271k|    }
 1132|   662k|  }
 1133|       |
 1134|       |  // If nameValHandle is an object, we should convert it to string now,
 1135|       |  // because toString may have side-effect, and we want to do this only
 1136|       |  // once.
 1137|  2.52M|  auto converted = toPropertyKeyIfObject(runtime, nameValHandle);
 1138|  2.52M|  if (LLVM_UNLIKELY(converted == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  2.52M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.52M]
  |  |  ------------------
  ------------------
 1139|      0|    return ExecutionStatus::EXCEPTION;
 1140|      0|  }
 1141|  2.52M|  auto nameValPrimitiveHandle = *converted;
 1142|       |
 1143|  2.52M|  ComputedPropertyDescriptor desc;
 1144|       |
 1145|       |  // Locate the descriptor. propObj contains the object which may be anywhere
 1146|       |  // along the prototype chain.
 1147|  2.52M|  MutableHandle<JSObject> propObj{runtime};
 1148|  2.52M|  MutableHandle<SymbolID> tmpPropNameStorage{runtime};
 1149|  2.52M|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  2.52M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.52M]
  |  |  ------------------
  ------------------
 1150|  2.52M|          getComputedPrimitiveDescriptor(
 1151|  2.52M|              selfHandle,
 1152|  2.52M|              runtime,
 1153|  2.52M|              nameValPrimitiveHandle,
 1154|  2.52M|              propObj,
 1155|  2.52M|              tmpPropNameStorage,
 1156|  2.52M|              desc) == ExecutionStatus::EXCEPTION)) {
 1157|      0|    return ExecutionStatus::EXCEPTION;
 1158|      0|  }
 1159|       |
 1160|  2.52M|  if (!propObj)
  ------------------
  |  Branch (1160:7): [True: 1.40M, False: 1.12M]
  ------------------
 1161|  1.40M|    return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1162|       |
 1163|  1.12M|  if (LLVM_LIKELY(
  ------------------
  |  |  188|  4.09M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 729k, False: 390k]
  |  |  |  Branch (188:51): [True: 1.12M, False: 0]
  |  |  |  Branch (188:51): [True: 729k, False: 390k]
  |  |  |  Branch (188:51): [True: 729k, False: 0]
  |  |  ------------------
  ------------------
 1164|  1.12M|          !desc.flags.accessor && !desc.flags.hostObject &&
 1165|  1.12M|          !desc.flags.proxyObject)) {
 1166|   729k|    return createPseudoHandle(getComputedSlotValueUnsafe(
 1167|   729k|        createPseudoHandle(propObj.get()), runtime, desc));
 1168|   729k|  }
 1169|       |
 1170|   390k|  if (desc.flags.accessor) {
  ------------------
  |  Branch (1170:7): [True: 0, False: 390k]
  ------------------
 1171|      0|    auto *accessor = vmcast<PropertyAccessor>(getComputedSlotValueUnsafe(
 1172|      0|        createPseudoHandle(propObj.get()), runtime, desc));
 1173|      0|    if (!accessor->getter)
  ------------------
  |  Branch (1173:9): [True: 0, False: 0]
  ------------------
 1174|      0|      return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1175|       |
 1176|       |    // Execute the accessor on this object.
 1177|      0|    return accessor->getter.getNonNull(runtime)->executeCall0(
 1178|      0|        runtime.makeHandle(accessor->getter), runtime, receiver);
 1179|   390k|  } else if (desc.flags.hostObject) {
  ------------------
  |  Branch (1179:14): [True: 390k, False: 0]
  ------------------
 1180|   390k|    SymbolID id{};
 1181|   390k|    LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  635|   390k|  do {                                                          \
  |  |  636|   390k|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 390k, False: 0]
  |  |  ------------------
  |  |  637|   390k|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|   390k|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|   390k|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|   390k|      id = **idRes;                                             \
  |  |  643|   390k|    }                                                           \
  |  |  644|   390k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1182|   390k|    auto propRes = vmcast<HostObject>(propObj.get())->get(id);
 1183|   390k|    if (propRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (1183:9): [True: 0, False: 390k]
  ------------------
 1184|      0|      return ExecutionStatus::EXCEPTION;
 1185|   390k|    return createPseudoHandle(*propRes);
 1186|   390k|  } else {
 1187|      0|    assert(desc.flags.proxyObject && "descriptor flags are impossible");
 1188|      0|    CallResult<Handle<>> key = toPropertyKey(runtime, nameValPrimitiveHandle);
 1189|      0|    if (key == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (1189:9): [True: 0, False: 0]
  ------------------
 1190|      0|      return ExecutionStatus::EXCEPTION;
 1191|      0|    return JSProxy::getComputed(propObj, runtime, *key, receiver);
 1192|      0|  }
 1193|   390k|}
_ZN6hermes2vm8JSObject24putNamedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS2_INS0_11HermesValueEEES8_NS0_11PropOpFlagsE:
 1337|   549k|    PropOpFlags opFlags) {
 1338|   549k|  NamedPropertyDescriptor desc;
 1339|       |
 1340|       |  // Look for the property in this object or along the prototype chain.
 1341|       |  // `name` will not be freed before this function returns,
 1342|       |  // so it will outlive the lifetime of `desc`.
 1343|   549k|  JSObject *propObj = getNamedDescriptorUnsafe(
 1344|   549k|      selfHandle,
 1345|   549k|      runtime,
 1346|   549k|      name,
 1347|   549k|      PropertyFlags::defaultNewNamedPropertyFlags(),
 1348|   549k|      desc);
 1349|       |
 1350|       |  // If the property exists (or, we hit a proxy/hostobject on the way
 1351|       |  // up the chain)
 1352|   549k|  if (propObj) {
  ------------------
  |  Branch (1352:7): [True: 543k, False: 6.09k]
  ------------------
 1353|       |    // Get the simple case out of the way: If the property already
 1354|       |    // exists on selfHandle, is not an accessor, selfHandle and
 1355|       |    // receiver are the same, selfHandle is not a host
 1356|       |    // object/proxy/internal setter, and the property is writable,
 1357|       |    // just write into the same slot.
 1358|       |
 1359|   543k|    if (LLVM_LIKELY(
  ------------------
  |  |  188|  4.89M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 543k]
  |  |  |  Branch (188:51): [True: 543k, False: 0]
  |  |  |  Branch (188:51): [True: 543k, False: 0]
  |  |  |  Branch (188:51): [True: 543k, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 543k]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1360|   543k|            *selfHandle == propObj &&
 1361|   543k|            selfHandle.getHermesValue().getRaw() == receiver->getRaw() &&
 1362|   543k|            !desc.flags.accessor && !desc.flags.internalSetter &&
 1363|   543k|            !desc.flags.hostObject && !desc.flags.proxyObject &&
 1364|   543k|            desc.flags.writable)) {
 1365|      0|      auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
 1366|      0|      setNamedSlotValueUnsafe(*selfHandle, runtime, desc, shv);
 1367|      0|      return true;
 1368|      0|    }
 1369|       |
 1370|   543k|    if (LLVM_UNLIKELY(desc.flags.accessor)) {
  ------------------
  |  |  189|   543k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 543k]
  |  |  ------------------
  ------------------
 1371|      0|      auto *accessor = vmcast<PropertyAccessor>(
 1372|      0|          getNamedSlotValueUnsafe(propObj, runtime, desc).getObject(runtime));
 1373|       |
 1374|       |      // If it is a read-only accessor, fail.
 1375|      0|      if (!accessor->setter) {
  ------------------
  |  Branch (1375:11): [True: 0, False: 0]
  ------------------
 1376|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1376:13): [True: 0, False: 0]
  ------------------
 1377|      0|          return runtime.raiseTypeError(
 1378|      0|              TwineChar16("Cannot assign to property '") +
 1379|      0|              runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1380|      0|              "' which has only a getter");
 1381|      0|        }
 1382|      0|        return false;
 1383|      0|      }
 1384|       |
 1385|       |      // Execute the accessor on this object.
 1386|      0|      if (accessor->setter.getNonNull(runtime)->executeCall1(
  ------------------
  |  Branch (1386:11): [True: 0, False: 0]
  ------------------
 1387|      0|              runtime.makeHandle(accessor->setter),
 1388|      0|              runtime,
 1389|      0|              receiver,
 1390|      0|              *valueHandle) == ExecutionStatus::EXCEPTION) {
 1391|      0|        return ExecutionStatus::EXCEPTION;
 1392|      0|      }
 1393|      0|      return true;
 1394|      0|    }
 1395|       |
 1396|   543k|    if (LLVM_UNLIKELY(desc.flags.proxyObject)) {
  ------------------
  |  |  189|   543k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 543k]
  |  |  ------------------
  ------------------
 1397|      0|      assert(
 1398|      0|          !opFlags.getMustExist() &&
 1399|      0|          "MustExist cannot be used with Proxy objects");
 1400|      0|      CallResult<bool> setRes = JSProxy::setNamed(
 1401|      0|          runtime.makeHandle(propObj), runtime, name, valueHandle, receiver);
 1402|      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]
  |  |  ------------------
  ------------------
 1403|      0|        return ExecutionStatus::EXCEPTION;
 1404|      0|      }
 1405|      0|      if (!*setRes && opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1405:11): [True: 0, False: 0]
  |  Branch (1405:23): [True: 0, False: 0]
  ------------------
 1406|      0|        return runtime.raiseTypeError(
 1407|      0|            TwineChar16("Proxy set returned false for property '") +
 1408|      0|            runtime.getIdentifierTable().getStringView(runtime, name) + "'");
 1409|      0|      }
 1410|      0|      return setRes;
 1411|      0|    }
 1412|       |
 1413|   543k|    if (LLVM_UNLIKELY(!desc.flags.writable)) {
  ------------------
  |  |  189|   543k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 543k]
  |  |  ------------------
  ------------------
 1414|      0|      if (desc.flags.staticBuiltin) {
  ------------------
  |  Branch (1414:11): [True: 0, False: 0]
  ------------------
 1415|      0|        return raiseErrorForOverridingStaticBuiltin(
 1416|      0|            selfHandle, runtime, runtime.makeHandle(name));
 1417|      0|      }
 1418|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1418:11): [True: 0, False: 0]
  ------------------
 1419|      0|        return runtime.raiseTypeError(
 1420|      0|            TwineChar16("Cannot assign to read-only property '") +
 1421|      0|            runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1422|      0|            "'");
 1423|      0|      }
 1424|      0|      return false;
 1425|      0|    }
 1426|       |
 1427|   543k|    if (*selfHandle == propObj && desc.flags.internalSetter) {
  ------------------
  |  Branch (1427:9): [True: 543k, False: 0]
  |  Branch (1427:35): [True: 543k, False: 0]
  ------------------
 1428|   543k|      return internalSetter(
 1429|   543k|          selfHandle, runtime, name, desc, valueHandle, opFlags);
 1430|   543k|    }
 1431|   543k|  }
 1432|       |
 1433|       |  // The property does not exist as an conventional own property on
 1434|       |  // this object.
 1435|       |
 1436|  6.09k|  MutableHandle<JSObject> receiverHandle{runtime, *selfHandle};
 1437|  6.09k|  MutableHandle<SymbolID> tmpSymbolStorage{runtime};
 1438|  6.09k|  if (selfHandle.getHermesValue().getRaw() != receiver->getRaw() ||
  ------------------
  |  Branch (1438:7): [True: 0, False: 6.09k]
  |  Branch (1438:7): [True: 0, False: 6.09k]
  ------------------
 1439|  6.09k|      receiverHandle->isHostObject() || receiverHandle->isProxyObject()) {
  ------------------
  |  Branch (1439:7): [True: 0, False: 6.09k]
  |  Branch (1439:41): [True: 0, False: 6.09k]
  ------------------
 1440|      0|    if (selfHandle.getHermesValue().getRaw() != receiver->getRaw()) {
  ------------------
  |  Branch (1440:9): [True: 0, False: 0]
  ------------------
 1441|      0|      receiverHandle = dyn_vmcast<JSObject>(*receiver);
 1442|      0|    }
 1443|      0|    if (!receiverHandle) {
  ------------------
  |  Branch (1443:9): [True: 0, False: 0]
  ------------------
 1444|      0|      return false;
 1445|      0|    }
 1446|       |
 1447|      0|    if (getOwnNamedDescriptor(receiverHandle, runtime, name, desc)) {
  ------------------
  |  Branch (1447:9): [True: 0, False: 0]
  ------------------
 1448|      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]
  |  |  ------------------
  ------------------
 1449|      0|        return false;
 1450|      0|      }
 1451|       |
 1452|      0|      assert(
 1453|      0|          !receiverHandle->isHostObject() && !receiverHandle->isProxyObject() &&
 1454|      0|          "getOwnNamedDescriptor never sets hostObject or proxyObject flags");
 1455|      0|      auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
 1456|      0|      setNamedSlotValueUnsafe(*receiverHandle, runtime, desc, shv);
 1457|      0|      return true;
 1458|      0|    }
 1459|       |
 1460|       |    // Now deal with host and proxy object cases.  We need to call
 1461|       |    // getOwnComputedPrimitiveDescriptor because it knows how to call
 1462|       |    // the [[getOwnProperty]] Proxy impl if needed.
 1463|      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]
  |  |  ------------------
  ------------------
 1464|      0|            receiverHandle->isHostObject() ||
 1465|      0|            receiverHandle->isProxyObject())) {
 1466|      0|      if (receiverHandle->isHostObject()) {
  ------------------
  |  Branch (1466:11): [True: 0, False: 0]
  ------------------
 1467|      0|        return vmcast<HostObject>(receiverHandle.get())
 1468|      0|            ->set(name, *valueHandle);
 1469|      0|      }
 1470|      0|      ComputedPropertyDescriptor desc;
 1471|       |      // getOwnComputedPrimitiveDescriptor and JSProxy::defineOwnProperty expect
 1472|       |      // the key to be passed in as a primitive string value rather than a
 1473|       |      // symbol, if it actually did come from a string.
 1474|      0|      Handle<> nameValHandle = name.isUniqued()
  ------------------
  |  Branch (1474:32): [True: 0, False: 0]
  ------------------
 1475|      0|          ? runtime.makeHandle(HermesValue::encodeStringValue(
 1476|      0|                runtime.getStringPrimFromSymbolID(name)))
 1477|      0|          : runtime.makeHandle(name);
 1478|      0|      CallResult<bool> descDefinedRes = getOwnComputedPrimitiveDescriptor(
 1479|      0|          receiverHandle,
 1480|      0|          runtime,
 1481|      0|          nameValHandle,
 1482|      0|          IgnoreProxy::No,
 1483|      0|          tmpSymbolStorage,
 1484|      0|          desc);
 1485|      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]
  |  |  ------------------
  ------------------
 1486|      0|        return ExecutionStatus::EXCEPTION;
 1487|      0|      }
 1488|      0|      DefinePropertyFlags dpf;
 1489|      0|      if (*descDefinedRes) {
  ------------------
  |  Branch (1489:11): [True: 0, False: 0]
  ------------------
 1490|      0|        dpf.setValue = 1;
 1491|      0|      } else {
 1492|      0|        dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
 1493|      0|      }
 1494|      0|      return JSProxy::defineOwnProperty(
 1495|      0|          receiverHandle, runtime, nameValHandle, dpf, valueHandle, opFlags);
 1496|      0|    }
 1497|      0|  }
 1498|       |
 1499|       |  // Does the caller require it to exist?
 1500|  6.09k|  if (LLVM_UNLIKELY(opFlags.getMustExist())) {
  ------------------
  |  |  189|  6.09k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6.09k]
  |  |  ------------------
  ------------------
 1501|      0|    return runtime.raiseReferenceError(
 1502|      0|        TwineChar16("Property '") +
 1503|      0|        runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1504|      0|        "' doesn't exist");
 1505|      0|  }
 1506|       |
 1507|       |  // Add a new property.
 1508|       |
 1509|  6.09k|  return addOwnProperty(
 1510|  6.09k|      receiverHandle,
 1511|  6.09k|      runtime,
 1512|  6.09k|      name,
 1513|  6.09k|      DefinePropertyFlags::getDefaultNewPropertyFlags(),
 1514|  6.09k|      valueHandle,
 1515|  6.09k|      opFlags);
 1516|  6.09k|}
_ZN6hermes2vm8JSObject27putComputedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEES7_S7_NS0_11PropOpFlagsE:
 1550|   272k|    PropOpFlags opFlags) {
 1551|   272k|  assert(
 1552|   272k|      !opFlags.getMustExist() &&
 1553|   272k|      "mustExist flag cannot be used with computed properties");
 1554|       |
 1555|       |  // Try the fast-path first: has "index-like" properties, the "name"
 1556|       |  // already is a valid integer index, selfHandle and receiver are the
 1557|       |  // same, and it is present in storage.
 1558|   272k|  if (selfHandle->flags_.fastIndexProperties) {
  ------------------
  |  Branch (1558:7): [True: 271k, False: 160]
  ------------------
 1559|   271k|    if (auto arrayIndex = toArrayIndexFastPath(*nameValHandle)) {
  ------------------
  |  Branch (1559:14): [True: 271k, False: 0]
  ------------------
 1560|   271k|      if (selfHandle.getHermesValue().getRaw() == receiver->getRaw()) {
  ------------------
  |  Branch (1560:11): [True: 271k, False: 0]
  ------------------
 1561|   271k|        if (haveOwnIndexed(selfHandle.get(), runtime, *arrayIndex)) {
  ------------------
  |  Branch (1561:13): [True: 0, False: 271k]
  ------------------
 1562|      0|          auto result =
 1563|      0|              setOwnIndexed(selfHandle, runtime, *arrayIndex, valueHandle);
 1564|      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]
  |  |  ------------------
  ------------------
 1565|      0|            return ExecutionStatus::EXCEPTION;
 1566|      0|          if (LLVM_LIKELY(*result))
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1567|      0|            return true;
 1568|      0|          if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1568:15): [True: 0, False: 0]
  ------------------
 1569|       |            // TODO: better message.
 1570|      0|            return runtime.raiseTypeError(
 1571|      0|                "Cannot assign to read-only property");
 1572|      0|          }
 1573|      0|          return false;
 1574|      0|        }
 1575|   271k|      }
 1576|   271k|    }
 1577|   271k|  }
 1578|       |
 1579|       |  // If nameValHandle is an object, we should convert it to string now,
 1580|       |  // because toString may have side-effect, and we want to do this only
 1581|       |  // once.
 1582|   272k|  auto converted = toPropertyKeyIfObject(runtime, nameValHandle);
 1583|   272k|  if (LLVM_UNLIKELY(converted == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   272k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 272k]
  |  |  ------------------
  ------------------
 1584|      0|    return ExecutionStatus::EXCEPTION;
 1585|      0|  }
 1586|   272k|  auto nameValPrimitiveHandle = *converted;
 1587|       |
 1588|   272k|  ComputedPropertyDescriptor desc;
 1589|       |
 1590|       |  // Look for the property in this object or along the prototype chain.
 1591|   272k|  MutableHandle<JSObject> propObj{runtime};
 1592|   272k|  MutableHandle<SymbolID> tmpSymbolStorage{runtime};
 1593|   272k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   272k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 272k]
  |  |  ------------------
  ------------------
 1594|   272k|          getComputedPrimitiveDescriptor(
 1595|   272k|              selfHandle,
 1596|   272k|              runtime,
 1597|   272k|              nameValPrimitiveHandle,
 1598|   272k|              propObj,
 1599|   272k|              tmpSymbolStorage,
 1600|   272k|              desc) == ExecutionStatus::EXCEPTION)) {
 1601|      0|    return ExecutionStatus::EXCEPTION;
 1602|      0|  }
 1603|       |
 1604|       |  // If the property exists (or, we hit a proxy/hostobject on the way
 1605|       |  // up the chain)
 1606|   272k|  if (propObj) {
  ------------------
  |  Branch (1606:7): [True: 0, False: 272k]
  ------------------
 1607|       |    // Get the simple case out of the way: If the property already
 1608|       |    // exists on selfHandle, is not an accessor, selfHandle and
 1609|       |    // receiver are the same, selfHandle is not a host
 1610|       |    // object/proxy/internal setter, and the property is writable,
 1611|       |    // just write into the same slot.
 1612|       |
 1613|      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]
  |  |  ------------------
  ------------------
 1614|      0|            selfHandle == propObj &&
 1615|      0|            selfHandle.getHermesValue().getRaw() == receiver->getRaw() &&
 1616|      0|            !desc.flags.accessor && !desc.flags.internalSetter &&
 1617|      0|            !desc.flags.hostObject && !desc.flags.proxyObject &&
 1618|      0|            desc.flags.writable)) {
 1619|      0|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1620|      0|              setComputedSlotValueUnsafe(
 1621|      0|                  selfHandle, runtime, desc, valueHandle) ==
 1622|      0|              ExecutionStatus::EXCEPTION)) {
 1623|      0|        return ExecutionStatus::EXCEPTION;
 1624|      0|      }
 1625|      0|      return true;
 1626|      0|    }
 1627|       |
 1628|       |    // Is it an accessor?
 1629|      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]
  |  |  ------------------
  ------------------
 1630|      0|      auto *accessor = vmcast<PropertyAccessor>(
 1631|      0|          getComputedSlotValueUnsafe(propObj, runtime, desc));
 1632|       |
 1633|       |      // If it is a read-only accessor, fail.
 1634|      0|      if (!accessor->setter) {
  ------------------
  |  Branch (1634:11): [True: 0, False: 0]
  ------------------
 1635|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1635:13): [True: 0, False: 0]
  ------------------
 1636|      0|          return runtime.raiseTypeErrorForValue(
 1637|      0|              "Cannot assign to property ",
 1638|      0|              nameValPrimitiveHandle,
 1639|      0|              " which has only a getter");
 1640|      0|        }
 1641|      0|        return false;
 1642|      0|      }
 1643|       |
 1644|       |      // Execute the accessor on this object.
 1645|      0|      if (accessor->setter.getNonNull(runtime)->executeCall1(
  ------------------
  |  Branch (1645:11): [True: 0, False: 0]
  ------------------
 1646|      0|              runtime.makeHandle(accessor->setter),
 1647|      0|              runtime,
 1648|      0|              receiver,
 1649|      0|              valueHandle.get()) == ExecutionStatus::EXCEPTION) {
 1650|      0|        return ExecutionStatus::EXCEPTION;
 1651|      0|      }
 1652|      0|      return true;
 1653|      0|    }
 1654|       |
 1655|      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]
  |  |  ------------------
  ------------------
 1656|      0|      assert(
 1657|      0|          !opFlags.getMustExist() &&
 1658|      0|          "MustExist cannot be used with Proxy objects");
 1659|      0|      CallResult<Handle<>> key = toPropertyKey(runtime, nameValPrimitiveHandle);
 1660|      0|      if (key == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (1660:11): [True: 0, False: 0]
  ------------------
 1661|      0|        return ExecutionStatus::EXCEPTION;
 1662|      0|      CallResult<bool> setRes =
 1663|      0|          JSProxy::setComputed(propObj, runtime, *key, valueHandle, receiver);
 1664|      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]
  |  |  ------------------
  ------------------
 1665|      0|        return ExecutionStatus::EXCEPTION;
 1666|      0|      }
 1667|      0|      if (!*setRes && opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1667:11): [True: 0, False: 0]
  |  Branch (1667:23): [True: 0, False: 0]
  ------------------
 1668|       |        // TODO: better message.
 1669|      0|        return runtime.raiseTypeError(
 1670|      0|            TwineChar16("Proxy trap returned false for property"));
 1671|      0|      }
 1672|      0|      return setRes;
 1673|      0|    }
 1674|       |
 1675|      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]
  |  |  ------------------
  ------------------
 1676|      0|      if (desc.flags.staticBuiltin) {
  ------------------
  |  Branch (1676:11): [True: 0, False: 0]
  ------------------
 1677|      0|        SymbolID id{};
 1678|      0|        LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  635|      0|  do {                                                          \
  |  |  636|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|      0|      id = **idRes;                                             \
  |  |  643|      0|    }                                                           \
  |  |  644|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1679|      0|        return raiseErrorForOverridingStaticBuiltin(
 1680|      0|            selfHandle, runtime, runtime.makeHandle(id));
 1681|      0|      }
 1682|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1682:11): [True: 0, False: 0]
  ------------------
 1683|      0|        return runtime.raiseTypeErrorForValue(
 1684|      0|            "Cannot assign to read-only property ", nameValPrimitiveHandle, "");
 1685|      0|      }
 1686|      0|      return false;
 1687|      0|    }
 1688|       |
 1689|      0|    if (selfHandle == propObj && desc.flags.internalSetter) {
  ------------------
  |  Branch (1689:9): [True: 0, False: 0]
  |  Branch (1689:34): [True: 0, False: 0]
  ------------------
 1690|      0|      SymbolID id{};
 1691|      0|      LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  635|      0|  do {                                                          \
  |  |  636|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|      0|      id = **idRes;                                             \
  |  |  643|      0|    }                                                           \
  |  |  644|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1692|      0|      return internalSetter(
 1693|      0|          selfHandle,
 1694|      0|          runtime,
 1695|      0|          id,
 1696|      0|          desc.castToNamedPropertyDescriptorRef(),
 1697|      0|          valueHandle,
 1698|      0|          opFlags);
 1699|      0|    }
 1700|      0|  }
 1701|       |
 1702|       |  // The property does not exist as an conventional own property on
 1703|       |  // this object.
 1704|       |
 1705|   272k|  MutableHandle<JSObject> receiverHandle{runtime, *selfHandle};
 1706|   272k|  if (selfHandle.getHermesValue().getRaw() != receiver->getRaw() ||
  ------------------
  |  Branch (1706:7): [True: 0, False: 272k]
  |  Branch (1706:7): [True: 0, False: 272k]
  ------------------
 1707|   272k|      receiverHandle->isHostObject() || receiverHandle->isProxyObject()) {
  ------------------
  |  Branch (1707:7): [True: 0, False: 272k]
  |  Branch (1707:41): [True: 0, False: 272k]
  ------------------
 1708|      0|    if (selfHandle.getHermesValue().getRaw() != receiver->getRaw()) {
  ------------------
  |  Branch (1708:9): [True: 0, False: 0]
  ------------------
 1709|      0|      receiverHandle = dyn_vmcast<JSObject>(*receiver);
 1710|      0|    }
 1711|      0|    if (!receiverHandle) {
  ------------------
  |  Branch (1711:9): [True: 0, False: 0]
  ------------------
 1712|      0|      return false;
 1713|      0|    }
 1714|      0|    ComputedPropertyDescriptor existingDesc;
 1715|      0|    CallResult<bool> descDefinedRes = getOwnComputedPrimitiveDescriptor(
 1716|      0|        receiverHandle,
 1717|      0|        runtime,
 1718|      0|        nameValPrimitiveHandle,
 1719|      0|        IgnoreProxy::No,
 1720|      0|        tmpSymbolStorage,
 1721|      0|        existingDesc);
 1722|      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]
  |  |  ------------------
  ------------------
 1723|      0|      return ExecutionStatus::EXCEPTION;
 1724|      0|    }
 1725|      0|    DefinePropertyFlags dpf;
 1726|      0|    if (*descDefinedRes) {
  ------------------
  |  Branch (1726:9): [True: 0, False: 0]
  ------------------
 1727|      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]
  |  |  ------------------
  ------------------
 1728|      0|              existingDesc.flags.accessor || !existingDesc.flags.writable)) {
 1729|      0|        return false;
 1730|      0|      }
 1731|       |
 1732|      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]
  |  |  ------------------
  ------------------
 1733|      0|              !existingDesc.flags.internalSetter &&
 1734|      0|              !receiverHandle->isHostObject() &&
 1735|      0|              !receiverHandle->isProxyObject())) {
 1736|      0|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1737|      0|                setComputedSlotValueUnsafe(
 1738|      0|                    receiverHandle, runtime, existingDesc, valueHandle) ==
 1739|      0|                ExecutionStatus::EXCEPTION)) {
 1740|      0|          return ExecutionStatus::EXCEPTION;
 1741|      0|        }
 1742|      0|        return true;
 1743|      0|      }
 1744|      0|    }
 1745|       |
 1746|       |    // At this point, either the descriptor exists on the receiver,
 1747|       |    // but it's a corner case; or, there was no descriptor.
 1748|      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]
  |  |  ------------------
  ------------------
 1749|      0|            existingDesc.flags.internalSetter ||
 1750|      0|            receiverHandle->isHostObject() ||
 1751|      0|            receiverHandle->isProxyObject())) {
 1752|       |      // If putComputed is called on a proxy whose target's prototype
 1753|       |      // is an array with a propname of 'length', then internalSetter
 1754|       |      // will be true, and the receiver will be a proxy.  In that case,
 1755|       |      // proxy wins.
 1756|      0|      if (receiverHandle->isProxyObject()) {
  ------------------
  |  Branch (1756:11): [True: 0, False: 0]
  ------------------
 1757|      0|        if (*descDefinedRes) {
  ------------------
  |  Branch (1757:13): [True: 0, False: 0]
  ------------------
 1758|      0|          dpf.setValue = 1;
 1759|      0|        } else {
 1760|      0|          dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
 1761|      0|        }
 1762|      0|        return JSProxy::defineOwnProperty(
 1763|      0|            receiverHandle,
 1764|      0|            runtime,
 1765|      0|            nameValPrimitiveHandle,
 1766|      0|            dpf,
 1767|      0|            valueHandle,
 1768|      0|            opFlags);
 1769|      0|      }
 1770|      0|      SymbolID id{};
 1771|      0|      LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  635|      0|  do {                                                          \
  |  |  636|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|      0|      id = **idRes;                                             \
  |  |  643|      0|    }                                                           \
  |  |  644|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1772|      0|      if (existingDesc.flags.internalSetter) {
  ------------------
  |  Branch (1772:11): [True: 0, False: 0]
  ------------------
 1773|      0|        return internalSetter(
 1774|      0|            receiverHandle,
 1775|      0|            runtime,
 1776|      0|            id,
 1777|      0|            existingDesc.castToNamedPropertyDescriptorRef(),
 1778|      0|            valueHandle,
 1779|      0|            opFlags);
 1780|      0|      }
 1781|      0|      assert(
 1782|      0|          receiverHandle->isHostObject() && "descriptor flags are impossible");
 1783|      0|      return vmcast<HostObject>(receiverHandle.get())->set(id, *valueHandle);
 1784|      0|    }
 1785|      0|  }
 1786|       |
 1787|       |  /// Can we add more properties?
 1788|   272k|  if (LLVM_UNLIKELY(!receiverHandle->isExtensible())) {
  ------------------
  |  |  189|   272k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 272k]
  |  |  ------------------
  ------------------
 1789|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1789:9): [True: 0, False: 0]
  ------------------
 1790|      0|      return runtime.raiseTypeError(
 1791|      0|          "cannot add a new property"); // TODO: better message.
 1792|      0|    }
 1793|      0|    return false;
 1794|      0|  }
 1795|       |
 1796|       |  // If we have indexed storage we must check whether the property is an index,
 1797|       |  // and if it is, store it in indexed storage.
 1798|   272k|  if (receiverHandle->flags_.indexedStorage) {
  ------------------
  |  Branch (1798:7): [True: 271k, False: 160]
  ------------------
 1799|   271k|    OptValue<uint32_t> arrayIndex;
 1800|   271k|    MutableHandle<StringPrimitive> strPrim{runtime};
 1801|   271k|    TO_ARRAY_INDEX(runtime, nameValPrimitiveHandle, strPrim, arrayIndex);
  ------------------
  |  |  653|   271k|  do {                                                          \
  |  |  654|   271k|    arrayIndex = toArrayIndexFastPath(*nameValHandle);          \
  |  |  655|   271k|    if (!arrayIndex && !nameValHandle->isSymbol()) {            \
  |  |  ------------------
  |  |  |  Branch (655:9): [True: 0, False: 271k]
  |  |  |  Branch (655:24): [True: 0, False: 0]
  |  |  ------------------
  |  |  656|      0|      LAZY_TO_STRING(runtime, nameValHandle, str);              \
  |  |  ------------------
  |  |  |  |  620|      0|  do {                                                    \
  |  |  |  |  621|      0|    if (!str) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (621:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  622|      0|      auto status = toString_RJS(runtime, nameValHandle); \
  |  |  |  |  623|      0|      assert(                                             \
  |  |  |  |  624|      0|          status != ExecutionStatus::EXCEPTION &&         \
  |  |  |  |  625|      0|          "toString() of primitive cannot fail");         \
  |  |  |  |  626|      0|      str = status->get();                                \
  |  |  |  |  627|      0|    }                                                     \
  |  |  |  |  628|      0|  } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (628:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  657|      0|      arrayIndex = toArrayIndex(runtime, str);                  \
  |  |  658|      0|    }                                                           \
  |  |  659|   271k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (659:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1802|   271k|    if (arrayIndex) {
  ------------------
  |  Branch (1802:9): [True: 271k, False: 0]
  ------------------
 1803|       |      // Check whether we need to update array's ".length" property.
 1804|   271k|      if (auto *array = dyn_vmcast<JSArray>(receiverHandle.get())) {
  ------------------
  |  Branch (1804:17): [True: 271k, False: 0]
  ------------------
 1805|   271k|        if (LLVM_UNLIKELY(*arrayIndex >= JSArray::getLength(array, runtime))) {
  ------------------
  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 271k, False: 0]
  |  |  ------------------
  ------------------
 1806|   271k|          auto cr = putNamed_RJS(
 1807|   271k|              receiverHandle,
 1808|   271k|              runtime,
 1809|   271k|              Predefined::getSymbolID(Predefined::length),
 1810|   271k|              runtime.makeHandle(
 1811|   271k|                  HermesValue::encodeUntrustedNumberValue(*arrayIndex + 1)),
 1812|   271k|              opFlags);
 1813|   271k|          if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 271k]
  |  |  ------------------
  ------------------
 1814|      0|            return ExecutionStatus::EXCEPTION;
 1815|   271k|          if (LLVM_UNLIKELY(!*cr))
  ------------------
  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 271k]
  |  |  ------------------
  ------------------
 1816|      0|            return false;
 1817|   271k|        }
 1818|   271k|      }
 1819|       |
 1820|   271k|      auto result =
 1821|   271k|          setOwnIndexed(receiverHandle, runtime, *arrayIndex, valueHandle);
 1822|   271k|      if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   271k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 271k]
  |  |  ------------------
  ------------------
 1823|      0|        return ExecutionStatus::EXCEPTION;
 1824|   271k|      if (LLVM_LIKELY(*result))
  ------------------
  |  |  188|   271k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 271k, False: 0]
  |  |  ------------------
  ------------------
 1825|   271k|        return true;
 1826|       |
 1827|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1827:11): [True: 0, False: 0]
  ------------------
 1828|       |        // TODO: better message.
 1829|      0|        return runtime.raiseTypeError("Cannot assign to read-only property");
 1830|      0|      }
 1831|      0|      return false;
 1832|      0|    }
 1833|   271k|  }
 1834|       |
 1835|    160|  SymbolID id{};
 1836|    160|  LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  635|    160|  do {                                                          \
  |  |  636|    160|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 160, False: 0]
  |  |  ------------------
  |  |  637|    160|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|    160|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|    160|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|    160|      id = **idRes;                                             \
  |  |  643|    160|    }                                                           \
  |  |  644|    160|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1837|       |
 1838|       |  // Add a new named property.
 1839|    160|  return addOwnProperty(
 1840|    160|      receiverHandle,
 1841|    160|      runtime,
 1842|    160|      id,
 1843|    160|      DefinePropertyFlags::getDefaultNewPropertyFlags(),
 1844|    160|      valueHandle,
 1845|    160|      opFlags);
 1846|    160|}
_ZN6hermes2vm8JSObject25defineOwnPropertyInternalENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 2020|  92.9k|    PropOpFlags opFlags) {
 2021|  92.9k|  assert(
 2022|  92.9k|      !opFlags.getMustExist() && "cannot use mustExist with defineOwnProperty");
 2023|  92.9k|  assert(
 2024|  92.9k|      !(dpFlags.setValue && dpFlags.isAccessor()) &&
 2025|  92.9k|      "Cannot set both value and accessor");
 2026|  92.9k|  assert(
 2027|  92.9k|      (dpFlags.setValue || dpFlags.isAccessor() ||
 2028|  92.9k|       valueOrAccessor.get().isUndefined()) &&
 2029|  92.9k|      "value must be undefined when all of setValue/setSetter/setGetter are "
 2030|  92.9k|      "false");
 2031|  92.9k|#ifndef NDEBUG
 2032|  92.9k|  if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2032:7): [True: 7.20k, False: 85.7k]
  ------------------
 2033|  7.20k|    assert(valueOrAccessor.get().isPointer() && "accessor must be non-empty");
 2034|  7.20k|    assert(
 2035|  7.20k|        !dpFlags.setWritable && !dpFlags.writable &&
 2036|  7.20k|        "writable must not be set with accessors");
 2037|  7.20k|  }
 2038|  92.9k|#endif
 2039|       |
 2040|       |  // Is it an existing property.
 2041|  92.9k|  NamedPropertyDescriptor desc;
 2042|  92.9k|  auto pos = findProperty(selfHandle, runtime, name, desc);
 2043|  92.9k|  if (pos) {
  ------------------
  |  Branch (2043:7): [True: 1.27k, False: 91.7k]
  ------------------
 2044|  1.27k|    return updateOwnProperty(
 2045|  1.27k|        selfHandle,
 2046|  1.27k|        runtime,
 2047|  1.27k|        name,
 2048|  1.27k|        *pos,
 2049|  1.27k|        desc,
 2050|  1.27k|        dpFlags,
 2051|  1.27k|        valueOrAccessor,
 2052|  1.27k|        opFlags);
 2053|  1.27k|  }
 2054|       |
 2055|  91.7k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   183k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 82, False: 91.6k]
  |  |  |  Branch (189:53): [True: 82, False: 91.6k]
  |  |  |  Branch (189:53): [True: 0, False: 91.6k]
  |  |  ------------------
  ------------------
 2056|  91.7k|          selfHandle->flags_.lazyObject || selfHandle->flags_.proxyObject)) {
 2057|     82|    if (selfHandle->flags_.proxyObject) {
  ------------------
  |  Branch (2057:9): [True: 0, False: 82]
  ------------------
 2058|      0|      return JSProxy::defineOwnProperty(
 2059|      0|          selfHandle,
 2060|      0|          runtime,
 2061|      0|          name.isUniqued() ? runtime.makeHandle(HermesValue::encodeStringValue(
  ------------------
  |  Branch (2061:11): [True: 0, False: 0]
  ------------------
 2062|      0|                                 runtime.getStringPrimFromSymbolID(name)))
 2063|      0|                           : runtime.makeHandle(name),
 2064|      0|          dpFlags,
 2065|      0|          valueOrAccessor,
 2066|      0|          opFlags);
 2067|      0|    }
 2068|     82|    assert(selfHandle->flags_.lazyObject && "descriptor flags are impossible");
 2069|       |    // if the property was not found and the object is lazy we need to
 2070|       |    // initialize it and try again.
 2071|     82|    JSObject::initializeLazyObject(runtime, selfHandle);
 2072|     82|    return defineOwnPropertyInternal(
 2073|     82|        selfHandle, runtime, name, dpFlags, valueOrAccessor, opFlags);
 2074|     82|  }
 2075|       |
 2076|  91.6k|  return addOwnProperty(
 2077|  91.6k|      selfHandle, runtime, name, dpFlags, valueOrAccessor, opFlags);
 2078|  91.7k|}
_ZN6hermes2vm8JSObject20defineNewOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsENS2_INS0_11HermesValueEEE:
 2085|   348k|    Handle<> valueOrAccessor) {
 2086|   348k|  assert(
 2087|   348k|      !selfHandle->flags_.proxyObject &&
 2088|   348k|      "definedNewOwnProperty cannot be used with proxy objects");
 2089|   348k|  assert(
 2090|   348k|      !(propertyFlags.accessor && !valueOrAccessor.get().isPointer()) &&
 2091|   348k|      "accessor must be non-empty");
 2092|   348k|  assert(
 2093|   348k|      !(propertyFlags.accessor && propertyFlags.writable) &&
 2094|   348k|      "writable must not be set with accessors");
 2095|   348k|  assert(
 2096|   348k|      !HiddenClass::debugIsPropertyDefined(
 2097|   348k|          selfHandle->clazz_.get(runtime), runtime, name) &&
 2098|   348k|      "new property is already defined");
 2099|       |
 2100|   348k|  return addOwnPropertyImpl(
 2101|   348k|      selfHandle, runtime, name, propertyFlags, valueOrAccessor);
 2102|   348k|}
_ZN6hermes2vm8JSObject26defineOwnComputedPrimitiveENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEENS0_19DefinePropertyFlagsES7_NS0_11PropOpFlagsE:
 2110|  1.53M|    PropOpFlags opFlags) {
 2111|  1.53M|  assert(
 2112|  1.53M|      !nameValHandle->isObject() &&
 2113|  1.53M|      "nameValHandle passed to "
 2114|  1.53M|      "defineOwnComputedPrimitive() cannot be "
 2115|  1.53M|      "an object");
 2116|  1.53M|  assert(
 2117|  1.53M|      !opFlags.getMustExist() && "cannot use mustExist with defineOwnProperty");
 2118|  1.53M|  assert(
 2119|  1.53M|      !(dpFlags.setValue && dpFlags.isAccessor()) &&
 2120|  1.53M|      "Cannot set both value and accessor");
 2121|  1.53M|  assert(
 2122|  1.53M|      (dpFlags.setValue || dpFlags.isAccessor() ||
 2123|  1.53M|       valueOrAccessor.get().isUndefined()) &&
 2124|  1.53M|      "value must be undefined when all of setValue/setSetter/setGetter are "
 2125|  1.53M|      "false");
 2126|  1.53M|  assert(
 2127|  1.53M|      !dpFlags.enableInternalSetter &&
 2128|  1.53M|      "Cannot set internalSetter on a computed property");
 2129|  1.53M|#ifndef NDEBUG
 2130|  1.53M|  if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2130:7): [True: 0, False: 1.53M]
  ------------------
 2131|      0|    assert(valueOrAccessor.get().isPointer() && "accessor must be non-empty");
 2132|      0|    assert(
 2133|      0|        !dpFlags.setWritable && !dpFlags.writable &&
 2134|      0|        "writable must not be set with accessors");
 2135|      0|  }
 2136|  1.53M|#endif
 2137|       |
 2138|       |  // If the name is a valid integer array index, store it here.
 2139|  1.53M|  OptValue<uint32_t> arrayIndex;
 2140|       |
 2141|       |  // If we have indexed storage, we must attempt to convert the name to array
 2142|       |  // index, even if the conversion is expensive.
 2143|  1.53M|  if (selfHandle->flags_.indexedStorage) {
  ------------------
  |  Branch (2143:7): [True: 1.53M, False: 0]
  ------------------
 2144|  1.53M|    MutableHandle<StringPrimitive> strPrim{runtime};
 2145|  1.53M|    TO_ARRAY_INDEX(runtime, nameValHandle, strPrim, arrayIndex);
  ------------------
  |  |  653|  1.53M|  do {                                                          \
  |  |  654|  1.53M|    arrayIndex = toArrayIndexFastPath(*nameValHandle);          \
  |  |  655|  1.53M|    if (!arrayIndex && !nameValHandle->isSymbol()) {            \
  |  |  ------------------
  |  |  |  Branch (655:9): [True: 0, False: 1.53M]
  |  |  |  Branch (655:24): [True: 0, False: 0]
  |  |  ------------------
  |  |  656|      0|      LAZY_TO_STRING(runtime, nameValHandle, str);              \
  |  |  ------------------
  |  |  |  |  620|      0|  do {                                                    \
  |  |  |  |  621|      0|    if (!str) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (621:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  622|      0|      auto status = toString_RJS(runtime, nameValHandle); \
  |  |  |  |  623|      0|      assert(                                             \
  |  |  |  |  624|      0|          status != ExecutionStatus::EXCEPTION &&         \
  |  |  |  |  625|      0|          "toString() of primitive cannot fail");         \
  |  |  |  |  626|      0|      str = status->get();                                \
  |  |  |  |  627|      0|    }                                                     \
  |  |  |  |  628|      0|  } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (628:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  657|      0|      arrayIndex = toArrayIndex(runtime, str);                  \
  |  |  658|      0|    }                                                           \
  |  |  659|  1.53M|  } while (0)
  |  |  ------------------
  |  |  |  Branch (659:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2146|  1.53M|  }
 2147|       |
 2148|  1.53M|  SymbolID id{};
 2149|       |
 2150|       |  // If not storing a property with an array index name, or if we don't have
 2151|       |  // indexed storage, just pass to the named routine.
 2152|  1.53M|  if (!arrayIndex) {
  ------------------
  |  Branch (2152:7): [True: 0, False: 1.53M]
  ------------------
 2153|       |    // TODO(T125334872): properly handle the case when self is a TypedArray.
 2154|      0|    LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  635|      0|  do {                                                          \
  |  |  636|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|      0|      id = **idRes;                                             \
  |  |  643|      0|    }                                                           \
  |  |  644|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2155|      0|    return defineOwnPropertyInternal(
 2156|      0|        selfHandle, runtime, id, dpFlags, valueOrAccessor, opFlags);
 2157|      0|  }
 2158|       |
 2159|       |  // At this point we know that we have indexed storage and that the property
 2160|       |  // has an index-like name.
 2161|       |
 2162|       |  // First check if a named property with the same name exists.
 2163|  1.53M|  if (selfHandle->clazz_.getNonNull(runtime)->getHasIndexLikeProperties()) {
  ------------------
  |  Branch (2163:7): [True: 703k, False: 827k]
  ------------------
 2164|   703k|    LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  635|   703k|  do {                                                          \
  |  |  636|   703k|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 703k, False: 0]
  |  |  ------------------
  |  |  637|   703k|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|   703k|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|   703k|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|   703k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 703k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|   703k|      id = **idRes;                                             \
  |  |  643|   703k|    }                                                           \
  |  |  644|   703k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2165|       |
 2166|   703k|    NamedPropertyDescriptor desc;
 2167|   703k|    auto pos = findProperty(selfHandle, runtime, id, desc);
 2168|       |    // If we found a named property, update it.
 2169|   703k|    if (pos) {
  ------------------
  |  Branch (2169:9): [True: 0, False: 703k]
  ------------------
 2170|      0|      return updateOwnProperty(
 2171|      0|          selfHandle,
 2172|      0|          runtime,
 2173|      0|          id,
 2174|      0|          *pos,
 2175|      0|          desc,
 2176|      0|          dpFlags,
 2177|      0|          valueOrAccessor,
 2178|      0|          opFlags);
 2179|      0|    }
 2180|   703k|  }
 2181|       |
 2182|       |  // Does an indexed property with that index exist?
 2183|  1.53M|  auto indexedPropPresent =
 2184|  1.53M|      getOwnIndexedPropertyFlags(selfHandle.get(), runtime, *arrayIndex);
 2185|  1.53M|  if (indexedPropPresent) {
  ------------------
  |  Branch (2185:7): [True: 0, False: 1.53M]
  ------------------
 2186|       |    // The current value of the property.
 2187|      0|    Handle<> curValueOrAccessor =
 2188|      0|        runtime.makeHandle(getOwnIndexed(selfHandle, runtime, *arrayIndex));
 2189|       |
 2190|      0|    auto updateStatus = checkPropertyUpdate(
 2191|      0|        runtime,
 2192|      0|        *indexedPropPresent,
 2193|      0|        dpFlags,
 2194|      0|        *curValueOrAccessor,
 2195|      0|        valueOrAccessor,
 2196|      0|        opFlags);
 2197|      0|    if (updateStatus == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2197:9): [True: 0, False: 0]
  ------------------
 2198|      0|      return ExecutionStatus::EXCEPTION;
 2199|      0|    if (updateStatus->first == PropertyUpdateStatus::failed)
  ------------------
  |  Branch (2199:9): [True: 0, False: 0]
  ------------------
 2200|      0|      return false;
 2201|       |
 2202|       |    // The property update is valid, but can the property remain an "indexed"
 2203|       |    // property, or do we need to convert it to a named property?
 2204|       |    // If the property flags didn't change, the property remains indexed.
 2205|      0|    if (updateStatus->second == *indexedPropPresent) {
  ------------------
  |  Branch (2205:9): [True: 0, False: 0]
  ------------------
 2206|       |      // If the value doesn't change, we are done.
 2207|      0|      if (updateStatus->first == PropertyUpdateStatus::done)
  ------------------
  |  Branch (2207:11): [True: 0, False: 0]
  ------------------
 2208|      0|        return true;
 2209|       |
 2210|       |      // If we successfully updated the value, we are done.
 2211|      0|      auto result =
 2212|      0|          setOwnIndexed(selfHandle, runtime, *arrayIndex, valueOrAccessor);
 2213|      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]
  |  |  ------------------
  ------------------
 2214|      0|        return ExecutionStatus::EXCEPTION;
 2215|      0|      if (*result)
  ------------------
  |  Branch (2215:11): [True: 0, False: 0]
  ------------------
 2216|      0|        return true;
 2217|       |
 2218|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2218:11): [True: 0, False: 0]
  ------------------
 2219|       |        // TODO: better error message.
 2220|      0|        return runtime.raiseTypeError("cannot change read-only property value");
 2221|      0|      }
 2222|       |
 2223|      0|      return false;
 2224|      0|    }
 2225|       |
 2226|       |    // OK, we need to convert an indexed property to a named one.
 2227|       |
 2228|       |    // Check whether to use the supplied value, or to reuse the old one, as we
 2229|       |    // are simply reconfiguring it.
 2230|      0|    MutableHandle<> value{runtime};
 2231|      0|    if (dpFlags.setValue || dpFlags.isAccessor()) {
  ------------------
  |  Branch (2231:9): [True: 0, False: 0]
  |  Branch (2231:29): [True: 0, False: 0]
  ------------------
 2232|      0|      value = valueOrAccessor.get();
 2233|      0|    } else {
 2234|      0|      value = *curValueOrAccessor;
 2235|      0|    }
 2236|       |
 2237|       |    // Delete the existing indexed property.
 2238|      0|    if (!deleteOwnIndexed(selfHandle, runtime, *arrayIndex)) {
  ------------------
  |  Branch (2238:9): [True: 0, False: 0]
  ------------------
 2239|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2239:11): [True: 0, False: 0]
  ------------------
 2240|       |        // TODO: better error message.
 2241|      0|        return runtime.raiseTypeError("Cannot define property");
 2242|      0|      }
 2243|      0|      return false;
 2244|      0|    }
 2245|       |
 2246|       |    // Add the new named property. Call addOwnPropertyImpl directly, since the
 2247|       |    // property must be added.
 2248|      0|    LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  635|      0|  do {                                                          \
  |  |  636|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|      0|      id = **idRes;                                             \
  |  |  643|      0|    }                                                           \
  |  |  644|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2249|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2250|      0|            addOwnPropertyImpl(
 2251|      0|                selfHandle, runtime, id, updateStatus->second, value) ==
 2252|      0|            ExecutionStatus::EXCEPTION))
 2253|      0|      return ExecutionStatus::EXCEPTION;
 2254|      0|    return true;
 2255|      0|  }
 2256|       |
 2257|       |  /// Can we add new properties?
 2258|  1.53M|  if (!selfHandle->isExtensible()) {
  ------------------
  |  Branch (2258:7): [True: 0, False: 1.53M]
  ------------------
 2259|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2259:9): [True: 0, False: 0]
  ------------------
 2260|      0|      return runtime.raiseTypeError(
 2261|      0|          "cannot add a new property"); // TODO: better message.
 2262|      0|    }
 2263|      0|    return false;
 2264|      0|  }
 2265|       |
 2266|       |  // This is a new property with an index-like name.
 2267|       |  // Check whether we need to update array's ".length" property.
 2268|  1.53M|  bool updateLength = false;
 2269|  1.53M|  if (auto arrayHandle = Handle<JSArray>::dyn_vmcast(selfHandle)) {
  ------------------
  |  Branch (2269:12): [True: 1.53M, False: 0]
  ------------------
 2270|  1.53M|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  1.53M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 947k, False: 583k]
  |  |  ------------------
  ------------------
 2271|  1.53M|            *arrayIndex >= JSArray::getLength(*arrayHandle, runtime))) {
 2272|   947k|      NamedPropertyDescriptor lengthDesc;
 2273|   947k|      bool lengthPresent = getOwnNamedDescriptor(
 2274|   947k|          arrayHandle,
 2275|   947k|          runtime,
 2276|   947k|          Predefined::getSymbolID(Predefined::length),
 2277|   947k|          lengthDesc);
 2278|   947k|      (void)lengthPresent;
 2279|   947k|      assert(lengthPresent && ".length must be present in JSArray");
 2280|       |
 2281|   947k|      if (!lengthDesc.flags.writable) {
  ------------------
  |  Branch (2281:11): [True: 0, False: 947k]
  ------------------
 2282|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2282:13): [True: 0, False: 0]
  ------------------
 2283|      0|          return runtime.raiseTypeError(
 2284|      0|              "Cannot assign to read-only 'length' property of array");
 2285|      0|        }
 2286|      0|        return false;
 2287|      0|      }
 2288|       |
 2289|   947k|      updateLength = true;
 2290|   947k|    }
 2291|  1.53M|  }
 2292|       |
 2293|  1.53M|  bool newIsIndexed = canNewPropertyBeIndexed(dpFlags);
 2294|  1.53M|  if (newIsIndexed) {
  ------------------
  |  Branch (2294:7): [True: 827k, False: 703k]
  ------------------
 2295|   827k|    auto result = setOwnIndexed(
 2296|   827k|        selfHandle,
 2297|   827k|        runtime,
 2298|   827k|        *arrayIndex,
 2299|   827k|        dpFlags.setValue ? valueOrAccessor : Runtime::getUndefinedValue());
  ------------------
  |  Branch (2299:9): [True: 827k, False: 0]
  ------------------
 2300|   827k|    if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   827k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 827k]
  |  |  ------------------
  ------------------
 2301|      0|      return ExecutionStatus::EXCEPTION;
 2302|   827k|    if (!*result) {
  ------------------
  |  Branch (2302:9): [True: 0, False: 827k]
  ------------------
 2303|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2303:11): [True: 0, False: 0]
  ------------------
 2304|       |        // TODO: better error message.
 2305|      0|        return runtime.raiseTypeError("Cannot define property");
 2306|      0|      }
 2307|      0|      return false;
 2308|      0|    }
 2309|   827k|  }
 2310|       |
 2311|       |  // If this is an array and we need to update ".length", do so.
 2312|  1.53M|  if (updateLength) {
  ------------------
  |  Branch (2312:7): [True: 947k, False: 583k]
  ------------------
 2313|       |    // This should always succeed since we are simply enlarging the length.
 2314|   947k|    auto res = JSArray::setLength(
 2315|   947k|        Handle<JSArray>::vmcast(selfHandle), runtime, *arrayIndex + 1, opFlags);
 2316|   947k|    (void)res;
 2317|   947k|    assert(
 2318|   947k|        res != ExecutionStatus::EXCEPTION && *res &&
 2319|   947k|        "JSArray::setLength() failed unexpectedly");
 2320|   947k|  }
 2321|       |
 2322|  1.53M|  if (newIsIndexed)
  ------------------
  |  Branch (2322:7): [True: 827k, False: 703k]
  ------------------
 2323|   827k|    return true;
 2324|       |
 2325|       |  // We are adding a new property with an index-like name.
 2326|       |  // TODO(T125334872): properly handle the case when self is a TypedArray.
 2327|   703k|  LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  635|   703k|  do {                                                          \
  |  |  636|   703k|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 76, False: 703k]
  |  |  ------------------
  |  |  637|     76|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|     76|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|     76|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|     76|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 76]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|     76|      id = **idRes;                                             \
  |  |  643|     76|    }                                                           \
  |  |  644|   703k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2328|   703k|  return addOwnProperty(
 2329|   703k|      selfHandle, runtime, id, dpFlags, valueOrAccessor, opFlags);
 2330|   703k|}
_ZN6hermes2vm8JSObject23_getOwnIndexedRangeImplEPS1_RNS0_7RuntimeE:
 2519|     15|    Runtime &runtime) {
 2520|     15|  return {0, 0};
 2521|     15|}
_ZN6hermes2vm8JSObject17preventExtensionsEPS1_:
 2555|    396|void JSObject::preventExtensions(JSObject *self) {
 2556|    396|  assert(
 2557|    396|      !self->flags_.proxyObject &&
 2558|    396|      "[[Extensible]] slot cannot be set directly on Proxy objects");
 2559|    396|  self->flags_.noExtend = true;
 2560|    396|}
_ZN6hermes2vm8JSObject14addOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 2702|   801k|    PropOpFlags opFlags) {
 2703|       |  /// Can we add more properties?
 2704|   801k|  if (!selfHandle->isExtensible() && !opFlags.getInternalForce()) {
  ------------------
  |  Branch (2704:7): [True: 0, False: 801k]
  |  Branch (2704:38): [True: 0, False: 0]
  ------------------
 2705|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2705:9): [True: 0, False: 0]
  ------------------
 2706|      0|      return runtime.raiseTypeError(
 2707|      0|          TwineChar16("Cannot add new property '") +
 2708|      0|          runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 2709|      0|          "'");
 2710|      0|    }
 2711|      0|    return false;
 2712|      0|  }
 2713|       |
 2714|   801k|  PropertyFlags flags{};
 2715|       |
 2716|       |  // Accessors don't set writeable.
 2717|   801k|  if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2717:7): [True: 7.20k, False: 794k]
  ------------------
 2718|  7.20k|    dpFlags.setWritable = 0;
 2719|  7.20k|    flags.accessor = 1;
 2720|  7.20k|  }
 2721|       |
 2722|       |  // Override the default flags if specified.
 2723|   801k|  if (dpFlags.setEnumerable)
  ------------------
  |  Branch (2723:7): [True: 799k, False: 1.60k]
  ------------------
 2724|   799k|    flags.enumerable = dpFlags.enumerable;
 2725|   801k|  if (dpFlags.setWritable)
  ------------------
  |  Branch (2725:7): [True: 792k, False: 8.80k]
  ------------------
 2726|   792k|    flags.writable = dpFlags.writable;
 2727|   801k|  if (dpFlags.setConfigurable)
  ------------------
  |  Branch (2727:7): [True: 799k, False: 1.60k]
  ------------------
 2728|   799k|    flags.configurable = dpFlags.configurable;
 2729|   801k|  flags.internalSetter = dpFlags.enableInternalSetter;
 2730|       |
 2731|   801k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   801k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 801k]
  |  |  ------------------
  ------------------
 2732|   801k|          addOwnPropertyImpl(
 2733|   801k|              selfHandle, runtime, name, flags, valueOrAccessor) ==
 2734|   801k|          ExecutionStatus::EXCEPTION)) {
 2735|      0|    return ExecutionStatus::EXCEPTION;
 2736|      0|  }
 2737|       |
 2738|   801k|  return true;
 2739|   801k|}
_ZN6hermes2vm8JSObject18addOwnPropertyImplENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsENS2_INS0_11HermesValueEEE:
 2746|  1.14M|    Handle<> valueOrAccessor) {
 2747|  1.14M|  assert(
 2748|  1.14M|      !selfHandle->flags_.proxyObject &&
 2749|  1.14M|      "Internal properties cannot be added to Proxy objects");
 2750|       |  // Add a new property to the class.
 2751|       |  // TODO: if we check for OOM here in the future, we must undo the slot
 2752|       |  // allocation.
 2753|  1.14M|  auto addResult = HiddenClass::addProperty(
 2754|  1.14M|      runtime.makeHandle(selfHandle->clazz_), runtime, name, propertyFlags);
 2755|  1.14M|  if (LLVM_UNLIKELY(addResult == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.14M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.14M]
  |  |  ------------------
  ------------------
 2756|      0|    return ExecutionStatus::EXCEPTION;
 2757|      0|  }
 2758|  1.14M|  selfHandle->clazz_.setNonNull(runtime, *addResult->first, runtime.getHeap());
 2759|       |
 2760|  1.14M|  allocateNewSlotStorage(
 2761|  1.14M|      selfHandle, runtime, addResult->second, valueOrAccessor);
 2762|       |
 2763|       |  // If this is an index-like property, we need to clear the fast path flags.
 2764|  1.14M|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  1.14M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 703k, False: 446k]
  |  |  ------------------
  ------------------
 2765|  1.14M|          selfHandle->clazz_.getNonNull(runtime)->getHasIndexLikeProperties()))
 2766|   703k|    selfHandle->flags_.fastIndexProperties = false;
 2767|       |
 2768|  1.14M|  return ExecutionStatus::RETURNED;
 2769|  1.14M|}
_ZN6hermes2vm8JSObject17updateOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_15DictPropertyMap11PropertyPosENS0_23NamedPropertyDescriptorENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 2779|  1.27k|    PropOpFlags opFlags) {
 2780|  1.27k|  auto updateStatus = checkPropertyUpdate(
 2781|  1.27k|      runtime,
 2782|  1.27k|      desc.flags,
 2783|  1.27k|      dpFlags,
 2784|  1.27k|      getNamedSlotValueUnsafe(selfHandle.get(), runtime, desc)
 2785|  1.27k|          .unboxToHV(runtime),
 2786|  1.27k|      valueOrAccessor,
 2787|  1.27k|      opFlags);
 2788|  1.27k|  if (updateStatus == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2788:7): [True: 0, False: 1.27k]
  ------------------
 2789|      0|    return ExecutionStatus::EXCEPTION;
 2790|  1.27k|  if (updateStatus->first == PropertyUpdateStatus::failed)
  ------------------
  |  Branch (2790:7): [True: 0, False: 1.27k]
  ------------------
 2791|      0|    return false;
 2792|       |
 2793|       |  // If the property flags changed, update them.
 2794|  1.27k|  if (updateStatus->second != desc.flags) {
  ------------------
  |  Branch (2794:7): [True: 556, False: 722]
  ------------------
 2795|    556|    desc.flags = updateStatus->second;
 2796|    556|    auto newClazz = HiddenClass::updateProperty(
 2797|    556|        runtime.makeHandle(selfHandle->clazz_),
 2798|    556|        runtime,
 2799|    556|        propertyPos,
 2800|    556|        desc.flags);
 2801|    556|    selfHandle->clazz_.setNonNull(runtime, *newClazz, runtime.getHeap());
 2802|    556|  }
 2803|       |
 2804|  1.27k|  if (updateStatus->first == PropertyUpdateStatus::done)
  ------------------
  |  Branch (2804:7): [True: 876, False: 402]
  ------------------
 2805|    876|    return true;
 2806|    402|  assert(
 2807|    402|      updateStatus->first == PropertyUpdateStatus::needSet &&
 2808|    402|      "unexpected PropertyUpdateStatus");
 2809|       |
 2810|    402|  if (dpFlags.setValue) {
  ------------------
  |  Branch (2810:7): [True: 402, False: 0]
  ------------------
 2811|    402|    if (LLVM_LIKELY(!desc.flags.internalSetter)) {
  ------------------
  |  |  188|    402|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 402, False: 0]
  |  |  ------------------
  ------------------
 2812|    402|      auto shv = SmallHermesValue::encodeHermesValue(*valueOrAccessor, runtime);
 2813|    402|      setNamedSlotValueUnsafe(selfHandle.get(), runtime, desc, shv);
 2814|    402|    } else {
 2815|      0|      return internalSetter(
 2816|      0|          selfHandle, runtime, name, desc, valueOrAccessor, opFlags);
 2817|      0|    }
 2818|    402|  } else if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2818:14): [True: 0, False: 0]
  ------------------
 2819|      0|    auto shv = SmallHermesValue::encodeHermesValue(*valueOrAccessor, runtime);
 2820|      0|    setNamedSlotValueUnsafe(selfHandle.get(), runtime, desc, shv);
 2821|      0|  } else {
 2822|       |    // If checkPropertyUpdate() returned needSet, but there is no value or
 2823|       |    // accessor, clear the value.
 2824|      0|    setNamedSlotValueUnsafe(
 2825|      0|        selfHandle.get(),
 2826|      0|        runtime,
 2827|      0|        desc,
 2828|      0|        SmallHermesValue::encodeUndefinedValue());
 2829|      0|  }
 2830|       |
 2831|    402|  return true;
 2832|    402|}
_ZN6hermes2vm8JSObject19checkPropertyUpdateERNS0_7RuntimeENS0_13PropertyFlagsENS0_19DefinePropertyFlagsENS0_11HermesValueENS0_6HandleIS6_EENS0_11PropOpFlagsE:
 2841|  1.27k|    PropOpFlags opFlags) {
 2842|       |  // 8.12.9 [5] Return true, if every field in Desc is absent.
 2843|  1.27k|  if (dpFlags.isEmpty())
  ------------------
  |  Branch (2843:7): [True: 0, False: 1.27k]
  ------------------
 2844|      0|    return std::make_pair(PropertyUpdateStatus::done, currentFlags);
 2845|       |
 2846|  1.27k|  assert(
 2847|  1.27k|      (!dpFlags.isAccessor() || (!dpFlags.setWritable && !dpFlags.writable)) &&
 2848|  1.27k|      "can't set both accessor and writable");
 2849|  1.27k|  assert(
 2850|  1.27k|      !dpFlags.enableInternalSetter &&
 2851|  1.27k|      "cannot change the value of internalSetter");
 2852|       |
 2853|       |  // 8.12.9 [6] Return true, if every field in Desc also occurs in current and
 2854|       |  // the value of every field in Desc is the same value as the corresponding
 2855|       |  // field in current when compared using the SameValue algorithm (9.12).
 2856|       |  // TODO: this would probably be much more efficient with bitmasks.
 2857|  1.27k|  if ((!dpFlags.setEnumerable ||
  ------------------
  |  Branch (2857:8): [True: 236, False: 1.04k]
  ------------------
 2858|  1.27k|       dpFlags.enumerable == currentFlags.enumerable) &&
  ------------------
  |  Branch (2858:8): [True: 1.04k, False: 0]
  ------------------
 2859|  1.27k|      (!dpFlags.setConfigurable ||
  ------------------
  |  Branch (2859:8): [True: 0, False: 1.27k]
  ------------------
 2860|  1.27k|       dpFlags.configurable == currentFlags.configurable)) {
  ------------------
  |  Branch (2860:8): [True: 1.11k, False: 160]
  ------------------
 2861|  1.11k|    if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2861:9): [True: 0, False: 1.11k]
  ------------------
 2862|      0|      if (currentFlags.accessor) {
  ------------------
  |  Branch (2862:11): [True: 0, False: 0]
  ------------------
 2863|      0|        auto *curAccessor = vmcast<PropertyAccessor>(curValueOrAccessor);
 2864|      0|        auto *newAccessor = vmcast<PropertyAccessor>(valueOrAccessor.get());
 2865|       |
 2866|      0|        if ((!dpFlags.setGetter ||
  ------------------
  |  Branch (2866:14): [True: 0, False: 0]
  ------------------
 2867|      0|             curAccessor->getter == newAccessor->getter) &&
  ------------------
  |  Branch (2867:14): [True: 0, False: 0]
  ------------------
 2868|      0|            (!dpFlags.setSetter ||
  ------------------
  |  Branch (2868:14): [True: 0, False: 0]
  ------------------
 2869|      0|             curAccessor->setter == newAccessor->setter)) {
  ------------------
  |  Branch (2869:14): [True: 0, False: 0]
  ------------------
 2870|      0|          return std::make_pair(PropertyUpdateStatus::done, currentFlags);
 2871|      0|        }
 2872|      0|      }
 2873|  1.11k|    } else {
 2874|  1.11k|      if (!currentFlags.accessor &&
  ------------------
  |  Branch (2874:11): [True: 1.11k, False: 0]
  ------------------
 2875|  1.11k|          (!dpFlags.setValue ||
  ------------------
  |  Branch (2875:12): [True: 76, False: 1.04k]
  ------------------
 2876|  1.11k|           isSameValue(curValueOrAccessor, valueOrAccessor.get())) &&
  ------------------
  |  Branch (2876:12): [True: 960, False: 82]
  ------------------
 2877|  1.11k|          (!dpFlags.setWritable || dpFlags.writable == currentFlags.writable)) {
  ------------------
  |  Branch (2877:12): [True: 0, False: 1.03k]
  |  Branch (2877:36): [True: 640, False: 396]
  ------------------
 2878|    640|        return std::make_pair(PropertyUpdateStatus::done, currentFlags);
 2879|    640|      }
 2880|  1.11k|    }
 2881|  1.11k|  }
 2882|       |
 2883|       |  // 8.12.9 [7]
 2884|       |  // If the property is not configurable, some aspects are not changeable.
 2885|    638|  if (!currentFlags.configurable) {
  ------------------
  |  Branch (2885:7): [True: 76, False: 562]
  ------------------
 2886|       |    // Trying to change non-configurable to configurable?
 2887|     76|    if (dpFlags.configurable) {
  ------------------
  |  Branch (2887:9): [True: 0, False: 76]
  ------------------
 2888|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2888:11): [True: 0, False: 0]
  ------------------
 2889|      0|        return runtime.raiseTypeError(
 2890|      0|            "property is not configurable"); // TODO: better message.
 2891|      0|      }
 2892|      0|      return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2893|      0|    }
 2894|       |
 2895|       |    // Trying to change the enumerability of non-configurable property?
 2896|     76|    if (dpFlags.setEnumerable &&
  ------------------
  |  Branch (2896:9): [True: 0, False: 76]
  ------------------
 2897|     76|        dpFlags.enumerable != currentFlags.enumerable) {
  ------------------
  |  Branch (2897:9): [True: 0, False: 0]
  ------------------
 2898|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2898:11): [True: 0, False: 0]
  ------------------
 2899|      0|        return runtime.raiseTypeError(
 2900|      0|            "property is not configurable"); // TODO: better message.
 2901|      0|      }
 2902|      0|      return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2903|      0|    }
 2904|     76|  }
 2905|       |
 2906|    638|  PropertyFlags newFlags = currentFlags;
 2907|       |
 2908|       |  // 8.12.9 [8] If IsGenericDescriptor(Desc) is true, then no further validation
 2909|       |  // is required.
 2910|    638|  if (!(dpFlags.setValue || dpFlags.setWritable || dpFlags.setGetter ||
  ------------------
  |  Branch (2910:9): [True: 402, False: 236]
  |  Branch (2910:29): [True: 76, False: 160]
  |  Branch (2910:52): [True: 0, False: 160]
  ------------------
 2911|    638|        dpFlags.setSetter)) {
  ------------------
  |  Branch (2911:9): [True: 0, False: 160]
  ------------------
 2912|       |    // Do nothing
 2913|    160|  }
 2914|       |  // 8.12.9 [9]
 2915|       |  // Changing between accessor and data descriptor?
 2916|    478|  else if (currentFlags.accessor != dpFlags.isAccessor()) {
  ------------------
  |  Branch (2916:12): [True: 0, False: 478]
  ------------------
 2917|      0|    if (!currentFlags.configurable) {
  ------------------
  |  Branch (2917:9): [True: 0, False: 0]
  ------------------
 2918|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2918:11): [True: 0, False: 0]
  ------------------
 2919|      0|        return runtime.raiseTypeError(
 2920|      0|            "property is not configurable"); // TODO: better message.
 2921|      0|      }
 2922|      0|      return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2923|      0|    }
 2924|       |
 2925|       |    // If we change from accessor to data descriptor, Preserve the existing
 2926|       |    // values of the converted property’s [[Configurable]] and [[Enumerable]]
 2927|       |    // attributes and set the rest of the property’s attributes to their default
 2928|       |    // values.
 2929|       |    // If it's the other way around, since the accessor doesn't have the
 2930|       |    // [[Writable]] attribute, do nothing.
 2931|      0|    newFlags.writable = 0;
 2932|       |
 2933|       |    // If we are changing from accessor to non-accessor, we must set a new
 2934|       |    // value.
 2935|      0|    if (!dpFlags.isAccessor())
  ------------------
  |  Branch (2935:9): [True: 0, False: 0]
  ------------------
 2936|      0|      dpFlags.setValue = 1;
 2937|      0|  }
 2938|       |  // 8.12.9 [10] if both are data descriptors.
 2939|    478|  else if (!currentFlags.accessor) {
  ------------------
  |  Branch (2939:12): [True: 478, False: 0]
  ------------------
 2940|    478|    if (!currentFlags.configurable) {
  ------------------
  |  Branch (2940:9): [True: 76, False: 402]
  ------------------
 2941|     76|      if (!currentFlags.writable) {
  ------------------
  |  Branch (2941:11): [True: 0, False: 76]
  ------------------
 2942|       |        // If the current property is not writable, but the new one is.
 2943|      0|        if (dpFlags.writable) {
  ------------------
  |  Branch (2943:13): [True: 0, False: 0]
  ------------------
 2944|      0|          if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2944:15): [True: 0, False: 0]
  ------------------
 2945|      0|            return runtime.raiseTypeError(
 2946|      0|                "property is not configurable"); // TODO: better message.
 2947|      0|          }
 2948|      0|          return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2949|      0|        }
 2950|       |
 2951|       |        // If we are setting a different value.
 2952|      0|        if (dpFlags.setValue &&
  ------------------
  |  Branch (2952:13): [True: 0, False: 0]
  ------------------
 2953|      0|            !isSameValue(curValueOrAccessor, valueOrAccessor.get())) {
  ------------------
  |  Branch (2953:13): [True: 0, False: 0]
  ------------------
 2954|      0|          if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2954:15): [True: 0, False: 0]
  ------------------
 2955|      0|            return runtime.raiseTypeError(
 2956|      0|                "property is not writable"); // TODO: better message.
 2957|      0|          }
 2958|      0|          return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2959|      0|        }
 2960|      0|      }
 2961|     76|    }
 2962|    478|  }
 2963|       |  // 8.12.9 [11] Both are accessors.
 2964|      0|  else {
 2965|      0|    auto *curAccessor = vmcast<PropertyAccessor>(curValueOrAccessor);
 2966|      0|    auto *newAccessor = vmcast<PropertyAccessor>(valueOrAccessor.get());
 2967|       |
 2968|       |    // If not configurable, make sure that nothing is changing.
 2969|      0|    if (!currentFlags.configurable) {
  ------------------
  |  Branch (2969:9): [True: 0, False: 0]
  ------------------
 2970|      0|      if ((dpFlags.setGetter && newAccessor->getter != curAccessor->getter) ||
  ------------------
  |  Branch (2970:12): [True: 0, False: 0]
  |  Branch (2970:33): [True: 0, False: 0]
  ------------------
 2971|      0|          (dpFlags.setSetter && newAccessor->setter != curAccessor->setter)) {
  ------------------
  |  Branch (2971:12): [True: 0, False: 0]
  |  Branch (2971:33): [True: 0, False: 0]
  ------------------
 2972|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2972:13): [True: 0, False: 0]
  ------------------
 2973|      0|          return runtime.raiseTypeError(
 2974|      0|              "property is not configurable"); // TODO: better message.
 2975|      0|        }
 2976|      0|        return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2977|      0|      }
 2978|      0|    }
 2979|       |
 2980|       |    // If not setting the getter or the setter, re-use the current one.
 2981|      0|    if (!dpFlags.setGetter)
  ------------------
  |  Branch (2981:9): [True: 0, False: 0]
  ------------------
 2982|      0|      newAccessor->getter.set(runtime, curAccessor->getter, runtime.getHeap());
 2983|      0|    if (!dpFlags.setSetter)
  ------------------
  |  Branch (2983:9): [True: 0, False: 0]
  ------------------
 2984|      0|      newAccessor->setter.set(runtime, curAccessor->setter, runtime.getHeap());
 2985|      0|  }
 2986|       |
 2987|       |  // 8.12.9 [12] For each attribute field of Desc that is present, set the
 2988|       |  // correspondingly named attribute of the property named P of object O to the
 2989|       |  // value of the field.
 2990|    638|  if (dpFlags.setEnumerable)
  ------------------
  |  Branch (2990:7): [True: 402, False: 236]
  ------------------
 2991|    402|    newFlags.enumerable = dpFlags.enumerable;
 2992|    638|  if (dpFlags.setWritable)
  ------------------
  |  Branch (2992:7): [True: 478, False: 160]
  ------------------
 2993|    478|    newFlags.writable = dpFlags.writable;
 2994|    638|  if (dpFlags.setConfigurable)
  ------------------
  |  Branch (2994:7): [True: 638, False: 0]
  ------------------
 2995|    638|    newFlags.configurable = dpFlags.configurable;
 2996|       |
 2997|    638|  if (dpFlags.setValue)
  ------------------
  |  Branch (2997:7): [True: 402, False: 236]
  ------------------
 2998|    402|    newFlags.accessor = false;
 2999|    236|  else if (dpFlags.isAccessor())
  ------------------
  |  Branch (2999:12): [True: 0, False: 236]
  ------------------
 3000|      0|    newFlags.accessor = true;
 3001|    236|  else
 3002|    236|    return std::make_pair(PropertyUpdateStatus::done, newFlags);
 3003|       |
 3004|    402|  return std::make_pair(PropertyUpdateStatus::needSet, newFlags);
 3005|    638|}
_ZN6hermes2vm8JSObject14internalSetterENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_23NamedPropertyDescriptorENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 3013|   543k|    PropOpFlags opFlags) {
 3014|   543k|  if (vmisa<JSArray>(selfHandle.get())) {
  ------------------
  |  Branch (3014:7): [True: 543k, False: 0]
  ------------------
 3015|   543k|    if (name == Predefined::getSymbolID(Predefined::length)) {
  ------------------
  |  Branch (3015:9): [True: 543k, False: 0]
  ------------------
 3016|   543k|      return JSArray::setLength(
 3017|   543k|          Handle<JSArray>::vmcast(selfHandle), runtime, value, opFlags);
 3018|   543k|    }
 3019|   543k|  }
 3020|       |
 3021|      0|  llvm_unreachable("unhandled property in Object::internalSetter()");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 3022|   543k|}
_ZN6hermes2vm21getForInPropertyNamesERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEERjS6_:
 3229|     15|    uint32_t &endIndex) {
 3230|     15|  Handle<HiddenClass> clazz(runtime, obj->getClass(runtime));
 3231|       |
 3232|       |  // Fast case: Check the cache.
 3233|     15|  MutableHandle<BigStorage> arr(runtime);
 3234|     15|  if (obj->shouldCacheForIn(runtime)) {
  ------------------
  |  Branch (3234:7): [True: 0, False: 15]
  ------------------
 3235|      0|    arr = clazz->getForInCache(runtime);
 3236|      0|    if (arr) {
  ------------------
  |  Branch (3236:9): [True: 0, False: 0]
  ------------------
 3237|      0|      beginIndex = matchesProtoClasses(runtime, obj, arr);
 3238|      0|      if (beginIndex) {
  ------------------
  |  Branch (3238:11): [True: 0, False: 0]
  ------------------
 3239|       |        // Cache is valid for this object, so use it.
 3240|      0|        endIndex = arr->size(runtime);
 3241|      0|        return arr;
 3242|      0|      }
 3243|       |      // Invalid for this object. We choose to clear the cache since the
 3244|       |      // changes to the prototype chain probably affect other objects too.
 3245|      0|      clazz->clearForInCache(runtime);
 3246|       |      // Clear arr to slightly reduce risk of OOM from allocation below.
 3247|      0|      arr = nullptr;
 3248|      0|    }
 3249|      0|  }
 3250|       |
 3251|       |  // Slow case: Build the array of properties.
 3252|     15|  auto ownPropEstimate = clazz->getNumProperties();
 3253|     15|  auto arrRes = obj->shouldCacheForIn(runtime)
  ------------------
  |  Branch (3253:17): [True: 0, False: 15]
  ------------------
 3254|     15|      ? BigStorage::createLongLived(runtime, ownPropEstimate)
 3255|     15|      : BigStorage::create(runtime, ownPropEstimate);
 3256|     15|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     15|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15]
  |  |  ------------------
  ------------------
 3257|      0|    return ExecutionStatus::EXCEPTION;
 3258|      0|  }
 3259|     15|  arr = std::move(*arrRes);
 3260|     15|  if (setProtoClasses(runtime, obj, arr) == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (3260:7): [True: 0, False: 15]
  ------------------
 3261|      0|    return ExecutionStatus::EXCEPTION;
 3262|      0|  }
 3263|     15|  beginIndex = arr->size(runtime);
 3264|       |  // If obj or any of its prototypes are unsuitable for caching, then
 3265|       |  // beginIndex is 0 and we return an array with only the property names.
 3266|     15|  bool canCache = beginIndex;
 3267|     15|  auto end = appendAllPropertyNames(obj, runtime, arr, beginIndex);
 3268|     15|  if (end == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (3268:7): [True: 0, False: 15]
  ------------------
 3269|      0|    return ExecutionStatus::EXCEPTION;
 3270|      0|  }
 3271|     15|  endIndex = *end;
 3272|       |  // Avoid degenerate memory explosion: if > 75% of the array is properties
 3273|       |  // or classes from prototypes, then don't cache it.
 3274|     15|  const bool tooMuchProto = *end / 4 > ownPropEstimate;
 3275|     15|  if (canCache && !tooMuchProto) {
  ------------------
  |  Branch (3275:7): [True: 0, False: 15]
  |  Branch (3275:19): [True: 0, False: 0]
  ------------------
 3276|      0|    assert(beginIndex > 0 && "cached array must start with proto classes");
 3277|      0|#ifdef HERMES_SLOW_DEBUG
 3278|      0|    assert(beginIndex == matchesProtoClasses(runtime, obj, arr) && "matches");
 3279|      0|#endif
 3280|      0|    clazz->setForInCache(*arr, runtime);
 3281|      0|  }
 3282|     15|  return arr;
 3283|     15|}
JSObject.cpp:_ZN6hermes2vm12_GLOBAL__N_137getOwnComputedPrimitiveDescriptorImplENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeENS2_INS0_11HermesValueEEENS3_11IgnoreProxyERNS0_8SymbolIDERNS0_13MutableHandleISA_EERNS0_26ComputedPropertyDescriptorE:
  708|  6.64M|    ComputedPropertyDescriptor &desc) {
  709|  6.64M|  assert(
  710|  6.64M|      !nameValHandle->isObject() &&
  711|  6.64M|      "nameValHandle passed to "
  712|  6.64M|      "getOwnComputedPrimitiveDescriptor "
  713|  6.64M|      "cannot be an object");
  714|       |
  715|       |  // Try the fast paths first if we have "fast" index properties and the
  716|       |  // property name is an obvious index.
  717|  6.64M|  if (auto arrayIndex = toArrayIndexFastPath(*nameValHandle)) {
  ------------------
  |  Branch (717:12): [True: 3.20M, False: 3.44M]
  ------------------
  718|  3.20M|    if (JSObject::Helper::flags(*selfHandle).fastIndexProperties) {
  ------------------
  |  Branch (718:9): [True: 1.92M, False: 1.27M]
  ------------------
  719|  1.92M|      auto res = JSObject::Helper::getOwnIndexedPropertyFlags(
  720|  1.92M|          selfHandle.get(), runtime, *arrayIndex);
  721|  1.92M|      if (res) {
  ------------------
  |  Branch (721:11): [True: 840k, False: 1.08M]
  ------------------
  722|       |        // This a valid array index, residing in our indexed storage.
  723|   840k|        desc.flags = *res;
  724|   840k|        desc.flags.indexed = 1;
  725|   840k|        desc.slot = *arrayIndex;
  726|   840k|        return true;
  727|   840k|      }
  728|       |
  729|       |      // This a valid array index, but we don't have it in our indexed storage,
  730|       |      // and we don't have index-like named properties.
  731|  1.08M|      return false;
  732|  1.92M|    }
  733|       |
  734|  1.27M|    if (!selfHandle->getClass(runtime)->getHasIndexLikeProperties() &&
  ------------------
  |  Branch (734:9): [True: 543k, False: 729k]
  ------------------
  735|  1.27M|        !selfHandle->isHostObject() && !selfHandle->isLazy() &&
  ------------------
  |  Branch (735:9): [True: 543k, False: 0]
  |  Branch (735:40): [True: 543k, False: 0]
  ------------------
  736|  1.27M|        !selfHandle->isProxyObject()) {
  ------------------
  |  Branch (736:9): [True: 543k, False: 0]
  ------------------
  737|       |      // Early return to handle the case where an object definitely has no
  738|       |      // index-like properties. This avoids allocating a new StringPrimitive and
  739|       |      // uniquing it below.
  740|   543k|      return false;
  741|   543k|    }
  742|  1.27M|  }
  743|       |
  744|       |  // Convert the string to a SymbolID
  745|  4.17M|  LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  635|  4.17M|  do {                                                          \
  |  |  636|  4.17M|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (636:9): [True: 2.25M, False: 1.91M]
  |  |  ------------------
  |  |  637|  2.25M|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  638|  2.25M|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  639|  2.25M|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|  2.25M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 2.25M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  640|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  641|      0|      }                                                         \
  |  |  642|  2.25M|      id = **idRes;                                             \
  |  |  643|  2.25M|    }                                                           \
  |  |  644|  4.17M|  } while (0)
  |  |  ------------------
  |  |  |  Branch (644:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  746|       |
  747|       |  // Look for a named property with this name.
  748|  4.17M|  if (JSObject::getOwnNamedDescriptor(
  ------------------
  |  Branch (748:7): [True: 729k, False: 3.44M]
  ------------------
  749|  4.17M|          selfHandle,
  750|  4.17M|          runtime,
  751|  4.17M|          id,
  752|  4.17M|          JSObject::Helper::castToNamedPropertyDescriptorRef(desc))) {
  753|   729k|    return true;
  754|   729k|  }
  755|       |
  756|  3.44M|  if (LLVM_LIKELY(
  ------------------
  |  |  188|  10.6M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.88M, False: 1.56M]
  |  |  |  Branch (188:51): [True: 1.88M, False: 1.56M]
  |  |  |  Branch (188:51): [True: 1.88M, False: 0]
  |  |  |  Branch (188:51): [True: 1.88M, False: 0]
  |  |  ------------------
  ------------------
  757|  3.44M|          !JSObject::Helper::flags(*selfHandle).indexedStorage &&
  758|  3.44M|          !selfHandle->isLazy() && !selfHandle->isProxyObject())) {
  759|  1.88M|    return false;
  760|  1.88M|  }
  761|  1.56M|  MutableHandle<StringPrimitive> strPrim{runtime};
  762|       |
  763|       |  // If we have indexed storage, perform potentially expensive conversions
  764|       |  // to array index and check it.
  765|  1.56M|  if (JSObject::Helper::flags(*selfHandle).indexedStorage) {
  ------------------
  |  Branch (765:7): [True: 1.56M, False: 0]
  ------------------
  766|       |    // If the name is a valid integer array index, store it here.
  767|  1.56M|    OptValue<uint32_t> arrayIndex;
  768|       |
  769|       |    // Try to convert the property name to an array index.
  770|  1.56M|    TO_ARRAY_INDEX(runtime, nameValHandle, strPrim, arrayIndex);
  ------------------
  |  |  653|  1.56M|  do {                                                          \
  |  |  654|  1.56M|    arrayIndex = toArrayIndexFastPath(*nameValHandle);          \
  |  |  655|  1.56M|    if (!arrayIndex && !nameValHandle->isSymbol()) {            \
  |  |  ------------------
  |  |  |  Branch (655:9): [True: 1.56M, False: 0]
  |  |  |  Branch (655:24): [True: 0, False: 1.56M]
  |  |  ------------------
  |  |  656|      0|      LAZY_TO_STRING(runtime, nameValHandle, str);              \
  |  |  ------------------
  |  |  |  |  620|      0|  do {                                                    \
  |  |  |  |  621|      0|    if (!str) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (621:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  622|      0|      auto status = toString_RJS(runtime, nameValHandle); \
  |  |  |  |  623|      0|      assert(                                             \
  |  |  |  |  624|      0|          status != ExecutionStatus::EXCEPTION &&         \
  |  |  |  |  625|      0|          "toString() of primitive cannot fail");         \
  |  |  |  |  626|      0|      str = status->get();                                \
  |  |  |  |  627|      0|    }                                                     \
  |  |  |  |  628|      0|  } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (628:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  657|      0|      arrayIndex = toArrayIndex(runtime, str);                  \
  |  |  658|      0|    }                                                           \
  |  |  659|  1.56M|  } while (0)
  |  |  ------------------
  |  |  |  Branch (659:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  771|       |
  772|  1.56M|    if (arrayIndex) {
  ------------------
  |  Branch (772:9): [True: 0, False: 1.56M]
  ------------------
  773|      0|      auto res = JSObject::Helper::getOwnIndexedPropertyFlags(
  774|      0|          selfHandle.get(), runtime, *arrayIndex);
  775|      0|      if (res) {
  ------------------
  |  Branch (775:11): [True: 0, False: 0]
  ------------------
  776|      0|        desc.flags = *res;
  777|      0|        desc.flags.indexed = 1;
  778|      0|        desc.slot = *arrayIndex;
  779|      0|        return true;
  780|      0|      }
  781|      0|    }
  782|  1.56M|    return false;
  783|  1.56M|  }
  784|       |
  785|      0|  if (selfHandle->isLazy()) {
  ------------------
  |  Branch (785:7): [True: 0, False: 0]
  ------------------
  786|      0|    JSObject::initializeLazyObject(runtime, selfHandle);
  787|      0|    return JSObject::getOwnComputedPrimitiveDescriptor(
  788|      0|        selfHandle,
  789|      0|        runtime,
  790|      0|        nameValHandle,
  791|      0|        ignoreProxy,
  792|      0|        tmpSymbolStorage,
  793|      0|        desc);
  794|      0|  }
  795|       |
  796|      0|  assert(selfHandle->isProxyObject() && "descriptor flags are impossible");
  797|      0|  if (ignoreProxy == JSObject::IgnoreProxy::Yes) {
  ------------------
  |  Branch (797:7): [True: 0, False: 0]
  ------------------
  798|      0|    return false;
  799|      0|  }
  800|      0|  return JSProxy::getOwnProperty(
  801|      0|      selfHandle, runtime, nameValHandle, desc, nullptr);
  802|      0|}
_ZN6hermes2vm8JSObject6Helper5flagsEPS1_:
  673|  8.21M|  static ObjectFlags &flags(JSObject *self) {
  674|  8.21M|    return self->flags_;
  675|  8.21M|  }
_ZN6hermes2vm8JSObject6Helper26getOwnIndexedPropertyFlagsEPS1_RNS0_7RuntimeEj:
  679|  1.92M|  getOwnIndexedPropertyFlags(JSObject *self, Runtime &runtime, uint32_t index) {
  680|  1.92M|    return JSObject::getOwnIndexedPropertyFlags(self, runtime, index);
  681|  1.92M|  }
_ZN6hermes2vm8JSObject6Helper32castToNamedPropertyDescriptorRefERNS0_26ComputedPropertyDescriptorE:
  685|  4.17M|      ComputedPropertyDescriptor &desc) {
  686|  4.17M|    return desc.castToNamedPropertyDescriptorRef();
  687|  4.17M|  }
JSObject.cpp:_ZN6hermes2vmL23canNewPropertyBeIndexedENS0_19DefinePropertyFlagsE:
  664|  1.53M|static bool canNewPropertyBeIndexed(DefinePropertyFlags dpf) {
  665|  1.53M|  return dpf.setEnumerable && dpf.enumerable && dpf.setWritable &&
  ------------------
  |  Branch (665:10): [True: 1.53M, False: 0]
  |  Branch (665:31): [True: 1.53M, False: 0]
  |  Branch (665:49): [True: 1.53M, False: 0]
  ------------------
  666|  1.53M|      dpf.writable && dpf.setConfigurable && dpf.configurable &&
  ------------------
  |  Branch (666:7): [True: 827k, False: 703k]
  |  Branch (666:23): [True: 827k, False: 0]
  |  Branch (666:46): [True: 827k, False: 0]
  ------------------
  667|  1.53M|      !dpf.setSetter && !dpf.setGetter;
  ------------------
  |  Branch (667:7): [True: 827k, False: 0]
  |  Branch (667:25): [True: 827k, False: 0]
  ------------------
  668|  1.53M|}
JSObject.cpp:_ZN6hermes2vm12_GLOBAL__N_115setProtoClassesERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEERNS0_13MutableHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEE:
 3159|     15|    MutableHandle<BigStorage> &arr) {
 3160|       |  // Layout of a JSArray stored in the for-in cache:
 3161|       |  // [class(proto(obj)), class(proto(proto(obj))), ..., null, prop0, prop1, ...]
 3162|       |
 3163|     15|  if (!obj->shouldCacheForIn(runtime)) {
  ------------------
  |  Branch (3163:7): [True: 15, False: 0]
  ------------------
 3164|     15|    arr->clear(runtime);
 3165|     15|    return ExecutionStatus::RETURNED;
 3166|     15|  }
 3167|      0|  MutableHandle<JSObject> head(runtime, obj->getParent(runtime));
 3168|      0|  MutableHandle<> clazz(runtime);
 3169|      0|  GCScopeMarkerRAII marker{runtime};
 3170|      0|  while (head.get()) {
  ------------------
  |  Branch (3170:10): [True: 0, False: 0]
  ------------------
 3171|      0|    if (!head->shouldCacheForIn(runtime)) {
  ------------------
  |  Branch (3171:9): [True: 0, False: 0]
  ------------------
 3172|      0|      arr->clear(runtime);
 3173|      0|      return ExecutionStatus::RETURNED;
 3174|      0|    }
 3175|      0|    if (JSObject::Helper::flags(*head).lazyObject) {
  ------------------
  |  Branch (3175:9): [True: 0, False: 0]
  ------------------
 3176|       |      // Ensure all properties have been initialized before caching the hidden
 3177|       |      // class. Not doing this will result in changes to the hidden class
 3178|       |      // when getOwnPropertyKeys is called later.
 3179|      0|      JSObject::initializeLazyObject(runtime, head);
 3180|      0|    }
 3181|      0|    clazz = HermesValue::encodeObjectValue(head->getClass(runtime));
 3182|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3183|      0|            BigStorage::push_back(arr, runtime, clazz) ==
 3184|      0|            ExecutionStatus::EXCEPTION)) {
 3185|      0|      return ExecutionStatus::EXCEPTION;
 3186|      0|    }
 3187|      0|    head = head->getParent(runtime);
 3188|      0|    marker.flush();
 3189|      0|  }
 3190|      0|  clazz = HermesValue::encodeNullValue();
 3191|      0|  return BigStorage::push_back(arr, runtime, clazz);
 3192|      0|}
JSObject.cpp:_ZN6hermes2vm12_GLOBAL__N_122appendAllPropertyNamesENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeERNS0_13MutableHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEEj:
 3033|     15|    uint32_t beginIndex) {
 3034|     15|  uint32_t size = beginIndex;
 3035|       |  // We know that duplicate property names can only exist between objects in
 3036|       |  // the prototype chain. Hence there should not be duplicated properties
 3037|       |  // before we start to look at any prototype.
 3038|     15|  bool needDedup = false;
 3039|     15|  MutableHandle<> prop(runtime);
 3040|     15|  MutableHandle<SymbolID> propIdHandle{runtime};
 3041|     15|  MutableHandle<JSObject> head(runtime, obj.get());
 3042|       |  // Keep track of the unique props we have seen so far. The props may be
 3043|       |  // strings (SymbolIDs) or index names.
 3044|     15|  llvh::SmallSet<SymbolID::RawType, 4> dedupNames;
 3045|     15|  llvh::SmallSet<double, 4> dedupIdxNames;
 3046|       |  // Add the current value of prop and/or propIdHandle to correct set(s).
 3047|     15|  auto addToDedup = [&dedupIdxNames, &dedupNames, &runtime](
 3048|     15|                        Handle<> prop, Handle<SymbolID> propIdHandle) {
 3049|     15|    if (prop->isNumber()) {
 3050|     15|      double d = prop->getNumber();
 3051|     15|      dedupIdxNames.insert(d);
 3052|     15|    } else {
 3053|     15|      SymbolID sym = propIdHandle.get();
 3054|     15|      dedupNames.insert(sym.unsafeGetRaw());
 3055|       |      // We need to make sure that we check for duplicates across the number and
 3056|       |      // string types. This is because 3 should be treated as a duplicate of
 3057|       |      // '3'. Therefore, we attempt to convert this string to a number, and
 3058|       |      // insert the resulting value in the duplicate set.
 3059|     15|      OptValue<uint32_t> strToIdx =
 3060|     15|          toArrayIndex(StringPrimitive::createStringView(
 3061|     15|              runtime, Handle<StringPrimitive>::vmcast(prop)));
 3062|     15|      if (strToIdx) {
 3063|     15|        dedupIdxNames.insert(*strToIdx);
 3064|     15|      }
 3065|     15|    }
 3066|     15|  }; // end of lambda expression
 3067|     60|  while (head.get()) {
  ------------------
  |  Branch (3067:10): [True: 45, False: 15]
  ------------------
 3068|     45|    GCScope gcScope(runtime);
 3069|       |
 3070|       |    // enumerableProps will contain all enumerable own properties from obj.
 3071|       |    // Impl note: this is the only place where getOwnPropertyKeys will be
 3072|       |    // called without IncludeNonEnumerable on a Proxy.  Everywhere else,
 3073|       |    // trap ordering is specified but ES9 13.7.5.15 says "The mechanics and
 3074|       |    // order of enumerating the properties is not specified", which is
 3075|       |    // unusual.
 3076|     45|    auto cr =
 3077|     45|        JSObject::getOwnPropertyNames(head, runtime, true /* onlyEnumerable */);
 3078|     45|    if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     45|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 45]
  |  |  ------------------
  ------------------
 3079|      0|      return ExecutionStatus::EXCEPTION;
 3080|      0|    }
 3081|     45|    auto enumerableProps = *cr;
 3082|     45|    auto marker = gcScope.createMarker();
 3083|   840k|    for (unsigned i = 0, e = enumerableProps->getEndIndex(); i < e; ++i) {
  ------------------
  |  Branch (3083:62): [True: 840k, False: 45]
  ------------------
 3084|   840k|      gcScope.flushToMarker(marker);
 3085|   840k|      prop = enumerableProps->at(runtime, i).unboxToHV(runtime);
 3086|   840k|      assert(
 3087|   840k|          (prop->isNumber() || prop->isString()) &&
 3088|   840k|          "property name is not a string or number");
 3089|   840k|      if (prop->isString()) {
  ------------------
  |  Branch (3089:11): [True: 0, False: 840k]
  ------------------
 3090|      0|        CallResult<Handle<SymbolID>> symRes =
 3091|      0|            runtime.getIdentifierTable().getSymbolHandleFromPrimitive(
 3092|      0|                runtime,
 3093|      0|                runtime.makeHandle<StringPrimitive>(prop->getString()));
 3094|      0|        if (LLVM_UNLIKELY(symRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3095|      0|          return ExecutionStatus::EXCEPTION;
 3096|      0|        }
 3097|      0|        propIdHandle = *symRes;
 3098|      0|      }
 3099|   840k|      if (!needDedup) {
  ------------------
  |  Branch (3099:11): [True: 840k, False: 0]
  ------------------
 3100|       |        // If no dedup is needed, add it directly.
 3101|   840k|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   840k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 840k]
  |  |  ------------------
  ------------------
 3102|   840k|                BigStorage::push_back(arr, runtime, prop) ==
 3103|   840k|                ExecutionStatus::EXCEPTION)) {
 3104|      0|          return ExecutionStatus::EXCEPTION;
 3105|      0|        }
 3106|   840k|        addToDedup(prop, propIdHandle);
 3107|   840k|        ++size;
 3108|   840k|        continue;
 3109|   840k|      }
 3110|       |      // Otherwise check the existing sets for matches.
 3111|      0|      bool dupFound;
 3112|      0|      if (prop->isNumber()) {
  ------------------
  |  Branch (3112:11): [True: 0, False: 0]
  ------------------
 3113|      0|        dupFound = dedupIdxNames.count(prop->getNumber());
 3114|      0|      } else {
 3115|      0|        dupFound = dedupNames.count(propIdHandle.get().unsafeGetRaw());
 3116|       |        // If we still haven't found a duplicate and there have been previous
 3117|       |        // index names, then attempt to convert this string prop to an index and
 3118|       |        // check that number value for duplicates.
 3119|      0|        if (LLVM_UNLIKELY(!dupFound && dedupIdxNames.size())) {
  ------------------
  |  |  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]
  |  |  ------------------
  ------------------
 3120|      0|          OptValue<uint32_t> propNum =
 3121|      0|              toArrayIndex(StringPrimitive::createStringView(
 3122|      0|                  runtime, Handle<StringPrimitive>::vmcast(prop)));
 3123|      0|          if (LLVM_UNLIKELY(propNum))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3124|      0|            dupFound = dedupIdxNames.count(*propNum);
 3125|      0|        }
 3126|      0|      }
 3127|      0|      if (LLVM_LIKELY(!dupFound)) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3128|      0|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3129|      0|                BigStorage::push_back(arr, runtime, prop) ==
 3130|      0|                ExecutionStatus::EXCEPTION)) {
 3131|      0|          return ExecutionStatus::EXCEPTION;
 3132|      0|        }
 3133|      0|        addToDedup(prop, propIdHandle);
 3134|      0|        ++size;
 3135|      0|      }
 3136|      0|    }
 3137|       |    // Continue to follow the prototype chain.
 3138|     45|    CallResult<PseudoHandle<JSObject>> parentRes =
 3139|     45|        JSObject::getPrototypeOf(head, runtime);
 3140|     45|    if (LLVM_UNLIKELY(parentRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     45|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 45]
  |  |  ------------------
  ------------------
 3141|      0|      return ExecutionStatus::EXCEPTION;
 3142|      0|    }
 3143|     45|    head = parentRes->get();
 3144|     45|    needDedup = true;
 3145|     45|  }
 3146|     15|  return size;
 3147|     15|}
JSObject.cpp:_ZZN6hermes2vm12_GLOBAL__N_122appendAllPropertyNamesENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeERNS0_13MutableHandleINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEEjENK3$_0clENS2_IS9_EENS2_INS0_8SymbolIDEEE:
 3048|   840k|                        Handle<> prop, Handle<SymbolID> propIdHandle) {
 3049|   840k|    if (prop->isNumber()) {
  ------------------
  |  Branch (3049:9): [True: 840k, False: 0]
  ------------------
 3050|   840k|      double d = prop->getNumber();
 3051|   840k|      dedupIdxNames.insert(d);
 3052|   840k|    } else {
 3053|      0|      SymbolID sym = propIdHandle.get();
 3054|      0|      dedupNames.insert(sym.unsafeGetRaw());
 3055|       |      // We need to make sure that we check for duplicates across the number and
 3056|       |      // string types. This is because 3 should be treated as a duplicate of
 3057|       |      // '3'. Therefore, we attempt to convert this string to a number, and
 3058|       |      // insert the resulting value in the duplicate set.
 3059|      0|      OptValue<uint32_t> strToIdx =
 3060|      0|          toArrayIndex(StringPrimitive::createStringView(
 3061|      0|              runtime, Handle<StringPrimitive>::vmcast(prop)));
 3062|      0|      if (strToIdx) {
  ------------------
  |  Branch (3062:11): [True: 0, False: 0]
  ------------------
 3063|      0|        dedupIdxNames.insert(*strToIdx);
 3064|      0|      }
 3065|      0|    }
 3066|   840k|  }; // end of lambda expression
JSObject.cpp:_ZZN6hermes2vm8JSObject18getOwnPropertyKeysENS0_6HandleIS1_EERNS0_7RuntimeENS0_12OwnKeysFlagsEENK3$_0clENS0_8SymbolIDENS0_23NamedPropertyDescriptorE:
  463|    795|         &dedupSet](SymbolID id, NamedPropertyDescriptor desc) {
  464|    795|          if (!isPropertyNamePrimitive(id)) {
  ------------------
  |  Branch (464:15): [True: 45, False: 750]
  ------------------
  465|     45|            return;
  466|     45|          }
  467|       |
  468|       |          // If specified, check whether it is enumerable.
  469|    750|          if (!okFlags.getIncludeNonEnumerable()) {
  ------------------
  |  Branch (469:15): [True: 750, False: 0]
  ------------------
  470|    750|            if (!desc.flags.enumerable)
  ------------------
  |  Branch (470:17): [True: 750, False: 0]
  ------------------
  471|    750|              return;
  472|    750|          }
  473|       |
  474|       |          // Host properties might overlap with the ones recognized by the
  475|       |          // hidden class. If we're dealing with a host object then keep track
  476|       |          // of hidden class properties for the deduplication purposes.
  477|      0|          if (LLVM_UNLIKELY(hostObjectSymbolCount > 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  478|      0|            dedupSet.insert(id.unsafeGetRaw());
  479|      0|          }
  480|       |
  481|       |          // Check if this property is an integer index. If it is, we stash it
  482|       |          // away to deal with it later. This check should be fast since most
  483|       |          // property names don't start with a digit.
  484|      0|          auto propNameAsIndex = toArrayIndex(
  485|      0|              runtime.getIdentifierTable().getStringView(runtime, id));
  486|      0|          if (LLVM_UNLIKELY(propNameAsIndex)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  487|      0|            indexNames.push_back(*propNameAsIndex);
  488|      0|            return;
  489|      0|          }
  490|       |
  491|      0|          tmpHandle = HermesValue::encodeStringValue(
  492|      0|              runtime.getStringPrimFromSymbolID(id));
  493|      0|          JSArray::setElementAt(array, runtime, index++, tmpHandle);
  494|      0|        });

_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|      8|    Handle<JSObject> parentHandle) {
   70|      8|  auto *cell = runtime.makeAFixed<JSRegExp, HasFinalizer::Yes>(
   71|      8|      runtime,
   72|      8|      parentHandle,
   73|      8|      runtime.getHiddenClassForPrototype(
   74|      8|          *parentHandle, numOverlapSlots<JSRegExp>()));
   75|      8|  return JSObjectInit::initToPseudoHandle(runtime, cell);
   76|      8|}
_ZN6hermes2vm8JSRegExp16createMatchClassERNS0_7RuntimeENS0_6HandleINS0_11HiddenClassEEE:
   80|    160|    Handle<HiddenClass> arrayClass) {
   81|       |  // Adds the property \p name to matchClass which, upon return, will point to
   82|       |  // the newly created hidden class.
   83|    160|  auto addProperty = [&](Handle<HiddenClass> clazz, Predefined::Str name) {
   84|    160|    auto added = HiddenClass::addProperty(
   85|    160|        clazz,
   86|    160|        runtime,
   87|    160|        Predefined::getSymbolID(name),
   88|    160|        PropertyFlags::defaultNewNamedPropertyFlags());
   89|    160|    assert(
   90|    160|        added != ExecutionStatus::EXCEPTION &&
   91|    160|        "Adding the first properties shouldn't cause overflow");
   92|    160|    return added->first;
   93|    160|  };
   94|       |
   95|    160|  Handle<HiddenClass> addIndex = addProperty(arrayClass, Predefined::index);
   96|    160|  Handle<HiddenClass> addInput = addProperty(addIndex, Predefined::input);
   97|    160|  return addProperty(addInput, Predefined::groups);
   98|    160|}
_ZN6hermes2vm8JSRegExp10initializeENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_15StringPrimitiveEEES7_N4llvh8ArrayRefIhEE:
  105|      8|    llvh::ArrayRef<uint8_t> bytecode) {
  106|      8|  assert(
  107|      8|      pattern && flags &&
  108|      8|      "Null pattern and/or flags passed to JSRegExp::initialize");
  109|      8|  selfHandle->pattern_.set(runtime, *pattern, runtime.getHeap());
  110|       |
  111|      8|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  112|      8|  dpf.enumerable = 0;
  113|      8|  dpf.configurable = 0;
  114|       |
  115|      8|  auto res = JSObject::defineOwnProperty(
  116|      8|      selfHandle,
  117|      8|      runtime,
  118|      8|      Predefined::getSymbolID(Predefined::lastIndex),
  119|      8|      dpf,
  120|      8|      HandleRootOwner::getZeroValue());
  121|      8|  (void)res;
  122|      8|  assert(
  123|      8|      res != ExecutionStatus::EXCEPTION && *res &&
  124|      8|      "defineOwnProperty() failed");
  125|       |
  126|      8|  selfHandle->initializeBytecode(bytecode);
  127|      8|}
_ZN6hermes2vm8JSRegExp10initializeENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_15StringPrimitiveEEES7_:
  163|      1|    Handle<StringPrimitive> flags) {
  164|      1|  assert(
  165|      1|      pattern && flags &&
  166|      1|      "Null pattern and/or flags passed to JSRegExp::initialize");
  167|      1|  llvh::SmallVector<char16_t, 6> flagsText16;
  168|      1|  flags->appendUTF16String(flagsText16);
  169|       |
  170|      1|  llvh::SmallVector<char16_t, 16> patternText16;
  171|      1|  pattern->appendUTF16String(patternText16);
  172|       |
  173|       |  // Build the regex.
  174|      1|  regex::Regex<regex::UTF16RegexTraits> regex(patternText16, flagsText16);
  175|       |
  176|      1|  if (!regex.valid()) {
  ------------------
  |  Branch (176:7): [True: 0, False: 1]
  ------------------
  177|      0|    return runtime.raiseSyntaxError(
  178|      0|        TwineChar16("Invalid RegExp: ") +
  179|      0|        regex::constants::messageForError(regex.getError()));
  180|      0|  }
  181|       |  // The regex is valid. Compile and store its bytecode.
  182|      1|  auto bytecode = regex.compile();
  183|       |  // Also store the name mappings.
  184|      1|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  185|      1|          initializeGroupNameMappingObj(
  186|      1|              runtime,
  187|      1|              selfHandle,
  188|      1|              regex.getOrderedNamedGroups(),
  189|      1|              regex.getGroupNamesMapping()) == ExecutionStatus::EXCEPTION)) {
  190|      0|    return ExecutionStatus::EXCEPTION;
  191|      0|  }
  192|      1|  initialize(selfHandle, runtime, pattern, flags, bytecode);
  193|      1|  return ExecutionStatus::RETURNED;
  194|      1|}
_ZN6hermes2vm8JSRegExp29initializeGroupNameMappingObjERNS0_7RuntimeENS0_6HandleIS1_EERNSt3__15dequeIN4llvh11SmallVectorIDsLj5EEENS6_9allocatorISA_EEEERNS8_8DenseMapINS8_8ArrayRefIDsEEjNS8_12DenseMapInfoISH_EENS8_6detail12DenseMapPairISH_jEEEE:
  200|      1|    regex::ParsedGroupNamesMapping &parsedMappings) {
  201|      1|  GCScope gcScope(runtime);
  202|      1|  if (parsedMappings.size() == 0)
  ------------------
  |  Branch (202:7): [True: 1, False: 0]
  ------------------
  203|      1|    return ExecutionStatus::RETURNED;
  204|       |
  205|      0|  auto objRes = JSObject::create(runtime, parsedMappings.size());
  206|      0|  auto obj = runtime.makeHandle(objRes.get());
  207|       |
  208|      0|  MutableHandle<HermesValue> numberHandle{runtime};
  209|      0|  for (const auto &identifier : orderedNamedGroups) {
  ------------------
  |  Branch (209:31): [True: 0, False: 0]
  ------------------
  210|      0|    GCScopeMarkerRAII marker{gcScope};
  211|      0|    auto symbolRes =
  212|      0|        runtime.getIdentifierTable().getSymbolHandle(runtime, identifier);
  213|      0|    if (LLVM_UNLIKELY(symbolRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  214|      0|      return ExecutionStatus::EXCEPTION;
  215|      0|    }
  216|      0|    auto idx = parsedMappings[identifier];
  217|      0|    numberHandle.set(HermesValue::encodeUntrustedNumberValue(idx));
  218|      0|    auto res = JSObject::defineNewOwnProperty(
  219|      0|        obj,
  220|      0|        runtime,
  221|      0|        symbolRes->get(),
  222|      0|        PropertyFlags::defaultNewNamedPropertyFlags(),
  223|      0|        numberHandle);
  224|      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]
  |  |  ------------------
  ------------------
  225|      0|      return ExecutionStatus::EXCEPTION;
  226|      0|  }
  227|       |
  228|      0|  selfHandle->groupNameMappings_.set(runtime, *obj, runtime.getHeap());
  229|      0|  return ExecutionStatus::RETURNED;
  230|      0|}
_ZN6hermes2vm8JSRegExp18initializeBytecodeEN4llvh8ArrayRefIhEE:
  242|      8|void JSRegExp::initializeBytecode(llvh::ArrayRef<uint8_t> bytecode) {
  243|      8|  size_t sz = bytecode.size();
  244|      8|  assert(
  245|      8|      sz <= std::numeric_limits<uint32_t>::max() &&
  246|      8|      "Bytecode size cannot exceed 32 bits");
  247|      8|  auto header =
  248|      8|      reinterpret_cast<const regex::RegexBytecodeHeader *>(bytecode.data());
  249|      8|  syntaxFlags_ = regex::SyntaxFlags::fromByte(header->syntaxFlags);
  250|      8|  bytecodeSize_ = sz;
  251|      8|  bytecode_ = (uint8_t *)checkedMalloc(sz);
  252|      8|  memcpy(bytecode_, bytecode.data(), sz);
  253|      8|}
_ZN6hermes2vm8JSRegExp10getPatternEPS1_RNS0_11PointerBaseE:
  257|      2|    PointerBase &base) {
  258|      2|  return createPseudoHandle(self->pattern_.get(base));
  259|      2|}
_ZN6hermes2vm8JSRegExpD2Ev:
  355|      8|JSRegExp::~JSRegExp() {
  356|      8|  free(bytecode_);
  357|      8|}
_ZN6hermes2vm8JSRegExp13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  359|      8|void JSRegExp::_finalizeImpl(GCCell *cell, GC &gc) {
  360|      8|  JSRegExp *self = vmcast<JSRegExp>(cell);
  361|      8|  if (self->bytecode_) {
  ------------------
  |  Branch (361:7): [True: 8, False: 0]
  ------------------
  362|      8|    gc.getIDTracker().untrackNative(self->bytecode_);
  363|      8|  }
  364|      8|  self->~JSRegExp();
  365|      8|}
_ZN6hermes2vm8JSRegExp13escapePatternENS0_6HandleINS0_15StringPrimitiveEEERNS0_7RuntimeE:
  416|      2|    Runtime &runtime) {
  417|      2|  SmallU16String<32> result;
  418|      2|  result.reserve(pattern->getStringLength());
  419|      2|  auto patternView = StringPrimitive::createStringView(runtime, pattern);
  420|      2|  bool isBackslashed = false;
  421|  91.3k|  for (char16_t c : patternView) {
  ------------------
  |  Branch (421:19): [True: 91.3k, False: 2]
  ------------------
  422|  91.3k|    switch (c) {
  423|      2|      case u'/':
  ------------------
  |  Branch (423:7): [True: 2, False: 91.3k]
  ------------------
  424|       |        // Avoid premature end of regex.
  425|       |        // TODO nice to have: don't do this if we are in square brackets.
  426|       |        // /[/]/ is valid and the middle / does not need to be escaped.
  427|       |        // However /[\/]/ is also valid and means the same thing
  428|       |        // (CharacterEscape production from regexp grammar). Still it would be
  429|       |        // nice to not unnecessarily mangle the user's supplied pattern.
  430|      2|        result.append(isBackslashed ? "/" : "\\/");
  ------------------
  |  Branch (430:23): [True: 0, False: 2]
  ------------------
  431|      2|        break;
  432|       |
  433|       |        // Escape line terminators. See ES5.1 7.3.
  434|  86.2k|      case u'\n':
  ------------------
  |  Branch (434:7): [True: 86.2k, False: 5.18k]
  ------------------
  435|  86.2k|        result.append(isBackslashed ? "n" : "\\n");
  ------------------
  |  Branch (435:23): [True: 0, False: 86.2k]
  ------------------
  436|  86.2k|        break;
  437|       |
  438|      1|      case u'\r':
  ------------------
  |  Branch (438:7): [True: 1, False: 91.3k]
  ------------------
  439|      1|        result.append(isBackslashed ? "r" : "\\r");
  ------------------
  |  Branch (439:23): [True: 0, False: 1]
  ------------------
  440|      1|        break;
  441|       |
  442|      0|      case 0x2028:
  ------------------
  |  Branch (442:7): [True: 0, False: 91.3k]
  ------------------
  443|      0|        result.append(isBackslashed ? "u2028" : "\\u2028");
  ------------------
  |  Branch (443:23): [True: 0, False: 0]
  ------------------
  444|      0|        break;
  445|       |
  446|      0|      case 0x2029:
  ------------------
  |  Branch (446:7): [True: 0, False: 91.3k]
  ------------------
  447|      0|        result.append(isBackslashed ? "u2029" : "\\u2029");
  ------------------
  |  Branch (447:23): [True: 0, False: 0]
  ------------------
  448|      0|        break;
  449|       |
  450|  5.17k|      default:
  ------------------
  |  Branch (450:7): [True: 5.17k, False: 86.2k]
  ------------------
  451|  5.17k|        result.append(c);
  452|  5.17k|        break;
  453|  91.3k|    }
  454|  91.3k|    isBackslashed = (c == u'\\') && !isBackslashed;
  ------------------
  |  Branch (454:21): [True: 0, False: 91.3k]
  |  Branch (454:37): [True: 0, False: 0]
  ------------------
  455|  91.3k|  }
  456|       |  // "If P is the empty String, this specification can be met by letting S be
  457|       |  // '(?:)'."
  458|      2|  if (result.empty()) {
  ------------------
  |  Branch (458:7): [True: 0, False: 2]
  ------------------
  459|      0|    result = u"(?:)";
  460|      0|  }
  461|       |
  462|       |  // Avoid unnecessary allocation in the likely event the source and pattern
  463|       |  // match.
  464|      2|  if (patternView.equals(result.arrayRef())) {
  ------------------
  |  Branch (464:7): [True: 1, False: 1]
  ------------------
  465|      1|    return pattern.getHermesValue();
  466|      1|  }
  467|      1|  return StringPrimitive::create(runtime, result);
  468|      2|}
JSRegExp.cpp:_ZZN6hermes2vm8JSRegExp16createMatchClassERNS0_7RuntimeENS0_6HandleINS0_11HiddenClassEEEENK3$_0clES6_NS0_10Predefined3StrE:
   83|    480|  auto addProperty = [&](Handle<HiddenClass> clazz, Predefined::Str name) {
   84|    480|    auto added = HiddenClass::addProperty(
   85|    480|        clazz,
   86|    480|        runtime,
   87|    480|        Predefined::getSymbolID(name),
   88|    480|        PropertyFlags::defaultNewNamedPropertyFlags());
   89|    480|    assert(
   90|    480|        added != ExecutionStatus::EXCEPTION &&
   91|    480|        "Adding the first properties shouldn't cause overflow");
   92|    480|    return added->first;
   93|    480|  };

_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|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIsLNS0_8CellKindE36EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIiLNS0_8CellKindE37EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE38EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE39EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayItLNS0_8CellKindE40EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIjLNS0_8CellKindE41EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIfLNS0_8CellKindE42EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIdLNS0_8CellKindE43EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIlLNS0_8CellKindE44EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayImLNS0_8CellKindE45EE7getNameERNS0_7RuntimeE:
  402|    160|      Runtime &runtime) {                                          \
  403|    160|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|    160|  }
_ZN6hermes2vm12JSTypedArrayIaLNS0_8CellKindE35EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIsLNS0_8CellKindE36EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIiLNS0_8CellKindE37EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE38EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE39EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayItLNS0_8CellKindE40EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIjLNS0_8CellKindE41EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIfLNS0_8CellKindE42EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIdLNS0_8CellKindE43EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayIlLNS0_8CellKindE44EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }
_ZN6hermes2vm12JSTypedArrayImLNS0_8CellKindE45EE12getPrototypeERKNS0_7RuntimeE:
  411|    160|      const Runtime &runtime) {                                     \
  412|    160|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|    160|  }

_ZN6hermes2vm13JSWeakMapImplILNS0_8CellKindE51EE21WeakMapOrSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  193|      1|    Metadata::Builder &mb) {
  194|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakMapImpl<C>>());
  195|      1|  WeakMapImplBaseBuildMeta(cell, mb);
  196|      1|}
_ZN6hermes2vm13JSWeakMapImplILNS0_8CellKindE52EE21WeakMapOrSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  193|      1|    Metadata::Builder &mb) {
  194|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakMapImpl<C>>());
  195|      1|  WeakMapImplBaseBuildMeta(cell, mb);
  196|      1|}
_ZN6hermes2vm17JSWeakMapImplBase24WeakMapImplBaseBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   24|      2|    Metadata::Builder &mb) {
   25|      2|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakMapImplBase>());
   26|      2|  JSObjectBuildMeta(cell, mb);
   27|      2|}
_ZN6hermes2vm18JSWeakMapBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  198|      1|void JSWeakMapBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  199|      1|  JSWeakMap::WeakMapOrSetBuildMeta(cell, mb);
  200|      1|  mb.setVTable(&JSWeakMap::vt);
  201|      1|}
_ZN6hermes2vm18JSWeakSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  203|      1|void JSWeakSetBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  204|      1|  JSWeakSet::WeakMapOrSetBuildMeta(cell, mb);
  205|      1|  mb.setVTable(&JSWeakSet::vt);
  206|      1|}

_ZN6hermes2vm18JSWeakRefBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   42|      1|void JSWeakRefBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   43|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakRef>());
   44|      1|  JSObjectBuildMeta(cell, mb);
   45|      1|  mb.setVTable(&JSWeakRef::vt);
   46|      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|    222|  for (const auto &p : mb.map##type##_) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (26:22): [True: 222, False: 79]
  |  |  |  |  ------------------
  |  |  |  |   27|    222|    offsets.fields[i] = p.first;          \
  |  |  |  |   28|    222|    names[i] = p.second;                  \
  |  |  |  |   29|    222|    i++;                                  \
  |  |  |  |   30|    222|  }                                       \
  |  |  |  |   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|     79|  assert(vtp->isValid() && "Must initialize VTable pointer for metadata.");
   37|     79|}
_ZN6hermes2vm8Metadata7BuilderC2EPKv:
   40|     79|    : base_(reinterpret_cast<const char *>(base)) {}
_ZN6hermes2vm8Metadata7Builder9getOffsetEPKv:
   42|    349|Metadata::offset_t Metadata::Builder::getOffset(const void *fieldLocation) {
   43|    349|  const size_t offset = reinterpret_cast<const char *>(fieldLocation) - base_;
   44|    349|  const offset_t ret = offset;
   45|    349|  assert(ret == offset && "Offset overflowed.");
   46|    349|  return ret;
   47|    349|}
_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|    222|      const char *name, const type *fieldLocation) {                           \
   59|    222|    offset_t offset = getOffset(fieldLocation);                                \
   60|    222|    assert(                                                                    \
   61|    222|        !fieldConflicts(offset, sizeof(type)) && "fields should not overlap"); \
   62|    222|    map##type##_[offset] = name;                                               \
   63|    222|  }
_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|      8|  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|    333|bool Metadata::Builder::fieldConflicts(offset_t offset, size_t size) {
   85|    333|  size_t end = offset + size;
   86|    333|  coveredOffsets_.resize(std::max(coveredOffsets_.size(), end));
   87|  1.70k|  for (offset_t i = offset; i < end; ++i) {
  ------------------
  |  Branch (87:29): [True: 1.37k, False: 333]
  ------------------
   88|  1.37k|    if (coveredOffsets_[i])
  ------------------
  |  Branch (88:9): [True: 0, False: 1.37k]
  ------------------
   89|      0|      return true;
   90|  1.37k|    coveredOffsets_[i] = true;
   91|  1.37k|  }
   92|    333|  return false;
   93|    333|}

_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|  2.21M|    PseudoHandle<StringPrimitive> strPrim) {
   40|       |  // Unique the string.
   41|  2.21M|  return runtime.getIdentifierTable().getSymbolHandleFromPrimitive(
   42|  2.21M|      runtime, std::move(strPrim));
   43|  2.21M|}
_ZN6hermes2vm15valueToSymbolIDERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
   47|  3.35M|    Handle<> nameValHnd) {
   48|  3.35M|  if (nameValHnd->isSymbol()) {
  ------------------
  |  Branch (48:7): [True: 1.13M, False: 2.21M]
  ------------------
   49|  1.13M|    return Handle<SymbolID>::vmcast(nameValHnd);
   50|  1.13M|  }
   51|       |  // Convert the value to a string.
   52|  2.21M|  auto res = toString_RJS(runtime, nameValHnd);
   53|  2.21M|  if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (53:7): [True: 0, False: 2.21M]
  ------------------
   54|      0|    return ExecutionStatus::EXCEPTION;
   55|       |
   56|       |  // Unique the string.
   57|  2.21M|  return stringToSymbolID(runtime, std::move(*res));
   58|  2.21M|}
_ZN6hermes2vm6typeOfERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
   60|  1.93k|HermesValue typeOf(Runtime &runtime, Handle<> valueHandle) {
   61|  1.93k|  switch (valueHandle->getETag()) {
   62|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (62:5): [True: 0, False: 1.93k]
  ------------------
   63|      0|      return HermesValue::encodeStringValue(
   64|      0|          runtime.getPredefinedString(Predefined::undefined));
   65|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (65:5): [True: 0, False: 1.93k]
  ------------------
   66|      0|      return HermesValue::encodeStringValue(
   67|      0|          runtime.getPredefinedString(Predefined::object));
   68|     10|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (68:5): [True: 10, False: 1.92k]
  ------------------
   69|     10|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (69:5): [True: 0, False: 1.93k]
  ------------------
   70|     10|      return HermesValue::encodeStringValue(
   71|     10|          runtime.getPredefinedString(Predefined::string));
   72|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (72:5): [True: 0, False: 1.93k]
  ------------------
   73|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (73:5): [True: 0, False: 1.93k]
  ------------------
   74|      0|      return HermesValue::encodeStringValue(
   75|      0|          runtime.getPredefinedString(Predefined::bigint));
   76|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (76:5): [True: 0, False: 1.93k]
  ------------------
   77|      0|      return HermesValue::encodeStringValue(
   78|      0|          runtime.getPredefinedString(Predefined::boolean));
   79|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (79:5): [True: 0, False: 1.93k]
  ------------------
   80|      0|      return HermesValue::encodeStringValue(
   81|      0|          runtime.getPredefinedString(Predefined::symbol));
   82|  1.92k|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (82:5): [True: 1.92k, False: 10]
  ------------------
   83|  1.92k|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (83:5): [True: 0, False: 1.93k]
  ------------------
   84|  1.92k|      if (vmisa<Callable>(*valueHandle))
  ------------------
  |  Branch (84:11): [True: 960, False: 960]
  ------------------
   85|    960|        return HermesValue::encodeStringValue(
   86|    960|            runtime.getPredefinedString(Predefined::function));
   87|    960|      return HermesValue::encodeStringValue(
   88|    960|          runtime.getPredefinedString(Predefined::object));
   89|      0|    default:
  ------------------
  |  Branch (89:5): [True: 0, False: 1.93k]
  ------------------
   90|      0|      assert(valueHandle->isNumber() && "Invalid type.");
   91|      0|      return HermesValue::encodeStringValue(
   92|      0|          runtime.getPredefinedString(Predefined::number));
   93|  1.93k|  }
   94|  1.93k|}
_ZN6hermes2vm12toArrayIndexENS0_10StringViewE:
  103|   887k|OptValue<uint32_t> toArrayIndex(StringView str) {
  104|   887k|  auto len = str.length();
  105|   887k|  if (str.isASCII()) {
  ------------------
  |  Branch (105:7): [True: 887k, False: 0]
  ------------------
  106|   887k|    const char *ptr = str.castToCharPtr();
  107|   887k|    return hermes::toArrayIndex(ptr, ptr + len);
  108|   887k|  }
  109|      0|  const char16_t *ptr = str.castToChar16Ptr();
  110|      0|  return hermes::toArrayIndex(ptr, ptr + len);
  111|   887k|}
_ZN6hermes2vm11isSameValueENS0_11HermesValueES1_:
  113|  1.04k|bool isSameValue(HermesValue x, HermesValue y) {
  114|       |  // Check for NaN before checking the tag. We have to do this because NaNs may
  115|       |  // differ in the sign bit, which may result in the tag comparison below
  116|       |  // incorrectly returning false.
  117|  1.04k|  if (LLVM_UNLIKELY(x.isNaN()) && y.isNaN())
  ------------------
  |  |  189|  2.08k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.04k]
  |  |  ------------------
  ------------------
  |  Branch (117:35): [True: 0, False: 0]
  ------------------
  118|      0|    return true;
  119|       |
  120|  1.04k|  if (x.getTag() != y.getTag()) {
  ------------------
  |  Branch (120:7): [True: 0, False: 1.04k]
  ------------------
  121|       |    // If the tags are different, they must be different.
  122|      0|    return false;
  123|      0|  }
  124|  1.04k|  assert(
  125|  1.04k|      !x.isEmpty() && !x.isNativeValue() &&
  126|  1.04k|      "Empty and Native Value cannot be compared");
  127|       |
  128|       |  // Strings require deep comparison.
  129|  1.04k|  if (x.isString()) {
  ------------------
  |  Branch (129:7): [True: 82, False: 960]
  ------------------
  130|       |    // For strings, we compare each character in sequence.
  131|     82|    return x.getString()->equals(y.getString());
  132|     82|  }
  133|       |
  134|       |  // Bigints also require deep comparison.
  135|    960|  if (x.isBigInt()) {
  ------------------
  |  Branch (135:7): [True: 0, False: 960]
  ------------------
  136|       |    // For bigints, perform the numerical comparison.
  137|      0|    return x.getBigInt()->compare(y.getBigInt()) == 0;
  138|      0|  }
  139|       |
  140|       |  // Otherwise they are identical if the raw bits are the same.
  141|    960|  return x.getRaw() == y.getRaw();
  142|    960|}
_ZN6hermes2vm11isPrimitiveENS0_11HermesValueE:
  152|  1.88M|bool isPrimitive(HermesValue val) {
  153|  1.88M|  assert(!val.isEmpty() && "empty value encountered");
  154|  1.88M|  assert(!val.isNativeValue() && "native value encountered");
  155|  1.88M|  return !val.isObject();
  156|  1.88M|}
_ZN6hermes2vm19ordinaryToPrimitiveENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeENS0_13PreferredTypeE:
  161|  1.13M|    PreferredType preferredType) {
  162|  1.13M|  GCScope gcScope{runtime};
  163|  1.13M|  assert(
  164|  1.13M|      preferredType != PreferredType::NONE &&
  165|  1.13M|      "OrdinaryToPrimitive requires a type hint");
  166|       |
  167|  1.88M|  for (int i = 0; i < 2; ++i) {
  ------------------
  |  Branch (167:19): [True: 1.88M, False: 0]
  ------------------
  168|  1.88M|    if (preferredType == PreferredType::STRING) {
  ------------------
  |  Branch (168:9): [True: 1.13M, False: 746k]
  ------------------
  169|  1.13M|      auto propRes = JSObject::getNamed_RJS(
  170|  1.13M|          selfHandle, runtime, Predefined::getSymbolID(Predefined::toString));
  171|  1.13M|      if (propRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (171:11): [True: 0, False: 1.13M]
  ------------------
  172|      0|        return ExecutionStatus::EXCEPTION;
  173|  1.13M|      if (auto funcHandle = Handle<Callable>::dyn_vmcast(
  ------------------
  |  Branch (173:16): [True: 1.13M, False: 0]
  ------------------
  174|  1.13M|              runtime.makeHandle(std::move(*propRes)))) {
  175|  1.13M|        auto callRes =
  176|  1.13M|            funcHandle->executeCall0(funcHandle, runtime, selfHandle);
  177|  1.13M|        if (callRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (177:13): [True: 0, False: 1.13M]
  ------------------
  178|      0|          return ExecutionStatus::EXCEPTION;
  179|  1.13M|        if (isPrimitive(callRes->get()))
  ------------------
  |  Branch (179:13): [True: 1.13M, False: 0]
  ------------------
  180|  1.13M|          return callRes.toCallResultHermesValue();
  181|  1.13M|      }
  182|       |
  183|       |      // This method failed. Try the other one.
  184|      0|      preferredType = PreferredType::NUMBER;
  185|   746k|    } else {
  186|   746k|      auto propRes = JSObject::getNamed_RJS(
  187|   746k|          selfHandle, runtime, Predefined::getSymbolID(Predefined::valueOf));
  188|   746k|      if (propRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (188:11): [True: 0, False: 746k]
  ------------------
  189|      0|        return ExecutionStatus::EXCEPTION;
  190|   746k|      if (auto funcHandle = Handle<Callable>::dyn_vmcast(
  ------------------
  |  Branch (190:16): [True: 746k, False: 0]
  ------------------
  191|   746k|              runtime.makeHandle(std::move(*propRes)))) {
  192|   746k|        auto callRes =
  193|   746k|            funcHandle->executeCall0(funcHandle, runtime, selfHandle);
  194|   746k|        if (callRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (194:13): [True: 0, False: 746k]
  ------------------
  195|      0|          return ExecutionStatus::EXCEPTION;
  196|   746k|        if (isPrimitive(callRes->get()))
  ------------------
  |  Branch (196:13): [True: 0, False: 746k]
  ------------------
  197|      0|          return callRes.toCallResultHermesValue();
  198|   746k|      }
  199|       |
  200|       |      // This method failed. Try the other one.
  201|   746k|      preferredType = PreferredType::STRING;
  202|   746k|    }
  203|  1.88M|  }
  204|       |
  205|       |  // Nothing succeeded, time to give up.
  206|      0|  return runtime.raiseTypeError("Cannot determine default value of object");
  207|  1.13M|}
_ZN6hermes2vm15toPrimitive_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEENS0_13PreferredTypeE:
  211|  2.75M|toPrimitive_RJS(Runtime &runtime, Handle<> valueHandle, PreferredType hint) {
  212|  2.75M|  assert(!valueHandle->isEmpty() && "empty value is not allowed");
  213|  2.75M|  assert(!valueHandle->isNativeValue() && "native value is not allowed");
  214|       |
  215|  2.75M|  if (!valueHandle->isObject())
  ------------------
  |  Branch (215:7): [True: 1.62M, False: 1.13M]
  ------------------
  216|  1.62M|    return *valueHandle;
  217|       |
  218|       |  // 4. Let exoticToPrim be GetMethod(input, @@toPrimitive).
  219|  1.13M|  auto exoticToPrim = getMethod(
  220|  1.13M|      runtime,
  221|  1.13M|      valueHandle,
  222|  1.13M|      runtime.makeHandle(
  223|  1.13M|          Predefined::getSymbolID(Predefined::SymbolToPrimitive)));
  224|  1.13M|  if (LLVM_UNLIKELY(exoticToPrim == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.13M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.13M]
  |  |  ------------------
  ------------------
  225|      0|    return ExecutionStatus::EXCEPTION;
  226|      0|  }
  227|       |  // 6. If exoticToPrim is not undefined, then
  228|  1.13M|  if (vmisa<Callable>(exoticToPrim->getHermesValue())) {
  ------------------
  |  Branch (228:7): [True: 0, False: 1.13M]
  ------------------
  229|      0|    auto callable = runtime.makeHandle<Callable>(
  230|      0|        dyn_vmcast<Callable>(exoticToPrim->getHermesValue()));
  231|      0|    CallResult<PseudoHandle<>> resultRes = Callable::executeCall1(
  232|      0|        callable,
  233|      0|        runtime,
  234|      0|        valueHandle,
  235|      0|        HermesValue::encodeStringValue(runtime.getPredefinedString(
  236|      0|            hint == PreferredType::NONE         ? Predefined::defaultStr
  ------------------
  |  Branch (236:13): [True: 0, False: 0]
  ------------------
  237|      0|                : hint == PreferredType::STRING ? Predefined::string
  ------------------
  |  Branch (237:19): [True: 0, False: 0]
  ------------------
  238|      0|                                                : Predefined::number)));
  239|      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]
  |  |  ------------------
  ------------------
  240|      0|      return ExecutionStatus::EXCEPTION;
  241|      0|    }
  242|      0|    PseudoHandle<> result = std::move(*resultRes);
  243|      0|    if (!result->isObject()) {
  ------------------
  |  Branch (243:9): [True: 0, False: 0]
  ------------------
  244|      0|      return result.getHermesValue();
  245|      0|    }
  246|      0|    return runtime.raiseTypeError(
  247|      0|        "Symbol.toPrimitive function must return a primitive");
  248|      0|  }
  249|       |
  250|       |  // 7. If hint is "default", let hint be "number".
  251|       |  // 8. Return OrdinaryToPrimitive(input,hint).
  252|  1.13M|  return ordinaryToPrimitive(
  253|  1.13M|      Handle<JSObject>::vmcast(valueHandle),
  254|  1.13M|      runtime,
  255|  1.13M|      hint == PreferredType::NONE ? PreferredType::NUMBER : hint);
  ------------------
  |  Branch (255:7): [True: 390k, False: 746k]
  ------------------
  256|  1.13M|}
_ZN6hermes2vm9toBooleanENS0_11HermesValueE:
  258|  1.45k|bool toBoolean(HermesValue value) {
  259|  1.45k|  switch (value.getETag()) {
  260|      0|#ifdef HERMES_SLOW_DEBUG
  261|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (261:5): [True: 0, False: 1.45k]
  ------------------
  262|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  263|      0|#endif // HERMES_SLOW_DEBUG
  264|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (264:5): [True: 0, False: 1.45k]
  ------------------
  265|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  266|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (266:5): [True: 0, False: 1.45k]
  ------------------
  267|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (267:5): [True: 0, False: 1.45k]
  ------------------
  268|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  269|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (269:5): [True: 0, False: 1.45k]
  ------------------
  270|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (270:5): [True: 0, False: 1.45k]
  ------------------
  271|      0|      return false;
  272|  1.45k|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (272:5): [True: 1.45k, False: 0]
  ------------------
  273|  1.45k|      return value.getBool();
  274|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (274:5): [True: 0, False: 1.45k]
  ------------------
  275|      0|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (275:5): [True: 0, False: 1.45k]
  ------------------
  276|      0|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (276:5): [True: 0, False: 1.45k]
  ------------------
  277|      0|      return true;
  278|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (278:5): [True: 0, False: 1.45k]
  ------------------
  279|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (279:5): [True: 0, False: 1.45k]
  ------------------
  280|      0|      return value.getBigInt()->compare(0) != 0;
  281|      0|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (281:5): [True: 0, False: 1.45k]
  ------------------
  282|      0|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (282:5): [True: 0, False: 1.45k]
  ------------------
  283|      0|      return value.getString()->getStringLength() != 0;
  284|      0|    default: {
  ------------------
  |  Branch (284:5): [True: 0, False: 1.45k]
  ------------------
  285|      0|      auto m = value.getNumber();
  286|      0|      return !(m == 0 || std::isnan(m));
  ------------------
  |  Branch (286:16): [True: 0, False: 0]
  |  Branch (286:26): [True: 0, False: 0]
  ------------------
  287|      0|    }
  288|  1.45k|  }
  289|  1.45k|}
_ZN6hermes2vm12toString_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  344|  7.25M|    Handle<> valueHandle) {
  345|  7.25M|  HermesValue value = valueHandle.get();
  346|  7.25M|  StringPrimitive *result;
  347|  7.25M|  switch (value.getETag()) {
  348|      0|#ifdef HERMES_SLOW_DEBUG
  349|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (349:5): [True: 0, False: 7.25M]
  ------------------
  350|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  351|      0|#endif // HERMES_SLOW_DEBUG
  352|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (352:5): [True: 0, False: 7.25M]
  ------------------
  353|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  354|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (354:5): [True: 0, False: 7.25M]
  ------------------
  355|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (355:5): [True: 0, False: 7.25M]
  ------------------
  356|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  357|   781k|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (357:5): [True: 781k, False: 6.46M]
  ------------------
  358|   781k|    case HermesValue::ETag::BigInt2: {
  ------------------
  |  Branch (358:5): [True: 0, False: 7.25M]
  ------------------
  359|   781k|      const uint8_t kDefaultRadix = 10;
  360|   781k|      auto res = BigIntPrimitive::toString(
  361|   781k|          runtime, Handle<BigIntPrimitive>::vmcast(valueHandle), kDefaultRadix);
  362|   781k|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   781k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 781k]
  |  |  ------------------
  ------------------
  363|      0|        return ExecutionStatus::EXCEPTION;
  364|      0|      }
  365|   781k|      result = res->getString();
  366|   781k|      break;
  367|   781k|    }
  368|  3.46M|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (368:5): [True: 3.46M, False: 3.78M]
  ------------------
  369|  3.46M|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (369:5): [True: 0, False: 7.25M]
  ------------------
  370|  3.46M|      result = vmcast<StringPrimitive>(value);
  371|  3.46M|      break;
  372|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (372:5): [True: 0, False: 7.25M]
  ------------------
  373|      0|      result = runtime.getPredefinedString(Predefined::undefined);
  374|      0|      break;
  375|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (375:5): [True: 0, False: 7.25M]
  ------------------
  376|      0|      result = runtime.getPredefinedString(Predefined::null);
  377|      0|      break;
  378|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (378:5): [True: 0, False: 7.25M]
  ------------------
  379|      0|      result = value.getBool()
  ------------------
  |  Branch (379:16): [True: 0, False: 0]
  ------------------
  380|      0|          ? runtime.getPredefinedString(Predefined::trueStr)
  381|      0|          : runtime.getPredefinedString(Predefined::falseStr);
  382|      0|      break;
  383|   390k|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (383:5): [True: 390k, False: 6.85M]
  ------------------
  384|   390k|    case HermesValue::ETag::Object2: {
  ------------------
  |  Branch (384:5): [True: 0, False: 7.25M]
  ------------------
  385|   390k|      auto res = toPrimitive_RJS(runtime, valueHandle, PreferredType::STRING);
  386|   390k|      if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (386:11): [True: 0, False: 390k]
  ------------------
  387|      0|        return ExecutionStatus::EXCEPTION;
  388|      0|      }
  389|   390k|      return toString_RJS(runtime, runtime.makeHandle(res.getValue()));
  390|   390k|    }
  391|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (391:5): [True: 0, False: 7.25M]
  ------------------
  392|      0|      return runtime.raiseTypeError("Cannot convert Symbol to string");
  393|  2.61M|    default:
  ------------------
  |  Branch (393:5): [True: 2.61M, False: 4.63M]
  ------------------
  394|  2.61M|      return numberToString(runtime, value.getNumber());
  395|  7.25M|  }
  396|       |
  397|  4.24M|  return createPseudoHandle(result);
  398|  7.25M|}
_ZN6hermes2vm12toNumber_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  512|  1.76M|CallResult<HermesValue> toNumber_RJS(Runtime &runtime, Handle<> valueHandle) {
  513|  1.76M|  auto value = valueHandle.get();
  514|  1.76M|  double result;
  515|  1.76M|  switch (value.getETag()) {
  516|      0|#ifdef HERMES_SLOW_DEBUG
  517|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (517:5): [True: 0, False: 1.76M]
  ------------------
  518|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  519|      0|#endif // HERMES_SLOW_DEBUG
  520|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (520:5): [True: 0, False: 1.76M]
  ------------------
  521|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  522|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (522:5): [True: 0, False: 1.76M]
  ------------------
  523|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (523:5): [True: 0, False: 1.76M]
  ------------------
  524|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  525|   177k|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (525:5): [True: 177k, False: 1.58M]
  ------------------
  526|   177k|    case HermesValue::ETag::Object2: {
  ------------------
  |  Branch (526:5): [True: 0, False: 1.76M]
  ------------------
  527|   177k|      auto res = toPrimitive_RJS(runtime, valueHandle, PreferredType::NUMBER);
  528|   177k|      if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (528:11): [True: 0, False: 177k]
  ------------------
  529|      0|        return ExecutionStatus::EXCEPTION;
  530|      0|      }
  531|   177k|      return toNumber_RJS(runtime, runtime.makeHandle(res.getValue()));
  532|   177k|    }
  533|   355k|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (533:5): [True: 355k, False: 1.40M]
  ------------------
  534|   355k|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (534:5): [True: 0, False: 1.76M]
  ------------------
  535|   355k|      result =
  536|   355k|          stringToNumber(runtime, Handle<StringPrimitive>::vmcast(valueHandle));
  537|   355k|      break;
  538|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (538:5): [True: 0, False: 1.76M]
  ------------------
  539|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (539:5): [True: 0, False: 1.76M]
  ------------------
  540|      0|      return runtime.raiseTypeError("Cannot convert BigInt to number");
  541|   271k|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (541:5): [True: 271k, False: 1.49M]
  ------------------
  542|   271k|      result = std::numeric_limits<double>::quiet_NaN();
  543|   271k|      break;
  544|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (544:5): [True: 0, False: 1.76M]
  ------------------
  545|      0|      result = +0.0;
  546|      0|      break;
  547|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (547:5): [True: 0, False: 1.76M]
  ------------------
  548|      0|      result = value.getBool();
  549|      0|      break;
  550|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (550:5): [True: 0, False: 1.76M]
  ------------------
  551|      0|      return runtime.raiseTypeError("Cannot convert Symbol to number");
  552|   959k|    default:
  ------------------
  |  Branch (552:5): [True: 959k, False: 804k]
  ------------------
  553|       |      // Already have a number, just return it.
  554|   959k|      return value;
  555|  1.76M|  }
  556|   627k|  return HermesValue::encodeUntrustedNumberValue(result);
  557|  1.76M|}
_ZN6hermes2vm13toNumeric_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  559|   177k|CallResult<HermesValue> toNumeric_RJS(Runtime &runtime, Handle<> valueHandle) {
  560|   177k|  GCScopeMarkerRAII marker{runtime};
  561|   177k|  auto primValue = toPrimitive_RJS(runtime, valueHandle, PreferredType::NUMBER);
  562|       |
  563|   177k|  if (LLVM_UNLIKELY(primValue == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 177k]
  |  |  ------------------
  ------------------
  564|      0|    return ExecutionStatus::EXCEPTION;
  565|      0|  }
  566|       |
  567|   177k|  if (primValue->isBigInt()) {
  ------------------
  |  Branch (567:7): [True: 1, False: 177k]
  ------------------
  568|      1|    return *primValue;
  569|      1|  }
  570|       |
  571|   177k|  return toNumber_RJS(runtime, runtime.makeHandle(*primValue));
  572|   177k|}
_ZN6hermes2vm11toLengthU64ERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  589|   781k|CallResult<uint64_t> toLengthU64(Runtime &runtime, Handle<> valueHandle) {
  590|   781k|  constexpr double highestIntegralDouble =
  591|   781k|      ((uint64_t)1 << std::numeric_limits<double>::digits) - 1;
  592|   781k|  auto res = toIntegerOrInfinity(runtime, valueHandle);
  593|   781k|  if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (593:7): [True: 0, False: 781k]
  ------------------
  594|      0|    return ExecutionStatus::EXCEPTION;
  595|      0|  }
  596|   781k|  auto len = res->getNumber();
  597|   781k|  if (len <= 0) {
  ------------------
  |  Branch (597:7): [True: 390k, False: 390k]
  ------------------
  598|   390k|    len = 0;
  599|   390k|  } else if (len > highestIntegralDouble) {
  ------------------
  |  Branch (599:14): [True: 0, False: 390k]
  ------------------
  600|      0|    len = highestIntegralDouble;
  601|      0|  }
  602|   781k|  return len;
  603|   781k|}
_ZN6hermes2vm19toIntegerOrInfinityERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  633|   781k|    Handle<> valueHandle) {
  634|   781k|  auto res = toNumber_RJS(runtime, valueHandle);
  635|   781k|  if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (635:7): [True: 0, False: 781k]
  ------------------
  636|      0|    return ExecutionStatus::EXCEPTION;
  637|      0|  }
  638|   781k|  double num = res->getNumber();
  639|       |
  640|   781k|  double result;
  641|   781k|  if (std::isnan(num)) {
  ------------------
  |  Branch (641:7): [True: 0, False: 781k]
  ------------------
  642|      0|    result = 0;
  643|   781k|  } else {
  644|   781k|    result = std::trunc(num);
  645|   781k|  }
  646|       |
  647|   781k|  return HermesValue::encodeTrustedNumberValue(result);
  648|   781k|}
_ZN6hermes2vm11toInt32_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  672|      2|CallResult<HermesValue> toInt32_RJS(Runtime &runtime, Handle<> valueHandle) {
  673|      2|  return toInt<int32_t>(runtime, valueHandle);
  674|      2|}
_ZN6hermes2vm21getPrimitivePrototypeERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  732|     22|    Handle<> base) {
  733|     22|  switch (base->getETag()) {
  734|      0|#ifdef HERMES_SLOW_DEBUG
  735|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (735:5): [True: 0, False: 22]
  ------------------
  736|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  737|      0|#endif // HERMES_SLOW_DEBUG
  738|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (738:5): [True: 0, False: 22]
  ------------------
  739|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  740|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (740:5): [True: 0, False: 22]
  ------------------
  741|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (741:5): [True: 0, False: 22]
  ------------------
  742|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  743|      0|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (743:5): [True: 0, False: 22]
  ------------------
  744|      0|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (744:5): [True: 0, False: 22]
  ------------------
  745|      0|      llvm_unreachable("object value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  746|      1|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (746:5): [True: 1, False: 21]
  ------------------
  747|      1|      return runtime.raiseTypeError("Cannot convert undefined value to object");
  748|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (748:5): [True: 0, False: 22]
  ------------------
  749|      0|      return runtime.raiseTypeError("Cannot convert null value to object");
  750|     21|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (750:5): [True: 21, False: 1]
  ------------------
  751|     21|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (751:5): [True: 0, False: 22]
  ------------------
  752|     21|      return Handle<JSObject>::vmcast(&runtime.stringPrototype);
  753|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (753:5): [True: 0, False: 22]
  ------------------
  754|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (754:5): [True: 0, False: 22]
  ------------------
  755|      0|      return Handle<JSObject>::vmcast(&runtime.bigintPrototype);
  756|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (756:5): [True: 0, False: 22]
  ------------------
  757|      0|      return Handle<JSObject>::vmcast(&runtime.booleanPrototype);
  758|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (758:5): [True: 0, False: 22]
  ------------------
  759|      0|      return Handle<JSObject>::vmcast(&runtime.symbolPrototype);
  760|      0|    default:
  ------------------
  |  Branch (760:5): [True: 0, False: 22]
  ------------------
  761|      0|      assert(base->isNumber() && "Unknown tag in getPrimitivePrototype.");
  762|      0|      return Handle<JSObject>::vmcast(&runtime.numberPrototype);
  763|     22|  }
  764|     22|}
_ZN6hermes2vm8toObjectERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  766|  3.80M|CallResult<HermesValue> toObject(Runtime &runtime, Handle<> valueHandle) {
  767|  3.80M|  auto value = valueHandle.get();
  768|  3.80M|  switch (value.getETag()) {
  769|      0|#ifdef HERMES_SLOW_DEBUG
  770|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (770:5): [True: 0, False: 3.80M]
  ------------------
  771|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  772|      0|#endif // HERMES_SLOW_DEBUG
  773|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (773:5): [True: 0, False: 3.80M]
  ------------------
  774|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  775|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (775:5): [True: 0, False: 3.80M]
  ------------------
  776|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (776:5): [True: 0, False: 3.80M]
  ------------------
  777|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  778|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (778:5): [True: 0, False: 3.80M]
  ------------------
  779|      0|      return runtime.raiseTypeError("Cannot convert undefined value to object");
  780|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (780:5): [True: 0, False: 3.80M]
  ------------------
  781|      0|      return runtime.raiseTypeError("Cannot convert null value to object");
  782|  3.80M|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (782:5): [True: 3.80M, False: 16]
  ------------------
  783|  3.80M|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (783:5): [True: 0, False: 3.80M]
  ------------------
  784|  3.80M|      return value;
  785|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (785:5): [True: 0, False: 3.80M]
  ------------------
  786|      0|      return JSBoolean::create(
  787|      0|                 runtime,
  788|      0|                 value.getBool(),
  789|      0|                 Handle<JSObject>::vmcast(&runtime.booleanPrototype))
  790|      0|          .getHermesValue();
  791|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (791:5): [True: 0, False: 3.80M]
  ------------------
  792|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (792:5): [True: 0, False: 3.80M]
  ------------------
  793|      0|      return JSBigInt::create(
  794|      0|                 runtime,
  795|      0|                 Handle<BigIntPrimitive>::vmcast(valueHandle),
  796|      0|                 Handle<JSObject>::vmcast(&runtime.bigintPrototype))
  797|      0|          .getHermesValue();
  798|     15|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (798:5): [True: 15, False: 3.80M]
  ------------------
  799|     15|    case HermesValue::ETag::Str2: {
  ------------------
  |  Branch (799:5): [True: 0, False: 3.80M]
  ------------------
  800|     15|      auto res = JSString::create(
  801|     15|          runtime,
  802|     15|          Handle<StringPrimitive>::vmcast(valueHandle),
  803|     15|          Handle<JSObject>::vmcast(&runtime.stringPrototype));
  804|     15|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     15|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15]
  |  |  ------------------
  ------------------
  805|      0|        return ExecutionStatus::EXCEPTION;
  806|      0|      }
  807|     15|      return res->getHermesValue();
  808|     15|    }
  809|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (809:5): [True: 0, False: 3.80M]
  ------------------
  810|      0|      return JSSymbol::create(
  811|      0|                 runtime,
  812|      0|                 *Handle<SymbolID>::vmcast(valueHandle),
  813|      0|                 Handle<JSObject>::vmcast(&runtime.symbolPrototype))
  814|      0|          .getHermesValue();
  815|      1|    default:
  ------------------
  |  Branch (815:5): [True: 1, False: 3.80M]
  ------------------
  816|      1|      assert(valueHandle->isNumber() && "Unknown tag in toObject.");
  817|      1|      return JSNumber::create(
  818|      1|                 runtime,
  819|      1|                 value.getNumber(),
  820|      1|                 Handle<JSObject>::vmcast(&runtime.numberPrototype))
  821|      1|          .getHermesValue();
  822|  3.80M|  }
  823|  3.80M|}
_ZN6hermes2vm35amendPropAccessErrorMsgWithPropNameERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEEN4llvh9StringRefENS0_8SymbolIDE:
  829|      1|    SymbolID id) {
  830|      1|  if (!valueHandle->isNull() && !valueHandle->isUndefined()) {
  ------------------
  |  Branch (830:7): [True: 1, False: 0]
  |  Branch (830:33): [True: 0, False: 1]
  ------------------
  831|       |    // If value is not null/undefined, fall back to the original exception.
  832|      0|    return ExecutionStatus::EXCEPTION;
  833|      0|  }
  834|      1|  assert(!runtime.getThrownValue().isEmpty() && "Error must have been thrown");
  835|       |  // Clear the error first because we will re-throw.
  836|      1|  runtime.clearThrownValue();
  837|       |
  838|       |  // Construct an error message that contains the property name.
  839|      1|  llvh::StringRef valueStr = valueHandle->isNull() ? "null" : "undefined";
  ------------------
  |  Branch (839:30): [True: 0, False: 1]
  ------------------
  840|      1|  return runtime.raiseTypeError(
  841|      1|      TwineChar16("Cannot ") + operationStr + " property '" +
  842|      1|      runtime.getIdentifierTable().getStringView(runtime, id) + "' of " +
  843|      1|      valueStr);
  844|      1|}
_ZN6hermes2vm24abstractEqualityTest_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_:
 1047|  1.28k|abstractEqualityTest_RJS(Runtime &runtime, Handle<> xHandle, Handle<> yHandle) {
 1048|  1.28k|  MutableHandle<> x{runtime, xHandle.get()};
 1049|  1.28k|  MutableHandle<> y{runtime, yHandle.get()};
 1050|       |
 1051|  1.28k|  while (true) {
  ------------------
  |  Branch (1051:10): [Folded - Ignored]
  ------------------
 1052|       |    // Combine tags for use in the switch statement. Use NativeValueTag as a
 1053|       |    // placeholder for numbers.
 1054|  1.28k|    assert(
 1055|  1.28k|        !x->isNativeValue() && !x->isEmpty() && "invalid value for comparison");
 1056|  1.28k|    assert(
 1057|  1.28k|        !y->isNativeValue() && !y->isEmpty() && "invalid value for comparison");
 1058|       |
 1059|       |    // The following macros are used to generate the switch cases using
 1060|       |    // HermesValue::combineETags; an S in the name means it is a single ETag
 1061|       |    // (e.g., ETag::Bool), while M means it is a multi ETag (e.g., ETag::Object1
 1062|       |    // and ETag::Object2).
 1063|  1.28k|#define CASE_S_S(typeA, typeB)    \
 1064|  1.28k|  case HermesValue::combineETags( \
 1065|  1.28k|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
 1066|       |
 1067|  1.28k|#define CASE_S_M(typeA, typeB) \
 1068|  1.28k|  CASE_S_S(typeA, typeB##1)    \
 1069|  1.28k|  CASE_S_S(typeA, typeB##2)
 1070|       |
 1071|  1.28k|#define CASE_M_S(typeA, typeB) \
 1072|  1.28k|  CASE_S_S(typeA##1, typeB)    \
 1073|  1.28k|  CASE_S_S(typeA##2, typeB)
 1074|       |
 1075|  1.28k|#define CASE_M_M(typeA, typeB) \
 1076|  1.28k|  CASE_M_S(typeA, typeB##1)    \
 1077|  1.28k|  CASE_M_S(typeA, typeB##2)
 1078|       |
 1079|       |// NUMBER_TAG is a "virtual" ETag member that is used to tag numbers (which
 1080|       |// don't have a tag assigned to them). It reuses ETag::Native1 there will
 1081|       |// never be any native values in this part of the code.
 1082|  1.28k|#define NUMBER_TAG Native1
 1083|       |
 1084|       |    // Tag numbers as with the "virtual" ETag member NUMBER_TAG, and use default
 1085|       |    // tag values for everything else.
 1086|  1.28k|    HermesValue::ETag xType =
 1087|  1.28k|        x->isNumber() ? HermesValue::ETag::NUMBER_TAG : x->getETag();
  ------------------
  |  | 1082|      0|#define NUMBER_TAG Native1
  ------------------
  |  Branch (1087:9): [True: 0, False: 1.28k]
  ------------------
 1088|  1.28k|    HermesValue::ETag yType =
 1089|  1.28k|        y->isNumber() ? HermesValue::ETag::NUMBER_TAG : y->getETag();
  ------------------
  |  | 1082|      0|#define NUMBER_TAG Native1
  ------------------
  |  Branch (1089:9): [True: 0, False: 1.28k]
  ------------------
 1090|       |
 1091|  1.28k|    switch (HermesValue::combineETags(xType, yType)) {
 1092|       |      // 1. If Type(x) is the same as Type(y), then
 1093|       |      // a. Return the result of performing Strict Equality Comparison x === y.
 1094|      0|      CASE_S_S(Undefined, Undefined)
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1095|      0|      CASE_S_S(Null, Null) {
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1096|      0|        return true;
 1097|      0|      }
 1098|      0|      CASE_S_S(NUMBER_TAG, NUMBER_TAG) {
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1099|      0|        return x->getNumber() == y->getNumber();
 1100|      0|      }
 1101|      0|      CASE_M_M(Str, Str) {
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1102|      0|        return x->getString()->equals(y->getString());
 1103|      0|      }
 1104|      0|      CASE_M_M(BigInt, BigInt) {
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1105|      0|        return x->getBigInt()->compare(y->getBigInt()) == 0;
 1106|      0|      }
 1107|      0|      CASE_S_S(Bool, Bool)
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1108|      0|      CASE_S_S(Symbol, Symbol)
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1109|      0|      CASE_M_M(Object, Object) {
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1110|      0|        return x->getRaw() == y->getRaw();
 1111|      0|      }
 1112|       |      // 2. If x is null and y is undefined, return true.
 1113|       |      // 3. If x is undefined and y is null, return true.
 1114|      0|      CASE_S_S(Undefined, Null)
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1115|      0|      CASE_S_S(Null, Undefined) {
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1116|      0|        return true;
 1117|      0|      }
 1118|       |      // 4. If Type(x) is Number and Type(y) is String, return the result of the
 1119|       |      // comparison x == ! ToNumber(y).
 1120|      0|      CASE_S_M(NUMBER_TAG, Str) {
  ------------------
  |  | 1068|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1069|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1121|      0|        return x->getNumber() ==
 1122|      0|            stringToNumber(runtime, Handle<StringPrimitive>::vmcast(y));
 1123|      0|      }
 1124|       |      // 5. If Type(x) is String and Type(y) is Number, return the result of the
 1125|       |      // comparison ! ToNumber(x) == y.
 1126|      0|      CASE_M_S(Str, NUMBER_TAG) {
  ------------------
  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1127|      0|        return stringToNumber(runtime, Handle<StringPrimitive>::vmcast(x)) ==
 1128|      0|            y->getNumber();
 1129|      0|      }
 1130|       |      // 6. If Type(x) is BigInt and Type(y) is String, then
 1131|      0|      CASE_M_M(BigInt, Str) {
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1132|       |        // a. Let n be ! StringToBigInt(y).
 1133|      0|        auto n = stringToBigInt(runtime, y);
 1134|      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]
  |  |  ------------------
  ------------------
 1135|      0|          return ExecutionStatus::EXCEPTION;
 1136|      0|        }
 1137|       |        // b. If n is NaN, return false.
 1138|       |        // N.B.: this has been amended in ES2023 to read
 1139|       |        //       If n is undefined, return false.
 1140|      0|        if (n->isUndefined()) {
  ------------------
  |  Branch (1140:13): [True: 0, False: 0]
  ------------------
 1141|      0|          return false;
 1142|      0|        }
 1143|       |        // c. Return the result of the comparison x == n.
 1144|      0|        y = n.getValue();
 1145|      0|        break;
 1146|      0|      }
 1147|       |      // 7. If Type(x) is String and Type(y) is BigInt, return the result of the
 1148|       |      // comparison y == x.
 1149|      0|      CASE_M_M(Str, BigInt) {
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1150|      0|        std::swap(x, y);
 1151|      0|        break;
 1152|      0|      }
 1153|       |      // 8. If Type(x) is Boolean, return the result of the comparison !
 1154|       |      // ToNumber(x) == y.
 1155|      0|      CASE_S_S(Bool, NUMBER_TAG) {
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1156|       |        // Do both conversions and check numerical equality.
 1157|      0|        return static_cast<double>(x->getBool()) == y->getNumber();
 1158|      0|      }
 1159|      0|      CASE_S_M(Bool, Str) {
  ------------------
  |  | 1068|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1069|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1160|       |        // Do string parsing and check double equality.
 1161|      0|        return static_cast<double>(x->getBool()) ==
 1162|      0|            stringToNumber(runtime, Handle<StringPrimitive>::vmcast(y));
 1163|      0|      }
 1164|      0|      CASE_S_M(Bool, BigInt) {
  ------------------
  |  | 1068|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1069|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1165|      0|        return y->getBigInt()->compare(static_cast<int32_t>(x->getBool())) == 0;
 1166|      0|      }
 1167|      0|      CASE_S_M(Bool, Object) {
  ------------------
  |  | 1068|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1069|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1168|      0|        x = HermesValue::encodeUntrustedNumberValue(x->getBool());
 1169|      0|        break;
 1170|      0|      }
 1171|       |      // 9. If Type(y) is Boolean, return the result of the comparison x == !
 1172|       |      // ToNumber(y).
 1173|      0|      CASE_S_S(NUMBER_TAG, Bool) {
  ------------------
  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  ------------------
  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1174|      0|        return x->getNumber() == static_cast<double>(y->getBool());
 1175|      0|      }
 1176|      0|      CASE_M_S(Str, Bool) {
  ------------------
  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1177|      0|        return stringToNumber(runtime, Handle<StringPrimitive>::vmcast(x)) ==
 1178|      0|            static_cast<double>(y->getBool());
 1179|      0|      }
 1180|      0|      CASE_M_S(BigInt, Bool) {
  ------------------
  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1181|      0|        return x->getBigInt()->compare(static_cast<int32_t>(y->getBool())) == 0;
 1182|      0|      }
 1183|      0|      CASE_M_S(Object, Bool) {
  ------------------
  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1184|      0|        y = HermesValue::encodeUntrustedNumberValue(y->getBool());
 1185|      0|        break;
 1186|      0|      }
 1187|       |      // 10. If Type(x) is either String, Number, BigInt, or Symbol and Type(y)
 1188|       |      // is Object, return the result of the comparison x == ToPrimitive(y).
 1189|      0|      CASE_M_M(Str, Object)
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1190|      0|      CASE_M_M(BigInt, Object)
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1191|      0|      CASE_S_M(Symbol, Object)
  ------------------
  |  | 1068|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1069|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1192|      0|      CASE_S_M(NUMBER_TAG, Object) {
  ------------------
  |  | 1068|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1069|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1193|      0|        auto status = toPrimitive_RJS(runtime, y, PreferredType::NONE);
 1194|      0|        if (status == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1194:13): [True: 0, False: 0]
  ------------------
 1195|      0|          return ExecutionStatus::EXCEPTION;
 1196|      0|        }
 1197|      0|        y = status.getValue();
 1198|      0|        break;
 1199|      0|      }
 1200|       |      // 11. If Type(x) is Object and Type(y) is either String, Number, BigInt,
 1201|       |      // or Symbol, return the result of the comparison ToPrimitive(x) == y.
 1202|      0|      CASE_M_M(Object, Str)
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1203|      0|      CASE_M_M(Object, BigInt)
  ------------------
  |  | 1076|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1077|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1204|      0|      CASE_M_S(Object, Symbol)
  ------------------
  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1205|      0|      CASE_M_S(Object, NUMBER_TAG) {
  ------------------
  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1206|      0|        auto status = toPrimitive_RJS(runtime, x, PreferredType::NONE);
 1207|      0|        if (status == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1207:13): [True: 0, False: 0]
  ------------------
 1208|      0|          return ExecutionStatus::EXCEPTION;
 1209|      0|        }
 1210|      0|        x = status.getValue();
 1211|      0|        break;
 1212|      0|      }
 1213|       |      // 12. If Type(x) is BigInt and Type(y) is Number, or if Type(x) is
 1214|       |      // Number and Type(y) is BigInt, then a. If x or y are any of NaN, +∞,
 1215|       |      // or -∞, return false. b. If the mathematical value of x is equal to
 1216|       |      // the mathematical value of y, return true; otherwise return false.
 1217|      0|      CASE_M_S(BigInt, NUMBER_TAG) {
  ------------------
  |  | 1072|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1073|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1218|      0|        std::swap(x, y);
 1219|      0|        [[fallthrough]];
 1220|      0|      }
 1221|      0|      CASE_S_M(NUMBER_TAG, BigInt) {
  ------------------
  |  | 1068|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1069|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1064|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1064:3): [True: 0, False: 1.28k]
  |  |  |  |  ------------------
  |  |  |  | 1065|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1222|      0|        if (!isIntegralNumber(x->getNumber())) {
  ------------------
  |  Branch (1222:13): [True: 0, False: 0]
  ------------------
 1223|      0|          return false;
 1224|      0|        }
 1225|       |
 1226|      0|        EqualityResult areEqual =
 1227|      0|            areEqualSmallNumbers(x->getNumber(), y->getBigInt());
 1228|      0|        if (areEqual != EqualityResult::Unknown) {
  ------------------
  |  Branch (1228:13): [True: 0, False: 0]
  ------------------
 1229|      0|          return areEqual == EqualityResult::Equal ? true : false;
  ------------------
  |  Branch (1229:18): [True: 0, False: 0]
  ------------------
 1230|      0|        }
 1231|       |
 1232|      0|        auto xAsBigInt = BigIntPrimitive::fromDouble(runtime, x->getNumber());
 1233|      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]
  |  |  ------------------
  ------------------
 1234|      0|          return ExecutionStatus::EXCEPTION;
 1235|      0|        }
 1236|      0|        return xAsBigInt->getBigInt()->compare(y->getBigInt()) == 0;
 1237|      0|      }
 1238|       |
 1239|       |      // 13. Return false.
 1240|  1.28k|      default:
  ------------------
  |  Branch (1240:7): [True: 1.28k, False: 0]
  ------------------
 1241|  1.28k|        return false;
 1242|  1.28k|    }
 1243|       |
 1244|  1.28k|#undef CASE_S_S
 1245|  1.28k|#undef CASE_S_M
 1246|  1.28k|#undef CASE_M_S
 1247|  1.28k|#undef CASE_M_M
 1248|  1.28k|#undef NUMBER_TAG
 1249|  1.28k|  }
 1250|  1.28k|}
_ZN6hermes2vm18strictEqualityTestENS0_11HermesValueES1_:
 1252|  2.88k|bool strictEqualityTest(HermesValue x, HermesValue y) {
 1253|       |  // Numbers are special because they can have different tags and they don't
 1254|       |  // obey bit-exact equality (because of NaN).
 1255|  2.88k|  if (x.isNumber())
  ------------------
  |  Branch (1255:7): [True: 0, False: 2.88k]
  ------------------
 1256|      0|    return y.isNumber() && x.getNumber() == y.getNumber();
  ------------------
  |  Branch (1256:12): [True: 0, False: 0]
  |  Branch (1256:28): [True: 0, False: 0]
  ------------------
 1257|       |  // If they are not numbers and are bit exact, they must be the same.
 1258|  2.88k|  if (x.getRaw() == y.getRaw())
  ------------------
  |  Branch (1258:7): [True: 2.88k, False: 0]
  ------------------
 1259|  2.88k|    return true;
 1260|       |  // All the rest of the cases need to have the same tags.
 1261|      0|  if (x.getTag() != y.getTag())
  ------------------
  |  Branch (1261:7): [True: 0, False: 0]
  ------------------
 1262|      0|    return false;
 1263|       |  // Strings need deep comparison.
 1264|      0|  if (x.isString())
  ------------------
  |  Branch (1264:7): [True: 0, False: 0]
  ------------------
 1265|      0|    return x.getString()->equals(y.getString());
 1266|       |
 1267|       |  // The only remaining case is bigint, which also needs a deep comparison.
 1268|      0|  return x.isBigInt() && x.getBigInt()->compare(y.getBigInt()) == 0;
  ------------------
  |  Branch (1268:10): [True: 0, False: 0]
  |  Branch (1268:26): [True: 0, False: 0]
  ------------------
 1269|      0|}
_ZN6hermes2vm9addOp_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_:
 1272|   781k|addOp_RJS(Runtime &runtime, Handle<> xHandle, Handle<> yHandle) {
 1273|   781k|  auto resX = toPrimitive_RJS(runtime, xHandle, PreferredType::NONE);
 1274|   781k|  if (resX == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1274:7): [True: 0, False: 781k]
  ------------------
 1275|      0|    return ExecutionStatus::EXCEPTION;
 1276|      0|  }
 1277|   781k|  auto xPrim = runtime.makeHandle(resX.getValue());
 1278|       |
 1279|   781k|  auto resY = toPrimitive_RJS(runtime, yHandle, PreferredType::NONE);
 1280|   781k|  if (resY == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1280:7): [True: 0, False: 781k]
  ------------------
 1281|      0|    return ExecutionStatus::EXCEPTION;
 1282|      0|  }
 1283|   781k|  auto yPrim = runtime.makeHandle(resY.getValue());
 1284|       |
 1285|       |  // If one of the values is a string, concatenate as strings.
 1286|   781k|  if (xPrim->isString() || yPrim->isString()) {
  ------------------
  |  Branch (1286:7): [True: 781k, False: 19]
  |  Branch (1286:28): [True: 1, False: 18]
  ------------------
 1287|   781k|    auto resX = toString_RJS(runtime, xPrim);
 1288|   781k|    if (resX == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1288:9): [True: 0, False: 781k]
  ------------------
 1289|      0|      return ExecutionStatus::EXCEPTION;
 1290|      0|    }
 1291|   781k|    auto xStr = runtime.makeHandle(std::move(*resX));
 1292|       |
 1293|   781k|    auto resY = toString_RJS(runtime, yPrim);
 1294|   781k|    if (resY == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1294:9): [True: 0, False: 781k]
  ------------------
 1295|      0|      return ExecutionStatus::EXCEPTION;
 1296|      0|    }
 1297|   781k|    auto yStr = runtime.makeHandle(std::move(*resY));
 1298|       |
 1299|   781k|    return StringPrimitive::concat(runtime, xStr, yStr);
 1300|   781k|  }
 1301|       |
 1302|       |  // xPrim and yPrim are primitives; hence, they are already bigints, or they
 1303|       |  // will never be bigints.
 1304|     18|  if (LLVM_LIKELY(!xPrim->isBigInt())) {
  ------------------
  |  |  188|     18|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 18, False: 0]
  |  |  ------------------
  ------------------
 1305|       |    // xPrim is not a bigint; thus this is Number + Number.
 1306|     18|    auto res = toNumber_RJS(runtime, xPrim);
 1307|     18|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
 1308|      0|      return ExecutionStatus::EXCEPTION;
 1309|      0|    }
 1310|     18|    const double xNum = res->getNumber();
 1311|       |    // N.B.: toNumber(yPrim) will raise an TypeError if yPrim is bigint, which
 1312|       |    // is the correct exception to be raised when trying to perform
 1313|       |    // Number + BigInt. This avoids the need to check if yPrim is a bigint.
 1314|     18|    res = toNumber_RJS(runtime, yPrim);
 1315|     18|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
 1316|      0|      return ExecutionStatus::EXCEPTION;
 1317|      0|    }
 1318|     18|    const double yNum = res->getNumber();
 1319|     18|    return HermesValue::encodeUntrustedNumberValue(xNum + yNum);
 1320|     18|  }
 1321|       |
 1322|       |  // yPrim is a primitive; therefore it is already a BigInt, or it will never be
 1323|       |  // one.
 1324|      0|  if (!yPrim->isBigInt()) {
  ------------------
  |  Branch (1324:7): [True: 0, False: 0]
  ------------------
 1325|      0|    return runtime.raiseTypeErrorForValue(
 1326|      0|        "Cannot convert ", yHandle, " to BigInt");
 1327|      0|  }
 1328|       |
 1329|      0|  return BigIntPrimitive::add(
 1330|      0|      runtime,
 1331|      0|      runtime.makeHandle(xPrim->getBigInt()),
 1332|      0|      runtime.makeHandle(yPrim->getBigInt()));
 1333|      0|}
_ZN6hermes2vm9getMethodERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_:
 1488|  1.13M|getMethod(Runtime &runtime, Handle<> O, Handle<> key) {
 1489|  1.13M|  GCScopeMarkerRAII gcScope{runtime};
 1490|  1.13M|  auto objRes = toObject(runtime, O);
 1491|  1.13M|  if (LLVM_UNLIKELY(objRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.13M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.13M]
  |  |  ------------------
  ------------------
 1492|      0|    return ExecutionStatus::EXCEPTION;
 1493|      0|  }
 1494|  1.13M|  auto obj = runtime.makeHandle<JSObject>(*objRes);
 1495|  1.13M|  auto funcRes = JSObject::getComputed_RJS(obj, runtime, key);
 1496|  1.13M|  if (LLVM_UNLIKELY(funcRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.13M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.13M]
  |  |  ------------------
  ------------------
 1497|      0|    return ExecutionStatus::EXCEPTION;
 1498|      0|  }
 1499|  1.13M|  if ((*funcRes)->isUndefined() || (*funcRes)->isNull()) {
  ------------------
  |  Branch (1499:7): [True: 1.13M, False: 0]
  |  Branch (1499:36): [True: 0, False: 0]
  ------------------
 1500|  1.13M|    return PseudoHandle<>::create(HermesValue::encodeUndefinedValue());
 1501|  1.13M|  }
 1502|      0|  if (!vmisa<Callable>(funcRes->get())) {
  ------------------
  |  Branch (1502:7): [True: 0, False: 0]
  ------------------
 1503|      0|    return runtime.raiseTypeError("Could not get callable method from object");
 1504|      0|  }
 1505|      0|  return funcRes;
 1506|      0|}
_ZN6hermes2vm8isRegExpERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
 1950|      1|CallResult<bool> isRegExp(Runtime &runtime, Handle<> arg) {
 1951|       |  // 1. If Type(argument) is not Object, return false.
 1952|      1|  if (!arg->isObject()) {
  ------------------
  |  Branch (1952:7): [True: 0, False: 1]
  ------------------
 1953|      0|    return false;
 1954|      0|  }
 1955|      1|  Handle<JSObject> obj = Handle<JSObject>::vmcast(arg);
 1956|       |  // 2. Let isRegExp be Get(argument, @@match).
 1957|      1|  auto propRes = JSObject::getNamed_RJS(
 1958|      1|      obj, runtime, Predefined::getSymbolID(Predefined::SymbolMatch));
 1959|       |  // 3. ReturnIfAbrupt(isRegExp).
 1960|      1|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 1961|      0|    return ExecutionStatus::EXCEPTION;
 1962|      0|  }
 1963|       |  // 4. If isRegExp is not undefined, return ToBoolean(isRegExp).
 1964|      1|  if (!(*propRes)->isUndefined()) {
  ------------------
  |  Branch (1964:7): [True: 0, False: 1]
  ------------------
 1965|      0|    return toBoolean(propRes->get());
 1966|      0|  }
 1967|       |  // 5. If argument has a [[RegExpMatcher]] internal slot, return true.
 1968|       |  // 6. Return false.
 1969|      1|  return vmisa<JSRegExp>(arg.get());
 1970|      1|}
_ZN6hermes2vm7isArrayERNS0_7RuntimeEPNS0_8JSObjectE:
 1996|   355k|CallResult<bool> isArray(Runtime &runtime, JSObject *obj) {
 1997|   355k|  if (!obj) {
  ------------------
  |  Branch (1997:7): [True: 0, False: 355k]
  ------------------
 1998|      0|    return false;
 1999|      0|  }
 2000|   355k|  while (true) {
  ------------------
  |  Branch (2000:10): [Folded - Ignored]
  ------------------
 2001|   355k|    if (vmisa<JSArray>(obj)) {
  ------------------
  |  Branch (2001:9): [True: 0, False: 355k]
  ------------------
 2002|      0|      return true;
 2003|      0|    }
 2004|   355k|    if (LLVM_LIKELY(!obj->isProxyObject())) {
  ------------------
  |  |  188|   355k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 355k, False: 0]
  |  |  ------------------
  ------------------
 2005|   355k|      return false;
 2006|   355k|    }
 2007|      0|    if (JSProxy::isRevoked(obj, runtime)) {
  ------------------
  |  Branch (2007:9): [True: 0, False: 0]
  ------------------
 2008|      0|      return runtime.raiseTypeError("Proxy has been revoked");
 2009|      0|    }
 2010|      0|    obj = JSProxy::getTarget(obj, runtime).get();
 2011|      0|    assert(obj && "target of non-revoked Proxy is null");
 2012|      0|  }
 2013|   355k|}
Operations.cpp:_ZN6hermes2vmL14numberToStringERNS0_7RuntimeEd:
  298|  2.61M|    double m) {
  299|  2.61M|  char buf8[hermes::NUMBER_TO_STRING_BUF_SIZE];
  300|       |
  301|       |  // Optimization: Fast-case for positive integers < 2^31
  302|  2.61M|  int32_t n = static_cast<int32_t>(m);
  303|  2.61M|  if (m == static_cast<double>(n) && n > 0) {
  ------------------
  |  Branch (303:7): [True: 2.59M, False: 20.7k]
  |  Branch (303:38): [True: 2.08M, False: 510k]
  ------------------
  304|       |    // Write base 10 digits in reverse from end of buf8.
  305|  2.08M|    char *p = buf8 + sizeof(buf8);
  306|  9.35M|    do {
  307|  9.35M|      *--p = '0' + (n % 10);
  308|  9.35M|      n /= 10;
  309|  9.35M|    } while (n);
  ------------------
  |  Branch (309:14): [True: 7.27M, False: 2.08M]
  ------------------
  310|  2.08M|    size_t len = buf8 + sizeof(buf8) - p;
  311|       |    // Temporarily stop the propagation of removing.
  312|  2.08M|    auto result = StringPrimitive::create(runtime, ASCIIRef(p, len));
  313|  2.08M|    if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  2.08M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.08M]
  |  |  ------------------
  ------------------
  314|      0|      return ExecutionStatus::EXCEPTION;
  315|      0|    }
  316|  2.08M|    return createPseudoHandle(vmcast<StringPrimitive>(*result));
  317|  2.08M|  }
  318|       |
  319|   531k|  auto getPredefined = [&runtime](Predefined::Str predefinedID) {
  320|   531k|    return createPseudoHandle(runtime.getPredefinedString(predefinedID));
  321|   531k|  };
  322|       |
  323|   531k|  if (std::isnan(m))
  ------------------
  |  Branch (323:7): [True: 2, False: 531k]
  ------------------
  324|      2|    return getPredefined(Predefined::NaN);
  325|   531k|  if (m == 0)
  ------------------
  |  Branch (325:7): [True: 510k, False: 21.2k]
  ------------------
  326|   510k|    return getPredefined(Predefined::zero);
  327|  21.2k|  if (m == std::numeric_limits<double>::infinity())
  ------------------
  |  Branch (327:7): [True: 0, False: 21.2k]
  ------------------
  328|      0|    return getPredefined(Predefined::Infinity);
  329|  21.2k|  if (m == -std::numeric_limits<double>::infinity())
  ------------------
  |  Branch (329:7): [True: 0, False: 21.2k]
  ------------------
  330|      0|    return getPredefined(Predefined::NegativeInfinity);
  331|       |
  332|       |  // After special cases, run the generic routine to convert.
  333|  21.2k|  size_t len = hermes::numberToString(m, buf8, sizeof(buf8));
  334|       |
  335|  21.2k|  auto result = StringPrimitive::create(runtime, ASCIIRef(buf8, len));
  336|  21.2k|  if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  21.2k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 21.2k]
  |  |  ------------------
  ------------------
  337|      0|    return ExecutionStatus::EXCEPTION;
  338|      0|  }
  339|  21.2k|  return createPseudoHandle(vmcast<StringPrimitive>(*result));
  340|  21.2k|}
Operations.cpp:_ZZN6hermes2vmL14numberToStringERNS0_7RuntimeEdENK3$_0clENS0_10Predefined3StrE:
  319|   510k|  auto getPredefined = [&runtime](Predefined::Str predefinedID) {
  320|   510k|    return createPseudoHandle(runtime.getPredefinedString(predefinedID));
  321|   510k|  };
Operations.cpp:_ZN6hermes2vmL14stringToNumberERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEE:
  409|   355k|    Handle<StringPrimitive> strPrim) {
  410|   355k|  auto &idTable = runtime.getIdentifierTable();
  411|       |
  412|       |  // Fast check for special values (no extraneous whitespace).
  413|   355k|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (413:7): [True: 0, False: 355k]
  ------------------
  414|   355k|          Predefined::getSymbolID(Predefined::Infinity), *strPrim)) {
  415|      0|    return std::numeric_limits<double>::infinity();
  416|      0|  }
  417|   355k|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (417:7): [True: 0, False: 355k]
  ------------------
  418|   355k|          Predefined::getSymbolID(Predefined::PositiveInfinity), *strPrim)) {
  419|      0|    return std::numeric_limits<double>::infinity();
  420|      0|  }
  421|   355k|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (421:7): [True: 0, False: 355k]
  ------------------
  422|   355k|          Predefined::getSymbolID(Predefined::NegativeInfinity), *strPrim)) {
  423|      0|  }
  424|   355k|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (424:7): [True: 0, False: 355k]
  ------------------
  425|   355k|          Predefined::getSymbolID(Predefined::NaN), *strPrim)) {
  426|      0|    return std::numeric_limits<double>::quiet_NaN();
  427|      0|  }
  428|       |
  429|       |  // Trim string to the interval [begin, end).
  430|   355k|  auto orig = StringPrimitive::createStringView(runtime, strPrim);
  431|   355k|  auto begin = orig.begin();
  432|   355k|  auto end = orig.end();
  433|       |
  434|       |  // Move begin and end to ignore whitespace.
  435|   355k|  while (begin != end &&
  ------------------
  |  Branch (435:10): [True: 355k, False: 0]
  ------------------
  436|   355k|         (isWhiteSpaceChar(*begin) || isLineTerminatorChar(*begin))) {
  ------------------
  |  Branch (436:11): [True: 0, False: 355k]
  |  Branch (436:39): [True: 1, False: 355k]
  ------------------
  437|      1|    ++begin;
  438|      1|  }
  439|   355k|  while (begin != end &&
  ------------------
  |  Branch (439:10): [True: 355k, False: 0]
  |  Branch (439:10): [True: 3, False: 355k]
  ------------------
  440|   355k|         (isWhiteSpaceChar(*(end - 1)) || isLineTerminatorChar(*(end - 1)))) {
  ------------------
  |  Branch (440:11): [True: 0, False: 355k]
  |  Branch (440:43): [True: 3, False: 355k]
  ------------------
  441|      3|    --end;
  442|      3|  }
  443|       |  // Early return for empty strings (strings only containing whitespace).
  444|   355k|  if (begin == end) {
  ------------------
  |  Branch (444:7): [True: 0, False: 355k]
  ------------------
  445|      0|    return 0;
  446|      0|  }
  447|       |
  448|       |  // Trim the string.
  449|   355k|  StringView str16 = orig.slice(begin, end);
  450|       |
  451|       |  // Slow check for special values.
  452|       |  // This should only run if user created a string with extra whitespace,
  453|       |  // since normal uses would get caught by the initial check.
  454|   355k|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|   355k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 355k]
  |  |  ------------------
  ------------------
  455|   355k|          runtime, Predefined::getSymbolID(Predefined::Infinity))))) {
  456|      0|    return std::numeric_limits<double>::infinity();
  457|      0|  }
  458|   355k|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|   355k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 355k]
  |  |  ------------------
  ------------------
  459|   355k|          runtime, Predefined::getSymbolID(Predefined::PositiveInfinity))))) {
  460|      0|    return std::numeric_limits<double>::infinity();
  461|      0|  }
  462|   355k|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|   355k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 355k]
  |  |  ------------------
  ------------------
  463|   355k|          runtime, Predefined::getSymbolID(Predefined::NegativeInfinity))))) {
  464|      0|    return -std::numeric_limits<double>::infinity();
  465|      0|  }
  466|   355k|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|   355k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 355k]
  |  |  ------------------
  ------------------
  467|   355k|          runtime, Predefined::getSymbolID(Predefined::NaN))))) {
  468|      0|    return std::numeric_limits<double>::quiet_NaN();
  469|      0|  }
  470|       |
  471|   355k|  auto len = str16.length();
  472|       |
  473|       |  // Parse hex codes, since dtoa doesn't do it.
  474|       |  // FIXME: May be inaccurate for some hex values.
  475|       |  // We need to check other sources first.
  476|   355k|  if (len > 2) {
  ------------------
  |  Branch (476:7): [True: 355k, False: 1]
  ------------------
  477|   355k|    if (str16[0] == u'0' && letterToLower(str16[1]) == u'x') {
  ------------------
  |  Branch (477:9): [True: 0, False: 355k]
  |  Branch (477:29): [True: 0, False: 0]
  ------------------
  478|      0|      return parseIntWithRadix(str16.slice(2), 16);
  479|      0|    }
  480|   355k|    if (str16[0] == u'0' && letterToLower(str16[1]) == u'o') {
  ------------------
  |  Branch (480:9): [True: 0, False: 355k]
  |  Branch (480:29): [True: 0, False: 0]
  ------------------
  481|      0|      return parseIntWithRadix(str16.slice(2), 8);
  482|      0|    }
  483|   355k|    if (str16[0] == u'0' && letterToLower(str16[1]) == u'b') {
  ------------------
  |  Branch (483:9): [True: 0, False: 355k]
  |  Branch (483:29): [True: 0, False: 0]
  ------------------
  484|      0|      return parseIntWithRadix(str16.slice(2), 2);
  485|      0|    }
  486|   355k|  }
  487|       |
  488|       |  // Finally, copy 16 bit chars into 8 bit chars and call dtoa.
  489|   355k|  llvh::SmallVector<char, 32> str8(len + 1);
  490|   355k|  uint32_t i = 0;
  491|   355k|  for (auto c16 : str16) {
  ------------------
  |  Branch (491:17): [True: 355k, False: 18]
  ------------------
  492|       |    // Check to ensure we only have valid number characters now.
  493|   355k|    if ((u'0' <= c16 && c16 <= u'9') || c16 == u'.' ||
  ------------------
  |  Branch (493:10): [True: 355k, False: 38]
  |  Branch (493:25): [True: 18, False: 355k]
  |  Branch (493:41): [True: 0, False: 355k]
  ------------------
  494|   355k|        letterToLower(c16) == u'e' || c16 == u'+' || c16 == u'-') {
  ------------------
  |  Branch (494:9): [True: 0, False: 355k]
  |  Branch (494:39): [True: 0, False: 355k]
  |  Branch (494:54): [True: 36, False: 355k]
  ------------------
  495|     54|      str8[i] = static_cast<char>(c16);
  496|   355k|    } else {
  497|   355k|      return std::numeric_limits<double>::quiet_NaN();
  498|   355k|    }
  499|     54|    ++i;
  500|     54|  }
  501|     18|  str8[len] = '\0';
  502|     18|  char *endPtr;
  503|     18|  double result = ::hermes_g_strtod(str8.data(), &endPtr);
  504|     18|  if (endPtr == str8.data() + len) {
  ------------------
  |  Branch (504:7): [True: 0, False: 18]
  ------------------
  505|      0|    return result;
  506|      0|  }
  507|       |
  508|       |  // If everything failed, return NaN.
  509|     18|  return std::numeric_limits<double>::quiet_NaN();
  510|     18|}
Operations.cpp:_ZN6hermes2vmL5toIntIiEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeENS0_6HandleIS3_EE:
  654|      2|    Handle<> valueHandle) {
  655|      2|  auto res = toNumber_RJS(runtime, valueHandle);
  656|      2|  if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (656:7): [True: 0, False: 2]
  ------------------
  657|      0|    return ExecutionStatus::EXCEPTION;
  658|      0|  }
  659|      2|  double num = res->getNumber();
  660|      2|  T result = static_cast<T>(hermes::truncateToInt32(num));
  661|      2|  return HermesValue::encodeUntrustedNumberValue(result);
  662|      2|}

_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|    160|    : hashTable_(runtime, hashTableStorage.get(), runtime.getHeap()) {}
_ZN6hermes2vm14OrderedHashMap6createERNS0_7RuntimeE:
   59|    160|    Runtime &runtime) {
   60|    160|  auto arrRes =
   61|    160|      ArrayStorageSmall::create(runtime, INITIAL_CAPACITY, INITIAL_CAPACITY);
   62|    160|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
   63|      0|    return ExecutionStatus::EXCEPTION;
   64|      0|  }
   65|    160|  auto hashTableStorage = runtime.makeHandle<ArrayStorageSmall>(*arrRes);
   66|       |
   67|    160|  return createPseudoHandle(
   68|    160|      runtime.makeAFixed<OrderedHashMap>(runtime, hashTableStorage));
   69|    160|}

_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|    175|    Handle<JSObject> parentHandle) {
   44|    175|  auto clazzHandle = runtime.getHiddenClassForPrototype(
   45|    175|      *parentHandle, numOverlapSlots<JSString>());
   46|    175|  auto obj =
   47|    175|      runtime.makeAFixed<JSString>(runtime, value, parentHandle, clazzHandle);
   48|       |
   49|    175|  auto selfHandle = JSObjectInit::initToHandle(runtime, obj);
   50|       |
   51|    175|  PropertyFlags pf;
   52|    175|  pf.writable = 0;
   53|    175|  pf.enumerable = 0;
   54|    175|  pf.configurable = 0;
   55|       |
   56|    175|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    175|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 175]
  |  |  ------------------
  ------------------
   57|    175|          JSObject::defineNewOwnProperty(
   58|    175|              selfHandle,
   59|    175|              runtime,
   60|    175|              Predefined::getSymbolID(Predefined::length),
   61|    175|              pf,
   62|    175|              runtime.makeHandle(HermesValue::encodeUntrustedNumberValue(
   63|    175|                  value->getStringLength()))) == ExecutionStatus::EXCEPTION)) {
   64|      0|    return ExecutionStatus::EXCEPTION;
   65|      0|  }
   66|       |
   67|    175|  return selfHandle;
   68|    175|}
_ZN6hermes2vm8JSString31_getOwnIndexedPropertyFlagsImplEPNS0_8JSObjectERNS0_7RuntimeEj:
   98|  1.68M|    uint32_t index) {
   99|  1.68M|  auto *str = getPrimitiveString(vmcast<JSString>(self), runtime);
  100|  1.68M|  if (index < str->getStringLength()) {
  ------------------
  |  Branch (100:7): [True: 1.68M, False: 0]
  ------------------
  101|  1.68M|    PropertyFlags flags;
  102|  1.68M|    flags.enumerable = 1;
  103|  1.68M|    return flags;
  104|  1.68M|  }
  105|       |
  106|      0|  return llvh::None;
  107|  1.68M|}
_ZN6hermes2vm8JSString23_getOwnIndexedRangeImplEPNS0_8JSObjectERNS0_7RuntimeE:
  111|     30|    Runtime &runtime) {
  112|     30|  auto *str = getPrimitiveString(vmcast<JSString>(selfObj), runtime);
  113|     30|  return {0, str->getStringLength()};
  114|     30|}
_ZN6hermes2vm25JSStringIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  187|      1|void JSStringIteratorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  188|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSStringIterator>());
  189|      1|  JSObjectBuildMeta(cell, mb);
  190|      1|  const auto *self = static_cast<const JSStringIterator *>(cell);
  191|      1|  mb.setVTable(&JSStringIterator::vt);
  192|      1|  mb.addField("iteratedString", &self->iteratedString_);
  193|      1|}
_ZN6hermes2vm17JSBigIntBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  283|      1|void JSBigIntBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  284|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSBigInt>());
  285|      1|  JSObjectBuildMeta(cell, mb);
  286|      1|  const auto *self = static_cast<const JSBigInt *>(cell);
  287|      1|  mb.setVTable(&JSBigInt::vt);
  288|      1|  mb.addField(&self->primitiveValue_);
  289|      1|}
_ZN6hermes2vm17JSNumberBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  317|      1|void JSNumberBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  318|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSNumber>());
  319|      1|  JSObjectBuildMeta(cell, mb);
  320|      1|  mb.setVTable(&JSNumber::vt);
  321|      1|}
_ZN6hermes2vm8JSNumber6createERNS0_7RuntimeEdNS0_6HandleINS0_8JSObjectEEE:
  326|    161|    Handle<JSObject> parentHandle) {
  327|    161|  auto clazzHandle = runtime.getHiddenClassForPrototype(
  328|    161|      *parentHandle, numOverlapSlots<JSNumber>());
  329|    161|  auto obj =
  330|    161|      runtime.makeAFixed<JSNumber>(runtime, value, parentHandle, clazzHandle);
  331|    161|  return JSObjectInit::initToPseudoHandle(runtime, obj);
  332|    161|}
_ZN6hermes2vm18JSBooleanBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  348|      1|void JSBooleanBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  349|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSBoolean>());
  350|      1|  JSObjectBuildMeta(cell, mb);
  351|      1|  mb.setVTable(&JSBoolean::vt);
  352|      1|}
_ZN6hermes2vm9JSBoolean6createERNS0_7RuntimeEbNS0_6HandleINS0_8JSObjectEEE:
  355|    160|JSBoolean::create(Runtime &runtime, bool value, Handle<JSObject> parentHandle) {
  356|    160|  auto clazzHandle = runtime.getHiddenClassForPrototype(
  357|    160|      *parentHandle, numOverlapSlots<JSBoolean>());
  358|    160|  auto obj =
  359|    160|      runtime.makeAFixed<JSBoolean>(runtime, value, parentHandle, clazzHandle);
  360|    160|  return JSObjectInit::initToPseudoHandle(runtime, obj);
  361|    160|}
_ZN6hermes2vm17JSSymbolBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  377|      1|void JSSymbolBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  378|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSSymbol>());
  379|      1|  JSObjectBuildMeta(cell, mb);
  380|      1|  const auto *self = static_cast<const JSSymbol *>(cell);
  381|      1|  mb.setVTable(&JSSymbol::vt);
  382|      1|  mb.addField(&self->primitiveValue_);
  383|      1|}

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

_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|  7.36k|    Handle<Callable> setter) {
   28|  7.36k|  auto *cell = runtime.makeAFixed<PropertyAccessor>(runtime, getter, setter);
   29|  7.36k|  return HermesValue::encodeObjectValue(cell);
   30|  7.36k|}

_ZN6hermes2vm7Runtime6createERKNS0_13RuntimeConfigE:
  154|    160|std::shared_ptr<Runtime> Runtime::create(const RuntimeConfig &runtimeConfig) {
  155|    160|#if defined(HERMESVM_CONTIGUOUS_HEAP)
  156|    160|  uint64_t maxHeapSize = runtimeConfig.getGCConfig().getMaxHeapSize();
  157|       |  // Allow some extra segments for the runtime, and as a buffer for the GC.
  158|    160|  uint64_t providerSize =
  159|    160|      std::min<uint64_t>(1ULL << 32, maxHeapSize + AlignedStorage::size() * 4);
  160|    160|  std::shared_ptr<StorageProvider> sp =
  161|    160|      StorageProvider::contiguousVAProvider(providerSize);
  162|    160|  auto rt = HeapRuntime<Runtime>::create(sp);
  163|    160|  new (rt.get()) Runtime(std::move(sp), runtimeConfig);
  164|    160|  return rt;
  165|       |#elif defined(HERMES_FACEBOOK_BUILD) && !defined(HERMES_FBCODE_BUILD) && \
  166|       |    !defined(__EMSCRIPTEN__)
  167|       |  // TODO (T84179835): Disable this once it is no longer useful for debugging.
  168|       |  return StackRuntime::create(runtimeConfig);
  169|       |#else
  170|       |  return std::shared_ptr<Runtime>{
  171|       |      new Runtime(StorageProvider::mmapProvider(), runtimeConfig)};
  172|       |#endif
  173|    160|}
_ZN6hermes2vm7RuntimeC2ENSt3__110shared_ptrINS0_15StorageProviderEEERKNS0_13RuntimeConfigE:
  242|    160|    : enableEval(runtimeConfig.getEnableEval()),
  243|    160|      verifyEvalIR(runtimeConfig.getVerifyEvalIR()),
  244|    160|      optimizedEval(runtimeConfig.getOptimizedEval()),
  245|    160|      asyncBreakCheckInEval(runtimeConfig.getAsyncBreakCheckInEval()),
  246|    160|      enableBlockScopingInEval(runtimeConfig.getEnableBlockScoping()),
  247|    160|      traceMode(runtimeConfig.getSynthTraceMode()),
  248|    160|      heapStorage_(
  249|    160|          *this,
  250|    160|          *this,
  251|    160|          runtimeConfig.getGCConfig(),
  252|    160|          runtimeConfig.getCrashMgr(),
  253|    160|          std::move(provider),
  254|    160|          runtimeConfig.getVMExperimentFlags()),
  255|    160|      hasES6Promise_(runtimeConfig.getES6Promise()),
  256|    160|      hasES6Proxy_(runtimeConfig.getES6Proxy()),
  257|    160|      hasES6Class_(runtimeConfig.getES6Class()),
  258|    160|      hasIntl_(runtimeConfig.getIntl()),
  259|    160|      hasArrayBuffer_(runtimeConfig.getArrayBuffer()),
  260|    160|      hasMicrotaskQueue_(runtimeConfig.getMicrotaskQueue()),
  261|    160|      shouldRandomizeMemoryLayout_(runtimeConfig.getRandomizeMemoryLayout()),
  262|    160|      bytecodeWarmupPercent_(runtimeConfig.getBytecodeWarmupPercent()),
  263|    160|      trackIO_(runtimeConfig.getTrackIO()),
  264|    160|      vmExperimentFlags_(runtimeConfig.getVMExperimentFlags()),
  265|    160|      jsLibStorage_(createJSLibStorage()),
  266|       |      stackPointer_(),
  267|    160|      crashMgr_(runtimeConfig.getCrashMgr()),
  268|       |#ifdef HERMES_CHECK_NATIVE_STACK
  269|    160|      overflowGuard_(StackOverflowGuard::nativeStackGuard(std::max(
  270|    160|          runtimeConfig.getNativeStackGap(),
  271|    160|          kMinSupportedNativeStackGap))),
  272|       |#else
  273|       |      overflowGuard_(StackOverflowGuard::depthCounterGuard(
  274|       |          Runtime::MAX_NATIVE_CALL_FRAME_DEPTH)),
  275|       |#endif
  276|       |      crashCallbackKey_(
  277|    160|          crashMgr_->registerCallback([this](int fd) { crashCallback(fd); })),
  278|    160|      codeCoverageProfiler_(std::make_unique<CodeCoverageProfiler>(*this)),
  279|    160|      gcEventCallback_(runtimeConfig.getGCConfig().getCallback()) {
  280|    160|  assert(
  281|    160|      (void *)this == (void *)(HandleRootOwner *)this &&
  282|    160|      "cast to HandleRootOwner should be no-op");
  283|       |#ifdef HERMES_FACEBOOK_BUILD
  284|       |  const bool isSnapshot = std::strstr(__FILE__, "hermes-snapshot");
  285|       |  crashMgr_->setCustomData("HermesIsSnapshot", isSnapshot ? "true" : "false");
  286|       |#endif
  287|    160|  crashMgr_->registerMemory(this, sizeof(Runtime));
  288|    160|  auto maxNumRegisters = runtimeConfig.getMaxNumRegisters();
  289|    160|  if (LLVM_UNLIKELY(maxNumRegisters > kMaxSupportedNumRegisters)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
  290|      0|    hermes_fatal("RuntimeConfig maxNumRegisters too big");
  291|      0|  }
  292|    160|  registerStackStart_ = runtimeConfig.getRegisterStack();
  293|    160|  if (!registerStackStart_) {
  ------------------
  |  Branch (293:7): [True: 160, False: 0]
  ------------------
  294|       |    // registerStackAllocation_ should not be allocated with new, because then
  295|       |    // default constructors would run for the whole stack space.
  296|       |    // Round up to page size as required by vm_allocate.
  297|    160|    const uint32_t numBytesForRegisters = llvh::alignTo(
  298|    160|        sizeof(PinnedHermesValue) * maxNumRegisters, oscompat::page_size());
  299|    160|    auto result = oscompat::vm_allocate(numBytesForRegisters);
  300|    160|    if (!result) {
  ------------------
  |  Branch (300:9): [True: 0, False: 160]
  ------------------
  301|      0|      hermes_fatal("Failed to allocate register stack", result.getError());
  302|      0|    }
  303|    160|    registerStackStart_ = static_cast<PinnedHermesValue *>(result.get());
  304|    160|    registerStackAllocation_ = {registerStackStart_, numBytesForRegisters};
  305|    160|    crashMgr_->registerMemory(registerStackStart_, numBytesForRegisters);
  306|    160|  }
  307|       |
  308|    160|  registerStackEnd_ = registerStackStart_ + maxNumRegisters;
  309|    160|  if (shouldRandomizeMemoryLayout_) {
  ------------------
  |  Branch (309:7): [True: 0, False: 160]
  ------------------
  310|      0|    const unsigned bytesOff = std::random_device()() % oscompat::page_size();
  311|      0|    registerStackStart_ += bytesOff / sizeof(PinnedHermesValue);
  312|      0|    assert(
  313|      0|        registerStackEnd_ >= registerStackStart_ && "register stack too small");
  314|      0|  }
  315|    160|  stackPointer_ = registerStackStart_;
  316|       |
  317|       |  // Setup the "root" stack frame.
  318|    160|  setCurrentFrameToTopOfStack();
  319|       |  // Allocate the "reserved" registers in the root frame.
  320|    160|  allocStack(
  321|    160|      StackFrameLayout::CalleeExtraRegistersAtStart,
  322|    160|      HermesValue::encodeUndefinedValue());
  323|       |
  324|       |  // Initialize Predefined Strings.
  325|       |  // This function does not do any allocations.
  326|    160|  initPredefinedStrings();
  327|       |  // Initialize special code blocks pointing to their own runtime module.
  328|       |  // specialCodeBlockRuntimeModule_ will be owned by runtimeModuleList_.
  329|    160|  RuntimeModuleFlags flags;
  330|    160|  flags.hidesEpilogue = true;
  331|    160|  specialCodeBlockDomain_ = Domain::create(*this).getHermesValue();
  332|    160|  specialCodeBlockRuntimeModule_ = RuntimeModule::createUninitialized(
  333|    160|      *this, Handle<Domain>::vmcast(&specialCodeBlockDomain_), flags);
  334|    160|  assert(
  335|    160|      &runtimeModuleList_.back() == specialCodeBlockRuntimeModule_ &&
  336|    160|      "specialCodeBlockRuntimeModule_ not added to runtimeModuleList_");
  337|       |
  338|       |  // At this point, allocations can begin, as all the roots are markable.
  339|       |
  340|       |  // Initialize the pre-allocated character strings.
  341|    160|  initCharacterStrings();
  342|       |
  343|    160|  GCScope scope(*this);
  344|       |
  345|       |  // Explicitly initialize the specialCodeBlockRuntimeModule_ without CJS
  346|       |  // modules.
  347|    160|  specialCodeBlockRuntimeModule_->initializeWithoutCJSModulesMayAllocate(
  348|    160|      hbc::BCProviderFromBuffer::createBCProviderFromBuffer(
  349|    160|          generateSpecialRuntimeBytecode())
  350|    160|          .first);
  351|    160|  emptyCodeBlock_ = specialCodeBlockRuntimeModule_->getCodeBlockMayAllocate(0);
  352|    160|  returnThisCodeBlock_ =
  353|    160|      specialCodeBlockRuntimeModule_->getCodeBlockMayAllocate(1);
  354|       |
  355|       |  // Initialize the root hidden class and its variants.
  356|    160|  {
  357|    160|    MutableHandle<HiddenClass> clazz(
  358|    160|        *this,
  359|    160|        vmcast<HiddenClass>(
  360|    160|            ignoreAllocationFailure(HiddenClass::createRoot(*this))));
  361|    160|    rootClazzes_[0] = clazz.getHermesValue();
  362|  1.28k|    for (unsigned i = 1; i <= InternalProperty::NumAnonymousInternalProperties;
  ------------------
  |  Branch (362:26): [True: 1.12k, False: 160]
  ------------------
  363|  1.12k|         ++i) {
  364|  1.12k|      auto addResult = HiddenClass::reserveSlot(clazz, *this);
  365|  1.12k|      assert(
  366|  1.12k|          addResult != ExecutionStatus::EXCEPTION &&
  367|  1.12k|          "Could not possibly grow larger than the limit");
  368|  1.12k|      clazz = *addResult->first;
  369|  1.12k|      rootClazzes_[i] = clazz.getHermesValue();
  370|  1.12k|    }
  371|    160|  }
  372|       |
  373|    160|  global_ =
  374|    160|      JSObject::create(*this, makeNullHandle<JSObject>()).getHermesValue();
  375|       |
  376|    160|  JSLibFlags jsLibFlags{};
  377|    160|  jsLibFlags.enableHermesInternal = runtimeConfig.getEnableHermesInternal();
  378|    160|  jsLibFlags.enableHermesInternalTestMethods =
  379|    160|      runtimeConfig.getEnableHermesInternalTestMethods();
  380|    160|  initGlobalObject(*this, jsLibFlags);
  381|       |
  382|       |  // Once the global object has been initialized, populate native builtins to
  383|       |  // the builtins table.
  384|    160|  initNativeBuiltins();
  385|       |
  386|       |  // Set the prototype of the global object to the standard object prototype,
  387|       |  // which has now been defined.
  388|    160|  ignoreAllocationFailure(JSObject::setParent(
  389|    160|      vmcast<JSObject>(global_),
  390|    160|      *this,
  391|    160|      vmcast<JSObject>(objectPrototype),
  392|    160|      PropOpFlags().plusThrowOnError()));
  393|       |
  394|    160|  symbolRegistry_.init(*this);
  395|       |
  396|       |  // BB Profiler need to be ready before running internal bytecode.
  397|       |#ifdef HERMESVM_PROFILER_BB
  398|       |  inlineCacheProfiler_.setHiddenClassArray(
  399|       |      ignoreAllocationFailure(JSArray::create(*this, 4, 4)).get());
  400|       |#endif
  401|       |
  402|    160|  codeCoverageProfiler_->disable();
  403|       |  // Execute our internal bytecode.
  404|    160|  auto jsBuiltinsObj = runInternalBytecode();
  405|    160|  codeCoverageProfiler_->restore();
  406|       |
  407|       |  // Populate JS builtins returned from internal bytecode to the builtins table.
  408|    160|  initJSBuiltins(builtins_, jsBuiltinsObj);
  409|       |
  410|    160|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
  411|    160|  if (runtimeConfig.getEnableSampleProfiling())
  ------------------
  |  Branch (411:7): [True: 0, False: 160]
  ------------------
  412|      0|    samplingProfiler = SamplingProfiler::create(*this);
  413|    160|#endif // HERMESVM_SAMPLING_PROFILER_AVAILABLE
  414|       |
  415|    160|  LLVM_DEBUG(llvh::dbgs() << "Runtime initialized\n");
  ------------------
  |  |  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  416|    160|}
_ZN6hermes2vm7RuntimeD2Ev:
  418|    160|Runtime::~Runtime() {
  419|    160|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
  420|    160|  samplingProfiler.reset();
  421|    160|#endif // HERMESVM_SAMPLING_PROFILER_AVAILABLE
  422|       |
  423|    160|  getHeap().finalizeAll();
  424|       |  // Remove inter-module dependencies so we can delete them in any order.
  425|    445|  for (auto &module : runtimeModuleList_) {
  ------------------
  |  Branch (425:21): [True: 445, False: 160]
  ------------------
  426|    445|    module.prepareForDestruction();
  427|    445|  }
  428|       |  // All RuntimeModules must be destroyed before the next assertion, to untrack
  429|       |  // all native IDs related to it (e.g., CodeBlock).
  430|    605|  while (!runtimeModuleList_.empty()) {
  ------------------
  |  Branch (430:10): [True: 445, False: 160]
  ------------------
  431|       |    // Calling delete will automatically remove it from the list.
  432|    445|    delete &runtimeModuleList_.back();
  433|    445|  }
  434|       |  // Now that all objects are finalized, there shouldn't be any native memory
  435|       |  // keys left in the ID tracker for memory profiling. Assert that the only IDs
  436|       |  // left are JS heap pointers.
  437|    160|  assert(
  438|    160|      !getHeap().getIDTracker().hasNativeIDs() &&
  439|    160|      "A pointer is left in the ID tracker that is from non-JS memory. "
  440|    160|      "Was untrackNative called?");
  441|    160|  crashMgr_->unregisterCallback(crashCallbackKey_);
  442|    160|  if (!registerStackAllocation_.empty()) {
  ------------------
  |  Branch (442:7): [True: 160, False: 0]
  ------------------
  443|    160|    crashMgr_->unregisterMemory(registerStackAllocation_.data());
  444|    160|    oscompat::vm_free(
  445|    160|        registerStackAllocation_.data(), registerStackAllocation_.size());
  446|    160|  }
  447|       |
  448|    160|  assert(
  449|    160|      !formattingStackTrace_ &&
  450|    160|      "Runtime is being destroyed while exception is being formatted");
  451|       |
  452|       |  // Unwatch the runtime from the time limit monitor in case the latter still
  453|       |  // has any references to this.
  454|    160|  if (timeLimitMonitor) {
  ------------------
  |  Branch (454:7): [True: 160, False: 0]
  ------------------
  455|    160|    timeLimitMonitor->unwatchRuntime(*this);
  456|    160|  }
  457|       |
  458|    160|  crashMgr_->unregisterMemory(this);
  459|    160|}
_ZN6hermes2vm7Runtime9markRootsERNS0_28RootAndSlotAcceptorWithNamesEb:
  494|    339|    bool markLongLived) {
  495|       |  // The body of markRoots should be sequence of blocks, each of which starts
  496|       |  // with the declaration of an appropriate RootSection instance.
  497|    339|  {
  498|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Registers);
  499|    339|    acceptor.beginRootSection(RootAcceptor::Section::Registers);
  500|  2.03M|    for (auto *p = registerStackStart_, *e = stackPointer_; p != e; ++p)
  ------------------
  |  Branch (500:61): [True: 2.02M, False: 339]
  ------------------
  501|  2.02M|      acceptor.accept(*p);
  502|    339|    acceptor.endRootSection();
  503|    339|  }
  504|       |
  505|    339|  {
  506|    339|    MarkRootsPhaseTimer timer(
  507|    339|        *this, RootAcceptor::Section::RuntimeInstanceVars);
  508|    339|    acceptor.beginRootSection(RootAcceptor::Section::RuntimeInstanceVars);
  509|    339|    for (auto &clazz : rootClazzes_)
  ------------------
  |  Branch (509:22): [True: 2.71k, False: 339]
  ------------------
  510|  2.71k|      acceptor.accept(clazz, "rootClass");
  511|    339|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  512|    339|#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|    339|#ifndef RUNTIME_HV_FIELD_PROTOTYPE
  |  |    9|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name)
  |  |   10|    339|#endif
  |  |   11|       |
  |  |   12|       |#ifndef RUNTIME_HV_FIELD_INSTANCE
  |  |   13|       |#define RUNTIME_HV_FIELD_INSTANCE(name)
  |  |   14|       |#endif
  |  |   15|       |
  |  |   16|    339|#ifndef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |   17|    339|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name)
  |  |   18|    339|#endif
  |  |   19|       |
  |  |   20|    339|RUNTIME_HV_FIELD_PROTOTYPE(objectPrototype)
  |  |   21|    339|RUNTIME_HV_FIELD_PROTOTYPE(objectConstructor)
  |  |   22|    339|RUNTIME_HV_FIELD_PROTOTYPE(errorConstructor)
  |  |   23|       |
  |  |   24|       |/// JSError and JSError.prototype, and constructor and prototype of all native
  |  |   25|       |/// error types.
  |  |   26|    339|#define ALL_ERROR_TYPE(name)                  \
  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |   29|    339|#include "hermes/FrontEndDefs/NativeErrorTypes.def"
  |  |   30|    339|#undef ALL_ERROR_TYPE
  |  |   31|    339|RUNTIME_HV_FIELD_PROTOTYPE(functionPrototype)
  |  |   32|    339|RUNTIME_HV_FIELD_PROTOTYPE(functionConstructor)
  |  |   33|       |
  |  |   34|    339|RUNTIME_HV_FIELD_PROTOTYPE(stringPrototype)
  |  |   35|    339|RUNTIME_HV_FIELD_PROTOTYPE(bigintPrototype)
  |  |   36|    339|RUNTIME_HV_FIELD_PROTOTYPE(numberPrototype)
  |  |   37|    339|RUNTIME_HV_FIELD_PROTOTYPE(booleanPrototype)
  |  |   38|    339|RUNTIME_HV_FIELD_PROTOTYPE(symbolPrototype)
  |  |   39|    339|RUNTIME_HV_FIELD_PROTOTYPE(datePrototype)
  |  |   40|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototype)
  |  |   41|       |
  |  |   42|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayBufferPrototype)
  |  |   43|    339|RUNTIME_HV_FIELD_PROTOTYPE(dataViewPrototype)
  |  |   44|    339|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBasePrototype)
  |  |   45|       |
  |  |   46|       |/// %TypedArray%.prototype and constructor for each typed array.
  |  |   47|    339|#define TYPED_ARRAY(name, type)                    \
  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |   50|    339|#include "hermes/VM/TypedArrays.def"
  |  |   51|    339|#undef TYPED_ARRAY
  |  |   52|       |
  |  |   53|    339|RUNTIME_HV_FIELD_PROTOTYPE(setPrototype)
  |  |   54|    339|RUNTIME_HV_FIELD_PROTOTYPE(setIteratorPrototype)
  |  |   55|    339|RUNTIME_HV_FIELD_PROTOTYPE(mapPrototype)
  |  |   56|    339|RUNTIME_HV_FIELD_PROTOTYPE(mapIteratorPrototype)
  |  |   57|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakMapPrototype)
  |  |   58|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakSetPrototype)
  |  |   59|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakRefPrototype)
  |  |   60|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpPrototype)
  |  |   61|    339|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBaseConstructor)
  |  |   62|       |
  |  |   63|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastInput)
  |  |   64|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastRegExp)
  |  |   65|       |
  |  |   66|    339|RUNTIME_HV_FIELD_PROTOTYPE(throwTypeErrorAccessor)
  |  |   67|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayClass)
  |  |   68|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpMatchClass)
  |  |   69|       |
  |  |   70|    339|RUNTIME_HV_FIELD_PROTOTYPE(iteratorPrototype)
  |  |   71|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayIteratorPrototype)
  |  |   72|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototypeValues)
  |  |   73|    339|RUNTIME_HV_FIELD_PROTOTYPE(asyncFunctionPrototype)
  |  |   74|    339|RUNTIME_HV_FIELD_PROTOTYPE(stringIteratorPrototype)
  |  |   75|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpStringIteratorPrototype)
  |  |   76|    339|RUNTIME_HV_FIELD_PROTOTYPE(generatorPrototype)
  |  |   77|    339|RUNTIME_HV_FIELD_PROTOTYPE(generatorFunctionPrototype)
  |  |   78|    339|RUNTIME_HV_FIELD_PROTOTYPE(parseIntFunction)
  |  |   79|    339|RUNTIME_HV_FIELD_PROTOTYPE(parseFloatFunction)
  |  |   80|    339|RUNTIME_HV_FIELD_PROTOTYPE(requireFunction)
  |  |   81|    339|RUNTIME_HV_FIELD_PROTOTYPE(jsErrorStackAccessor)
  |  |   82|    339|RUNTIME_HV_FIELD_PROTOTYPE(callSitePrototype)
  |  |   83|    339|RUNTIME_HV_FIELD_PROTOTYPE(textEncoderPrototype)
  |  |   84|       |
  |  |   85|       |// TODO: for Serialization/Deserialization  after global object initialization
  |  |   86|       |// we record specialCodeBlockDomain_ and create runtimemodule later need to
  |  |   87|       |// revisit this in stage 2
  |  |   88|    339|RUNTIME_HV_FIELD_RUNTIMEMODULE(specialCodeBlockDomain_)
  |  |   89|       |
  |  |   90|    339|RUNTIME_HV_FIELD_INSTANCE(global_)
  |  |  ------------------
  |  |  |  |  511|    339|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   91|    339|RUNTIME_HV_FIELD_INSTANCE(thrownValue_)
  |  |  ------------------
  |  |  |  |  511|    339|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   92|    339|RUNTIME_HV_FIELD_INSTANCE(keptObjects_)
  |  |  ------------------
  |  |  |  |  511|    339|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   93|    339|#ifdef HERMES_ENABLE_DEBUGGER
  |  |   94|    339|RUNTIME_HV_FIELD_INSTANCE(debuggerInternalObject_)
  |  |  ------------------
  |  |  |  |  511|    339|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   95|    339|#endif // HERMES_ENABLE_DEBUGGER
  |  |   96|       |
  |  |   97|       |#ifdef HERMES_ENABLE_INTL
  |  |   98|       |// TODO T65916424: move these out of Runtime
  |  |   99|       |RUNTIME_HV_FIELD_INSTANCE(intlCollator)
  |  |  100|       |RUNTIME_HV_FIELD_PROTOTYPE(intlCollatorPrototype)
  |  |  101|       |RUNTIME_HV_FIELD_INSTANCE(intlDateTimeFormat)
  |  |  102|       |RUNTIME_HV_FIELD_PROTOTYPE(intlDateTimeFormatPrototype)
  |  |  103|       |RUNTIME_HV_FIELD_INSTANCE(intlNumberFormat)
  |  |  104|       |RUNTIME_HV_FIELD_PROTOTYPE(intlNumberFormatPrototype)
  |  |  105|       |#endif
  |  |  106|       |
  |  |  107|    339|RUNTIME_HV_FIELD_INSTANCE(promiseRejectionTrackingHook_)
  |  |  ------------------
  |  |  |  |  511|    339|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |  108|       |
  |  |  109|    339|#undef RUNTIME_HV_FIELD_PROTOTYPE
  |  |  110|    339|#undef RUNTIME_HV_FIELD_INSTANCE
  |  |  111|    339|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |  112|    339|#undef RUNTIME_HV_FIELD
  ------------------
  513|    339|#undef RUNTIME_HV_FIELD_INSTANCE
  514|    339|    acceptor.endRootSection();
  515|    339|  }
  516|       |
  517|    339|  {
  518|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::RuntimeModules);
  519|    339|    acceptor.beginRootSection(RootAcceptor::Section::RuntimeModules);
  520|    339|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name) acceptor.accept(name);
  521|    339|#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|    339|#ifndef RUNTIME_HV_FIELD_PROTOTYPE
  |  |    9|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name)
  |  |   10|    339|#endif
  |  |   11|       |
  |  |   12|    339|#ifndef RUNTIME_HV_FIELD_INSTANCE
  |  |   13|    339|#define RUNTIME_HV_FIELD_INSTANCE(name)
  |  |   14|    339|#endif
  |  |   15|       |
  |  |   16|       |#ifndef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |   17|       |#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name)
  |  |   18|       |#endif
  |  |   19|       |
  |  |   20|    339|RUNTIME_HV_FIELD_PROTOTYPE(objectPrototype)
  |  |   21|    339|RUNTIME_HV_FIELD_PROTOTYPE(objectConstructor)
  |  |   22|    339|RUNTIME_HV_FIELD_PROTOTYPE(errorConstructor)
  |  |   23|       |
  |  |   24|       |/// JSError and JSError.prototype, and constructor and prototype of all native
  |  |   25|       |/// error types.
  |  |   26|    339|#define ALL_ERROR_TYPE(name)                  \
  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |   29|    339|#include "hermes/FrontEndDefs/NativeErrorTypes.def"
  |  |   30|    339|#undef ALL_ERROR_TYPE
  |  |   31|    339|RUNTIME_HV_FIELD_PROTOTYPE(functionPrototype)
  |  |   32|    339|RUNTIME_HV_FIELD_PROTOTYPE(functionConstructor)
  |  |   33|       |
  |  |   34|    339|RUNTIME_HV_FIELD_PROTOTYPE(stringPrototype)
  |  |   35|    339|RUNTIME_HV_FIELD_PROTOTYPE(bigintPrototype)
  |  |   36|    339|RUNTIME_HV_FIELD_PROTOTYPE(numberPrototype)
  |  |   37|    339|RUNTIME_HV_FIELD_PROTOTYPE(booleanPrototype)
  |  |   38|    339|RUNTIME_HV_FIELD_PROTOTYPE(symbolPrototype)
  |  |   39|    339|RUNTIME_HV_FIELD_PROTOTYPE(datePrototype)
  |  |   40|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototype)
  |  |   41|       |
  |  |   42|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayBufferPrototype)
  |  |   43|    339|RUNTIME_HV_FIELD_PROTOTYPE(dataViewPrototype)
  |  |   44|    339|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBasePrototype)
  |  |   45|       |
  |  |   46|       |/// %TypedArray%.prototype and constructor for each typed array.
  |  |   47|    339|#define TYPED_ARRAY(name, type)                    \
  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |   50|    339|#include "hermes/VM/TypedArrays.def"
  |  |   51|    339|#undef TYPED_ARRAY
  |  |   52|       |
  |  |   53|    339|RUNTIME_HV_FIELD_PROTOTYPE(setPrototype)
  |  |   54|    339|RUNTIME_HV_FIELD_PROTOTYPE(setIteratorPrototype)
  |  |   55|    339|RUNTIME_HV_FIELD_PROTOTYPE(mapPrototype)
  |  |   56|    339|RUNTIME_HV_FIELD_PROTOTYPE(mapIteratorPrototype)
  |  |   57|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakMapPrototype)
  |  |   58|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakSetPrototype)
  |  |   59|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakRefPrototype)
  |  |   60|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpPrototype)
  |  |   61|    339|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBaseConstructor)
  |  |   62|       |
  |  |   63|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastInput)
  |  |   64|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastRegExp)
  |  |   65|       |
  |  |   66|    339|RUNTIME_HV_FIELD_PROTOTYPE(throwTypeErrorAccessor)
  |  |   67|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayClass)
  |  |   68|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpMatchClass)
  |  |   69|       |
  |  |   70|    339|RUNTIME_HV_FIELD_PROTOTYPE(iteratorPrototype)
  |  |   71|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayIteratorPrototype)
  |  |   72|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototypeValues)
  |  |   73|    339|RUNTIME_HV_FIELD_PROTOTYPE(asyncFunctionPrototype)
  |  |   74|    339|RUNTIME_HV_FIELD_PROTOTYPE(stringIteratorPrototype)
  |  |   75|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpStringIteratorPrototype)
  |  |   76|    339|RUNTIME_HV_FIELD_PROTOTYPE(generatorPrototype)
  |  |   77|    339|RUNTIME_HV_FIELD_PROTOTYPE(generatorFunctionPrototype)
  |  |   78|    339|RUNTIME_HV_FIELD_PROTOTYPE(parseIntFunction)
  |  |   79|    339|RUNTIME_HV_FIELD_PROTOTYPE(parseFloatFunction)
  |  |   80|    339|RUNTIME_HV_FIELD_PROTOTYPE(requireFunction)
  |  |   81|    339|RUNTIME_HV_FIELD_PROTOTYPE(jsErrorStackAccessor)
  |  |   82|    339|RUNTIME_HV_FIELD_PROTOTYPE(callSitePrototype)
  |  |   83|    339|RUNTIME_HV_FIELD_PROTOTYPE(textEncoderPrototype)
  |  |   84|       |
  |  |   85|       |// TODO: for Serialization/Deserialization  after global object initialization
  |  |   86|       |// we record specialCodeBlockDomain_ and create runtimemodule later need to
  |  |   87|       |// revisit this in stage 2
  |  |   88|    339|RUNTIME_HV_FIELD_RUNTIMEMODULE(specialCodeBlockDomain_)
  |  |  ------------------
  |  |  |  |  520|    339|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name) acceptor.accept(name);
  |  |  ------------------
  |  |   89|       |
  |  |   90|    339|RUNTIME_HV_FIELD_INSTANCE(global_)
  |  |   91|    339|RUNTIME_HV_FIELD_INSTANCE(thrownValue_)
  |  |   92|    339|RUNTIME_HV_FIELD_INSTANCE(keptObjects_)
  |  |   93|    339|#ifdef HERMES_ENABLE_DEBUGGER
  |  |   94|    339|RUNTIME_HV_FIELD_INSTANCE(debuggerInternalObject_)
  |  |   95|    339|#endif // HERMES_ENABLE_DEBUGGER
  |  |   96|       |
  |  |   97|       |#ifdef HERMES_ENABLE_INTL
  |  |   98|       |// TODO T65916424: move these out of Runtime
  |  |   99|       |RUNTIME_HV_FIELD_INSTANCE(intlCollator)
  |  |  100|       |RUNTIME_HV_FIELD_PROTOTYPE(intlCollatorPrototype)
  |  |  101|       |RUNTIME_HV_FIELD_INSTANCE(intlDateTimeFormat)
  |  |  102|       |RUNTIME_HV_FIELD_PROTOTYPE(intlDateTimeFormatPrototype)
  |  |  103|       |RUNTIME_HV_FIELD_INSTANCE(intlNumberFormat)
  |  |  104|       |RUNTIME_HV_FIELD_PROTOTYPE(intlNumberFormatPrototype)
  |  |  105|       |#endif
  |  |  106|       |
  |  |  107|    339|RUNTIME_HV_FIELD_INSTANCE(promiseRejectionTrackingHook_)
  |  |  108|       |
  |  |  109|    339|#undef RUNTIME_HV_FIELD_PROTOTYPE
  |  |  110|    339|#undef RUNTIME_HV_FIELD_INSTANCE
  |  |  111|    339|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |  112|    339|#undef RUNTIME_HV_FIELD
  ------------------
  522|    339|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  523|    339|    for (auto &rm : runtimeModuleList_)
  ------------------
  |  Branch (523:19): [True: 1.32k, False: 339]
  ------------------
  524|  1.32k|      rm.markRoots(acceptor, markLongLived);
  525|    339|    acceptor.endRootSection();
  526|    339|  }
  527|       |
  528|    339|  {
  529|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::CharStrings);
  530|    339|    acceptor.beginRootSection(RootAcceptor::Section::CharStrings);
  531|    339|    if (markLongLived) {
  ------------------
  |  Branch (531:9): [True: 226, False: 113]
  ------------------
  532|    226|      for (auto &hv : charStrings_)
  ------------------
  |  Branch (532:21): [True: 57.8k, False: 226]
  ------------------
  533|  57.8k|        acceptor.accept(hv);
  534|    226|    }
  535|    339|    acceptor.endRootSection();
  536|    339|  }
  537|       |
  538|    339|  {
  539|    339|    MarkRootsPhaseTimer timer(
  540|    339|        *this, RootAcceptor::Section::StringCycleCheckVisited);
  541|    339|    acceptor.beginRootSection(RootAcceptor::Section::StringCycleCheckVisited);
  542|    339|    for (auto *&ptr : stringCycleCheckVisited_)
  ------------------
  |  Branch (542:21): [True: 36, False: 339]
  ------------------
  543|     36|      acceptor.acceptPtr(ptr);
  544|    339|    acceptor.endRootSection();
  545|    339|  }
  546|       |
  547|    339|  {
  548|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Builtins);
  549|    339|    acceptor.beginRootSection(RootAcceptor::Section::Builtins);
  550|    339|    for (Callable *&f : builtins_)
  ------------------
  |  Branch (550:23): [True: 17.9k, False: 339]
  ------------------
  551|  17.9k|      acceptor.acceptPtr(f);
  552|    339|    acceptor.endRootSection();
  553|    339|  }
  554|       |
  555|    339|  {
  556|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Jobs);
  557|    339|    acceptor.beginRootSection(RootAcceptor::Section::Jobs);
  558|    339|    for (Callable *&f : jobQueue_)
  ------------------
  |  Branch (558:23): [True: 0, False: 339]
  ------------------
  559|      0|      acceptor.acceptPtr(f);
  560|    339|    acceptor.endRootSection();
  561|    339|  }
  562|       |
  563|       |#ifdef MARK
  564|       |#error "Shouldn't have defined mark already"
  565|       |#endif
  566|    339|#define MARK(field) acceptor.accept((field), #field)
  567|    339|  {
  568|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Prototypes);
  569|    339|    acceptor.beginRootSection(RootAcceptor::Section::Prototypes);
  570|       |    // Prototypes.
  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  572|    339|#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|    339|#ifndef RUNTIME_HV_FIELD_INSTANCE
  |  |   13|    339|#define RUNTIME_HV_FIELD_INSTANCE(name)
  |  |   14|    339|#endif
  |  |   15|       |
  |  |   16|    339|#ifndef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |   17|    339|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name)
  |  |   18|    339|#endif
  |  |   19|       |
  |  |   20|    339|RUNTIME_HV_FIELD_PROTOTYPE(objectPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   21|    339|RUNTIME_HV_FIELD_PROTOTYPE(objectConstructor)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|    339|RUNTIME_HV_FIELD_PROTOTYPE(errorConstructor)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   23|       |
  |  |   24|       |/// JSError and JSError.prototype, and constructor and prototype of all native
  |  |   25|       |/// error types.
  |  |   26|    339|#define ALL_ERROR_TYPE(name)                  \
  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |   29|    339|#include "hermes/FrontEndDefs/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|    339|#ifdef ALL_ERROR_TYPE
  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |   13|    339|#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|    339|ALL_ERROR_TYPE(Error)
  |  |  |  |  ------------------
  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   31|    339|AGGREGATE_ERROR_TYPE(AggregateError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   13|    339|#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   32|    339|NATIVE_ERROR_TYPE(EvalError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   33|    339|NATIVE_ERROR_TYPE(RangeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   34|    339|NATIVE_ERROR_TYPE(ReferenceError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   35|    339|NATIVE_ERROR_TYPE(SyntaxError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|    339|NATIVE_ERROR_TYPE(TypeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   37|    339|NATIVE_ERROR_TYPE(URIError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   38|    339|NATIVE_ERROR_TYPE(TimeoutError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   39|    339|NATIVE_ERROR_TYPE(QuitError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    339|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   28|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##Constructor)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   40|       |
  |  |  |  |   41|    339|#undef AGGREGATE_ERROR_TYPE
  |  |  |  |   42|    339|#undef NATIVE_ERROR_TYPE
  |  |  |  |   43|    339|#undef ALL_ERROR_TYPE
  |  |  ------------------
  |  |   30|    339|#undef ALL_ERROR_TYPE
  |  |   31|    339|RUNTIME_HV_FIELD_PROTOTYPE(functionPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|    339|RUNTIME_HV_FIELD_PROTOTYPE(functionConstructor)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   33|       |
  |  |   34|    339|RUNTIME_HV_FIELD_PROTOTYPE(stringPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   35|    339|RUNTIME_HV_FIELD_PROTOTYPE(bigintPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   36|    339|RUNTIME_HV_FIELD_PROTOTYPE(numberPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   37|    339|RUNTIME_HV_FIELD_PROTOTYPE(booleanPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   38|    339|RUNTIME_HV_FIELD_PROTOTYPE(symbolPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   39|    339|RUNTIME_HV_FIELD_PROTOTYPE(datePrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   40|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|       |
  |  |   42|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayBufferPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    339|RUNTIME_HV_FIELD_PROTOTYPE(dataViewPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|    339|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBasePrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   45|       |
  |  |   46|       |/// %TypedArray%.prototype and constructor for each typed array.
  |  |   47|    339|#define TYPED_ARRAY(name, type)                    \
  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |   50|    339|#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|    339|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|    339|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|    339|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|    339|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|    339|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|    339|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   20|       |#else
  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|       |#endif
  |  |  |  |   23|    339|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|    339|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|    339|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|    339|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|    339|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|    339|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   48|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   49|    339|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|    339|#undef TYPED_ARRAY
  |  |  ------------------
  |  |   51|    339|#undef TYPED_ARRAY
  |  |   52|       |
  |  |   53|    339|RUNTIME_HV_FIELD_PROTOTYPE(setPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   54|    339|RUNTIME_HV_FIELD_PROTOTYPE(setIteratorPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   55|    339|RUNTIME_HV_FIELD_PROTOTYPE(mapPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   56|    339|RUNTIME_HV_FIELD_PROTOTYPE(mapIteratorPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   57|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakMapPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakSetPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   59|    339|RUNTIME_HV_FIELD_PROTOTYPE(weakRefPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|    339|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBaseConstructor)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|       |
  |  |   63|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastInput)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   64|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastRegExp)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   65|       |
  |  |   66|    339|RUNTIME_HV_FIELD_PROTOTYPE(throwTypeErrorAccessor)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   67|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayClass)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpMatchClass)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   69|       |
  |  |   70|    339|RUNTIME_HV_FIELD_PROTOTYPE(iteratorPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   71|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayIteratorPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   72|    339|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototypeValues)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   73|    339|RUNTIME_HV_FIELD_PROTOTYPE(asyncFunctionPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   74|    339|RUNTIME_HV_FIELD_PROTOTYPE(stringIteratorPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   75|    339|RUNTIME_HV_FIELD_PROTOTYPE(regExpStringIteratorPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   76|    339|RUNTIME_HV_FIELD_PROTOTYPE(generatorPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   77|    339|RUNTIME_HV_FIELD_PROTOTYPE(generatorFunctionPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   78|    339|RUNTIME_HV_FIELD_PROTOTYPE(parseIntFunction)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   79|    339|RUNTIME_HV_FIELD_PROTOTYPE(parseFloatFunction)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   80|    339|RUNTIME_HV_FIELD_PROTOTYPE(requireFunction)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   81|    339|RUNTIME_HV_FIELD_PROTOTYPE(jsErrorStackAccessor)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   82|    339|RUNTIME_HV_FIELD_PROTOTYPE(callSitePrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   83|    339|RUNTIME_HV_FIELD_PROTOTYPE(textEncoderPrototype)
  |  |  ------------------
  |  |  |  |  571|    339|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  566|    339|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   84|       |
  |  |   85|       |// TODO: for Serialization/Deserialization  after global object initialization
  |  |   86|       |// we record specialCodeBlockDomain_ and create runtimemodule later need to
  |  |   87|       |// revisit this in stage 2
  |  |   88|    339|RUNTIME_HV_FIELD_RUNTIMEMODULE(specialCodeBlockDomain_)
  |  |   89|       |
  |  |   90|    339|RUNTIME_HV_FIELD_INSTANCE(global_)
  |  |   91|    339|RUNTIME_HV_FIELD_INSTANCE(thrownValue_)
  |  |   92|    339|RUNTIME_HV_FIELD_INSTANCE(keptObjects_)
  |  |   93|    339|#ifdef HERMES_ENABLE_DEBUGGER
  |  |   94|    339|RUNTIME_HV_FIELD_INSTANCE(debuggerInternalObject_)
  |  |   95|    339|#endif // HERMES_ENABLE_DEBUGGER
  |  |   96|       |
  |  |   97|       |#ifdef HERMES_ENABLE_INTL
  |  |   98|       |// TODO T65916424: move these out of Runtime
  |  |   99|       |RUNTIME_HV_FIELD_INSTANCE(intlCollator)
  |  |  100|       |RUNTIME_HV_FIELD_PROTOTYPE(intlCollatorPrototype)
  |  |  101|       |RUNTIME_HV_FIELD_INSTANCE(intlDateTimeFormat)
  |  |  102|       |RUNTIME_HV_FIELD_PROTOTYPE(intlDateTimeFormatPrototype)
  |  |  103|       |RUNTIME_HV_FIELD_INSTANCE(intlNumberFormat)
  |  |  104|       |RUNTIME_HV_FIELD_PROTOTYPE(intlNumberFormatPrototype)
  |  |  105|       |#endif
  |  |  106|       |
  |  |  107|    339|RUNTIME_HV_FIELD_INSTANCE(promiseRejectionTrackingHook_)
  |  |  108|       |
  |  |  109|    339|#undef RUNTIME_HV_FIELD_PROTOTYPE
  |  |  110|    339|#undef RUNTIME_HV_FIELD_INSTANCE
  |  |  111|    339|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |  112|    339|#undef RUNTIME_HV_FIELD
  ------------------
  573|    339|#undef RUNTIME_HV_FIELD_PROTOTYPE
  574|    339|    acceptor.acceptPtr(objectPrototypeRawPtr, "objectPrototype");
  575|    339|    acceptor.acceptPtr(functionPrototypeRawPtr, "functionPrototype");
  576|    339|#undef MARK
  577|    339|    acceptor.endRootSection();
  578|    339|  }
  579|       |
  580|    339|  {
  581|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::IdentifierTable);
  582|    339|    if (markLongLived) {
  ------------------
  |  Branch (582:9): [True: 226, False: 113]
  ------------------
  583|    226|#ifdef HERMES_MEMORY_INSTRUMENTATION
  584|       |      // Need to add nodes before the root section, and edges during the root
  585|       |      // section.
  586|    226|      acceptor.provideSnapshot([this](HeapSnapshot &snap) {
  587|    226|        identifierTable_.snapshotAddNodes(snap);
  588|    226|      });
  589|    226|#endif
  590|    226|      acceptor.beginRootSection(RootAcceptor::Section::IdentifierTable);
  591|    226|      identifierTable_.markIdentifiers(acceptor, getHeap());
  592|    226|#ifdef HERMES_MEMORY_INSTRUMENTATION
  593|    226|      acceptor.provideSnapshot([this](HeapSnapshot &snap) {
  594|    226|        identifierTable_.snapshotAddEdges(snap);
  595|    226|      });
  596|    226|#endif
  597|    226|      acceptor.endRootSection();
  598|    226|    }
  599|    339|  }
  600|       |
  601|    339|  {
  602|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::GCScopes);
  603|    339|    acceptor.beginRootSection(RootAcceptor::Section::GCScopes);
  604|    339|    markGCScopes(acceptor);
  605|    339|    acceptor.endRootSection();
  606|    339|  }
  607|       |
  608|    339|  {
  609|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::SymbolRegistry);
  610|    339|    acceptor.beginRootSection(RootAcceptor::Section::SymbolRegistry);
  611|    339|    symbolRegistry_.markRoots(acceptor);
  612|    339|    acceptor.endRootSection();
  613|    339|  }
  614|    339|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
  615|    339|  {
  616|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::SamplingProfiler);
  617|    339|    acceptor.beginRootSection(RootAcceptor::Section::SamplingProfiler);
  618|    339|    if (samplingProfiler) {
  ------------------
  |  Branch (618:9): [True: 0, False: 339]
  ------------------
  619|      0|      samplingProfiler->markRoots(acceptor);
  620|      0|    }
  621|    339|    acceptor.endRootSection();
  622|    339|  }
  623|    339|#endif
  624|       |
  625|    339|  {
  626|    339|    MarkRootsPhaseTimer timer(
  627|    339|        *this, RootAcceptor::Section::CodeCoverageProfiler);
  628|    339|    acceptor.beginRootSection(RootAcceptor::Section::CodeCoverageProfiler);
  629|    339|    if (codeCoverageProfiler_) {
  ------------------
  |  Branch (629:9): [True: 339, False: 0]
  ------------------
  630|    339|      codeCoverageProfiler_->markRoots(acceptor);
  631|    339|    }
  632|       |#ifdef HERMESVM_PROFILER_BB
  633|       |    auto *&hiddenClassArray = inlineCacheProfiler_.getHiddenClassArray();
  634|       |    if (hiddenClassArray) {
  635|       |      acceptor.acceptPtr(hiddenClassArray);
  636|       |    }
  637|       |#endif
  638|    339|    acceptor.endRootSection();
  639|    339|  }
  640|       |
  641|    339|  {
  642|    339|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Custom);
  643|       |    // Define nodes before the root section starts.
  644|    339|    for (auto &fn : customSnapshotNodeFuncs_) {
  ------------------
  |  Branch (644:19): [True: 339, False: 339]
  ------------------
  645|    339|      acceptor.provideSnapshot(fn);
  646|    339|    }
  647|    339|    acceptor.beginRootSection(RootAcceptor::Section::Custom);
  648|    339|    for (auto &fn : customMarkRootFuncs_)
  ------------------
  |  Branch (648:19): [True: 339, False: 339]
  ------------------
  649|    339|      fn(&getHeap(), acceptor);
  650|       |    // Define edges while inside the root section.
  651|    339|    for (auto &fn : customSnapshotEdgeFuncs_) {
  ------------------
  |  Branch (651:19): [True: 339, False: 339]
  ------------------
  652|    339|      acceptor.provideSnapshot(fn);
  653|    339|    }
  654|    339|    acceptor.endRootSection();
  655|    339|  }
  656|    339|}
_ZN6hermes2vm7Runtime13markWeakRootsERNS0_16WeakRootAcceptorEb:
  658|    339|void Runtime::markWeakRoots(WeakRootAcceptor &acceptor, bool markLongLived) {
  659|    339|  MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::WeakRefs);
  660|    339|  acceptor.beginRootSection(RootAcceptor::Section::WeakRefs);
  661|       |  // Call this first so that it can remove RuntimeModules whose owning Domain is
  662|       |  // dead from runtimeModuleList_, before marking long-lived WeakRoots in them.
  663|    339|  markDomainRefInRuntimeModules(acceptor);
  664|    339|  if (markLongLived) {
  ------------------
  |  Branch (664:7): [True: 226, False: 113]
  ------------------
  665|    226|    for (auto &entry : fixedPropCache_) {
  ------------------
  |  Branch (665:22): [True: 226, False: 226]
  ------------------
  666|    226|      acceptor.acceptWeak(entry.clazz);
  667|    226|    }
  668|    226|    for (auto &rm : runtimeModuleList_)
  ------------------
  |  Branch (668:19): [True: 830, False: 226]
  ------------------
  669|    830|      rm.markLongLivedWeakRoots(acceptor);
  670|    226|  }
  671|    339|  for (auto &fn : customMarkWeakRootFuncs_)
  ------------------
  |  Branch (671:17): [True: 339, False: 339]
  ------------------
  672|    339|    fn(&getHeap(), acceptor);
  673|    339|  acceptor.endRootSection();
  674|    339|}
_ZN6hermes2vm7Runtime29markDomainRefInRuntimeModulesERNS0_16WeakRootAcceptorE:
  676|    339|void Runtime::markDomainRefInRuntimeModules(WeakRootAcceptor &acceptor) {
  677|    339|  std::vector<RuntimeModule *> modulesToDelete;
  678|  1.32k|  for (auto &rm : runtimeModuleList_) {
  ------------------
  |  Branch (678:17): [True: 1.32k, False: 339]
  ------------------
  679|  1.32k|    rm.markDomainRef(acceptor);
  680|       |    // If the owning domain is dead, store the RuntimeModule pointer for
  681|       |    // destruction later.
  682|  1.32k|    if (LLVM_UNLIKELY(rm.isOwningDomainDead())) {
  ------------------
  |  |  189|  1.32k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 152, False: 1.16k]
  |  |  ------------------
  ------------------
  683|       |      // Prepare these RuntimeModules for destruction so that we don't rely on
  684|       |      // their relative order in runtimeModuleList_.
  685|    152|      rm.prepareForDestruction();
  686|    152|      modulesToDelete.push_back(&rm);
  687|    152|    }
  688|  1.32k|  }
  689|       |
  690|       |  // We need to destroy these RuntimeModules after we call
  691|       |  // prepareForDestruction() on all of them, otherwise, it may cause
  692|       |  // use-after-free when checking the ownership of a CodeBlock in the destructor
  693|       |  // of a RuntimeModule (which may refer a CodeBlock that is owned and deleted
  694|       |  // by another RuntimeModule).
  695|    339|  for (auto *rm : modulesToDelete) {
  ------------------
  |  Branch (695:17): [True: 152, False: 339]
  ------------------
  696|       |    // Calling delete will automatically remove it from the list.
  697|    152|    delete rm;
  698|    152|  }
  699|    339|}
_ZN6hermes2vm7Runtime19removeRuntimeModuleEPNS0_13RuntimeModuleE:
  767|    597|void Runtime::removeRuntimeModule(RuntimeModule *rm) {
  768|    597|#ifdef HERMES_ENABLE_DEBUGGER
  769|    597|  debugger_.willUnloadModule(rm);
  770|    597|#endif
  771|    597|  runtimeModuleList_.remove(*rm);
  772|    597|}
_ZN6hermes2vm7Runtime12isSymbolLiveENS0_8SymbolIDE:
  913|  2.34M|bool Runtime::isSymbolLive(SymbolID id) {
  914|  2.34M|  return identifierTable_.isSymbolLive(id);
  915|  2.34M|}
_ZN6hermes2vm7Runtime18getStringForSymbolENS0_8SymbolIDE:
  917|  2.34M|const void *Runtime::getStringForSymbol(SymbolID id) {
  918|  2.34M|  return identifierTable_.getStringForSymbol(id);
  919|  2.34M|}
_ZN6hermes2vm7Runtime11runBytecodeEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefENS0_6HandleINS0_11EnvironmentEEENSB_INS0_11HermesValueEEE:
 1004|    356|    Handle<> thisArg) {
 1005|    356|  clearThrownValue();
 1006|       |
 1007|    356|  auto globalFunctionIndex = bytecode->getGlobalFunctionIndex();
 1008|       |
 1009|    356|  if (bytecode->getBytecodeOptions().staticBuiltins && !builtinsFrozen_) {
  ------------------
  |  Branch (1009:7): [True: 0, False: 356]
  |  Branch (1009:7): [True: 0, False: 356]
  |  Branch (1009:56): [True: 0, False: 0]
  ------------------
 1010|      0|    if (assertBuiltinsUnmodified() == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1010:9): [True: 0, False: 0]
  ------------------
 1011|      0|      return ExecutionStatus::EXCEPTION;
 1012|      0|    }
 1013|      0|    freezeBuiltins();
 1014|      0|    assert(builtinsFrozen_ && "Builtins must be frozen by now.");
 1015|      0|  }
 1016|       |
 1017|    356|  if (bytecode->getBytecodeOptions().hasAsync && !hasES6Promise_) {
  ------------------
  |  Branch (1017:7): [True: 0, False: 356]
  |  Branch (1017:7): [True: 0, False: 356]
  |  Branch (1017:50): [True: 0, False: 0]
  ------------------
 1018|      0|    return raiseTypeError(
 1019|      0|        "Cannot execute a bytecode having async functions when Promise is disabled.");
 1020|      0|  }
 1021|       |
 1022|    356|  if (flags.persistent) {
  ------------------
  |  Branch (1022:7): [True: 274, False: 82]
  ------------------
 1023|    274|    persistentBCProviders_.push_back(bytecode);
 1024|    274|    if (bytecodeWarmupPercent_ > 0) {
  ------------------
  |  Branch (1024:9): [True: 0, False: 274]
  ------------------
 1025|       |      // Start the warmup thread for this bytecode if it's a buffer.
 1026|      0|      bytecode->startWarmup(bytecodeWarmupPercent_);
 1027|      0|    }
 1028|    274|    if (getVMExperimentFlags() & experiments::MAdviseRandom) {
  ------------------
  |  Branch (1028:9): [True: 0, False: 274]
  ------------------
 1029|      0|      bytecode->madvise(oscompat::MAdvice::Random);
 1030|    274|    } else if (getVMExperimentFlags() & experiments::MAdviseSequential) {
  ------------------
  |  Branch (1030:16): [True: 0, False: 274]
  ------------------
 1031|      0|      bytecode->madvise(oscompat::MAdvice::Sequential);
 1032|      0|    }
 1033|    274|    if (getVMExperimentFlags() & experiments::VerifyBytecodeChecksum) {
  ------------------
  |  Branch (1033:9): [True: 0, False: 274]
  ------------------
 1034|      0|      llvh::ArrayRef<uint8_t> buf = bytecode->getRawBuffer();
 1035|       |      // buf is empty for non-buffer providers
 1036|      0|      if (!buf.empty()) {
  ------------------
  |  Branch (1036:11): [True: 0, False: 0]
  ------------------
 1037|      0|        if (!hbc::BCProviderFromBuffer::bytecodeHashIsValid(buf)) {
  ------------------
  |  Branch (1037:13): [True: 0, False: 0]
  ------------------
 1038|      0|          const char *msg = "Bytecode checksum verification failed";
 1039|      0|          hermesLog("Hermes", "%s", msg);
 1040|      0|          hermes_fatal(msg);
 1041|      0|        }
 1042|      0|      }
 1043|      0|    }
 1044|    274|  }
 1045|       |  // Only track I/O for buffers > 64 kB (which excludes things like
 1046|       |  // Runtime::generateSpecialRuntimeBytecode).
 1047|    356|  if (flags.persistent && trackIO_ &&
  ------------------
  |  Branch (1047:7): [True: 274, False: 82]
  |  Branch (1047:7): [True: 0, False: 356]
  |  Branch (1047:27): [True: 0, False: 274]
  ------------------
 1048|    356|      bytecode->getRawBuffer().size() > MIN_IO_TRACKING_SIZE) {
  ------------------
  |  Branch (1048:7): [True: 0, False: 0]
  ------------------
 1049|      0|    bytecode->startPageAccessTracker();
 1050|      0|    if (!bytecode->getPageAccessTracker()) {
  ------------------
  |  Branch (1050:9): [True: 0, False: 0]
  ------------------
 1051|      0|      hermesLog(
 1052|      0|          "Hermes",
 1053|      0|          "Failed to start bytecode I/O instrumentation, "
 1054|      0|          "maybe not supported on this platform.");
 1055|      0|    }
 1056|      0|  }
 1057|       |
 1058|    356|  GCScope scope(*this);
 1059|       |
 1060|    356|  Handle<Domain> domain = makeHandle(Domain::create(*this));
 1061|       |
 1062|    356|  auto runtimeModuleRes = RuntimeModule::create(
 1063|    356|      *this, domain, nextScriptId_++, std::move(bytecode), flags, sourceURL);
 1064|    356|  if (LLVM_UNLIKELY(runtimeModuleRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    356|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 356]
  |  |  ------------------
  ------------------
 1065|      0|    return ExecutionStatus::EXCEPTION;
 1066|      0|  }
 1067|    356|  auto runtimeModule = *runtimeModuleRes;
 1068|    356|  auto globalCode = runtimeModule->getCodeBlockMayAllocate(globalFunctionIndex);
 1069|       |
 1070|    356|#ifdef HERMES_ENABLE_DEBUGGER
 1071|       |  // If the debugger is configured to pause on load, give it a chance to pause.
 1072|    356|  getDebugger().willExecuteModule(runtimeModule, globalCode);
 1073|    356|#endif
 1074|       |
 1075|    356|  if (runtimeModule->hasCJSModules()) {
  ------------------
  |  Branch (1075:7): [True: 0, False: 356]
  ------------------
 1076|      0|    auto requireContext = RequireContext::create(
 1077|      0|        *this, domain, getPredefinedStringHandle(Predefined::dotSlash));
 1078|      0|    return runRequireCall(
 1079|      0|        *this,
 1080|      0|        requireContext,
 1081|      0|        domain,
 1082|      0|        *domain->getCJSModuleOffset(*this, domain->getCJSEntryModuleID()));
 1083|    356|  } else if (runtimeModule->hasCJSModulesStatic()) {
  ------------------
  |  Branch (1083:14): [True: 0, False: 356]
  ------------------
 1084|      0|    return runRequireCall(
 1085|      0|        *this,
 1086|      0|        makeNullHandle<RequireContext>(),
 1087|      0|        domain,
 1088|      0|        *domain->getCJSModuleOffset(*this, domain->getCJSEntryModuleID()));
 1089|    356|  } else {
 1090|       |    // Create a JSFunction which will reference count the runtime module.
 1091|       |    // Note that its handle gets registered in the scope, so we don't need to
 1092|       |    // save it. Also note that environment will often be null here, except if
 1093|       |    // this is local eval.
 1094|    356|    auto func = JSFunction::create(
 1095|    356|        *this,
 1096|    356|        domain,
 1097|    356|        Handle<JSObject>::vmcast(&functionPrototype),
 1098|    356|        environment,
 1099|    356|        globalCode);
 1100|       |
 1101|    356|    ScopedNativeCallFrame newFrame{
 1102|    356|        *this,
 1103|    356|        0,
 1104|    356|        func.getHermesValue(),
 1105|    356|        HermesValue::encodeUndefinedValue(),
 1106|    356|        *thisArg};
 1107|    356|    if (LLVM_UNLIKELY(newFrame.overflowed()))
  ------------------
  |  |  189|    356|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 356]
  |  |  ------------------
  ------------------
 1108|      0|      return raiseStackOverflow(StackOverflowKind::NativeStack);
 1109|    356|    return shouldRandomizeMemoryLayout_
  ------------------
  |  Branch (1109:12): [True: 0, False: 356]
  ------------------
 1110|    356|        ? interpretFunctionWithRandomStack(*this, globalCode)
 1111|    356|        : interpretFunction(globalCode);
 1112|    356|  }
 1113|    356|}
_ZN6hermes2vm7Runtime19runInternalBytecodeEv:
 1132|    160|Handle<JSObject> Runtime::runInternalBytecode() {
 1133|    160|  auto module = getInternalBytecode();
 1134|    160|  std::pair<std::unique_ptr<hbc::BCProvider>, std::string> bcResult =
 1135|    160|      hbc::BCProviderFromBuffer::createBCProviderFromBuffer(
 1136|    160|          std::make_unique<Buffer>(module.data(), module.size()));
 1137|    160|  if (LLVM_UNLIKELY(!bcResult.first)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 160]
  |  |  ------------------
  ------------------
 1138|      0|    hermes_fatal((llvh::Twine("Error running internal bytecode: ") +
 1139|      0|                  bcResult.second.c_str())
 1140|      0|                     .str());
 1141|      0|  }
 1142|       |  // The bytes backing our buffer are immortal, so we can be persistent.
 1143|    160|  RuntimeModuleFlags flags;
 1144|    160|  flags.persistent = true;
 1145|    160|  flags.hidesEpilogue = true;
 1146|    160|  auto res = runBytecode(
 1147|    160|      std::move(bcResult.first),
 1148|    160|      flags,
 1149|    160|      /*sourceURL*/ "InternalBytecode.js",
 1150|    160|      makeNullHandle<Environment>());
 1151|       |  // It is a fatal error for the internal bytecode to throw an exception.
 1152|    160|  assert(
 1153|    160|      res != ExecutionStatus::EXCEPTION && "Internal bytecode threw exception");
 1154|    160|  assert(
 1155|    160|      res->isObject() &&
 1156|    160|      "Completion value of internal bytecode must be an object");
 1157|       |
 1158|    160|  return makeHandle<JSObject>(*res);
 1159|    160|}
_ZN6hermes2vm7Runtime9getGlobalEv:
 1233|   367k|Handle<JSObject> Runtime::getGlobal() {
 1234|   367k|  return Handle<JSObject>::vmcast(&global_);
 1235|   367k|}
_ZN6hermes2vm7Runtime22raiseTypeErrorForValueERKNS0_11TwineChar16ENS0_6HandleINS0_11HermesValueEEES4_:
 1340|      1|    const TwineChar16 &msg2) {
 1341|      1|  switch (value->getTag()) {
 1342|      0|    case HermesValue::Tag::Object:
  ------------------
  |  Branch (1342:5): [True: 0, False: 1]
  ------------------
 1343|      0|      return raiseTypeError(msg1 + "Object" + msg2);
 1344|      1|    case HermesValue::Tag::Str:
  ------------------
  |  Branch (1344:5): [True: 1, False: 0]
  ------------------
 1345|      1|      return raiseTypeError(
 1346|      1|          msg1 + "'" + vmcast<StringPrimitive>(*value) + "'" + msg2);
 1347|      0|    case HermesValue::Tag::BoolSymbol:
  ------------------
  |  Branch (1347:5): [True: 0, False: 1]
  ------------------
 1348|      0|      if (value->isBool()) {
  ------------------
  |  Branch (1348:11): [True: 0, False: 0]
  ------------------
 1349|      0|        if (value->getBool()) {
  ------------------
  |  Branch (1349:13): [True: 0, False: 0]
  ------------------
 1350|      0|          return raiseTypeError(msg1 + "true" + msg2);
 1351|      0|        } else {
 1352|      0|          return raiseTypeError(msg1 + "false" + msg2);
 1353|      0|        }
 1354|      0|      }
 1355|      0|      return raiseTypeError(
 1356|      0|          msg1 + "Symbol(" + getStringPrimFromSymbolID(value->getSymbol()) +
 1357|      0|          ")" + msg2);
 1358|      0|    case HermesValue::Tag::UndefinedNull:
  ------------------
  |  Branch (1358:5): [True: 0, False: 1]
  ------------------
 1359|      0|      if (value->isUndefined())
  ------------------
  |  Branch (1359:11): [True: 0, False: 0]
  ------------------
 1360|      0|        return raiseTypeError(msg1 + "undefined" + msg2);
 1361|      0|      else
 1362|      0|        return raiseTypeError(msg1 + "null" + msg2);
 1363|      0|    default:
  ------------------
  |  Branch (1363:5): [True: 0, False: 1]
  ------------------
 1364|      0|      if (value->isNumber()) {
  ------------------
  |  Branch (1364:11): [True: 0, False: 0]
  ------------------
 1365|      0|        char buf[hermes::NUMBER_TO_STRING_BUF_SIZE];
 1366|      0|        size_t len = hermes::numberToString(
 1367|      0|            value->getNumber(), buf, hermes::NUMBER_TO_STRING_BUF_SIZE);
 1368|      0|        return raiseTypeError(msg1 + llvh::StringRef{buf, len} + msg2);
 1369|      0|      }
 1370|      1|  }
 1371|      0|  return raiseTypeError(msg1 + "Value" + msg2);
 1372|      1|}
_ZN6hermes2vm7Runtime25raiseTypeErrorForCallableENS0_6HandleINS0_11HermesValueEEE:
 1374|      1|ExecutionStatus Runtime::raiseTypeErrorForCallable(Handle<> callable) {
 1375|      1|  if (CodeBlock *curCodeBlock = getCurrentFrame().getCalleeCodeBlock(*this)) {
  ------------------
  |  Branch (1375:18): [True: 1, False: 0]
  ------------------
 1376|      1|    if (OptValue<uint32_t> textifiedCalleeOffset =
  ------------------
  |  Branch (1376:28): [True: 1, False: 0]
  ------------------
 1377|      1|            curCodeBlock->getTextifiedCalleeOffset()) {
 1378|       |      // Look up the textified callee for the current IP in the debug
 1379|       |      // information. If one is available, use that in the error message.
 1380|      1|      OptValue<llvh::StringRef> tCallee =
 1381|      1|          curCodeBlock->getRuntimeModule()
 1382|      1|              ->getBytecode()
 1383|      1|              ->getDebugInfo()
 1384|      1|              ->getTextifiedCalleeUTF8(
 1385|      1|                  *textifiedCalleeOffset,
 1386|      1|                  curCodeBlock->getOffsetOf(getCurrentIP()));
 1387|      1|      if (tCallee.hasValue()) {
  ------------------
  |  Branch (1387:11): [True: 0, False: 1]
  ------------------
 1388|       |        // The textified callee is UTF8, so it may need to be converted to
 1389|       |        // UTF16.
 1390|      0|        if (isAllASCII(tCallee->begin(), tCallee->end())) {
  ------------------
  |  Branch (1390:13): [True: 0, False: 0]
  ------------------
 1391|       |          // All ASCII means no conversion is needed.
 1392|      0|          return raiseTypeErrorForValue(
 1393|      0|              TwineChar16(*tCallee) + " is not a function (it is ",
 1394|      0|              callable,
 1395|      0|              ")");
 1396|      0|        }
 1397|       |
 1398|       |        // Convert UTF8 to UTF16 before creating the Error.
 1399|      0|        llvh::SmallVector<char16_t, 16> tCalleeUTF16;
 1400|      0|        convertUTF8WithSurrogatesToUTF16(
 1401|      0|            std::back_inserter(tCalleeUTF16), tCallee->begin(), tCallee->end());
 1402|      0|        return raiseTypeErrorForValue(
 1403|      0|            TwineChar16(tCalleeUTF16) + " is not a function (it is ",
 1404|      0|            callable,
 1405|      0|            ")");
 1406|      0|      }
 1407|      1|    }
 1408|      1|  }
 1409|       |
 1410|      1|  return raiseTypeErrorForValue(callable, " is not a function");
 1411|      1|}
_ZN6hermes2vm7Runtime14raiseTypeErrorERKNS0_11TwineChar16E:
 1413|      3|ExecutionStatus Runtime::raiseTypeError(const TwineChar16 &msg) {
 1414|      3|  return raisePlaceholder(
 1415|      3|      *this, Handle<JSObject>::vmcast(&TypeErrorPrototype), msg);
 1416|      3|}
_ZN6hermes2vm7Runtime16raiseSyntaxErrorERKNS0_11TwineChar16E:
 1418|      5|ExecutionStatus Runtime::raiseSyntaxError(const TwineChar16 &msg) {
 1419|      5|  return raisePlaceholder(
 1420|      5|      *this, Handle<JSObject>::vmcast(&SyntaxErrorPrototype), msg);
 1421|      5|}
_ZN6hermes2vm7Runtime19raiseReferenceErrorERKNS0_11TwineChar16E:
 1428|     45|ExecutionStatus Runtime::raiseReferenceError(const TwineChar16 &msg) {
 1429|     45|  return raisePlaceholder(
 1430|     45|      *this, Handle<JSObject>::vmcast(&ReferenceErrorPrototype), msg);
 1431|     45|}
_ZN6hermes2vm7Runtime19insertVisitedObjectEPNS0_8JSObjectE:
 1488|   781k|bool Runtime::insertVisitedObject(JSObject *obj) {
 1489|   781k|  if (llvh::find(stringCycleCheckVisited_, obj) !=
  ------------------
  |  Branch (1489:7): [True: 0, False: 781k]
  ------------------
 1490|   781k|      stringCycleCheckVisited_.end())
 1491|      0|    return true;
 1492|   781k|  stringCycleCheckVisited_.push_back(obj);
 1493|   781k|  return false;
 1494|   781k|}
_ZN6hermes2vm7Runtime19removeVisitedObjectEPNS0_8JSObjectE:
 1496|   781k|void Runtime::removeVisitedObject(JSObject *obj) {
 1497|   781k|  (void)obj;
 1498|   781k|  assert(
 1499|   781k|      stringCycleCheckVisited_.back() == obj && "string cycle stack corrupted");
 1500|   781k|  stringCycleCheckVisited_.pop_back();
 1501|   781k|}
_ZN6hermes2vm7Runtime30generateSpecialRuntimeBytecodeEv:
 1503|    160|std::unique_ptr<Buffer> Runtime::generateSpecialRuntimeBytecode() {
 1504|    160|  hbc::SimpleBytecodeBuilder builder;
 1505|    160|  {
 1506|    160|    hbc::BytecodeInstructionGenerator bcGen;
 1507|    160|    bcGen.emitLoadConstUndefined(0);
 1508|    160|    bcGen.emitRet(0);
 1509|    160|    builder.addFunction(1, 1, bcGen.acquireBytecode());
 1510|    160|  }
 1511|    160|  {
 1512|    160|    hbc::BytecodeInstructionGenerator bcGen;
 1513|    160|    bcGen.emitGetGlobalObject(0);
 1514|    160|    bcGen.emitRet(0);
 1515|    160|    builder.addFunction(1, 1, bcGen.acquireBytecode());
 1516|    160|  }
 1517|    160|  auto buffer = builder.generateBytecodeBuffer();
 1518|    160|  assert(buffer->size() < MIN_IO_TRACKING_SIZE);
 1519|    160|  return buffer;
 1520|    160|}
_ZN6hermes2vm7Runtime21initPredefinedStringsEv:
 1522|    160|void Runtime::initPredefinedStrings() {
 1523|    160|  assert(!getTopGCScope() && "There shouldn't be any handles allocated yet");
 1524|       |
 1525|    160|  auto buffer = predefStringAndSymbolChars;
 1526|    160|  auto propLengths = predefPropertyLengths;
 1527|    160|  auto strLengths = predefStringLengths;
 1528|    160|  auto symLengths = predefSymbolLengths;
 1529|       |
 1530|    160|  static const uint32_t hashes[] = {
 1531|    160|#define STR(name, string) constexprHashString(string),
 1532|    160|#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|    160|STR(emptyString, "")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   17|    160|STR(comma, ",")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   18|    160|STR(space, " ")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   19|    160|STR(anonymous, "anonymous")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   20|       |
  |  |   21|    160|STR(undefined, "undefined")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   22|    160|STR(null, "null")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   23|    160|STR(number, "number")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   24|    160|STR(bigint, "bigint")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   25|    160|STR(string, "string")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   26|    160|STR(defaultStr, "default")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   27|    160|STR(boolean, "boolean")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   28|    160|STR(symbol, "symbol")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   29|    160|STR(object, "object")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   30|    160|STR(function, "function")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   31|    160|STR(toString, "toString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   32|    160|STR(description, "description")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   33|    160|STR(toLocaleString, "toLocaleString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   34|    160|STR(hasOwnProperty, "hasOwnProperty")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   35|    160|STR(hasOwn, "hasOwn")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   36|    160|STR(isPrototypeOf, "isPrototypeOf")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   37|    160|STR(propertyIsEnumerable, "propertyIsEnumerable")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   38|    160|STR(valueOf, "valueOf")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   39|    160|STR(trueStr, "true")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   40|    160|STR(falseStr, "false")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   41|    160|STR(NaN, "NaN")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   42|    160|STR(zero, "0")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   43|    160|STR(Infinity, "Infinity")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   44|    160|STR(PositiveInfinity, "+Infinity")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   45|    160|STR(NegativeInfinity, "-Infinity")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   46|    160|STR(print, "print")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   47|    160|STR(eval, "eval")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   48|    160|STR(quit, "quit")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   49|    160|STR(parseInt, "parseInt")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   50|    160|STR(parseFloat, "parseFloat")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   51|    160|STR(isNaN, "isNaN")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   52|    160|STR(isFinite, "isFinite")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   53|    160|STR(escape, "escape")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   54|    160|STR(unescape, "unescape")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   55|    160|STR(atob, "atob")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   56|    160|STR(btoa, "btoa")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   57|    160|STR(decodeURI, "decodeURI")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   58|    160|STR(decodeURIComponent, "decodeURIComponent")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   59|    160|STR(encodeURI, "encodeURI")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   60|    160|STR(encodeURIComponent, "encodeURIComponent")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   61|    160|STR(prototype, "prototype")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   62|    160|STR(constructor, "constructor")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   63|    160|STR(Object, "Object")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   64|    160|STR(value, "value")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   65|    160|STR(writable, "writable")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   66|    160|STR(enumerable, "enumerable")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   67|    160|STR(configurable, "configurable")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   68|    160|STR(get, "get")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   69|    160|STR(set, "set")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   70|    160|STR(getPrototypeOf, "getPrototypeOf")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   71|    160|STR(setPrototypeOf, "setPrototypeOf")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   72|    160|STR(getOwnPropertyDescriptor, "getOwnPropertyDescriptor")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   73|    160|STR(getOwnPropertyDescriptors, "getOwnPropertyDescriptors")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   74|    160|STR(getOwnPropertyNames, "getOwnPropertyNames")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   75|    160|STR(getOwnPropertySymbols, "getOwnPropertySymbols")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   76|    160|STR(seal, "seal")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   77|    160|STR(freeze, "freeze")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   78|    160|STR(fromEntries, "fromEntries")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   79|    160|STR(create, "create")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   80|    160|STR(defineProperty, "defineProperty")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   81|    160|STR(defineProperties, "defineProperties")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   82|    160|STR(preventExtensions, "preventExtensions")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   83|    160|STR(is, "is")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   84|    160|STR(isSealed, "isSealed")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   85|    160|STR(isFrozen, "isFrozen")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   86|    160|STR(isExtensible, "isExtensible")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   87|    160|STR(keys, "keys")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   88|    160|STR(length, "length")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   89|    160|STR(underscore_proto, "__proto__")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   90|    160|STR(__defineGetter__, "__defineGetter__")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   91|    160|STR(__defineSetter__, "__defineSetter__")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   92|    160|STR(__lookupGetter__, "__lookupGetter__")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   93|    160|STR(__lookupSetter__, "__lookupSetter__")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   94|    160|STR(assign, "assign")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   95|    160|STR(raw, "raw")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   96|    160|STR(globalThis, "globalThis")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   97|       |
  |  |   98|    160|STR(BigInt, "BigInt")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   99|    160|STR(asIntN, "asIntN")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  100|    160|STR(asUintN, "asUintN")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  101|       |
  |  |  102|    160|STR(String, "String")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  103|    160|STR(fromCharCode, "fromCharCode")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  104|    160|STR(fromCodePoint, "fromCodePoint")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  105|    160|STR(charAt, "charAt")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  106|    160|STR(charCodeAt, "charCodeAt")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  107|    160|STR(codePointAt, "codePointAt")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  108|    160|STR(concat, "concat")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  109|    160|STR(endsWith, "endsWith")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  110|    160|STR(slice, "slice")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  111|    160|STR(startsWith, "startsWith")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  112|    160|STR(substring, "substring")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  113|    160|STR(toLowerCase, "toLowerCase")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  114|    160|STR(toLocaleLowerCase, "toLocaleLowerCase")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  115|    160|STR(toUpperCase, "toUpperCase")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  116|    160|STR(toLocaleUpperCase, "toLocaleUpperCase")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  117|    160|STR(substr, "substr")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  118|    160|STR(trim, "trim")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  119|    160|STR(trimLeft, "trimLeft")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  120|    160|STR(trimRight, "trimRight")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  121|    160|STR(indexOf, "indexOf")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  122|    160|STR(lastIndexOf, "lastIndexOf")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  123|    160|STR(localeCompare, "localeCompare")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  124|    160|STR(match, "match")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  125|    160|STR(matchAll, "matchAll")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  126|    160|STR(normalize, "normalize")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  127|    160|STR(padEnd, "padEnd")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  128|    160|STR(padStart, "padStart")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  129|    160|STR(repeat, "repeat")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  130|    160|STR(replace, "replace")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  131|    160|STR(replaceAll, "replaceAll")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  132|    160|STR(search, "search")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  133|    160|STR(split, "split")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  134|    160|STR(trimStart, "trimStart")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  135|    160|STR(trimEnd, "trimEnd")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  136|       |
  |  |  137|    160|STR(Function, "Function")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  138|    160|STR(callee, "callee")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  139|    160|STR(caller, "caller")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  140|    160|STR(arguments, "arguments")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  141|    160|STR(call, "call")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  142|    160|STR(apply, "apply")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  143|    160|STR(bind, "bind")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  144|    160|STR(gc, "gc")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  145|       |
  |  |  146|    160|STR(name, "name")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  147|    160|STR(displayName, "displayName")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  148|    160|STR(message, "message")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  149|    160|STR(cause, "cause")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  150|    160|STR(stack, "stack")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  151|    160|STR(stacktraceTooLong, "Stacktrace too long")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  152|    160|STR(captureStackTrace, "captureStackTrace")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  153|    160|STR(prepareStackTrace, "prepareStackTrace")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  155|    160|#include "hermes/FrontEndDefs/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|    160|#ifdef ALL_ERROR_TYPE
  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |   13|    160|#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|    160|ALL_ERROR_TYPE(Error)
  |  |  |  |  ------------------
  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   31|    160|AGGREGATE_ERROR_TYPE(AggregateError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   13|    160|#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   32|    160|NATIVE_ERROR_TYPE(EvalError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   33|    160|NATIVE_ERROR_TYPE(RangeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   34|    160|NATIVE_ERROR_TYPE(ReferenceError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   35|    160|NATIVE_ERROR_TYPE(SyntaxError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|    160|NATIVE_ERROR_TYPE(TypeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   37|    160|NATIVE_ERROR_TYPE(URIError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   38|    160|NATIVE_ERROR_TYPE(TimeoutError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   39|    160|NATIVE_ERROR_TYPE(QuitError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|    160|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|    160|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   40|       |
  |  |  |  |   41|    160|#undef AGGREGATE_ERROR_TYPE
  |  |  |  |   42|    160|#undef NATIVE_ERROR_TYPE
  |  |  |  |   43|    160|#undef ALL_ERROR_TYPE
  |  |  ------------------
  |  |  156|       |
  |  |  157|    160|STR(errors, "errors")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  158|    160|STR(CallSite, "CallSite")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  159|    160|STR(getColumnNumber, "getColumnNumber")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  160|    160|STR(getBytecodeAddress, "getBytecodeAddress")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  161|    160|STR(getEvalOrigin, "getEvalOrigin")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  162|    160|STR(getFileName, "getFileName")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  163|    160|STR(getFunction, "getFunction")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  164|    160|STR(getFunctionName, "getFunctionName")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  165|    160|STR(getLineNumber, "getLineNumber")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  166|    160|STR(getMethodName, "getMethodName")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  167|    160|STR(getPromiseIndex, "getPromiseIndex")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  168|    160|STR(getThis, "getThis")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  169|    160|STR(getTypeName, "getTypeName")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  170|    160|STR(isAsync, "isAsync")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  171|    160|STR(isConstructor, "isConstructor")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  172|    160|STR(isEval, "isEval")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  173|    160|STR(isPromiseAll, "isPromiseAll")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  174|    160|STR(isToplevel, "isToplevel")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  175|       |
  |  |  176|    160|STR(Array, "Array")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  177|    160|STR(ArrayIterator, "Array Iterator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  178|    160|STR(isArray, "isArray")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  179|    160|STR(at, "at")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  180|    160|STR(join, "join")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  181|    160|STR(push, "push")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  182|    160|STR(pop, "pop")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  183|    160|STR(reverse, "reverse")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  184|    160|STR(shift, "shift")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  185|    160|STR(sort, "sort")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  186|    160|STR(splice, "splice")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  187|    160|STR(unshift, "unshift")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  188|    160|STR(every, "every")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  189|    160|STR(some, "some")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  190|    160|STR(forEach, "forEach")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  191|    160|STR(map, "map")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  192|    160|STR(filter, "filter")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  193|    160|STR(reduce, "reduce")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  194|    160|STR(reduceRight, "reduceRight")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  195|    160|STR(find, "find")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  196|    160|STR(findIndex, "findIndex")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  197|    160|STR(findLast, "findLast")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  198|    160|STR(findLastIndex, "findLastIndex")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  199|    160|STR(includes, "includes")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  200|    160|STR(subarray, "subarray")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  201|    160|STR(flat, "flat")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  202|    160|STR(flatMap, "flatMap")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  203|    160|STR(toReversed, "toReversed")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  204|    160|STR(toSpliced, "toSpliced")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  205|    160|STR(with, "with")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  206|       |
  |  |  207|    160|STR(ArrayBuffer, "ArrayBuffer")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  208|    160|STR(byteLength, "byteLength")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  209|    160|STR(isView, "isView")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  210|    160|STR(buffer, "buffer")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  211|    160|STR(byteOffset, "byteOffset")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  212|    160|STR(copyWithin, "copyWithin")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  213|    160|STR(entries, "entries")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  214|       |
  |  |  215|    160|STR(TypedArray, "TypedArray")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  216|    160|STR(BYTES_PER_ELEMENT, "BYTES_PER_ELEMENT")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  217|    160|STR(from, "from")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  218|    160|STR(of, "of")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  220|    160|#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|    160|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|    160|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|    160|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|    160|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|    160|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|    160|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   20|       |#else
  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|       |#endif
  |  |  |  |   23|    160|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|    160|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|    160|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|    160|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|    160|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|    160|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|    160|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|    160|#undef TYPED_ARRAY
  |  |  ------------------
  |  |  221|       |
  |  |  222|    160|STR(DataView, "DataView")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  223|    160|#define TYPED_ARRAY(name, type) \
  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  226|    160|#define TYPED_ARRAY_NO_CLAMP
  |  |  227|    160|#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|    160|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|    160|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|    160|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|    160|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|       |#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|       |TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |   20|       |#else
  |  |  |  |   21|    160|#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|    160|#endif
  |  |  |  |   23|    160|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|    160|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|    160|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|    160|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|    160|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|    160|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  224|    160|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  225|    160|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|    160|#undef TYPED_ARRAY
  |  |  ------------------
  |  |  228|    160|STR(fill, "fill")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  229|       |
  |  |  230|    160|STR(Set, "Set")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  231|    160|STR(SetIterator, "Set Iterator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  232|    160|STR(Map, "Map")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  233|    160|STR(MapIterator, "Map Iterator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  234|    160|STR(add, "add")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  235|    160|STR(clear, "clear")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  236|    160|STR(deleteStr, "delete")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  237|    160|STR(has, "has")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  238|    160|STR(size, "size")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  239|    160|STR(values, "values")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  240|    160|STR(next, "next")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  241|    160|STR(done, "done")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  242|    160|STR(returnStr, "return")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  243|       |
  |  |  244|    160|STR(Number, "Number")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  245|    160|STR(MAX_VALUE, "MAX_VALUE")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  246|    160|STR(MIN_VALUE, "MIN_VALUE")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  247|    160|STR(NEGATIVE_INFINITY, "NEGATIVE_INFINITY")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  248|    160|STR(POSITIVE_INFINITY, "POSITIVE_INFINITY")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  249|    160|STR(EPSILON, "EPSILON")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  250|    160|STR(MAX_SAFE_INTEGER, "MAX_SAFE_INTEGER")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  251|    160|STR(MIN_SAFE_INTEGER, "MIN_SAFE_INTEGER")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  252|    160|STR(toFixed, "toFixed")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  253|    160|STR(toExponential, "toExponential")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  254|    160|STR(toPrecision, "toPrecision")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  255|    160|STR(isInteger, "isInteger")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  256|    160|STR(isSafeInteger, "isSafeInteger")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  257|       |
  |  |  258|    160|STR(Boolean, "Boolean")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  259|       |
  |  |  260|    160|STR(StringIterator, "String Iterator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  261|    160|STR(RegExpStringIterator, "RegExp String Iterator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  262|       |
  |  |  263|    160|STR(Date, "Date")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  264|    160|STR(UTC, "UTC")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  265|    160|STR(parse, "parse")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  266|    160|STR(now, "now")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  267|    160|STR(toISOString, "toISOString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  268|    160|STR(toUTCString, "toUTCString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  269|    160|STR(toGMTString, "toGMTString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  270|    160|STR(toLocaleDateString, "toLocaleDateString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  271|    160|STR(toLocaleTimeString, "toLocaleTimeString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  272|    160|STR(toJSON, "toJSON")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  273|    160|STR(getTime, "getTime")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  274|    160|STR(getFullYear, "getFullYear")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  275|    160|STR(getYear, "getYear")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  276|    160|STR(getMonth, "getMonth")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  277|    160|STR(getDate, "getDate")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  278|    160|STR(getDay, "getDay")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  279|    160|STR(getHours, "getHours")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  280|    160|STR(getMinutes, "getMinutes")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  281|    160|STR(getSeconds, "getSeconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  282|    160|STR(getMilliseconds, "getMilliseconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  283|    160|STR(getUTCFullYear, "getUTCFullYear")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  284|    160|STR(getUTCMonth, "getUTCMonth")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  285|    160|STR(getUTCDate, "getUTCDate")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  286|    160|STR(getUTCDay, "getUTCDay")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  287|    160|STR(getUTCHours, "getUTCHours")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  288|    160|STR(getUTCMinutes, "getUTCMinutes")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  289|    160|STR(getUTCSeconds, "getUTCSeconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  290|    160|STR(getUTCMilliseconds, "getUTCMilliseconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  291|    160|STR(getTimezoneOffset, "getTimezoneOffset")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  292|    160|STR(setTime, "setTime")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  293|    160|STR(setFullYear, "setFullYear")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  294|    160|STR(setYear, "setYear")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  295|    160|STR(setMonth, "setMonth")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  296|    160|STR(setDate, "setDate")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  297|    160|STR(setHours, "setHours")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  298|    160|STR(setMinutes, "setMinutes")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  299|    160|STR(setSeconds, "setSeconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  300|    160|STR(setMilliseconds, "setMilliseconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  301|    160|STR(setUTCFullYear, "setUTCFullYear")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  302|    160|STR(setUTCMonth, "setUTCMonth")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  303|    160|STR(setUTCDate, "setUTCDate")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  304|    160|STR(setUTCHours, "setUTCHours")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  305|    160|STR(setUTCMinutes, "setUTCMinutes")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  306|    160|STR(setUTCSeconds, "setUTCSeconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  307|    160|STR(setUTCMilliseconds, "setUTCMilliseconds")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  308|    160|STR(toDateString, "toDateString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  309|    160|STR(toTimeString, "toTimeString")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  310|    160|STR(InvalidDate, "Invalid Date")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  311|       |
  |  |  312|    160|STR(RegExp, "RegExp")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  313|    160|STR(exec, "exec")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  314|    160|STR(test, "test")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  315|    160|STR(index, "index")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  316|    160|STR(input, "input")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  317|    160|STR(flags, "flags")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  318|    160|STR(source, "source")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  319|    160|STR(global, "global")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  320|    160|STR(groups, "groups")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  321|    160|STR(ignoreCase, "ignoreCase")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  322|    160|STR(multiline, "multiline")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  323|    160|STR(unicode, "unicode")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  324|    160|STR(sticky, "sticky")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  325|    160|STR(dotAll, "dotAll")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  326|    160|STR(indices, "indices")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  327|    160|STR(hasIndices, "hasIndices")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  328|    160|STR(lastIndex, "lastIndex")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  329|    160|STR(dollar1, "$1")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  330|    160|STR(dollar2, "$2")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  331|    160|STR(dollar3, "$3")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  332|    160|STR(dollar4, "$4")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  333|    160|STR(dollar5, "$5")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  334|    160|STR(dollar6, "$6")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  335|    160|STR(dollar7, "$7")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  336|    160|STR(dollar8, "$8")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  337|    160|STR(dollar9, "$9")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  338|    160|STR(dollarBacktick, "$`")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  339|    160|STR(leftContext, "leftContext")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  340|    160|STR(dollarApostrophe, "$'")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  341|    160|STR(rightContext, "rightContext")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  342|    160|STR(dollarUnderscore, "$_")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  343|    160|STR(dollarAmpersand, "$&")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  344|    160|STR(lastMatch, "lastMatch")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  345|    160|STR(dollarPlus, "$+")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  346|    160|STR(lastParen, "lastParen")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  347|       |
  |  |  348|    160|STR(Math, "Math")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  349|       |// Math property names, per ES5.1 15.8.1
  |  |  350|    160|STR(E, "E")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  351|    160|STR(LN10, "LN10")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  352|    160|STR(LN2, "LN2")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  353|    160|STR(LOG2E, "LOG2E")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  354|    160|STR(LOG10E, "LOG10E")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  355|    160|STR(PI, "PI")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  356|    160|STR(SQRT1_2, "SQRT1_2")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  357|    160|STR(SQRT2, "SQRT2")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  358|    160|STR(abs, "abs")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  359|    160|STR(acos, "acos")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  360|    160|STR(acosh, "acosh")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  361|    160|STR(asin, "asin")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  362|    160|STR(asinh, "asinh")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  363|    160|STR(atan, "atan")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  364|    160|STR(atanh, "atanh")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  365|    160|STR(atan2, "atan2")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  366|    160|STR(cbrt, "cbrt")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  367|    160|STR(ceil, "ceil")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  368|    160|STR(clz32, "clz32")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  369|    160|STR(cos, "cos")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  370|    160|STR(cosh, "cosh")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  371|    160|STR(exp, "exp")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  372|    160|STR(expm1, "expm1")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  373|    160|STR(floor, "floor")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  374|    160|STR(hypot, "hypot")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  375|    160|STR(log, "log")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  376|    160|STR(log10, "log10")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  377|    160|STR(log1p, "log1p")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  378|    160|STR(log2, "log2")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  379|    160|STR(trunc, "trunc")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  380|    160|STR(fround, "fround")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  381|    160|STR(max, "max")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  382|    160|STR(min, "min")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  383|    160|STR(imul, "imul")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  384|    160|STR(pow, "pow")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  385|    160|STR(random, "random")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  386|    160|STR(round, "round")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  387|    160|STR(sign, "sign")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  388|    160|STR(sin, "sin")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  389|    160|STR(sinh, "sinh")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  390|    160|STR(sqrt, "sqrt")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  391|    160|STR(tan, "tan")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  392|    160|STR(tanh, "tanh")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  393|       |
  |  |  394|    160|STR(JSON, "JSON")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  395|    160|STR(stringify, "stringify")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  396|       |
  |  |  397|    160|STR(WeakMap, "WeakMap")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  398|    160|STR(WeakSet, "WeakSet")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  399|       |
  |  |  400|    160|STR(WeakRef, "WeakRef")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  401|    160|STR(deref, "deref")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  402|       |
  |  |  403|    160|STR(Symbol, "Symbol")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  404|    160|STR(predefinedFor, "for")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  405|    160|STR(keyFor, "keyFor")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  406|    160|STR(hasInstance, "hasInstance")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  407|    160|STR(isConcatSpreadable, "isConcatSpreadable")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  408|    160|STR(iterator, "iterator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  409|    160|STR(toPrimitive, "toPrimitive")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  410|    160|STR(toStringTag, "toStringTag")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  411|       |
  |  |  412|    160|STR(Generator, "Generator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  413|    160|STR(throwStr, "throw")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  414|       |
  |  |  415|    160|STR(GeneratorFunction, "GeneratorFunction")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  416|    160|STR(AsyncFunction, "AsyncFunction")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  417|       |
  |  |  418|    160|STR(Proxy, "Proxy")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  419|    160|STR(Reflect, "Reflect")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  420|    160|STR(construct, "construct")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  421|    160|STR(deleteProperty, "deleteProperty")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  422|    160|STR(ownKeys, "ownKeys")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  423|    160|STR(proxy, "proxy")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  424|    160|STR(proxyTrap, "proxy trap")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  425|    160|STR(revocable, "revocable")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  426|    160|STR(revoke, "revoke")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  427|       |
  |  |  428|    160|STR(HermesInternal, "HermesInternal")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  429|    160|STR(detachArrayBuffer, "detachArrayBuffer")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  430|    160|STR(createHeapSnapshot, "createHeapSnapshot")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  431|    160|STR(hasPromise, "hasPromise")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  432|    160|STR(hasES6Class, "hasES6Class")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  433|    160|STR(useEngineQueue, "useEngineQueue")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  434|    160|STR(enqueueJob, "enqueueJob")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  435|    160|STR(drainJobs, "drainJobs")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  436|    160|STR(getEpilogues, "getEpilogues")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  437|    160|STR(getWeakSize, "getWeakSize")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  438|    160|STR(silentSetPrototypeOf, "silentSetPrototypeOf")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  439|    160|STR(getInstrumentedStats, "getInstrumentedStats")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  440|    160|STR(getRuntimeProperties, "getRuntimeProperties")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  441|    160|STR(ttiReached, "ttiReached")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  442|    160|STR(ttrcReached, "ttrcReached")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  443|    160|STR(returnThis, "return this")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  444|    160|STR(getTemplateObject, "getTemplateObject")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  445|    160|STR(ensureObject, "ensureObject")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  446|    160|STR(getMethod, "getMethod")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  447|    160|STR(throwTypeError, "throwTypeError")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  448|    160|STR(generatorSetDelegated, "generatorSetDelegated")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  449|    160|STR(copyDataProperties, "copyDataProperties")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  450|    160|STR(copyRestArgs, "copyRestArgs")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  451|    160|STR(arraySpread, "arraySpread")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  452|    160|STR(exportAll, "exportAll")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  453|    160|STR(exponentiationOperator, "exponentiationOperator")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  454|    160|STR(initRegexNamedGroups, "initRegexNamedGroups")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  455|    160|STR(getFunctionLocation, "getFunctionLocation")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  456|    160|STR(getOriginalNativeErrorConstructor, "getOriginalNativeErrorConstructor")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  457|    160|STR(isNative, "isNative")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  458|    160|STR(lineNumber, "lineNumber")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  459|    160|STR(columnNumber, "columnNumber")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  460|    160|STR(segmentID, "segmentID")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  461|    160|STR(virtualOffset, "virtualOffset")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  462|    160|STR(fileName, "fileName")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  463|    160|STR(setPromiseRejectionTrackingHook, "setPromiseRejectionTrackingHook")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  464|    160|STR(enablePromiseRejectionTracker, "enablePromiseRejectionTracker")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  465|    160|STR(spawnAsync, "spawnAsync") /* NOLINT */
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  466|       |
  |  |  467|    160|STR(require, "require")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  468|    160|STR(requireFast, "requireFast")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  469|    160|STR(context, "context")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  470|    160|STR(exports, "exports")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  471|    160|STR(dotSlash, "./")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  472|    160|STR(defaultExport, "?default")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  473|       |
  |  |  474|    160|STR(squareObjectUndefined, "[object Undefined]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  475|    160|STR(squareObjectNull, "[object Null]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  476|    160|STR(squareObjectGlobal, "[object global]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  477|    160|STR(squareSymbolHasInstance, "[Symbol.hasInstance]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  478|    160|STR(squareSymbolIterator, "[Symbol.iterator]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  479|    160|STR(squareSymbolToPrimitive, "[Symbol.toPrimitive]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  480|    160|STR(squareSymbolToStringTag, "[Symbol.toStringTag]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  481|    160|STR(squareSymbolMatch, "[Symbol.match]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  482|    160|STR(squareSymbolMatchAll, "[Symbol.matchAll]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  483|    160|STR(squareSymbolSearch, "[Symbol.search]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  484|    160|STR(squareSymbolReplace, "[Symbol.replace]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  485|    160|STR(squareSymbolSplit, "[Symbol.split]")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  486|       |
  |  |  487|    160|STR(TextEncoder, "TextEncoder")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  488|    160|STR(encode, "encode")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  489|    160|STR(encodeInto, "encodeInto")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  490|    160|STR(read, "read")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  491|    160|STR(written, "written")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  492|    160|STR(encoding, "encoding")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  493|    160|STR(utf8, "utf-8")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  494|       |
  |  |  495|       |#ifdef HERMES_ENABLE_INTL
  |  |  496|       |// TODO T65916424: Consider how we can move these out of the
  |  |  497|       |// predefined strings table.
  |  |  498|       |STR(Collator, "Collator")
  |  |  499|       |STR(IntlCollator, "Intl.Collator")
  |  |  500|       |STR(DateTimeFormat, "DateTimeFormat")
  |  |  501|       |STR(IntlDateTimeFormat, "Intl.DateTimeFormat")
  |  |  502|       |STR(NumberFormat, "NumberFormat")
  |  |  503|       |STR(IntlNumberFormat, "Intl.NumberFormat")
  |  |  504|       |STR(Intl, "Intl")
  |  |  505|       |STR(compare, "compare")
  |  |  506|       |STR(format, "format")
  |  |  507|       |STR(formatToParts, "formatToParts")
  |  |  508|       |STR(getCanonicalLocales, "getCanonicalLocales")
  |  |  509|       |STR(resolvedOptions, "resolvedOptions")
  |  |  510|       |STR(supportedLocalesOf, "supportedLocalesOf")
  |  |  511|       |#endif
  |  |  512|       |
  |  |  513|       |// Define strings like "[object Number]" for all classes.
  |  |  514|    160|#define CELL_JS_NAME(name, jsClassName) \
  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  516|    160|#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|    160|#ifndef CELL_KIND
  |  |  |  |   12|    160|#define CELL_KIND(name)
  |  |  |  |   13|    160|#endif
  |  |  |  |   14|       |
  |  |  |  |   15|       |#ifndef CELL_JS_NAME
  |  |  |  |   16|       |#define CELL_JS_NAME(name, jsClassName)
  |  |  |  |   17|       |#endif
  |  |  |  |   18|       |
  |  |  |  |   19|    160|#ifndef CELL_RANGE
  |  |  |  |   20|    160|#define CELL_RANGE(rangeName, first, last)
  |  |  |  |   21|    160|#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|    160|#define CELL_CLASS(name, jsClassName) \
  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |   28|       |
  |  |  |  |   29|    160|CELL_KIND(Uninitialized)
  |  |  |  |   30|    160|CELL_KIND(FillerCell)
  |  |  |  |   31|    160|#if defined(HERMESVM_GC_HADES) || defined(HERMESVM_GC_RUNTIME)
  |  |  |  |   32|    160|CELL_KIND(Freelist)
  |  |  |  |   33|    160|#endif
  |  |  |  |   34|    160|CELL_KIND(DynamicUTF16StringPrimitive)
  |  |  |  |   35|    160|CELL_KIND(DynamicASCIIStringPrimitive)
  |  |  |  |   36|    160|CELL_KIND(BufferedUTF16StringPrimitive)
  |  |  |  |   37|    160|CELL_KIND(BufferedASCIIStringPrimitive)
  |  |  |  |   38|    160|CELL_KIND(DynamicUniquedUTF16StringPrimitive)
  |  |  |  |   39|    160|CELL_KIND(DynamicUniquedASCIIStringPrimitive)
  |  |  |  |   40|    160|CELL_KIND(ExternalUTF16StringPrimitive)
  |  |  |  |   41|    160|CELL_KIND(ExternalASCIIStringPrimitive)
  |  |  |  |   42|    160|CELL_KIND(DictPropertyMap)
  |  |  |  |   43|    160|CELL_KIND(Domain)
  |  |  |  |   44|    160|CELL_KIND(HiddenClass)
  |  |  |  |   45|    160|CELL_KIND(ArrayStorage)
  |  |  |  |   46|    160|CELL_KIND(ArrayStorageSmall)
  |  |  |  |   47|    160|CELL_KIND(SegmentedArray)
  |  |  |  |   48|    160|CELL_KIND(SegmentedArraySmall)
  |  |  |  |   49|    160|CELL_KIND(Segment)
  |  |  |  |   50|    160|CELL_KIND(SegmentSmall)
  |  |  |  |   51|    160|CELL_KIND(PropertyAccessor)
  |  |  |  |   52|    160|CELL_KIND(Environment)
  |  |  |  |   53|    160|CELL_KIND(HashMapEntry)
  |  |  |  |   54|    160|CELL_KIND(OrderedHashMap)
  |  |  |  |   55|    160|CELL_KIND(BoxedDouble)
  |  |  |  |   56|    160|CELL_KIND(NativeState)
  |  |  |  |   57|       |
  |  |  |  |   58|    160|CELL_CLASS(JSObject, "Object")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|    160|CELL_CLASS(DecoratedObject, "DecoratedObject")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   60|    160|CELL_KIND(HostObject)
  |  |  |  |   61|       |
  |  |  |  |   62|    160|CELL_CLASS(JSError, "Error")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   63|    160|CELL_CLASS(JSCallSite, "CallSite")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|    160|CELL_CLASS(Arguments, "Arguments")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   65|    160|CELL_CLASS(JSArray, "Array")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   66|    160|CELL_CLASS(JSArrayBuffer, "ArrayBuffer")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|    160|CELL_CLASS(JSDataView, "DataView")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |   69|    160|#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|    160|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   15|    160|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    160|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    160|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   18|    160|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |  |  |   19|    160|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#else
  |  |  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |  |  |   22|       |#endif
  |  |  |  |  |  |   23|    160|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   24|    160|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   25|    160|TYPED_ARRAY(Float32, float)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|TYPED_ARRAY(Float64, double)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   27|    160|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   28|    160|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|    160|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   29|       |
  |  |  |  |  |  |   30|    160|#undef TYPED_ARRAY
  |  |  |  |  ------------------
  |  |  |  |   70|    160|CELL_CLASS(JSArrayIterator, "Array Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|    160|CELL_CLASS(JSSet, "Set")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|    160|CELL_CLASS(JSMap, "Map")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   73|    160|CELL_CLASS(JSSetIterator, "Set Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   74|    160|CELL_CLASS(JSMapIterator, "Map Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   75|    160|CELL_CLASS(JSWeakMap, "WeakMap")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   76|    160|CELL_CLASS(JSWeakSet, "WeakSet")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   77|    160|CELL_CLASS(JSWeakRef, "WeakRef")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   78|    160|CELL_CLASS(JSBoolean, "Boolean")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|    160|CELL_CLASS(JSString, "String")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   80|    160|CELL_CLASS(JSNumber, "Number")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   81|    160|CELL_CLASS(JSSymbol, "Symbol")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   82|    160|CELL_CLASS(JSStringIterator, "String Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   83|    160|CELL_CLASS(JSJSON, "JSON")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|    160|CELL_CLASS(JSMath, "Math")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   85|    160|CELL_CLASS(JSDate, "Date")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   86|    160|CELL_CLASS(JSRegExp, "RegExp")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   87|    160|CELL_CLASS(JSRegExpStringIterator, "RegExp String Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   88|    160|CELL_CLASS(RequireContext, "RequireContext")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   89|    160|CELL_CLASS(JSGenerator, "Generator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   90|    160|CELL_CLASS(JSProxy, "Proxy")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   91|    160|CELL_CLASS(JSBigInt, "BigInt")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|       |
  |  |  |  |   93|    160|CELL_KIND(BoundFunction)
  |  |  |  |   94|    160|CELL_KIND(NativeFunction)
  |  |  |  |   95|    160|CELL_KIND(NativeConstructor)
  |  |  |  |   96|    160|CELL_CLASS(JSCallableProxy, "CallableProxy")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   97|    160|CELL_KIND(FinalizableNativeFunction)
  |  |  |  |   98|    160|CELL_KIND(JSGeneratorFunction)
  |  |  |  |   99|    160|CELL_KIND(GeneratorInnerFunction)
  |  |  |  |  100|    160|CELL_KIND(JSAsyncFunction)
  |  |  |  |  101|    160|CELL_CLASS(JSFunction, "Function")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|    160|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|    160|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  515|    160|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  102|       |
  |  |  |  |  103|    160|CELL_KIND(BigIntPrimitive)
  |  |  |  |  104|       |
  |  |  |  |  105|       |// Dummy object used only in tests.
  |  |  |  |  106|    160|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|    160|CELL_RANGE(AllCells, Uninitialized, DummyObject)
  |  |  |  |  113|    160|CELL_RANGE(Object, JSObject, JSFunction)
  |  |  |  |  114|    160|CELL_RANGE(DecoratedObject, DecoratedObject, HostObject)
  |  |  |  |  115|    160|CELL_RANGE(ArrayImpl, Arguments, JSArray)
  |  |  |  |  116|    160|CELL_RANGE(Callable, BoundFunction, JSFunction)
  |  |  |  |  117|    160|CELL_RANGE(CodeBlockFunction, JSGeneratorFunction, JSFunction)
  |  |  |  |  118|    160|CELL_RANGE(NativeFunction, NativeFunction, FinalizableNativeFunction)
  |  |  |  |  119|    160|CELL_RANGE(TypedArrayBase, Int8Array, BigUint64Array)
  |  |  |  |  120|    160|CELL_RANGE(WeakMapImplBase, JSWeakMap, JSWeakSet)
  |  |  |  |  121|    160|CELL_RANGE(
  |  |  |  |  122|    160|    StringPrimitive,
  |  |  |  |  123|    160|    DynamicUTF16StringPrimitive,
  |  |  |  |  124|    160|    ExternalASCIIStringPrimitive)
  |  |  |  |  125|       |
  |  |  |  |  126|    160|#undef CELL_KIND
  |  |  |  |  127|    160|#undef CELL_JS_NAME
  |  |  |  |  128|    160|#undef CELL_RANGE
  |  |  |  |  129|    160|#undef CELL_CLASS
  |  |  ------------------
  |  |  517|       |
  |  |  518|       |// These strings are the same ones that RN adds to the Runtime before
  |  |  519|       |// executing bytecode. They are added here because it may provide
  |  |  520|       |// a performance benefit.
  |  |  521|    160|STR(__rnReserved00, "nativePerformanceNow")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  522|    160|STR(__rnReserved01, "nativeLoggingHook")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  523|    160|STR(__rnReserved02, "nativeQPLMarkerPoint")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  524|    160|STR(__rnReserved03, "jsEngine")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  525|    160|STR(__rnReserved04, "nativeCallSyncHook")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  526|    160|STR(__rnReserved05, "nativeFlushQueueImmediate")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  527|    160|STR(__rnReserved06, "nativeTraceBeginSection")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  528|    160|STR(__rnReserved07, "nativeTraceEndSection")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  529|    160|STR(__rnReserved08, "nativeTraceBeginAsyncSection")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  530|    160|STR(__rnReserved09, "nativeTraceEndAsyncSection")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  531|    160|STR(__rnReserved10, "nativeTraceCounter")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  532|    160|STR(__rnReserved11, "nativeModuleProxy")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  533|    160|STR(__rnReserved12, "nativeGetThreadCpuTimeMillis")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  534|    160|STR(__rnReserved13, "nativeQPLTimestamp")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  535|    160|STR(__rnReserved14, "nativeQPLMarkerStart")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  536|    160|STR(__rnReserved15, "nativeQPLMarkerEnd")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  537|    160|STR(__rnReserved16, "nativeQPLMarkerNote")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  538|    160|STR(__rnReserved17, "nativeQPLMarkerTag")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  539|    160|STR(__rnReserved18, "nativeQPLMarkerAnnotate")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  540|    160|STR(__rnReserved20, "nativeGetThreadMajorPageFaults")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  541|    160|STR(__rnReserved21, "__jsiExecutorDescription")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  542|    160|STR(__rnReserved22, "nativeTraceIsTracing")
  |  |  ------------------
  |  |  |  | 1531|    160|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  543|       |
  |  |  544|       |#ifdef HERMES_ENABLE_FUZZILLI
  |  |  545|       |STR(fuzzilli, "fuzzilli")
  |  |  546|       |#endif
  |  |  547|       |
  |  |  548|       |
  |  |  549|    160|#undef STR
  ------------------
 1533|    160|  };
 1534|       |
 1535|    160|  uint32_t offset = 0;
 1536|    160|  uint32_t registered = 0;
 1537|    160|  (void)registered;
 1538|    160|  const uint32_t strCount = Predefined::NumStrings;
 1539|    160|  const uint32_t symCount = Predefined::NumSymbols;
 1540|    160|  identifierTable_.reserve(Predefined::_IPROP_AFTER_LAST + strCount + symCount);
 1541|       |
 1542|  2.40k|  for (uint32_t idx = 0; idx < Predefined::_IPROP_AFTER_LAST; ++idx) {
  ------------------
  |  Branch (1542:26): [True: 2.24k, False: 160]
  ------------------
 1543|  2.24k|    SymbolID sym = identifierTable_.createNotUniquedLazySymbol(
 1544|  2.24k|        ASCIIRef{&buffer[offset], propLengths[idx]});
 1545|       |
 1546|  2.24k|    assert(sym == Predefined::getSymbolID((Predefined::IProp)registered++));
 1547|  2.24k|    (void)sym;
 1548|       |
 1549|  2.24k|    offset += propLengths[idx];
 1550|  2.24k|  }
 1551|       |
 1552|    160|  assert(
 1553|    160|      strCount == sizeof hashes / sizeof hashes[0] &&
 1554|    160|      "Arrays should have same length");
 1555|  87.5k|  for (uint32_t idx = 0; idx < strCount; idx++) {
  ------------------
  |  Branch (1555:26): [True: 87.3k, False: 160]
  ------------------
 1556|  87.3k|    SymbolID sym = identifierTable_.registerLazyIdentifier(
 1557|  87.3k|        ASCIIRef{&buffer[offset], strLengths[idx]}, hashes[idx]);
 1558|       |
 1559|  87.3k|    assert(sym == Predefined::getSymbolID((Predefined::Str)registered++));
 1560|  87.3k|    (void)sym;
 1561|       |
 1562|  87.3k|    offset += strLengths[idx];
 1563|  87.3k|  }
 1564|       |
 1565|  1.76k|  for (uint32_t idx = 0; idx < symCount; ++idx) {
  ------------------
  |  Branch (1565:26): [True: 1.60k, False: 160]
  ------------------
 1566|  1.60k|    SymbolID sym = identifierTable_.createNotUniquedLazySymbol(
 1567|  1.60k|        ASCIIRef{&buffer[offset], symLengths[idx]});
 1568|       |
 1569|  1.60k|    assert(sym == Predefined::getSymbolID((Predefined::Sym)registered++));
 1570|  1.60k|    (void)sym;
 1571|       |
 1572|  1.60k|    offset += symLengths[idx];
 1573|  1.60k|  }
 1574|       |
 1575|    160|  assert(
 1576|    160|      !getTopGCScope() &&
 1577|    160|      "There shouldn't be any handles allocated during initializing the predefined strings");
 1578|    160|}
_ZN6hermes2vm7Runtime20initCharacterStringsEv:
 1580|    160|void Runtime::initCharacterStrings() {
 1581|    160|  GCScope gc(*this);
 1582|    160|  auto marker = gc.createMarker();
 1583|    160|  charStrings_.reserve(256);
 1584|  41.1k|  for (char16_t ch = 0; ch < 256; ++ch) {
  ------------------
  |  Branch (1584:25): [True: 40.9k, False: 160]
  ------------------
 1585|  40.9k|    gc.flushToMarker(marker);
 1586|  40.9k|    charStrings_.push_back(allocateCharacterString(ch).getHermesValue());
 1587|  40.9k|  }
 1588|    160|}
_ZN6hermes2vm7Runtime23allocateCharacterStringEDs:
 1590|  40.9k|Handle<StringPrimitive> Runtime::allocateCharacterString(char16_t ch) {
 1591|       |  // This can in theory throw when called out of initialization phase.
 1592|       |  // However there is only that many character strings and in practice this
 1593|       |  // is not a problem.  Note that we allocate these as "long-lived" objects,
 1594|       |  // so we don't have to scan the charStrings_ array in
 1595|       |  // young-generation collections.
 1596|       |
 1597|  40.9k|  PinnedHermesValue strRes;
 1598|  40.9k|  if (LLVM_LIKELY(ch < 128)) {
  ------------------
  |  |  188|  40.9k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 20.4k, False: 20.4k]
  |  |  ------------------
  ------------------
 1599|  20.4k|    strRes = ignoreAllocationFailure(
 1600|  20.4k|        StringPrimitive::createLongLived(*this, ASCIIRef(ch)));
 1601|  20.4k|  } else {
 1602|  20.4k|    strRes = ignoreAllocationFailure(
 1603|  20.4k|        StringPrimitive::createLongLived(*this, UTF16Ref(ch)));
 1604|  20.4k|  }
 1605|  40.9k|  return makeHandle<StringPrimitive>(strRes);
 1606|  40.9k|}
_ZN6hermes2vm7Runtime18getCharacterStringEDs:
 1608|    160|Handle<StringPrimitive> Runtime::getCharacterString(char16_t ch) {
 1609|    160|  if (LLVM_LIKELY(ch < 256))
  ------------------
  |  |  188|    160|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 160, False: 0]
  |  |  ------------------
  ------------------
 1610|    160|    return Handle<StringPrimitive>::vmcast(&charStrings_[ch]);
 1611|       |
 1612|      0|  return makeHandle<StringPrimitive>(
 1613|      0|      ignoreAllocationFailure(StringPrimitive::create(*this, UTF16Ref(ch))));
 1614|    160|}
_ZN6hermes2vm7Runtime26forEachPublicNativeBuiltinERKNSt3__18functionIFNS0_15ExecutionStatusEjNS0_10Predefined3StrERNS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEEEE:
 1645|    160|        SymbolID methodID)> &callback) {
 1646|    160|  MutableHandle<JSObject> lastObject{*this};
 1647|    160|  Predefined::Str lastObjectName = Predefined::_STRING_AFTER_LAST;
 1648|       |
 1649|  6.08k|  for (unsigned methodIndex = 0; methodIndex < BuiltinMethod::_firstPrivate;
  ------------------
  |  Branch (1649:34): [True: 5.92k, False: 160]
  ------------------
 1650|  5.92k|       ++methodIndex) {
 1651|  5.92k|    GCScopeMarkerRAII marker{*this};
 1652|  5.92k|    LLVM_DEBUG(llvh::dbgs() << publicNativeBuiltins[methodIndex].name << "\n");
  ------------------
  |  |  123|  5.92k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  5.92k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 5.92k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  5.92k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1653|       |    // Find the object first, if it changed.
 1654|  5.92k|    auto objectName = (Predefined::Str)publicNativeBuiltins[methodIndex].object;
 1655|  5.92k|    if (objectName != lastObjectName) {
  ------------------
  |  Branch (1655:9): [True: 960, False: 4.96k]
  ------------------
 1656|    960|      auto objectID = Predefined::getSymbolID(objectName);
 1657|       |      // Avoid running any JS here to avoid modifying the builtins while
 1658|       |      // iterating them.
 1659|    960|      NamedPropertyDescriptor desc;
 1660|       |      // Check if the builtin is overridden.
 1661|    960|      if (!JSObject::getOwnNamedDescriptor(
  ------------------
  |  Branch (1661:11): [True: 0, False: 960]
  ------------------
 1662|    960|              getGlobal(), *this, objectID, desc)) {
 1663|      0|        return raiseTypeError(
 1664|      0|            TwineChar16{
 1665|      0|                "Cannot execute a bytecode compiled with -fstatic-builtins: "} +
 1666|      0|            getPredefinedString(objectName) + " was deleted");
 1667|      0|      }
 1668|       |      // Doesn't run accessors.
 1669|    960|      auto cr = JSObject::getNamedSlotValue(getGlobal(), *this, desc);
 1670|    960|      if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    960|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 960]
  |  |  ------------------
  ------------------
 1671|      0|        return ExecutionStatus::EXCEPTION;
 1672|      0|      }
 1673|       |      // This is known to not be PropertyAccessor, so check that casting it to
 1674|       |      // JSObject is allowed.
 1675|    960|      if (LLVM_UNLIKELY(!vmisa<JSObject>(cr->get()))) {
  ------------------
  |  |  189|    960|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 960]
  |  |  ------------------
  ------------------
 1676|      0|        return raiseTypeError(
 1677|      0|            TwineChar16{
 1678|      0|                "Cannot execute a bytecode compiled with -fstatic-builtins: "} +
 1679|      0|            getPredefinedString(objectName) + " is not an object");
 1680|      0|      }
 1681|       |
 1682|    960|      lastObject = vmcast<JSObject>(cr->get());
 1683|    960|      lastObjectName = objectName;
 1684|    960|    }
 1685|       |
 1686|       |    // Find the method.
 1687|  5.92k|    auto methodName = (Predefined::Str)publicNativeBuiltins[methodIndex].method;
 1688|  5.92k|    auto methodID = Predefined::getSymbolID(methodName);
 1689|       |
 1690|  5.92k|    ExecutionStatus status =
 1691|  5.92k|        callback(methodIndex, objectName, lastObject, methodID);
 1692|  5.92k|    if (status != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1692:9): [True: 0, False: 5.92k]
  ------------------
 1693|      0|      return ExecutionStatus::EXCEPTION;
 1694|      0|    }
 1695|  5.92k|  }
 1696|    160|  return ExecutionStatus::RETURNED;
 1697|    160|}
_ZN6hermes2vm7Runtime18initNativeBuiltinsEv:
 1699|    160|void Runtime::initNativeBuiltins() {
 1700|    160|  GCScopeMarkerRAII gcScope{*this};
 1701|       |
 1702|    160|  builtins_.resize(BuiltinMethod::_count);
 1703|       |
 1704|    160|  (void)forEachPublicNativeBuiltin([this](
 1705|    160|                                       unsigned methodIndex,
 1706|    160|                                       Predefined::Str /* objectName */,
 1707|    160|                                       Handle<JSObject> &currentObject,
 1708|    160|                                       SymbolID methodID) {
 1709|    160|    auto cr = JSObject::getNamed_RJS(currentObject, *this, methodID);
 1710|    160|    assert(
 1711|    160|        cr.getStatus() != ExecutionStatus::EXCEPTION &&
 1712|    160|        "getNamed() of builtin method failed");
 1713|    160|    assert(
 1714|    160|        vmisa<NativeFunction>(cr->get()) &&
 1715|    160|        "getNamed() of builtin method must be a NativeFunction");
 1716|    160|    builtins_[methodIndex] = vmcast<NativeFunction>(cr->get());
 1717|    160|    return ExecutionStatus::RETURNED;
 1718|    160|  });
 1719|       |
 1720|       |  // Now add the private native builtins.
 1721|    160|  createHermesBuiltins(*this, builtins_);
 1722|    160|#ifndef NDEBUG
 1723|       |  // Make sure native builtins are all defined.
 1724|  8.48k|  for (unsigned i = 0; i < BuiltinMethod::_firstJS; ++i) {
  ------------------
  |  Branch (1724:24): [True: 8.32k, False: 160]
  ------------------
 1725|  8.32k|    assert(builtins_[i] && "native builtin not initialized");
 1726|  8.32k|  }
 1727|    160|#endif
 1728|    160|}
_ZN6hermes2vm7Runtime14initJSBuiltinsEN4llvh15MutableArrayRefIPNS0_8CallableEEENS0_6HandleINS0_8JSObjectEEE:
 1745|    160|    Handle<JSObject> jsBuiltinsObj) {
 1746|    160|  for (const JSBuiltin &jsBuiltin : jsBuiltins) {
  ------------------
  |  Branch (1746:35): [True: 160, False: 160]
  ------------------
 1747|    160|    auto symID = jsBuiltin.symID;
 1748|    160|    auto builtinIndex = jsBuiltin.builtinIndex;
 1749|       |
 1750|       |    // Try to get the JS function from jsBuiltinsObj.
 1751|    160|    auto getRes = JSObject::getNamed_RJS(
 1752|    160|        jsBuiltinsObj, *this, Predefined::getSymbolID((Predefined::Str)symID));
 1753|    160|    assert(getRes == ExecutionStatus::RETURNED && "Failed to get JS builtin.");
 1754|    160|    JSFunction *jsFunc = vmcast<JSFunction>(getRes->getHermesValue());
 1755|       |
 1756|    160|    builtins[builtinIndex] = jsFunc;
 1757|    160|  }
 1758|    160|}
_ZN6hermes2vm7Runtime24symbolEqualsToStringPrimENS0_8SymbolIDEPNS0_15StringPrimitiveE:
 1931|  1.42M|bool Runtime::symbolEqualsToStringPrim(SymbolID id, StringPrimitive *strPrim) {
 1932|  1.42M|  auto view = identifierTable_.getStringView(*this, id);
 1933|  1.42M|  return strPrim->equals(view);
 1934|  1.42M|}
_ZN6hermes2vm7Runtime10allocStackEjNS0_11HermesValueE:
 1937|  3.45M|void Runtime::allocStack(uint32_t count, HermesValue initValue) {
 1938|       |  // Note: it is important that allocStack be defined out-of-line. If inline,
 1939|       |  // constants are propagated into initValue, which enables clang to use
 1940|       |  // memset_pattern_16. This ends up being a significant loss as it is an
 1941|       |  // indirect call.
 1942|  3.45M|  auto *oldStackPointer = stackPointer_;
 1943|  3.45M|  allocUninitializedStack(count);
 1944|       |  // Initialize the new registers.
 1945|  3.45M|  std::uninitialized_fill_n(oldStackPointer, count, initValue);
 1946|  3.45M|}
_ZN6hermes2vm7Runtime9onGCEventENS0_11GCEventKindERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
 2102|    226|void Runtime::onGCEvent(GCEventKind kind, const std::string &extraInfo) {
 2103|    226|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
 2104|    226|  if (samplingProfiler) {
  ------------------
  |  Branch (2104:7): [True: 0, False: 226]
  ------------------
 2105|      0|    switch (kind) {
 2106|      0|      case GCEventKind::CollectionStart:
  ------------------
  |  Branch (2106:7): [True: 0, False: 0]
  ------------------
 2107|      0|        samplingProfiler->suspend(extraInfo);
 2108|      0|        break;
 2109|      0|      case GCEventKind::CollectionEnd:
  ------------------
  |  Branch (2109:7): [True: 0, False: 0]
  ------------------
 2110|      0|        samplingProfiler->resume();
 2111|      0|        break;
 2112|      0|      default:
  ------------------
  |  Branch (2112:7): [True: 0, False: 0]
  ------------------
 2113|      0|        llvm_unreachable("unknown GCEventKind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 2114|      0|    }
 2115|      0|  }
 2116|    226|#endif // HERMESVM_SAMPLING_PROFILER_AVAILABLE
 2117|    226|  if (gcEventCallback_) {
  ------------------
  |  Branch (2117:7): [True: 0, False: 226]
  ------------------
 2118|      0|    gcEventCallback_(kind, extraInfo.c_str());
 2119|      0|  }
 2120|    226|}
_ZN6hermes2vm7Runtime29getCurrentInterpreterLocationEPKNS_4inst4InstE:
 2212|     82|Runtime::getCurrentInterpreterLocation(const inst::Inst *ip) {
 2213|     82|  assert(ip && "IP being null implies we're not currently in the interpreter.");
 2214|     82|  auto callFrames = getStackFrames();
 2215|     82|  const CodeBlock *codeBlock = nullptr;
 2216|    164|  for (auto frameIt = callFrames.begin(); frameIt != callFrames.end();
  ------------------
  |  Branch (2216:43): [True: 164, False: 0]
  ------------------
 2217|    164|       ++frameIt) {
 2218|    164|    codeBlock = frameIt->getCalleeCodeBlock(*this);
 2219|    164|    if (codeBlock) {
  ------------------
  |  Branch (2219:9): [True: 82, False: 82]
  ------------------
 2220|     82|      break;
 2221|     82|    } else {
 2222|     82|      ip = frameIt->getSavedIP();
 2223|     82|    }
 2224|    164|  }
 2225|     82|  assert(codeBlock && "Could not find CodeBlock.");
 2226|     82|  return {codeBlock, ip};
 2227|     82|}
_ZN6hermes2vm7Runtime19MarkRootsPhaseTimerC2ERS1_NS0_19RootSectionAcceptor7SectionE:
  467|  5.08k|      : rt_(rt), section_(section), start_(std::chrono::steady_clock::now()) {
  468|  5.08k|    if (static_cast<unsigned>(section) == 0) {
  ------------------
  |  Branch (468:9): [True: 339, False: 4.74k]
  ------------------
  469|       |      // The first phase; record the start as the start of markRoots.
  470|    339|      rt_.startOfMarkRoots_ = start_;
  471|    339|    }
  472|  5.08k|  }
_ZN6hermes2vm7Runtime19MarkRootsPhaseTimerD2Ev:
  473|  5.08k|  ~MarkRootsPhaseTimer() {
  474|  5.08k|    auto tp = std::chrono::steady_clock::now();
  475|  5.08k|    std::chrono::duration<double> elapsed = (tp - start_);
  476|  5.08k|    start_ = tp;
  477|  5.08k|    unsigned index = static_cast<unsigned>(section_);
  478|  5.08k|    rt_.markRootsPhaseTimes_[index] += elapsed.count();
  479|  5.08k|    if (index + 1 ==
  ------------------
  |  Branch (479:9): [True: 339, False: 4.74k]
  ------------------
  480|  5.08k|        static_cast<unsigned>(RootAcceptor::Section::NumSections)) {
  481|    339|      std::chrono::duration<double> totalElapsed = (tp - rt_.startOfMarkRoots_);
  482|    339|      rt_.totalMarkRootsTime_ += totalElapsed.count();
  483|    339|    }
  484|  5.08k|  }
Runtime.cpp:_ZN6hermes2vmL16raisePlaceholderERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEERKNS0_11TwineChar16E:
 1307|     53|    const TwineChar16 &msg) {
 1308|       |  // Since this happens unexpectedly and rarely, don't rely on the parent
 1309|       |  // GCScope.
 1310|     53|  GCScope gcScope{runtime};
 1311|       |
 1312|     53|  SmallU16String<64> buf;
 1313|     53|  msg.toVector(buf);
 1314|       |
 1315|     53|  auto strRes = StringPrimitive::create(runtime, buf);
 1316|     53|  if (strRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1316:7): [True: 0, False: 53]
  ------------------
 1317|      0|    return ExecutionStatus::EXCEPTION;
 1318|      0|  }
 1319|     53|  auto str = runtime.makeHandle<StringPrimitive>(*strRes);
 1320|     53|  LLVM_DEBUG(llvh::errs() << buf.arrayRef() << "\n");
  ------------------
  |  |  123|     53|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     53|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 53]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     53|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1321|     53|  return raisePlaceholder(runtime, prototype, str);
 1322|     53|}
Runtime.cpp:_ZN6hermes2vmL16raisePlaceholderERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS3_INS0_11HermesValueEEE:
 1293|     53|    Handle<> message) {
 1294|     53|  GCScopeMarkerRAII gcScope{runtime};
 1295|       |
 1296|       |  // Create the error object, initialize stack property and set message.
 1297|     53|  auto errorObj = runtime.makeHandle(JSError::create(runtime, prototype));
 1298|     53|  return raisePlaceholder(runtime, errorObj, message);
 1299|     53|}
Runtime.cpp:_ZN6hermes2vmL16raisePlaceholderERNS0_7RuntimeENS0_6HandleINS0_7JSErrorEEENS3_INS0_11HermesValueEEE:
 1282|     53|raisePlaceholder(Runtime &runtime, Handle<JSError> errorObj, Handle<> message) {
 1283|     53|  JSError::recordStackTrace(errorObj, runtime);
 1284|     53|  JSError::setMessage(errorObj, runtime, message);
 1285|     53|  return runtime.setThrownValue(errorObj.getHermesValue());
 1286|     53|}
Runtime.cpp:_ZZN6hermes2vm7Runtime18initNativeBuiltinsEvENK3$_0clEjNS0_10Predefined3StrERNS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDE:
 1708|  5.92k|                                       SymbolID methodID) {
 1709|  5.92k|    auto cr = JSObject::getNamed_RJS(currentObject, *this, methodID);
 1710|  5.92k|    assert(
 1711|  5.92k|        cr.getStatus() != ExecutionStatus::EXCEPTION &&
 1712|  5.92k|        "getNamed() of builtin method failed");
 1713|  5.92k|    assert(
 1714|  5.92k|        vmisa<NativeFunction>(cr->get()) &&
 1715|  5.92k|        "getNamed() of builtin method must be a NativeFunction");
 1716|  5.92k|    builtins_[methodIndex] = vmcast<NativeFunction>(cr->get());
 1717|  5.92k|    return ExecutionStatus::RETURNED;
 1718|  5.92k|  });

_ZN6hermes2vm13RuntimeModuleC2ERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefEj:
   30|    597|    : runtime_(runtime),
   31|    597|      domain_(*domain, runtime),
   32|    597|      flags_(flags),
   33|    597|      sourceURL_(sourceURL),
   34|    597|      scriptID_(scriptID) {
   35|    597|  runtime_.addRuntimeModule(this);
   36|    597|  Domain::addRuntimeModule(domain, runtime, this);
   37|    597|#ifndef HERMESVM_LEAN
   38|    597|  lazyRoot_ = this;
   39|    597|#endif
   40|    597|}
_ZN6hermes2vm13RuntimeModule35createSymbolFromStringIDMayAllocateEjRKNS_16StringTableEntryENS_8OptValueIjEE:
   45|  19.6k|    OptValue<uint32_t> mhash) {
   46|       |  // Use manual pointer arithmetic to avoid out of bounds errors on empty
   47|       |  // string accesses.
   48|  19.6k|  auto strStorage = bcProvider_->getStringStorage();
   49|  19.6k|  if (entry.isUTF16()) {
  ------------------
  |  Branch (49:7): [True: 328, False: 19.3k]
  ------------------
   50|    328|    const char16_t *s =
   51|    328|        (const char16_t *)(strStorage.begin() + entry.getOffset());
   52|    328|    UTF16Ref str{s, entry.getLength()};
   53|    328|    uint32_t hash = mhash ? *mhash : hashString(str);
  ------------------
  |  Branch (53:21): [True: 261, False: 67]
  ------------------
   54|    328|    return mapStringMayAllocate(str, stringID, hash);
   55|  19.3k|  } else {
   56|       |    // ASCII.
   57|  19.3k|    const char *s = (const char *)strStorage.begin() + entry.getOffset();
   58|  19.3k|    ASCIIRef str{s, entry.getLength()};
   59|  19.3k|    uint32_t hash = mhash ? *mhash : hashString(str);
  ------------------
  |  Branch (59:21): [True: 17.5k, False: 1.76k]
  ------------------
   60|  19.3k|    return mapStringMayAllocate(str, stringID, hash);
   61|  19.3k|  }
   62|  19.6k|}
_ZN6hermes2vm13RuntimeModuleD2Ev:
   64|    597|RuntimeModule::~RuntimeModule() {
   65|    597|  if (bcProvider_ && !bcProvider_->getRawBuffer().empty())
  ------------------
  |  Branch (65:7): [True: 597, False: 0]
  |  Branch (65:7): [True: 320, False: 277]
  |  Branch (65:22): [True: 320, False: 277]
  ------------------
   66|    320|    runtime_.getCrashManager().unregisterMemory(bcProvider_.get());
   67|    597|  runtime_.getCrashManager().unregisterMemory(this);
   68|    597|  runtime_.removeRuntimeModule(this);
   69|       |
   70|       |  // We may reference other CodeBlocks through lazy compilation, but we only
   71|       |  // own the ones that reference us.
   72|   116k|  for (auto *block : functionMap_) {
  ------------------
  |  Branch (72:20): [True: 116k, False: 597]
  ------------------
   73|   116k|    if (block != nullptr && block->getRuntimeModule() == this) {
  ------------------
  |  Branch (73:9): [True: 6.51k, False: 110k]
  |  Branch (73:29): [True: 6.51k, False: 0]
  ------------------
   74|  6.51k|      runtime_.getHeap().getIDTracker().untrackNative(block);
   75|  6.51k|      delete block;
   76|  6.51k|    }
   77|   116k|  }
   78|    597|  runtime_.getHeap().getIDTracker().untrackNative(&functionMap_);
   79|    597|}
_ZN6hermes2vm13RuntimeModule21prepareForDestructionEv:
   81|    597|void RuntimeModule::prepareForDestruction() {
   82|   117k|  for (int i = 0, e = functionMap_.size(); i < e; i++) {
  ------------------
  |  Branch (82:44): [True: 116k, False: 597]
  ------------------
   83|   116k|    if (functionMap_[i] != nullptr &&
  ------------------
  |  Branch (83:9): [True: 6.59k, False: 110k]
  ------------------
   84|   116k|        functionMap_[i]->getRuntimeModule() != this) {
  ------------------
  |  Branch (84:9): [True: 81, False: 6.51k]
  ------------------
   85|     81|      functionMap_[i] = nullptr;
   86|     81|    }
   87|   116k|  }
   88|    597|}
_ZN6hermes2vm13RuntimeModule6createERNS0_7RuntimeENS0_6HandleINS0_6DomainEEEjONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefE:
   96|    356|    llvh::StringRef sourceURL) {
   97|    356|  RuntimeModule *result;
   98|    356|  result = new RuntimeModule(runtime, domain, flags, sourceURL, scriptID);
   99|    356|  runtime.getCrashManager().registerMemory(result, sizeof(*result));
  100|    356|  if (bytecode) {
  ------------------
  |  Branch (100:7): [True: 356, False: 0]
  ------------------
  101|    356|    if (result->initializeMayAllocate(std::move(bytecode)) ==
  ------------------
  |  Branch (101:9): [True: 0, False: 356]
  ------------------
  102|    356|        ExecutionStatus::EXCEPTION) {
  103|      0|      return ExecutionStatus::EXCEPTION;
  104|      0|    }
  105|       |    // If the BC provider is backed by a buffer, register the BC provider struct
  106|       |    // (but not the buffer contents, since that might be too large).
  107|    356|    if (result->bcProvider_ && !result->bcProvider_->getRawBuffer().empty())
  ------------------
  |  Branch (107:9): [True: 356, False: 0]
  |  Branch (107:9): [True: 160, False: 196]
  |  Branch (107:32): [True: 160, False: 196]
  ------------------
  108|    160|      runtime.getCrashManager().registerMemory(
  109|    160|          result->bcProvider_.get(), sizeof(hbc::BCProviderFromBuffer));
  110|    356|  }
  111|    356|  return result;
  112|    356|}
_ZN6hermes2vm13RuntimeModule19createUninitializedERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS0_18RuntimeModuleFlagsEj:
  118|    241|    facebook::hermes::debugger::ScriptID scriptID) {
  119|    241|  return new RuntimeModule(runtime, domain, flags, "", scriptID);
  120|    241|}
_ZN6hermes2vm13RuntimeModule38initializeWithoutCJSModulesMayAllocateEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEE:
  123|    516|    std::shared_ptr<hbc::BCProvider> &&bytecode) {
  124|    516|  assert(!bcProvider_ && "RuntimeModule already initialized");
  125|    516|  bcProvider_ = std::move(bytecode);
  126|    516|  importStringIDMapMayAllocate();
  127|    516|  initializeFunctionMap();
  128|    516|}
_ZN6hermes2vm13RuntimeModule21initializeMayAllocateEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEE:
  131|    356|    std::shared_ptr<hbc::BCProvider> &&bytecode) {
  132|    356|  initializeWithoutCJSModulesMayAllocate(std::move(bytecode));
  133|    356|  if (LLVM_UNLIKELY(importCJSModuleTable() == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    356|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 356]
  |  |  ------------------
  ------------------
  134|      0|    return ExecutionStatus::EXCEPTION;
  135|      0|  }
  136|    356|  return ExecutionStatus::RETURNED;
  137|    356|}
_ZN6hermes2vm13RuntimeModule20getCodeBlockSlowPathEj:
  139|  6.51k|CodeBlock *RuntimeModule::getCodeBlockSlowPath(unsigned index) {
  140|  6.51k|#ifndef HERMESVM_LEAN
  141|  6.51k|  if (bcProvider_->isFunctionLazy(index)) {
  ------------------
  |  Branch (141:7): [True: 81, False: 6.43k]
  ------------------
  142|     81|    auto *lazyModule = RuntimeModule::createLazyModule(
  143|     81|        runtime_, getDomain(runtime_), this, index);
  144|     81|    functionMap_[index] = lazyModule->getOnlyLazyCodeBlock();
  145|     81|    return functionMap_[index];
  146|     81|  }
  147|  6.43k|#endif
  148|  6.43k|  functionMap_[index] = CodeBlock::createCodeBlock(
  149|  6.43k|      this,
  150|  6.43k|      bcProvider_->getFunctionHeader(index),
  151|  6.43k|      bcProvider_->getBytecode(index),
  152|  6.43k|      index);
  153|  6.43k|  return functionMap_[index];
  154|  6.51k|}
_ZN6hermes2vm13RuntimeModule16createLazyModuleERNS0_7RuntimeENS0_6HandleINS0_6DomainEEEPS1_j:
  161|     81|    uint32_t functionID) {
  162|     81|  auto RM = createUninitialized(runtime, domain);
  163|     81|  RM->lazyRoot_ = parent->lazyRoot_;
  164|       |  // Copy the lazy root's script ID for lazy modules.
  165|     81|  RM->scriptID_ = RM->lazyRoot_->scriptID_;
  166|       |
  167|       |  // Set the bcProvider's BytecodeModule to point to the parent's.
  168|     81|  assert(parent->isInitialized() && "Parent module must have been initialized");
  169|       |
  170|     81|  auto *bcFunction = &((hbc::BCProviderFromSrc *)parent->getBytecode())
  171|     81|                          ->getBytecodeModule()
  172|     81|                          ->getFunction(functionID);
  173|       |
  174|     81|  RM->bcProvider_ = hbc::BCProviderLazy::createBCProviderLazy(bcFunction);
  175|       |
  176|       |  // We don't know which function index this block will eventually represent,
  177|       |  // so just add it as 0 to ensure ownership. We'll move it later in
  178|       |  // `initializeLazy`.
  179|     81|  RM->functionMap_.emplace_back(CodeBlock::createCodeBlock(
  180|     81|      RM, RM->bcProvider_->getFunctionHeader(functionID), {}, functionID));
  181|       |
  182|       |  // The module doesn't have a string table until we've compiled the block,
  183|       |  // so just add the string name as 0 in the mean time for f.name to work via
  184|       |  // getLazyName(). Since it's in the stringIDMap_, it'll be correctly GC'd.
  185|     81|  RM->stringIDMap_.emplace_back(parent->getSymbolIDFromStringIDMayAllocate(
  186|     81|      bcFunction->getHeader().functionName));
  187|       |
  188|     81|  return RM;
  189|     81|}
_ZN6hermes2vm13RuntimeModule11getLazyNameEv:
  191|     81|SymbolID RuntimeModule::getLazyName() {
  192|     81|  assert(functionMap_.size() == 1 && "Not a lazy module?");
  193|     81|  assert(stringIDMap_.size() == 1 && "Missing lazy function name symbol");
  194|     81|  assert(this->stringIDMap_[0].isValid() && "Invalid function name symbol");
  195|     81|  return this->stringIDMap_[0];
  196|     81|}
_ZN6hermes2vm13RuntimeModule28importStringIDMapMayAllocateEv:
  225|    516|void RuntimeModule::importStringIDMapMayAllocate() {
  226|    516|  assert(bcProvider_ && "Uninitialized RuntimeModule");
  227|    516|  PerfSection perf("Import String ID Map");
  228|    516|  GCScope scope(runtime_);
  229|       |
  230|    516|  auto strTableSize = bcProvider_->getStringCount();
  231|       |
  232|    516|  stringIDMap_.clear();
  233|       |
  234|       |  // Populate the string ID map with empty identifiers.
  235|    516|  stringIDMap_.resize(strTableSize, RootSymbolID(SymbolID::empty()));
  236|       |
  237|    516|  if (runtime_.getVMExperimentFlags() & experiments::MAdviseStringsSequential) {
  ------------------
  |  Branch (237:7): [True: 0, False: 516]
  ------------------
  238|      0|    bcProvider_->adviseStringTableSequential();
  239|      0|  }
  240|       |
  241|    516|  if (runtime_.getVMExperimentFlags() & experiments::MAdviseStringsWillNeed) {
  ------------------
  |  Branch (241:7): [True: 0, False: 516]
  ------------------
  242|      0|    bcProvider_->willNeedStringTable();
  243|      0|  }
  244|       |
  245|       |  // Get the array of pre-computed hashes from identifiers in the bytecode
  246|       |  // to their runtime representation as SymbolIDs.
  247|    516|  auto kinds = bcProvider_->getStringKinds();
  248|    516|  auto hashes = bcProvider_->getIdentifierHashes();
  249|    516|  assert(
  250|    516|      hashes.size() <= strTableSize &&
  251|    516|      "Should not have more strings than identifiers");
  252|       |
  253|       |  // Preallocate enough space to store all identifiers to prevent
  254|       |  // unnecessary allocations. NOTE: If this module is not the first module,
  255|       |  // then this is an underestimate.
  256|    516|  runtime_.getIdentifierTable().reserve(hashes.size());
  257|    516|  {
  258|    516|    StringID strID = 0;
  259|    516|    uint32_t hashID = 0;
  260|       |
  261|    607|    for (auto entry : kinds) {
  ------------------
  |  Branch (261:21): [True: 607, False: 516]
  ------------------
  262|    607|      switch (entry.kind()) {
  ------------------
  |  Branch (262:15): [True: 0, False: 607]
  ------------------
  263|    363|        case StringKind::String:
  ------------------
  |  Branch (263:9): [True: 363, False: 244]
  ------------------
  264|    363|          strID += entry.count();
  265|    363|          break;
  266|       |
  267|    244|        case StringKind::Identifier:
  ------------------
  |  Branch (267:9): [True: 244, False: 363]
  ------------------
  268|  18.0k|          for (uint32_t i = 0; i < entry.count(); ++i, ++strID, ++hashID) {
  ------------------
  |  Branch (268:32): [True: 17.8k, False: 244]
  ------------------
  269|  17.8k|            createSymbolFromStringIDMayAllocate(
  270|  17.8k|                strID, bcProvider_->getStringTableEntry(strID), hashes[hashID]);
  271|  17.8k|          }
  272|    244|          break;
  273|    607|      }
  274|    607|    }
  275|       |
  276|    516|    assert(strID == strTableSize && "Should map every string in the bytecode.");
  277|    516|    assert(hashID == hashes.size() && "Should hash all identifiers.");
  278|    516|  }
  279|       |
  280|    516|  if (runtime_.getVMExperimentFlags() & experiments::MAdviseStringsRandom) {
  ------------------
  |  Branch (280:7): [True: 0, False: 516]
  ------------------
  281|      0|    bcProvider_->adviseStringTableRandom();
  282|      0|  }
  283|       |
  284|    516|  if (strTableSize == 0) {
  ------------------
  |  Branch (284:7): [True: 160, False: 356]
  ------------------
  285|       |    // If the string table turns out to be empty,
  286|       |    // we always add one empty string to it.
  287|       |    // Note that this can only happen when we are creating the RuntimeModule
  288|       |    // in a non-standard way, either in unit tests or the special
  289|       |    // emptyCodeBlockRuntimeModule_ in Runtime where the creation happens
  290|       |    // manually instead of going through bytecode module generation.
  291|       |    // In those cases, functions will be created with a default nameID=0
  292|       |    // without adding the name string into the string table. Hence here
  293|       |    // we need to add it manually and it will have index 0.
  294|    160|    ASCIIRef s;
  295|    160|    stringIDMap_.push_back({});
  296|    160|    mapStringMayAllocate(s, 0, hashString(s));
  297|    160|  }
  298|    516|}
_ZN6hermes2vm13RuntimeModule21initializeFunctionMapEv:
  300|    516|void RuntimeModule::initializeFunctionMap() {
  301|    516|  assert(bcProvider_ && "Uninitialized RuntimeModule");
  302|    516|  assert(
  303|    516|      bcProvider_->getFunctionCount() >= functionMap_.size() &&
  304|    516|      "Unexpected size reduction. Lazy module missing functions?");
  305|    516|  functionMap_.resize(bcProvider_->getFunctionCount());
  306|    516|}
_ZN6hermes2vm13RuntimeModule20importCJSModuleTableEv:
  308|    356|ExecutionStatus RuntimeModule::importCJSModuleTable() {
  309|    356|  PerfSection perf("Import CJS Module Table");
  310|    356|  return Domain::importCJSModuleTable(getDomain(runtime_), runtime_, this);
  311|    356|}
_ZN6hermes2vm13RuntimeModule36getStringPrimFromStringIDMayAllocateEj:
  314|   764k|    StringID stringID) {
  315|   764k|  return runtime_.getStringPrimFromSymbolID(
  316|   764k|      getSymbolIDFromStringIDMayAllocate(stringID));
  317|   764k|}
_ZNK6hermes2vm13RuntimeModule26getBigIntBytesFromBigIntIdEj:
  336|   390k|    BigIntID bigIntId) const {
  337|   390k|  assert(
  338|   390k|      bigIntId < bcProvider_->getBigIntTable().size() && "Invalid bigint id");
  339|   390k|  bigint::BigIntTableEntry entry = bcProvider_->getBigIntTable()[bigIntId];
  340|   390k|  return bcProvider_->getBigIntStorage().slice(entry.offset, entry.length);
  341|   390k|}
_ZNK6hermes2vm13RuntimeModule29getRegExpBytecodeFromRegExpIDEj:
  344|      7|    uint32_t regExpId) const {
  345|      7|  assert(
  346|      7|      regExpId < bcProvider_->getRegExpTable().size() && "Invalid regexp id");
  347|      7|  RegExpTableEntry entry = bcProvider_->getRegExpTable()[regExpId];
  348|      7|  return bcProvider_->getRegExpStorage().slice(entry.offset, entry.length);
  349|      7|}
_ZN6hermes2vm13RuntimeModule9markRootsERNS0_12RootAcceptorEb:
  377|  1.32k|void RuntimeModule::markRoots(RootAcceptor &acceptor, bool markLongLived) {
  378|  1.32k|  for (auto &it : templateMap_) {
  ------------------
  |  Branch (378:17): [True: 249, False: 1.32k]
  ------------------
  379|    249|    acceptor.acceptPtr(it.second);
  380|    249|  }
  381|       |
  382|  1.32k|  if (markLongLived) {
  ------------------
  |  Branch (382:7): [True: 830, False: 491]
  ------------------
  383|  34.9k|    for (auto symbol : stringIDMap_) {
  ------------------
  |  Branch (383:22): [True: 34.9k, False: 830]
  ------------------
  384|  34.9k|      if (symbol.isValid()) {
  ------------------
  |  Branch (384:11): [True: 24.4k, False: 10.4k]
  ------------------
  385|  24.4k|        acceptor.accept(symbol);
  386|  24.4k|      }
  387|  34.9k|    }
  388|    830|  }
  389|  1.32k|}
_ZN6hermes2vm13RuntimeModule22markLongLivedWeakRootsERNS0_16WeakRootAcceptorE:
  391|    830|void RuntimeModule::markLongLivedWeakRoots(WeakRootAcceptor &acceptor) {
  392|  19.4k|  for (auto &cbPtr : functionMap_) {
  ------------------
  |  Branch (392:20): [True: 19.4k, False: 830]
  ------------------
  393|       |    // Only mark a CodeBlock is its non-null, and has not been scanned
  394|       |    // previously in this top-level markRoots invocation.
  395|  19.4k|    if (cbPtr != nullptr && cbPtr->getRuntimeModule() == this) {
  ------------------
  |  Branch (395:9): [True: 9.26k, False: 10.1k]
  |  Branch (395:29): [True: 9.19k, False: 76]
  ------------------
  396|  9.19k|      cbPtr->markCachedHiddenClasses(runtime_, acceptor);
  397|  9.19k|    }
  398|  19.4k|  }
  399|    830|  for (auto &entry : objectLiteralHiddenClasses_) {
  ------------------
  |  Branch (399:20): [True: 0, False: 830]
  ------------------
  400|      0|    if (entry.second) {
  ------------------
  |  Branch (400:9): [True: 0, False: 0]
  ------------------
  401|      0|      acceptor.acceptWeak(entry.second);
  402|      0|    }
  403|      0|  }
  404|    830|}
_ZN6hermes2vm13RuntimeModule20mapStringMayAllocateIDsEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEjj:
  355|    328|    uint32_t hash) {
  356|       |  // Create a SymbolID for a given string. In general a SymbolID holds onto an
  357|       |  // intern'd StringPrimitive. As an optimization, if this RuntimeModule is
  358|       |  // persistent, then it will not be deallocated before the Runtime, and we can
  359|       |  // have the SymbolID hold a raw pointer into the storage and produce the
  360|       |  // StringPrimitive when it is first required.
  361|    328|  SymbolID id;
  362|    328|  if (flags_.persistent) {
  ------------------
  |  Branch (362:7): [True: 328, False: 0]
  ------------------
  363|       |    // Registering a lazy identifier does not allocate, so we do not need a
  364|       |    // GC scope.
  365|    328|    id = runtime_.getIdentifierTable().registerLazyIdentifier(str, hash);
  366|    328|  } else {
  367|       |    // Accessing a symbol non-lazily may allocate in the GC heap, so add a scope
  368|       |    // marker.
  369|      0|    GCScopeMarkerRAII scopeMarker{runtime_};
  370|      0|    id = *runtime_.ignoreAllocationFailure(
  371|      0|        runtime_.getIdentifierTable().getSymbolHandle(runtime_, str, hash));
  372|      0|  }
  373|    328|  stringIDMap_[stringID] = RootSymbolID(id);
  374|    328|  return id;
  375|    328|}
_ZN6hermes2vm13RuntimeModule20mapStringMayAllocateIcEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEjj:
  355|  19.5k|    uint32_t hash) {
  356|       |  // Create a SymbolID for a given string. In general a SymbolID holds onto an
  357|       |  // intern'd StringPrimitive. As an optimization, if this RuntimeModule is
  358|       |  // persistent, then it will not be deallocated before the Runtime, and we can
  359|       |  // have the SymbolID hold a raw pointer into the storage and produce the
  360|       |  // StringPrimitive when it is first required.
  361|  19.5k|  SymbolID id;
  362|  19.5k|  if (flags_.persistent) {
  ------------------
  |  Branch (362:7): [True: 19.2k, False: 243]
  ------------------
  363|       |    // Registering a lazy identifier does not allocate, so we do not need a
  364|       |    // GC scope.
  365|  19.2k|    id = runtime_.getIdentifierTable().registerLazyIdentifier(str, hash);
  366|  19.2k|  } else {
  367|       |    // Accessing a symbol non-lazily may allocate in the GC heap, so add a scope
  368|       |    // marker.
  369|    243|    GCScopeMarkerRAII scopeMarker{runtime_};
  370|    243|    id = *runtime_.ignoreAllocationFailure(
  371|    243|        runtime_.getIdentifierTable().getSymbolHandle(runtime_, str, hash));
  372|    243|  }
  373|  19.5k|  stringIDMap_[stringID] = RootSymbolID(id);
  374|  19.5k|  return id;
  375|  19.5k|}

_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7Segment6createERNS0_7RuntimeE:
   47|    799|SegmentedArrayBase<HVType>::Segment::create(Runtime &runtime) {
   48|       |  // NOTE: This needs to live in the cpp file instead of the header because it
   49|       |  // uses PseudoHandle, which requires a specialization of IsGCObject for the
   50|       |  // type it constructs.
   51|    799|  return createPseudoHandle(runtime.makeAFixed<Segment>());
   52|    799|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE7Segment9setLengthERNS0_7RuntimeEj:
   57|   816k|    uint32_t newLength) {
   58|   816k|  const auto len = length();
   59|   816k|  if (newLength > len) {
  ------------------
  |  Branch (59:7): [True: 815k, False: 793]
  ------------------
   60|       |    // Length is increasing, fill with emptys.
   61|   815k|    GCHVType::uninitialized_fill(
   62|   815k|        data_ + len,
   63|   815k|        data_ + newLength,
   64|   815k|        HVType::encodeEmptyValue(),
   65|   815k|        runtime.getHeap());
   66|   815k|    length_.store(newLength, std::memory_order_release);
   67|   815k|  } else if (newLength < len) {
  ------------------
  |  Branch (67:14): [True: 0, False: 793]
  ------------------
   68|       |    // If length is decreasing a write barrier needs to be done.
   69|      0|    GCHVType::rangeUnreachableWriteBarrier(
   70|      0|        data_ + newLength, data_ + len, runtime.getHeap());
   71|      0|    length_.store(newLength, std::memory_order_release);
   72|      0|  }
   73|   816k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE6createERNS0_7RuntimeEj:
  115|    153|SegmentedArrayBase<HVType>::create(Runtime &runtime, size_type capacity) {
  116|    153|  if (LLVM_UNLIKELY(capacity > maxElements())) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  117|      0|    return throwExcessiveCapacityError(runtime, capacity);
  118|      0|  }
  119|       |  // Leave the segments as null. Whenever the size is changed, the segments
  120|       |  // will be allocated. Note that this means the capacity argument won't be
  121|       |  // reflected in capacity() if it is larger than the inline storage space.
  122|       |  // That is in order to avoid having an extra field to track, and the upper
  123|       |  // bound of "size" can be used instead.
  124|    153|  const auto allocSize = allocationSizeForCapacity(capacity);
  125|    153|  return createPseudoHandle(
  126|    153|      runtime.makeAVariable<SegmentedArrayBase>(allocSize));
  127|    153|}
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE8capacityEv:
  160|  1.68M|SegmentedArrayBase<HVType>::capacity() const {
  161|  1.68M|  const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  162|  1.68M|  if (numSlotsUsed <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (162:7): [True: 50.0k, False: 1.63M]
  ------------------
  163|       |    // In the case where the size is less than the number of inline elements,
  164|       |    // the capacity is at most slotCapacity, or the segment threshold if slot
  165|       |    // capacity goes beyond that.
  166|  50.0k|    return std::min(slotCapacity(), size_type{kValueToSegmentThreshold});
  167|  1.63M|  } else {
  168|       |    // Any slot after numSlotsUsed_ is guaranteed to be null.
  169|  1.63M|    return kValueToSegmentThreshold +
  170|  1.63M|        (numSlotsUsed - kValueToSegmentThreshold) * Segment::kMaxLength;
  171|  1.63M|  }
  172|  1.68M|}
_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE20totalCapacityOfSpineEv:
  176|   840k|SegmentedArrayBase<HVType>::totalCapacityOfSpine() const {
  177|   840k|  const auto slotCap = slotCapacity();
  178|   840k|  if (slotCap <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (178:7): [True: 25.0k, False: 815k]
  ------------------
  179|  25.0k|    return slotCap;
  180|   815k|  } else {
  181|   815k|    return kValueToSegmentThreshold +
  182|   815k|        (slotCap - kValueToSegmentThreshold) * Segment::kMaxLength;
  183|   815k|  }
  184|   840k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE9push_backERNS0_13MutableHandleIS3_EERNS0_7RuntimeENS0_6HandleIS2_EE:
  190|   840k|    Handle<> value) {
  191|   840k|  auto oldSize = self->size(runtime);
  192|   840k|  if (growRight(self, runtime, 1) == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (192:7): [True: 0, False: 840k]
  ------------------
  193|      0|    return ExecutionStatus::EXCEPTION;
  194|      0|  }
  195|   840k|  const auto shv = HVType::encodeHermesValue(*value, runtime);
  196|   840k|  auto &elm = self->atRef(runtime, oldSize);
  197|   840k|  new (&elm) GCHVType(shv, runtime.getHeap());
  198|   840k|  return ExecutionStatus::RETURNED;
  199|   840k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE15allocateSegmentERNS0_7RuntimeENS0_6HandleIS3_EEj:
  262|    799|    SegmentNumber segment) {
  263|    799|  assert(
  264|    799|      self->segmentAtPossiblyUnallocated(segment)->isEmpty() &&
  265|    799|      "Allocating into a non-empty segment");
  266|    799|  PseudoHandle<Segment> c = Segment::create(runtime);
  267|    799|  self->segmentAtPossiblyUnallocated(segment)->set(
  268|    799|      HVType::encodeObjectValue(c.get(), runtime), runtime.getHeap());
  269|    799|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE9growRightERNS0_13MutableHandleIS3_EERNS0_7RuntimeEj:
  275|   840k|    size_type amount) {
  276|   840k|  if (self->size(runtime) + amount <= self->totalCapacityOfSpine()) {
  ------------------
  |  Branch (276:7): [True: 840k, False: 138]
  ------------------
  277|   840k|    increaseSize(runtime, self, amount);
  278|   840k|    return ExecutionStatus::RETURNED;
  279|   840k|  }
  280|    138|  const auto newSize = self->size(runtime) + amount;
  281|       |  // Allocate a new SegmentedArray according to the resize policy.
  282|    138|  auto arrRes =
  283|    138|      create(runtime, calculateNewCapacity(self->size(runtime), newSize));
  284|    138|  if (arrRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (284:7): [True: 0, False: 138]
  ------------------
  285|      0|    return ExecutionStatus::EXCEPTION;
  286|      0|  }
  287|    138|  PseudoHandle<SegmentedArrayBase> newSegmentedArray = std::move(*arrRes);
  288|       |  // Copy inline storage and segments over.
  289|       |  // Do this with raw pointers so that the range write barrier occurs.
  290|    138|  const auto numSlotsUsed = self->numSlotsUsed_.load(std::memory_order_relaxed);
  291|    138|  GCHVType::uninitialized_copy(
  292|    138|      self->inlineStorage(),
  293|    138|      self->inlineStorage() + numSlotsUsed,
  294|    138|      newSegmentedArray->inlineStorage(),
  295|    138|      runtime.getHeap());
  296|       |  // Set the size of the new array to be the same as the old array's size.
  297|    138|  newSegmentedArray->numSlotsUsed_.store(
  298|    138|      numSlotsUsed, std::memory_order_release);
  299|    138|  newSegmentedArray =
  300|    138|      increaseSize(runtime, std::move(newSegmentedArray), amount);
  301|       |  // Assign back to self.
  302|    138|  self = newSegmentedArray.get();
  303|    138|  return ExecutionStatus::RETURNED;
  304|    138|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE11shrinkRightERNS0_7RuntimeEj:
  362|     15|    size_type amount) {
  363|     15|  decreaseSize(runtime, amount);
  364|     15|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE26increaseSizeWithinCapacityERNS0_7RuntimeEj:
  380|   839k|    size_type amount) {
  381|       |  // This function has the same logic as increaseSize, but removes some
  382|       |  // complexity from avoiding dealing with alllocations.
  383|   839k|  const auto currSize = size(runtime);
  384|   839k|  const auto finalSize = currSize + amount;
  385|   839k|  assert(
  386|   839k|      finalSize <= capacity() &&
  387|   839k|      "Cannot use increaseSizeWithinCapacity without checking for capacity first");
  388|       |
  389|   839k|  if (finalSize <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (389:7): [True: 25.0k, False: 814k]
  ------------------
  390|       |    // currSize and finalSize are inside inline storage, bump and fill.
  391|  25.0k|    GCHVType::uninitialized_fill(
  392|  25.0k|        inlineStorage() + currSize,
  393|  25.0k|        inlineStorage() + finalSize,
  394|  25.0k|        HVType::encodeEmptyValue(),
  395|  25.0k|        runtime.getHeap());
  396|       |    // Set the final size.
  397|  25.0k|    numSlotsUsed_.store(finalSize, std::memory_order_release);
  398|  25.0k|    return;
  399|  25.0k|  }
  400|       |  // Since this change is within capacity, it is at most filling up a single
  401|       |  // segment.
  402|   814k|  const SegmentNumber segment = toSegment(finalSize - 1);
  403|   814k|  const auto segmentLength = toInterior(finalSize - 1) + 1;
  404|       |  // Fill the inline slots if necessary, and the single segment.
  405|   814k|  if (currSize < kValueToSegmentThreshold) {
  ------------------
  |  Branch (405:7): [True: 0, False: 814k]
  ------------------
  406|      0|    GCHVType::uninitialized_fill(
  407|      0|        inlineStorage() + currSize,
  408|      0|        inlineStorage() + kValueToSegmentThreshold,
  409|      0|        HVType::encodeEmptyValue(),
  410|      0|        runtime.getHeap());
  411|      0|  }
  412|   814k|  segmentAt(runtime, segment)->setLength(runtime, segmentLength);
  413|   814k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE12increaseSizeERNS0_7RuntimeENS0_12PseudoHandleIS3_EEj:
  420|   840k|    size_type amount) {
  421|   840k|  const auto currSize = self->size(runtime);
  422|   840k|  const auto finalSize = currSize + amount;
  423|       |
  424|   840k|  if (finalSize <= self->capacity()) {
  ------------------
  |  Branch (424:7): [True: 839k, False: 799]
  ------------------
  425|   839k|    self->increaseSizeWithinCapacity(runtime, amount);
  426|   839k|    return self;
  427|   839k|  }
  428|       |
  429|       |  // Inline slots must be reserved by the caller. Since finalSize is greater
  430|       |  // than the capacity, we know that it must require adding segments.
  431|    799|  assert(finalSize > kValueToSegmentThreshold);
  432|       |
  433|       |  // currSize might be in inline storage, but finalSize is definitely in
  434|       |  // segments.
  435|       |  // Allocate missing segments after filling inline storage.
  436|    799|  if (currSize <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (436:7): [True: 6, False: 793]
  ------------------
  437|       |    // Segments will need to be allocated, if the old size didn't have the
  438|       |    // inline storage filled up, fill it up now.
  439|      6|    GCHVType::uninitialized_fill(
  440|      6|        self->inlineStorage() + currSize,
  441|      6|        self->inlineStorage() + kValueToSegmentThreshold,
  442|      6|        HVType::encodeEmptyValue(),
  443|      6|        runtime.getHeap());
  444|       |    // Set the size to the inline storage threshold.
  445|      6|    self->numSlotsUsed_.store(
  446|      6|        kValueToSegmentThreshold, std::memory_order_release);
  447|      6|  }
  448|       |
  449|       |  // NOTE: during this function, allocations can happen.
  450|       |  // If one of these allocations triggers a full compacting GC, then the array
  451|       |  // currently being increased might have its capacity shrunk to match its
  452|       |  // numSlotsUsed. So, increase numSlotsUsed immediately to its final value
  453|       |  // before the allocations happen so it isn't shrunk, and also fill with
  454|       |  // empty values so that any mark passes don't fail. The segments should all
  455|       |  // have length 0 until allocations are finished, so that uninitialized
  456|       |  // memory is not scanned inside the segments. Once allocations are finished,
  457|       |  // go back and fixup the lengths.
  458|    799|  const SegmentNumber startSegment =
  459|    799|      currSize <= kValueToSegmentThreshold ? 0 : toSegment(currSize - 1);
  ------------------
  |  Branch (459:7): [True: 6, False: 793]
  ------------------
  460|    799|  const SegmentNumber lastSegment = toSegment(finalSize - 1);
  461|    799|  const auto newNumSlotsUsed = numSlotsForCapacity(finalSize);
  462|       |  // Put empty values into all of the added slots so that the memory is not
  463|       |  // uninitialized during marking.
  464|    799|  GCHVType::uninitialized_fill(
  465|    799|      self->inlineStorage() +
  466|    799|          self->numSlotsUsed_.load(std::memory_order_relaxed),
  467|    799|      self->inlineStorage() + newNumSlotsUsed,
  468|    799|      HVType::encodeEmptyValue(),
  469|    799|      runtime.getHeap());
  470|    799|  self->numSlotsUsed_.store(newNumSlotsUsed, std::memory_order_release);
  471|       |
  472|       |  // Allocate a handle to track the current array.
  473|    799|  auto selfHandle = runtime.makeHandle(std::move(self));
  474|       |  // Allocate each segment.
  475|    799|  if (startSegment <= lastSegment &&
  ------------------
  |  Branch (475:7): [True: 799, False: 0]
  ------------------
  476|    799|      selfHandle->segmentAtPossiblyUnallocated(startSegment)->isEmpty()) {
  ------------------
  |  Branch (476:7): [True: 6, False: 793]
  ------------------
  477|       |    // The start segment might already be allocated if it was half full when
  478|       |    // we increase the size.
  479|      6|    allocateSegment(runtime, selfHandle, startSegment);
  480|      6|  }
  481|  1.59k|  for (auto i = startSegment + 1; i <= lastSegment; ++i) {
  ------------------
  |  Branch (481:35): [True: 793, False: 799]
  ------------------
  482|       |    // All segments except the start need to become allocated.
  483|    793|    allocateSegment(runtime, selfHandle, i);
  484|    793|  }
  485|       |
  486|       |  // Now that all allocations have occurred, set the lengths inside each
  487|       |  // segment, and optionally fill.
  488|  2.39k|  for (auto i = startSegment; i <= lastSegment; ++i) {
  ------------------
  |  Branch (488:31): [True: 1.59k, False: 799]
  ------------------
  489|       |    // If its the last chunk, set to the length required by any leftover
  490|       |    // elements.
  491|  1.59k|    const auto segmentLength =
  492|  1.59k|        i == lastSegment ? toInterior(finalSize - 1) + 1 : Segment::kMaxLength;
  ------------------
  |  Branch (492:9): [True: 799, False: 793]
  ------------------
  493|  1.59k|    selfHandle->segmentAt(runtime, i)->setLength(runtime, segmentLength);
  494|  1.59k|  }
  495|    799|  self = selfHandle;
  496|    799|  return self;
  497|    799|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE12decreaseSizeERNS0_7RuntimeEj:
  502|     15|    size_type amount) {
  503|     15|  const auto initialSize = size(runtime);
  504|     15|  const auto initialNumSlots = numSlotsUsed_.load(std::memory_order_relaxed);
  505|     15|  assert(amount <= initialSize && "Cannot decrease size past zero");
  506|     15|  const auto finalSize = initialSize - amount;
  507|     15|  const auto finalNumSlots = numSlotsForCapacity(finalSize);
  508|     15|  assert(
  509|     15|      finalNumSlots <= initialNumSlots &&
  510|     15|      "Should not be increasing the number of slots");
  511|     15|  if (finalSize > kValueToSegmentThreshold) {
  ------------------
  |  Branch (511:7): [True: 0, False: 15]
  ------------------
  512|       |    // Set the new last used segment's length to be the leftover.
  513|      0|    segmentAt(runtime, toSegment(finalSize - 1))
  514|      0|        ->setLength(runtime, toInterior(finalSize - 1) + 1);
  515|      0|  }
  516|       |  // Before shrinking, do a snapshot write barrier for the elements being
  517|       |  // removed.
  518|     15|  GCHVType::rangeUnreachableWriteBarrier(
  519|     15|      inlineStorage() + finalNumSlots,
  520|     15|      inlineStorage() + initialNumSlots,
  521|     15|      runtime.getHeap());
  522|     15|  numSlotsUsed_.store(finalNumSlots, std::memory_order_release);
  523|     15|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment6createERNS0_7RuntimeE:
   47|  2.23k|SegmentedArrayBase<HVType>::Segment::create(Runtime &runtime) {
   48|       |  // NOTE: This needs to live in the cpp file instead of the header because it
   49|       |  // uses PseudoHandle, which requires a specialization of IsGCObject for the
   50|       |  // type it constructs.
   51|  2.23k|  return createPseudoHandle(runtime.makeAFixed<Segment>());
   52|  2.23k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment9setLengthERNS0_7RuntimeEj:
   57|  1.33M|    uint32_t newLength) {
   58|  1.33M|  const auto len = length();
   59|  1.33M|  if (newLength > len) {
  ------------------
  |  Branch (59:7): [True: 1.33M, False: 1.29k]
  ------------------
   60|       |    // Length is increasing, fill with emptys.
   61|  1.33M|    GCHVType::uninitialized_fill(
   62|  1.33M|        data_ + len,
   63|  1.33M|        data_ + newLength,
   64|  1.33M|        HVType::encodeEmptyValue(),
   65|  1.33M|        runtime.getHeap());
   66|  1.33M|    length_.store(newLength, std::memory_order_release);
   67|  1.33M|  } else if (newLength < len) {
  ------------------
  |  Branch (67:14): [True: 0, False: 1.29k]
  ------------------
   68|       |    // If length is decreasing a write barrier needs to be done.
   69|      0|    GCHVType::rangeUnreachableWriteBarrier(
   70|      0|        data_ + newLength, data_ + len, runtime.getHeap());
   71|      0|    length_.store(newLength, std::memory_order_release);
   72|      0|  }
   73|  1.33M|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEj:
  115|   663k|SegmentedArrayBase<HVType>::create(Runtime &runtime, size_type capacity) {
  116|   663k|  if (LLVM_UNLIKELY(capacity > maxElements())) {
  ------------------
  |  |  189|   663k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 663k]
  |  |  ------------------
  ------------------
  117|      0|    return throwExcessiveCapacityError(runtime, capacity);
  118|      0|  }
  119|       |  // Leave the segments as null. Whenever the size is changed, the segments
  120|       |  // will be allocated. Note that this means the capacity argument won't be
  121|       |  // reflected in capacity() if it is larger than the inline storage space.
  122|       |  // That is in order to avoid having an extra field to track, and the upper
  123|       |  // bound of "size" can be used instead.
  124|   663k|  const auto allocSize = allocationSizeForCapacity(capacity);
  125|   663k|  return createPseudoHandle(
  126|   663k|      runtime.makeAVariable<SegmentedArrayBase>(allocSize));
  127|   663k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEjj:
  146|      1|    HVType>::create(Runtime &runtime, size_type capacity, size_type size) {
  147|      1|  auto arrRes = create(runtime, capacity);
  148|      1|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  149|      0|    return ExecutionStatus::EXCEPTION;
  150|      0|  }
  151|      1|  PseudoHandle<SegmentedArrayBase> self = std::move(*arrRes);
  152|       |  // TODO T25663446: This is potentially optimizable to iterate over the
  153|       |  // inline storage and the segments separately.
  154|      1|  self = increaseSize(runtime, std::move(self), size);
  155|      1|  return self;
  156|      1|}
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8capacityEv:
  160|  6.29M|SegmentedArrayBase<HVType>::capacity() const {
  161|  6.29M|  const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  162|  6.29M|  if (numSlotsUsed <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (162:7): [True: 2.29M, False: 4.00M]
  ------------------
  163|       |    // In the case where the size is less than the number of inline elements,
  164|       |    // the capacity is at most slotCapacity, or the segment threshold if slot
  165|       |    // capacity goes beyond that.
  166|  2.29M|    return std::min(slotCapacity(), size_type{kValueToSegmentThreshold});
  167|  4.00M|  } else {
  168|       |    // Any slot after numSlotsUsed_ is guaranteed to be null.
  169|  4.00M|    return kValueToSegmentThreshold +
  170|  4.00M|        (numSlotsUsed - kValueToSegmentThreshold) * Segment::kMaxLength;
  171|  4.00M|  }
  172|  6.29M|}
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE20totalCapacityOfSpineEv:
  176|   273k|SegmentedArrayBase<HVType>::totalCapacityOfSpine() const {
  177|   273k|  const auto slotCap = slotCapacity();
  178|   273k|  if (slotCap <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (178:7): [True: 271k, False: 1.33k]
  ------------------
  179|   271k|    return slotCap;
  180|   271k|  } else {
  181|  1.33k|    return kValueToSegmentThreshold +
  182|  1.33k|        (slotCap - kValueToSegmentThreshold) * Segment::kMaxLength;
  183|  1.33k|  }
  184|   273k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE6resizeERNS0_13MutableHandleIS3_EERNS0_7RuntimeEj:
  205|   273k|    size_type newSize) {
  206|   273k|  if (newSize > self->size(runtime)) {
  ------------------
  |  Branch (206:7): [True: 273k, False: 0]
  ------------------
  207|   273k|    return growRight(self, runtime, newSize - self->size(runtime));
  208|   273k|  } else if (newSize < self->size(runtime)) {
  ------------------
  |  Branch (208:14): [True: 0, False: 0]
  ------------------
  209|      0|    self->shrinkRight(runtime, self->size(runtime) - newSize);
  210|      0|  }
  211|      0|  return ExecutionStatus::RETURNED;
  212|   273k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE20resizeWithinCapacityEPS3_RNS0_7RuntimeEj:
  233|  1.82M|    size_type newSize) {
  234|  1.82M|  const size_type currSize = self->size(runtime);
  235|  1.82M|  assert(
  236|  1.82M|      newSize <= self->capacity() &&
  237|  1.82M|      "Cannot resizeWithinCapacity to a size not within capacity");
  238|  1.82M|  if (newSize > currSize) {
  ------------------
  |  Branch (238:7): [True: 1.82M, False: 0]
  ------------------
  239|  1.82M|    self->increaseSizeWithinCapacity(runtime, newSize - currSize);
  240|  1.82M|  } else if (newSize < currSize) {
  ------------------
  |  Branch (240:14): [True: 0, False: 0]
  ------------------
  241|      0|    self->shrinkRight(runtime, currSize - newSize);
  242|      0|  }
  243|  1.82M|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE15allocateSegmentERNS0_7RuntimeENS0_6HandleIS3_EEj:
  262|  2.23k|    SegmentNumber segment) {
  263|  2.23k|  assert(
  264|  2.23k|      self->segmentAtPossiblyUnallocated(segment)->isEmpty() &&
  265|  2.23k|      "Allocating into a non-empty segment");
  266|  2.23k|  PseudoHandle<Segment> c = Segment::create(runtime);
  267|  2.23k|  self->segmentAtPossiblyUnallocated(segment)->set(
  268|  2.23k|      HVType::encodeObjectValue(c.get(), runtime), runtime.getHeap());
  269|  2.23k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9growRightERNS0_13MutableHandleIS3_EERNS0_7RuntimeEj:
  275|   273k|    size_type amount) {
  276|   273k|  if (self->size(runtime) + amount <= self->totalCapacityOfSpine()) {
  ------------------
  |  Branch (276:7): [True: 273k, False: 13]
  ------------------
  277|   273k|    increaseSize(runtime, self, amount);
  278|   273k|    return ExecutionStatus::RETURNED;
  279|   273k|  }
  280|     13|  const auto newSize = self->size(runtime) + amount;
  281|       |  // Allocate a new SegmentedArray according to the resize policy.
  282|     13|  auto arrRes =
  283|     13|      create(runtime, calculateNewCapacity(self->size(runtime), newSize));
  284|     13|  if (arrRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (284:7): [True: 0, False: 13]
  ------------------
  285|      0|    return ExecutionStatus::EXCEPTION;
  286|      0|  }
  287|     13|  PseudoHandle<SegmentedArrayBase> newSegmentedArray = std::move(*arrRes);
  288|       |  // Copy inline storage and segments over.
  289|       |  // Do this with raw pointers so that the range write barrier occurs.
  290|     13|  const auto numSlotsUsed = self->numSlotsUsed_.load(std::memory_order_relaxed);
  291|     13|  GCHVType::uninitialized_copy(
  292|     13|      self->inlineStorage(),
  293|     13|      self->inlineStorage() + numSlotsUsed,
  294|     13|      newSegmentedArray->inlineStorage(),
  295|     13|      runtime.getHeap());
  296|       |  // Set the size of the new array to be the same as the old array's size.
  297|     13|  newSegmentedArray->numSlotsUsed_.store(
  298|     13|      numSlotsUsed, std::memory_order_release);
  299|     13|  newSegmentedArray =
  300|     13|      increaseSize(runtime, std::move(newSegmentedArray), amount);
  301|       |  // Assign back to self.
  302|     13|  self = newSegmentedArray.get();
  303|     13|  return ExecutionStatus::RETURNED;
  304|     13|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE26increaseSizeWithinCapacityERNS0_7RuntimeEj:
  380|  2.09M|    size_type amount) {
  381|       |  // This function has the same logic as increaseSize, but removes some
  382|       |  // complexity from avoiding dealing with alllocations.
  383|  2.09M|  const auto currSize = size(runtime);
  384|  2.09M|  const auto finalSize = currSize + amount;
  385|  2.09M|  assert(
  386|  2.09M|      finalSize <= capacity() &&
  387|  2.09M|      "Cannot use increaseSizeWithinCapacity without checking for capacity first");
  388|       |
  389|  2.09M|  if (finalSize <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (389:7): [True: 766k, False: 1.33M]
  ------------------
  390|       |    // currSize and finalSize are inside inline storage, bump and fill.
  391|   766k|    GCHVType::uninitialized_fill(
  392|   766k|        inlineStorage() + currSize,
  393|   766k|        inlineStorage() + finalSize,
  394|   766k|        HVType::encodeEmptyValue(),
  395|   766k|        runtime.getHeap());
  396|       |    // Set the final size.
  397|   766k|    numSlotsUsed_.store(finalSize, std::memory_order_release);
  398|   766k|    return;
  399|   766k|  }
  400|       |  // Since this change is within capacity, it is at most filling up a single
  401|       |  // segment.
  402|  1.33M|  const SegmentNumber segment = toSegment(finalSize - 1);
  403|  1.33M|  const auto segmentLength = toInterior(finalSize - 1) + 1;
  404|       |  // Fill the inline slots if necessary, and the single segment.
  405|  1.33M|  if (currSize < kValueToSegmentThreshold) {
  ------------------
  |  Branch (405:7): [True: 0, False: 1.33M]
  ------------------
  406|      0|    GCHVType::uninitialized_fill(
  407|      0|        inlineStorage() + currSize,
  408|      0|        inlineStorage() + kValueToSegmentThreshold,
  409|      0|        HVType::encodeEmptyValue(),
  410|      0|        runtime.getHeap());
  411|      0|  }
  412|  1.33M|  segmentAt(runtime, segment)->setLength(runtime, segmentLength);
  413|  1.33M|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE12increaseSizeERNS0_7RuntimeENS0_12PseudoHandleIS3_EEj:
  420|   273k|    size_type amount) {
  421|   273k|  const auto currSize = self->size(runtime);
  422|   273k|  const auto finalSize = currSize + amount;
  423|       |
  424|   273k|  if (finalSize <= self->capacity()) {
  ------------------
  |  Branch (424:7): [True: 271k, False: 1.33k]
  ------------------
  425|   271k|    self->increaseSizeWithinCapacity(runtime, amount);
  426|   271k|    return self;
  427|   271k|  }
  428|       |
  429|       |  // Inline slots must be reserved by the caller. Since finalSize is greater
  430|       |  // than the capacity, we know that it must require adding segments.
  431|  1.33k|  assert(finalSize > kValueToSegmentThreshold);
  432|       |
  433|       |  // currSize might be in inline storage, but finalSize is definitely in
  434|       |  // segments.
  435|       |  // Allocate missing segments after filling inline storage.
  436|  1.33k|  if (currSize <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (436:7): [True: 39, False: 1.29k]
  ------------------
  437|       |    // Segments will need to be allocated, if the old size didn't have the
  438|       |    // inline storage filled up, fill it up now.
  439|     39|    GCHVType::uninitialized_fill(
  440|     39|        self->inlineStorage() + currSize,
  441|     39|        self->inlineStorage() + kValueToSegmentThreshold,
  442|     39|        HVType::encodeEmptyValue(),
  443|     39|        runtime.getHeap());
  444|       |    // Set the size to the inline storage threshold.
  445|     39|    self->numSlotsUsed_.store(
  446|     39|        kValueToSegmentThreshold, std::memory_order_release);
  447|     39|  }
  448|       |
  449|       |  // NOTE: during this function, allocations can happen.
  450|       |  // If one of these allocations triggers a full compacting GC, then the array
  451|       |  // currently being increased might have its capacity shrunk to match its
  452|       |  // numSlotsUsed. So, increase numSlotsUsed immediately to its final value
  453|       |  // before the allocations happen so it isn't shrunk, and also fill with
  454|       |  // empty values so that any mark passes don't fail. The segments should all
  455|       |  // have length 0 until allocations are finished, so that uninitialized
  456|       |  // memory is not scanned inside the segments. Once allocations are finished,
  457|       |  // go back and fixup the lengths.
  458|  1.33k|  const SegmentNumber startSegment =
  459|  1.33k|      currSize <= kValueToSegmentThreshold ? 0 : toSegment(currSize - 1);
  ------------------
  |  Branch (459:7): [True: 39, False: 1.29k]
  ------------------
  460|  1.33k|  const SegmentNumber lastSegment = toSegment(finalSize - 1);
  461|  1.33k|  const auto newNumSlotsUsed = numSlotsForCapacity(finalSize);
  462|       |  // Put empty values into all of the added slots so that the memory is not
  463|       |  // uninitialized during marking.
  464|  1.33k|  GCHVType::uninitialized_fill(
  465|  1.33k|      self->inlineStorage() +
  466|  1.33k|          self->numSlotsUsed_.load(std::memory_order_relaxed),
  467|  1.33k|      self->inlineStorage() + newNumSlotsUsed,
  468|  1.33k|      HVType::encodeEmptyValue(),
  469|  1.33k|      runtime.getHeap());
  470|  1.33k|  self->numSlotsUsed_.store(newNumSlotsUsed, std::memory_order_release);
  471|       |
  472|       |  // Allocate a handle to track the current array.
  473|  1.33k|  auto selfHandle = runtime.makeHandle(std::move(self));
  474|       |  // Allocate each segment.
  475|  1.33k|  if (startSegment <= lastSegment &&
  ------------------
  |  Branch (475:7): [True: 1.33k, False: 0]
  ------------------
  476|  1.33k|      selfHandle->segmentAtPossiblyUnallocated(startSegment)->isEmpty()) {
  ------------------
  |  Branch (476:7): [True: 39, False: 1.29k]
  ------------------
  477|       |    // The start segment might already be allocated if it was half full when
  478|       |    // we increase the size.
  479|     39|    allocateSegment(runtime, selfHandle, startSegment);
  480|     39|  }
  481|  3.52k|  for (auto i = startSegment + 1; i <= lastSegment; ++i) {
  ------------------
  |  Branch (481:35): [True: 2.19k, False: 1.33k]
  ------------------
  482|       |    // All segments except the start need to become allocated.
  483|  2.19k|    allocateSegment(runtime, selfHandle, i);
  484|  2.19k|  }
  485|       |
  486|       |  // Now that all allocations have occurred, set the lengths inside each
  487|       |  // segment, and optionally fill.
  488|  4.86k|  for (auto i = startSegment; i <= lastSegment; ++i) {
  ------------------
  |  Branch (488:31): [True: 3.52k, False: 1.33k]
  ------------------
  489|       |    // If its the last chunk, set to the length required by any leftover
  490|       |    // elements.
  491|  3.52k|    const auto segmentLength =
  492|  3.52k|        i == lastSegment ? toInterior(finalSize - 1) + 1 : Segment::kMaxLength;
  ------------------
  |  Branch (492:9): [True: 1.33k, False: 2.19k]
  ------------------
  493|  3.52k|    selfHandle->segmentAt(runtime, i)->setLength(runtime, segmentLength);
  494|  3.52k|  }
  495|  1.33k|  self = selfHandle;
  496|  1.33k|  return self;
  497|  1.33k|}
_ZN6hermes2vm16SegmentBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   34|      1|void SegmentBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   35|      1|  const auto *self = static_cast<const SegmentedArray::Segment *>(cell);
   36|      1|  mb.setVTable(&SegmentedArray::Segment::vt);
   37|      1|  mb.addArray("data", self->data_, &self->length_, sizeof(GCHermesValue));
   38|      1|}
_ZN6hermes2vm21SegmentSmallBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   39|      1|void SegmentSmallBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   40|      1|  const auto *self = static_cast<const SegmentedArraySmall::Segment *>(cell);
   41|      1|  mb.setVTable(&SegmentedArraySmall::Segment::vt);
   42|      1|  mb.addArray("data", self->data_, &self->length_, sizeof(GCSmallHermesValue));
   43|      1|}
_ZN6hermes2vm23SegmentedArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   93|      1|void SegmentedArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   94|      1|  const auto *self = static_cast<const SegmentedArray *>(cell);
   95|      1|  mb.setVTable(&SegmentedArray::vt);
   96|      1|  mb.addArray(
   97|      1|      "slots",
   98|      1|      self->inlineStorage(),
   99|      1|      &self->numSlotsUsed_,
  100|      1|      sizeof(GCHermesValue));
  101|      1|}
_ZN6hermes2vm28SegmentedArraySmallBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  103|      1|void SegmentedArraySmallBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  104|      1|  const auto *self = static_cast<const SegmentedArraySmall *>(cell);
  105|      1|  mb.setVTable(&SegmentedArraySmall::vt);
  106|      1|  mb.addArray(
  107|      1|      "slots",
  108|      1|      self->inlineStorage(),
  109|      1|      &self->numSlotsUsed_,
  110|      1|      sizeof(GCSmallHermesValue));
  111|      1|}

_ZN6hermes2vm23SerializedLiteralParser3getERNS0_7RuntimeE:
   21|   411k|HermesValue SerializedLiteralParser::get(Runtime &) {
   22|   411k|  assert(hasNext() && "Object buffer doesn't have any more values");
   23|       |
   24|   411k|  if (leftInSeq_ == 0)
  ------------------
  |  Branch (24:7): [True: 134, False: 411k]
  ------------------
   25|    134|    parseTagAndSeqLength();
   26|   411k|  leftInSeq_--;
   27|   411k|  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|   411k|  switch (lastTag_) {
  ------------------
  |  Branch (32:11): [True: 0, False: 411k]
  ------------------
   33|      0|    case SLG::ByteStringTag: {
  ------------------
  |  Branch (33:5): [True: 0, False: 411k]
  ------------------
   34|      0|      uint8_t val = llvh::support::endian::read<uint8_t, 1>(
   35|      0|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   36|      0|      currIdx_ += 1;
   37|      0|      return runtimeModule_ == nullptr
  ------------------
  |  Branch (37:14): [True: 0, False: 0]
  ------------------
   38|      0|          ? HermesValue::encodeSymbolValue(SymbolID::unsafeCreate(val))
   39|      0|          : HermesValue::encodeStringValue(
   40|      0|                runtimeModule_->getStringPrimFromStringIDMayAllocate(val));
   41|      0|    }
   42|      0|    case SLG::ShortStringTag: {
  ------------------
  |  Branch (42:5): [True: 0, False: 411k]
  ------------------
   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: 411k]
  ------------------
   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|     12|    case SLG::NumberTag: {
  ------------------
  |  Branch (60:5): [True: 12, False: 411k]
  ------------------
   61|     12|      double val = llvh::support::endian::read<double, 1>(
   62|     12|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   63|     12|      currIdx_ += 8;
   64|     12|      return HermesValue::encodeUntrustedNumberValue(val);
   65|      0|    }
   66|   411k|    case SLG::IntegerTag: {
  ------------------
  |  Branch (66:5): [True: 411k, False: 12]
  ------------------
   67|   411k|      int32_t val = llvh::support::endian::read<int32_t, 1>(
   68|   411k|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   69|   411k|      currIdx_ += 4;
   70|   411k|      return HermesValue::encodeUntrustedNumberValue(val);
   71|      0|    }
   72|      0|    case SLG::NullTag:
  ------------------
  |  Branch (72:5): [True: 0, False: 411k]
  ------------------
   73|      0|      return HermesValue::encodeNullValue();
   74|      0|    case SLG::TrueTag:
  ------------------
  |  Branch (74:5): [True: 0, False: 411k]
  ------------------
   75|      0|      return HermesValue::encodeBoolValue(true);
   76|      0|    case SLG::FalseTag:
  ------------------
  |  Branch (76:5): [True: 0, False: 411k]
  ------------------
   77|      0|      return HermesValue::encodeBoolValue(false);
   78|   411k|  }
   79|      0|  llvm_unreachable("No other valid tag");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   80|   411k|}

_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:
  199|    160|StorageProvider::~StorageProvider() {
  200|    160|  assert(numLiveAllocs() == 0);
  201|    160|}
_ZN6hermes2vm15StorageProvider20contiguousVAProviderEm:
  210|    160|    size_t size) {
  211|    160|  return std::make_unique<ContiguousVAStorageProvider>(size);
  212|    160|}
_ZN6hermes2vm15StorageProvider10newStorageEPKc:
  219|    480|llvh::ErrorOr<void *> StorageProvider::newStorage(const char *name) {
  220|    480|  auto res = newStorageImpl(name);
  221|       |
  222|    480|  if (res) {
  ------------------
  |  Branch (222:7): [True: 480, False: 0]
  ------------------
  223|    480|    numSucceededAllocs_++;
  224|    480|  } else {
  225|      0|    numFailedAllocs_++;
  226|      0|  }
  227|       |
  228|    480|  return res;
  229|    480|}
_ZN6hermes2vm15StorageProvider13deleteStorageEPv:
  231|    480|void StorageProvider::deleteStorage(void *storage) {
  232|    480|  if (!storage) {
  ------------------
  |  Branch (232:7): [True: 0, False: 480]
  ------------------
  233|      0|    return;
  234|      0|  }
  235|       |
  236|    480|  numDeletedAllocs_++;
  237|    480|  deleteStorageImpl(storage);
  238|    480|}
_ZNK6hermes2vm15StorageProvider13numLiveAllocsEv:
  283|    160|size_t StorageProvider::numLiveAllocs() const {
  284|    160|  return numSucceededAllocs_ - numDeletedAllocs_;
  285|    160|}
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_110alignAllocEPv:
   67|    160|char *alignAlloc(void *p) {
   68|    160|  return reinterpret_cast<char *>(
   69|    160|      llvh::alignTo(reinterpret_cast<uintptr_t>(p), AlignedStorage::size()));
   70|    160|}
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_111getMmapHintEv:
   72|    160|void *getMmapHint() {
   73|    160|  uintptr_t addr = std::random_device()();
   74|    160|  if constexpr (sizeof(uintptr_t) >= 8) {
   75|       |    // std::random_device() yields an unsigned int, so combine two.
   76|    160|    addr = (addr << 32) | std::random_device()();
   77|       |    // Don't use the entire address space, to ensure this is a valid address.
   78|    160|    addr &= MAX_ADDR_HINT;
  ------------------
  |  |   45|    160|#define MAX_ADDR_HINT 0x3FFFFFFFFFFF
  ------------------
   79|    160|  }
   80|    160|  return alignAlloc(reinterpret_cast<void *>(addr));
   81|    160|}
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProviderC2Em:
   92|    160|      : size_(llvh::alignTo<AlignedStorage::size()>(size)) {
   93|    160|    auto result = oscompat::vm_reserve_aligned(
   94|    160|        size_, AlignedStorage::size(), getMmapHint());
   95|    160|    if (!result)
  ------------------
  |  Branch (95:9): [True: 0, False: 160]
  ------------------
   96|      0|      hermes_fatal("Contiguous storage allocation failed.", result.getError());
   97|    160|    level_ = start_ = static_cast<char *>(*result);
   98|    160|    oscompat::vm_name(start_, size_, kFreeRegionName);
   99|    160|  }
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProviderD2Ev:
  100|    160|  ~ContiguousVAStorageProvider() override {
  101|    160|    oscompat::vm_release_aligned(start_, size_);
  102|    160|  }
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProvider14newStorageImplEPKc:
  104|    480|  llvh::ErrorOr<void *> newStorageImpl(const char *name) override {
  105|    480|    void *storage;
  106|    480|    if (!freelist_.empty()) {
  ------------------
  |  Branch (106:9): [True: 0, False: 480]
  ------------------
  107|      0|      storage = freelist_.back();
  108|      0|      freelist_.pop_back();
  109|    480|    } else if (level_ < start_ + size_) {
  ------------------
  |  Branch (109:16): [True: 480, False: 0]
  ------------------
  110|    480|      storage = std::exchange(level_, level_ + AlignedStorage::size());
  111|    480|    } else {
  112|      0|      return make_error_code(OOMError::MaxStorageReached);
  113|      0|    }
  114|    480|    auto res = oscompat::vm_commit(storage, AlignedStorage::size());
  115|    480|    if (res) {
  ------------------
  |  Branch (115:9): [True: 480, False: 0]
  ------------------
  116|    480|      oscompat::vm_name(storage, AlignedStorage::size(), name);
  117|    480|    }
  118|    480|    return res;
  119|    480|  }
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProvider17deleteStorageImplEPv:
  121|    480|  void deleteStorageImpl(void *storage) override {
  122|    480|    assert(
  123|    480|        !llvh::alignmentAdjustment(storage, AlignedStorage::size()) &&
  124|    480|        "Storage not aligned");
  125|    480|    assert(storage >= start_ && storage < level_ && "Storage not in region");
  126|    480|    oscompat::vm_name(storage, AlignedStorage::size(), kFreeRegionName);
  127|    480|    oscompat::vm_uncommit(storage, AlignedStorage::size());
  128|    480|    freelist_.push_back(storage);
  129|    480|  }

_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EEC2EN4llvh8ArrayRefIDsEE:
  413|  20.4k|    : DynamicStringPrimitive((uint32_t)src.size()) {
  414|  20.4k|  hermes::uninitializedCopy(
  415|  20.4k|      src.begin(), src.end(), this->template getTrailingObjects<T>());
  416|  20.4k|}
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE6createERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  421|      3|    Ref str) {
  422|      3|  assert(!isExternalLength(str.size()) && "length should not be external");
  423|      3|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  424|      3|      allocationSize((uint32_t)str.size()), str);
  425|      3|  return HermesValue::encodeStringValue(cell);
  426|      3|}
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  431|  20.4k|    Ref str) {
  432|  20.4k|  assert(!isExternalLength(str.size()) && "length should not be external");
  433|  20.4k|  auto *obj = runtime.makeAVariable<
  434|  20.4k|      DynamicStringPrimitive<T, Uniqued>,
  435|  20.4k|      HasFinalizer::No,
  436|  20.4k|      LongLived::Yes>(allocationSize((uint32_t)str.size()), str);
  437|  20.4k|  return HermesValue::encodeStringValue(obj);
  438|  20.4k|}
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE6createERNS0_7RuntimeEj:
  443|   390k|    uint32_t length) {
  444|   390k|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  445|   390k|      allocationSize(length), length);
  446|   390k|  return HermesValue::encodeStringValue(cell);
  447|   390k|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EEC2EN4llvh8ArrayRefIcEE:
  413|  2.12M|    : DynamicStringPrimitive((uint32_t)src.size()) {
  414|  2.12M|  hermes::uninitializedCopy(
  415|  2.12M|      src.begin(), src.end(), this->template getTrailingObjects<T>());
  416|  2.12M|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE6createERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  421|  2.10M|    Ref str) {
  422|  2.10M|  assert(!isExternalLength(str.size()) && "length should not be external");
  423|  2.10M|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  424|  2.10M|      allocationSize((uint32_t)str.size()), str);
  425|  2.10M|  return HermesValue::encodeStringValue(cell);
  426|  2.10M|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  431|  20.4k|    Ref str) {
  432|  20.4k|  assert(!isExternalLength(str.size()) && "length should not be external");
  433|  20.4k|  auto *obj = runtime.makeAVariable<
  434|  20.4k|      DynamicStringPrimitive<T, Uniqued>,
  435|  20.4k|      HasFinalizer::No,
  436|  20.4k|      LongLived::Yes>(allocationSize((uint32_t)str.size()), str);
  437|  20.4k|  return HermesValue::encodeStringValue(obj);
  438|  20.4k|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE6createERNS0_7RuntimeEj:
  443|  1.95M|    uint32_t length) {
  444|  1.95M|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  445|  1.95M|      allocationSize(length), length);
  446|  1.95M|  return HermesValue::encodeStringValue(cell);
  447|  1.95M|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE15createLongLivedERNS0_7RuntimeEONSt3__112basic_stringIDsNS5_11char_traitsIDsEENS5_9allocatorIDsEEEE:
  496|     11|    StdString &&str) {
  497|     11|  if (LLVM_UNLIKELY(str.size() > MAX_STRING_LENGTH))
  ------------------
  |  |  189|     11|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  498|      0|    return runtime.raiseRangeError("String length exceeds limit");
  499|     11|  if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(
  ------------------
  |  |  189|     11|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  500|     11|          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|     11|  auto *extStr = runtime.makeAVariable<
  507|     11|      ExternalStringPrimitive<T>,
  508|     11|      HasFinalizer::Yes,
  509|     11|      LongLived::Yes>(sizeof(ExternalStringPrimitive<T>), std::move(str));
  510|     11|  runtime.getHeap().creditExternalMemory(
  511|     11|      extStr, extStr->calcExternalMemorySize());
  512|     11|  return HermesValue::encodeStringValue(extStr);
  513|     11|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE6createERNS0_7RuntimeEj:
  518|    202|    uint32_t length) {
  519|    202|  assert(isExternalLength(length) && "length should be external");
  520|    202|  if (LLVM_UNLIKELY(length > MAX_STRING_LENGTH))
  ------------------
  |  |  189|    202|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 202]
  |  |  ------------------
  ------------------
  521|      0|    return runtime.raiseRangeError("String length exceeds limit");
  522|    202|  uint32_t allocSize = length * sizeof(T);
  523|    202|  if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(allocSize))) {
  ------------------
  |  |  189|    202|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 202]
  |  |  ------------------
  ------------------
  524|      0|    return runtime.raiseRangeError(
  525|      0|        "Cannot allocate an external string primitive.");
  526|      0|  }
  527|    202|  return create(runtime, StdString(length, T(0)));
  528|    202|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  531|    263|void ExternalStringPrimitive<T>::_finalizeImpl(GCCell *cell, GC &gc) {
  532|    263|  ExternalStringPrimitive<T> *self = vmcast<ExternalStringPrimitive<T>>(cell);
  533|       |  // Remove the external string from the snapshot tracking system if it's being
  534|       |  // tracked.
  535|    263|  gc.getIDTracker().untrackNative(self->contents_.data());
  536|    263|  gc.debitExternalMemory(self, self->calcExternalMemorySize());
  537|    263|  self->~ExternalStringPrimitive<T>();
  538|    263|}
_ZN6hermes2vm23ExternalStringPrimitiveIcE15createLongLivedERNS0_7RuntimeEONSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
  496|     28|    StdString &&str) {
  497|     28|  if (LLVM_UNLIKELY(str.size() > MAX_STRING_LENGTH))
  ------------------
  |  |  189|     28|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 28]
  |  |  ------------------
  ------------------
  498|      0|    return runtime.raiseRangeError("String length exceeds limit");
  499|     28|  if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(
  ------------------
  |  |  189|     28|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 28]
  |  |  ------------------
  ------------------
  500|     28|          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|     28|  auto *extStr = runtime.makeAVariable<
  507|     28|      ExternalStringPrimitive<T>,
  508|     28|      HasFinalizer::Yes,
  509|     28|      LongLived::Yes>(sizeof(ExternalStringPrimitive<T>), std::move(str));
  510|     28|  runtime.getHeap().creditExternalMemory(
  511|     28|      extStr, extStr->calcExternalMemorySize());
  512|     28|  return HermesValue::encodeStringValue(extStr);
  513|     28|}
_ZN6hermes2vm23ExternalStringPrimitiveIcE13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  531|     28|void ExternalStringPrimitive<T>::_finalizeImpl(GCCell *cell, GC &gc) {
  532|     28|  ExternalStringPrimitive<T> *self = vmcast<ExternalStringPrimitive<T>>(cell);
  533|       |  // Remove the external string from the snapshot tracking system if it's being
  534|       |  // tracked.
  535|     28|  gc.getIDTracker().untrackNative(self->contents_.data());
  536|     28|  gc.debitExternalMemory(self, self->calcExternalMemorySize());
  537|     28|  self->~ExternalStringPrimitive<T>();
  538|     28|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE6createINSt3__112basic_stringIDsNS4_11char_traitsIDsEENS4_9allocatorIDsEEEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeEOT_:
  475|    252|    BasicString &&str) {
  476|    252|  static_assert(
  477|    252|      std::is_same<T, typename BasicString::value_type>::value,
  478|    252|      "ExternalStringPrimitive mismatched char type");
  479|    252|  if (LLVM_UNLIKELY(str.size() > MAX_STRING_LENGTH))
  ------------------
  |  |  189|    252|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 252]
  |  |  ------------------
  ------------------
  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|    252|  auto *extStr =
  485|    252|      runtime.makeAVariable<ExternalStringPrimitive<T>, HasFinalizer::Yes>(
  486|    252|          sizeof(ExternalStringPrimitive<T>), std::forward<BasicString>(str));
  487|    252|  runtime.getHeap().creditExternalMemory(
  488|    252|      extStr, extStr->calcExternalMemorySize());
  489|    252|  auto res = HermesValue::encodeStringValue(extStr);
  490|    252|  return res;
  491|    252|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE6createERNS0_7RuntimeEjNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEE:
  608|     31|    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|     31|  auto *cell = runtime.makeAVariable<BufferedStringPrimitive<T>>(
  613|     31|      sizeof(BufferedStringPrimitive<T>), runtime, length, storage);
  614|     31|  return createPseudoHandle<StringPrimitive>(cell);
  615|     31|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE6appendENS0_6HandleIS2_EERNS0_7RuntimeENS3_INS0_15StringPrimitiveEEE:
  682|     29|    Handle<StringPrimitive> rightHnd) {
  683|     29|  NoAllocScope noAlloc{runtime};
  684|     29|  auto *self = selfHnd.get();
  685|     29|  auto *right = rightHnd.get();
  686|     29|  ExternalStringPrimitive<T> *storage = self->getConcatBuffer();
  687|       |
  688|     29|  assertValidLength(self, right);
  689|     29|  assert(
  690|     29|      (std::is_same<T, char16_t>::value || right->isASCII()) &&
  691|     29|      "cannot append UTF16 to ASCII");
  692|       |
  693|       |  // Can't append if this is not the end of the string.
  694|     29|  if (self->getStringLength() != storage->contents_.size()) {
  ------------------
  |  Branch (694:7): [True: 0, False: 29]
  ------------------
  695|      0|    noAlloc.release();
  696|      0|    return BufferedStringPrimitive<T>::create(runtime, selfHnd, rightHnd);
  697|      0|  }
  698|       |
  699|     29|  auto oldExternalMem = storage->calcExternalMemorySize();
  700|     29|  appendToCopyableString(storage->contents_, right);
  701|     29|  runtime.getHeap().creditExternalMemory(
  702|     29|      storage, storage->calcExternalMemorySize() - oldExternalMem);
  703|       |
  704|     29|  noAlloc.release();
  705|     29|  return BufferedStringPrimitive<T>::create(
  706|     29|      runtime, storage->contents_.size(), runtime.makeHandle(storage));
  707|     29|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE6createERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEES7_:
  654|      2|    Handle<StringPrimitive> rightHnd) {
  655|      2|  typename ExternalStringPrimitive<T>::CopyableStdString contents{};
  656|      2|  uint32_t len;
  657|       |
  658|      2|  {
  659|      2|    NoAllocScope noAlloc{runtime};
  660|      2|    auto *left = leftHnd.get();
  661|      2|    auto *right = rightHnd.get();
  662|       |
  663|      2|    assertValidLength(left, right);
  664|      2|    len = left->getStringLength() + right->getStringLength();
  665|       |
  666|      2|    contents.reserve(len);
  667|      2|    appendToCopyableString(contents, left);
  668|      2|    appendToCopyableString(contents, right);
  669|      2|  }
  670|       |
  671|      2|  auto storageHnd = runtime.makeHandle<ExternalStringPrimitive<T>>(
  672|      2|      runtime.ignoreAllocationFailure(
  673|      2|          ExternalStringPrimitive<T>::create(runtime, std::move(contents))));
  674|       |
  675|      2|  return create(runtime, len, storageHnd);
  676|      2|}
_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|  1.17M|    ASCIIRef str) {
  118|  1.17M|  return createEfficientImpl(runtime, str);
  119|  1.17M|}
_ZN6hermes2vm15StringPrimitive13createDynamicERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  204|   390k|    UTF16Ref str) {
  205|   390k|  return createDynamicWithKnownEncoding(
  206|   390k|      runtime, str, isAllASCII(str.begin(), str.end()));
  207|   390k|}
_ZN6hermes2vm15StringPrimitive30createDynamicWithKnownEncodingERNS0_7RuntimeEN4llvh8ArrayRefIDsEEb:
  212|   390k|    bool isASCII) {
  213|   390k|  if (LLVM_LIKELY(isASCII)) {
  ------------------
  |  |  188|   390k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 390k, False: 3]
  |  |  ------------------
  ------------------
  214|   390k|    auto res = DynamicASCIIStringPrimitive::create(runtime, str.size());
  215|   390k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   390k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 390k]
  |  |  ------------------
  ------------------
  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|   390k|    std::copy(
  224|   390k|        str.begin(), str.end(), res->getString()->castToASCIIPointerForWrite());
  225|       |#ifdef _MSC_VER
  226|       |#pragma warning(pop)
  227|       |#endif
  228|   390k|    return res;
  229|   390k|  } else {
  230|      3|    return DynamicUTF16StringPrimitive::create(runtime, str);
  231|      3|  }
  232|   390k|}
_ZNK6hermes2vm15StringPrimitive11sliceEqualsEjjPKS1_:
  237|    168|    const StringPrimitive *other) const {
  238|    168|  if (isASCII()) {
  ------------------
  |  Branch (238:7): [True: 82, False: 86]
  ------------------
  239|     82|    if (other->isASCII()) {
  ------------------
  |  Branch (239:9): [True: 82, False: 0]
  ------------------
  240|     82|      return stringRefEquals(
  241|     82|          castToASCIIRef(start, length), other->castToASCIIRef());
  242|     82|    }
  243|      0|    return stringRefEquals(
  244|      0|        castToASCIIRef(start, length), other->castToUTF16Ref());
  245|     82|  }
  246|     86|  if (other->isASCII()) {
  ------------------
  |  Branch (246:7): [True: 86, False: 0]
  ------------------
  247|     86|    return stringRefEquals(
  248|     86|        castToUTF16Ref(start, length), other->castToASCIIRef());
  249|     86|  }
  250|      0|  return stringRefEquals(
  251|      0|      castToUTF16Ref(start, length), other->castToUTF16Ref());
  252|     86|}
_ZNK6hermes2vm15StringPrimitive6equalsEPKS1_:
  254|    168|bool StringPrimitive::equals(const StringPrimitive *other) const {
  255|    168|  if (this == other) {
  ------------------
  |  Branch (255:7): [True: 0, False: 168]
  ------------------
  256|      0|    return true;
  257|      0|  }
  258|    168|  return sliceEquals(0, getStringLength(), other);
  259|    168|}
_ZNK6hermes2vm15StringPrimitive6equalsERKNS0_10StringViewE:
  261|  1.42M|bool StringPrimitive::equals(const StringView &other) const {
  262|  1.42M|  if (isASCII()) {
  ------------------
  |  Branch (262:7): [True: 1.42M, False: 8]
  ------------------
  263|  1.42M|    return other.equals(castToASCIIRef());
  264|  1.42M|  }
  265|      8|  return other.equals(castToUTF16Ref());
  266|  1.42M|}
_ZN6hermes2vm15StringPrimitive6concatERNS0_7RuntimeENS0_6HandleIS1_EES5_:
  284|   781k|    Handle<StringPrimitive> yHandle) {
  285|   781k|  auto *xPtr = xHandle.get();
  286|   781k|  auto *yPtr = yHandle.get();
  287|       |
  288|   781k|  auto xLen = xPtr->getStringLength();
  289|   781k|  auto yLen = yPtr->getStringLength();
  290|   781k|  if (!xLen) {
  ------------------
  |  Branch (290:7): [True: 0, False: 781k]
  ------------------
  291|       |    // x is the empty string, just return y.
  292|      0|    return yHandle.getHermesValue();
  293|      0|  }
  294|   781k|  if (!yLen) {
  ------------------
  |  Branch (294:7): [True: 390k, False: 390k]
  ------------------
  295|       |    // y is the empty string, just return x.
  296|   390k|    return xHandle.getHermesValue();
  297|   390k|  }
  298|       |
  299|   390k|  SafeUInt32 xyLen(xLen);
  300|   390k|  xyLen.add(yLen);
  301|   390k|  if (xyLen.isOverflowed() || xyLen.get() > MAX_STRING_LENGTH) {
  ------------------
  |  Branch (301:7): [True: 0, False: 390k]
  |  Branch (301:31): [True: 0, False: 390k]
  ------------------
  302|      0|    return runtime.raiseRangeError("String length exceeds limit");
  303|      0|  }
  304|       |
  305|   390k|  if (xyLen.get() >= CONCAT_STRING_MIN_SIZE ||
  ------------------
  |  Branch (305:7): [True: 31, False: 390k]
  ------------------
  306|   390k|      isBufferedStringPrimitive(xPtr)) {
  ------------------
  |  Branch (306:7): [True: 0, False: 390k]
  ------------------
  307|     31|    if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(xyLen.get()))) {
  ------------------
  |  |  189|     31|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 31]
  |  |  ------------------
  ------------------
  308|      0|      return runtime.raiseRangeError(
  309|      0|          "Cannot allocate an external string primitive.");
  310|      0|    }
  311|     31|    return internalConcatStringPrimitives(runtime, xHandle, yHandle)
  312|     31|        .getHermesValue();
  313|     31|  }
  314|       |
  315|   390k|  auto builder = StringBuilder::createStringBuilder(
  316|   390k|      runtime, xyLen, xPtr->isASCII() && yPtr->isASCII());
  ------------------
  |  Branch (316:23): [True: 390k, False: 28]
  |  Branch (316:42): [True: 390k, False: 1]
  ------------------
  317|   390k|  if (builder == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (317:7): [True: 0, False: 390k]
  ------------------
  318|      0|    return ExecutionStatus::EXCEPTION;
  319|      0|  }
  320|       |
  321|   390k|  builder->appendStringPrim(xHandle);
  322|   390k|  builder->appendStringPrim(yHandle);
  323|   390k|  return HermesValue::encodeStringValue(*builder->getStringPrimitive());
  324|   390k|}
_ZN6hermes2vm15StringPrimitive5sliceERNS0_7RuntimeENS0_6HandleIS1_EEmm:
  330|      5|    size_t length) {
  331|      5|  assert(
  332|      5|      start + length <= str->getStringLength() && "Invalid length for slice");
  333|       |
  334|      5|  SafeUInt32 safeLen(length);
  335|       |
  336|      5|  auto builder =
  337|      5|      StringBuilder::createStringBuilder(runtime, safeLen, str->isASCII());
  338|      5|  if (builder == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (338:7): [True: 0, False: 5]
  ------------------
  339|      0|    return ExecutionStatus::EXCEPTION;
  340|      0|  }
  341|      5|  if (str->isASCII()) {
  ------------------
  |  Branch (341:7): [True: 0, False: 5]
  ------------------
  342|      0|    builder->appendASCIIRef(
  343|      0|        ASCIIRef(str->castToASCIIPointer() + start, length));
  344|      5|  } else {
  345|      5|    builder->appendUTF16Ref(
  346|      5|        UTF16Ref(str->castToUTF16Pointer() + start, length));
  347|      5|  }
  348|      5|  return HermesValue::encodeStringValue(*builder->getStringPrimitive());
  349|      5|}
_ZN6hermes2vm15StringPrimitive16createStringViewERNS0_7RuntimeENS0_6HandleIS1_EE:
  353|  1.07M|    Handle<StringPrimitive> self) {
  354|  1.07M|  ensureFlat(runtime, self);
  355|  1.07M|  return createStringViewMustBeFlat(self);
  356|  1.07M|}
_ZNK6hermes2vm15StringPrimitive17appendUTF16StringERN4llvh15SmallVectorImplIDsEE:
  359|   358k|    llvh::SmallVectorImpl<char16_t> &str) const {
  360|   358k|  if (isASCII()) {
  ------------------
  |  Branch (360:7): [True: 358k, False: 215]
  ------------------
  361|   358k|    const char *ptr = castToASCIIPointer();
  362|   358k|    str.append(ptr, ptr + getStringLength());
  363|   358k|  } else {
  364|    215|    const char16_t *ptr = castToUTF16Pointer();
  365|    215|    str.append(ptr, ptr + getStringLength());
  366|    215|  }
  367|   358k|}
_ZN6hermes2vm15StringPrimitive26createStringViewMustBeFlatENS0_6HandleIS1_EE:
  380|  1.90M|    Handle<StringPrimitive> self) {
  381|  1.90M|  return StringView(self);
  382|  1.90M|}
_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|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE22appendToCopyableStringERNSt3__112basic_stringIDsNS3_11char_traitsIDsEENS3_9allocatorIDsEEEEPKNS0_15StringPrimitiveE:
  640|     33|    const StringPrimitive *str) {
  641|     33|  if (str->isASCII()) {
  ------------------
  |  Branch (641:7): [True: 30, False: 3]
  ------------------
  642|     30|    auto it = (const uint8_t *)str->castToASCIIPointer();
  643|     30|    res.append(it, it + str->getStringLength());
  644|     30|  } else {
  645|      3|    auto it = str->castToUTF16Pointer();
  646|      3|    res.append(it, it + str->getStringLength());
  647|      3|  }
  648|     33|}
_ZN6hermes2vm30internalConcatStringPrimitivesERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEES5_:
  712|     31|    Handle<StringPrimitive> rightHnd) {
  713|     31|  auto *left = leftHnd.get();
  714|     31|  auto *right = rightHnd.get();
  715|       |
  716|     31|  assertValidLength(left, right);
  717|       |
  718|     31|  if (left->isASCII() && right->isASCII()) {
  ------------------
  |  Branch (718:7): [True: 1, False: 30]
  |  Branch (718:26): [True: 0, False: 1]
  ------------------
  719|      0|    if (auto *bufLeft = dyn_vmcast<BufferedASCIIStringPrimitive>(left)) {
  ------------------
  |  Branch (719:15): [True: 0, False: 0]
  ------------------
  720|      0|      if (bufLeft->getStringLength() ==
  ------------------
  |  Branch (720:11): [True: 0, False: 0]
  ------------------
  721|      0|          bufLeft->getConcatBuffer()->contents_.size())
  722|      0|        return BufferedASCIIStringPrimitive::append(
  723|      0|            Handle<BufferedASCIIStringPrimitive>::vmcast(leftHnd),
  724|      0|            runtime,
  725|      0|            rightHnd);
  726|      0|    }
  727|      0|    return BufferedASCIIStringPrimitive::create(runtime, leftHnd, rightHnd);
  728|     31|  } else {
  729|     31|    if (auto *bufLeft = dyn_vmcast<BufferedUTF16StringPrimitive>(left)) {
  ------------------
  |  Branch (729:15): [True: 29, False: 2]
  ------------------
  730|     29|      if (bufLeft->getStringLength() ==
  ------------------
  |  Branch (730:11): [True: 29, False: 0]
  ------------------
  731|     29|          bufLeft->getConcatBuffer()->contents_.size()) {
  732|     29|        return BufferedUTF16StringPrimitive::append(
  733|     29|            Handle<BufferedUTF16StringPrimitive>::vmcast(leftHnd),
  734|     29|            runtime,
  735|     29|            rightHnd);
  736|     29|      }
  737|     29|    }
  738|      2|    return BufferedUTF16StringPrimitive::create(runtime, leftHnd, rightHnd);
  739|     31|  }
  740|     31|}
StringPrimitive.cpp:_ZN6hermes2vmL17assertValidLengthEPNS0_15StringPrimitiveES2_:
  619|     62|static void assertValidLength(StringPrimitive *a, StringPrimitive *b) {
  620|     62|  SafeUInt32 len(a->getStringLength());
  621|     62|  len.add(b->getStringLength());
  622|     62|  assert(
  623|     62|      !len.isOverflowed() && len.get() <= StringPrimitive::MAX_STRING_LENGTH &&
  624|     62|      "length must have been validated");
  625|     62|}
_ZN6hermes2vm15StringPrimitive19createEfficientImplIcEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EEPNSt3__112basic_stringISC_NSE_11char_traitsISC_EENSE_9allocatorISC_EEEE:
   66|  1.17M|    std::basic_string<T> *optStorage) {
   67|  1.17M|  constexpr bool charIs8Bit = std::is_same<T, char>::value;
   68|  1.17M|  assert(
   69|  1.17M|      (!optStorage ||
   70|  1.17M|       str == llvh::makeArrayRef(optStorage->data(), optStorage->size())) &&
   71|  1.17M|      "If optStorage is provided, it must equal the input string");
   72|  1.17M|  assert(
   73|  1.17M|      (!charIs8Bit || isAllASCII(str.begin(), str.end())) &&
   74|  1.17M|      "8 bit strings must be ASCII");
   75|  1.17M|  if (str.empty()) {
  ------------------
  |  Branch (75:7): [True: 0, False: 1.17M]
  ------------------
   76|      0|    return HermesValue::encodeStringValue(
   77|      0|        runtime.getPredefinedString(Predefined::emptyString));
   78|      0|  }
   79|  1.17M|  if (str.size() == 1) {
  ------------------
  |  Branch (79:7): [True: 160, False: 1.17M]
  ------------------
   80|    160|    return runtime.getCharacterString(str[0]).getHermesValue();
   81|    160|  }
   82|       |
   83|       |  // Check if we should acquire ownership of storage.
   84|  1.17M|  if (optStorage != nullptr &&
  ------------------
  |  Branch (84:7): [True: 0, False: 1.17M]
  ------------------
   85|  1.17M|      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|  1.17M|  bool isAscii = charIs8Bit || isAllASCII(str.begin(), str.end());
  ------------------
  |  Branch (92:18): [Folded - Ignored]
  |  Branch (92:32): [True: 0, False: 0]
  ------------------
   93|  1.17M|  if (isAscii) {
  ------------------
  |  Branch (93:7): [True: 1.17M, False: 0]
  ------------------
   94|  1.17M|    auto result = StringPrimitive::create(runtime, str.size(), isAscii);
   95|  1.17M|    if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.17M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.17M]
  |  |  ------------------
  ------------------
   96|      0|      return ExecutionStatus::EXCEPTION;
   97|      0|    }
   98|  1.17M|    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|  1.17M|    std::copy(str.begin(), str.end(), output->castToASCIIPointerForWrite());
  106|       |#ifdef _MSC_VER
  107|       |#pragma warning(pop)
  108|       |#endif
  109|  1.17M|    return output.getHermesValue();
  110|  1.17M|  }
  111|       |
  112|      0|  return StringPrimitive::create(runtime, str);
  113|  1.17M|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsEC2INSt3__112basic_stringIDsNS4_11char_traitsIDsEENS4_9allocatorIDsEEEEEEOT_:
  459|    263|    : SymbolStringPrimitive(contents.size()),
  460|    263|      contents_(std::forward<BasicString>(contents)) {
  461|    263|  static_assert(
  462|    263|      std::is_same<T, typename BasicString::value_type>::value,
  463|    263|      "ExternalStringPrimitive mismatched char type");
  464|    263|  assert(
  465|    263|      getStringLength() >= EXTERNAL_STRING_MIN_SIZE &&
  466|    263|      "ExternalStringPrimitive length must be at least EXTERNAL_STRING_MIN_SIZE");
  467|    263|}
_ZN6hermes2vm23ExternalStringPrimitiveIcEC2INSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEEEOT_:
  459|     28|    : SymbolStringPrimitive(contents.size()),
  460|     28|      contents_(std::forward<BasicString>(contents)) {
  461|     28|  static_assert(
  462|     28|      std::is_same<T, typename BasicString::value_type>::value,
  463|     28|      "ExternalStringPrimitive mismatched char type");
  464|     28|  assert(
  465|     28|      getStringLength() >= EXTERNAL_STRING_MIN_SIZE &&
  466|     28|      "ExternalStringPrimitive length must be at least EXTERNAL_STRING_MIN_SIZE");
  467|     28|}

_ZN6hermes2vm14createASCIIRefEPKc:
   23|   782k|ASCIIRef createASCIIRef(const char *str) {
   24|   782k|  return ASCIIRef(str, ascii_traits::length(str));
   25|   782k|}
_ZN6hermes2vmlsERN4llvh11raw_ostreamENS1_8ArrayRefIDsEE:
   33|   325k|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|   325k|  std::string narrowStr;
   37|   325k|  convertUTF16ToUTF8WithReplacements(narrowStr, u16ref);
   38|   325k|  return OS << narrowStr;
   39|   325k|}

_ZNK6hermes2vm10StringView11getUTF16RefERN4llvh15SmallVectorImplIDsEEb:
   19|   325k|    bool alwaysCopy) const {
   20|   325k|  uint32_t existingLen = allocator.size();
   21|   325k|  if (isASCII()) {
  ------------------
  |  Branch (21:7): [True: 325k, False: 104]
  ------------------
   22|   325k|    const char *ptr = castToCharPtr();
   23|   325k|    allocator.append(ptr, ptr + length());
   24|   325k|    return UTF16Ref(allocator.data() + existingLen, length());
   25|   325k|  }
   26|    104|  const char16_t *ptr = castToChar16Ptr();
   27|    104|  if (alwaysCopy) {
  ------------------
  |  Branch (27:7): [True: 0, False: 104]
  ------------------
   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|    104|  return UTF16Ref(ptr, length());
   33|    104|}
_ZN6hermes2vmlsERN4llvh11raw_ostreamERKNS0_10StringViewE:
   35|  7.20k|llvh::raw_ostream &operator<<(llvh::raw_ostream &os, const StringView &sv) {
   36|  7.20k|  if (sv.isASCII()) {
  ------------------
  |  Branch (36:7): [True: 7.20k, False: 0]
  ------------------
   37|  7.20k|    return os << llvh::StringRef(sv.castToCharPtr(), sv.length());
   38|  7.20k|  } else {
   39|      0|    return os << UTF16Ref(sv.castToChar16Ptr(), sv.length());
   40|      0|  }
   41|  7.20k|}

_ZN6hermes2vm14SymbolRegistry4initERNS0_7RuntimeE:
   20|    160|void SymbolRegistry::init(Runtime &runtime) {
   21|    160|  stringMap_ = OrderedHashMap::create(runtime)->getHermesValue();
   22|    160|}
_ZN6hermes2vm14SymbolRegistry9markRootsERNS0_12RootAcceptorE:
   25|    339|void SymbolRegistry::markRoots(RootAcceptor &acceptor) {
   26|    339|  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|    339|}

_ZN6hermes2vm16TimeLimitMonitor11getOrCreateEv:
   18|    160|std::shared_ptr<TimeLimitMonitor> TimeLimitMonitor::getOrCreate() {
   19|       |  /// The singleton payload, intentionally leaked to avoid destruction order
   20|       |  /// fiasco.
   21|    160|  static struct Singleton {
   22|       |    /// Synchronizes access to weakMonitor.
   23|    160|    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|    160|    std::weak_ptr<TimeLimitMonitor> weakMonitor;
   30|    160|  } *singleton = new Singleton();
   31|       |
   32|    160|  std::lock_guard<std::mutex> singletonGuard{singleton->guard};
   33|    160|  if (auto monitor = singleton->weakMonitor.lock()) {
  ------------------
  |  Branch (33:12): [True: 0, False: 160]
  ------------------
   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|    160|  auto monitor = std::make_shared<TimeLimitMonitor>();
   40|    160|  singleton->weakMonitor = monitor;
   41|    160|  return monitor;
   42|    160|}
_ZN6hermes2vm16TimeLimitMonitorC2Ev:
   44|    160|TimeLimitMonitor::TimeLimitMonitor() {
   45|       |  // Spawns a new thread that performs the time limit monitoring. This thread
   46|       |  // is joined in the destructor.
   47|    160|  timerThread_ = std::thread(&TimeLimitMonitor::timerLoop, this);
   48|    160|}
_ZN6hermes2vm16TimeLimitMonitorD2Ev:
   50|    160|TimeLimitMonitor::~TimeLimitMonitor() {
   51|    160|  {
   52|    160|    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|    160|    enabled_ = false;
   56|    160|  }
   57|       |
   58|       |  // Tickle the timeLoop thread so it can terminate.
   59|    160|  timerLoopCond_.notify_all();
   60|       |
   61|       |  /// And wait for the helper thread termination.
   62|    160|  timerThread_.join();
   63|    160|}
_ZN6hermes2vm16TimeLimitMonitor12watchRuntimeERNS0_7RuntimeENSt3__16chrono8durationIxNS4_5ratioILl1ELl1000EEEEE:
   67|    160|    std::chrono::milliseconds timeout) {
   68|    160|  {
   69|    160|    std::lock_guard<std::mutex> lockGuard(lock_);
   70|       |    // The execution deadline for runtime.
   71|    160|    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|    160|    watchedRuntimes_[&runtime] = runtimeDeadline;
   76|    160|  }
   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|    160|  timerLoopCond_.notify_all();
   82|    160|}
_ZN6hermes2vm16TimeLimitMonitor14unwatchRuntimeERNS0_7RuntimeE:
   84|    160|void TimeLimitMonitor::unwatchRuntime(Runtime &runtime) {
   85|    160|  std::lock_guard<std::mutex> lockGuard(lock_);
   86|    160|  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|    160|}
_ZN6hermes2vm16TimeLimitMonitor9timerLoopEv:
   93|    160|void TimeLimitMonitor::timerLoop() {
   94|    160|  oscompat::set_thread_name("time-limit-monitor");
   95|       |
   96|    160|  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|    160|  static constexpr Deadline NoDeadline = Deadline::max();
  101|       |
  102|    320|  while (enabled_) {
  ------------------
  |  Branch (102:10): [True: 160, False: 160]
  ------------------
  103|       |    // Assume there's no deadline in watchedRuntimes_ -- i.e., no Runtimes are
  104|       |    // being watched.
  105|    160|    Deadline nextDeadline = NoDeadline;
  106|    160|    Deadline now = std::chrono::steady_clock::now();
  107|       |
  108|    160|    for (auto it = watchedRuntimes_.begin(), end = watchedRuntimes_.end();
  109|    320|         it != end;) {
  ------------------
  |  Branch (109:10): [True: 160, False: 160]
  ------------------
  110|    160|      auto curr = it++;
  111|       |
  112|    160|      if (curr->second <= now) {
  ------------------
  |  Branch (112:11): [True: 0, False: 160]
  ------------------
  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|    160|      } else {
  119|       |        // curr's deadline is in the future, but it could be ealier than the
  120|       |        // nextDeadline; Update the latter accordingly.
  121|    160|        nextDeadline = std::min(nextDeadline, curr->second);
  122|    160|      }
  123|    160|    }
  124|       |
  125|    160|    if (nextDeadline != NoDeadline) {
  ------------------
  |  Branch (125:9): [True: 160, 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|    160|      timerLoopCond_.wait_until(lockGuard, nextDeadline);
  131|    160|    } 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|    160|  }
  138|    160|}

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

_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringIcEEjN4llvh8ArrayRefIT_EEjb:
   23|  2.44M|    bool mustBeNew) const {
   24|  2.44M|  assert(identifierTable_ && "identifier table pointer is not initialized");
   25|       |
   26|  2.44M|  auto cap = capacity();
   27|  2.44M|  assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
   28|  2.44M|  assert(size_ < cap && "The hash table can never be full");
   29|       |
   30|  2.44M|#ifdef HERMES_SLOW_DEBUG
   31|  2.44M|  assert(hash == hashString(str) && "invalid hash");
   32|  2.44M|#endif
   33|  2.44M|  uint32_t idx = hash & (cap - 1);
   34|  2.44M|  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|  2.44M|  OptValue<uint32_t> deletedIndex;
   39|       |  // The loop will always terminate as long as the hash table is not full.
   40|  3.84M|  while (1) {
  ------------------
  |  Branch (40:10): [Folded - Ignored]
  ------------------
   41|  3.84M|    if (table_.isEmpty(idx)) {
  ------------------
  |  Branch (41:9): [True: 968k, False: 2.87M]
  ------------------
   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|   968k|      return deletedIndex ? *deletedIndex : idx;
  ------------------
  |  Branch (44:14): [True: 0, False: 968k]
  ------------------
   45|  2.87M|    } else if (table_.isDeleted(idx)) {
  ------------------
  |  Branch (45:16): [True: 0, False: 2.87M]
  ------------------
   46|      0|      assert(
   47|      0|          !mustBeNew &&
   48|      0|          "mustBeNew should never be set if there are deleted entries");
   49|      0|      deletedIndex = idx;
   50|  2.87M|    } else if (!mustBeNew) {
  ------------------
  |  Branch (50:16): [True: 2.72M, False: 145k]
  ------------------
   51|       |      // If mustBeNew is set, we know this string does not exist in the table.
   52|       |      // There is no need to compare.
   53|       |
   54|  2.72M|      auto &lookupTableEntry =
   55|  2.72M|          identifierTable_->getLookupTableEntry(table_.get(idx));
   56|  2.72M|      if (lookupTableEntry.getHash() == hash) {
  ------------------
  |  Branch (56:11): [True: 1.48M, False: 1.24M]
  ------------------
   57|  1.48M|        if (lookupTableEntry.isStringPrim()) {
  ------------------
  |  Branch (57:13): [True: 1.47M, False: 2.45k]
  ------------------
   58|  1.47M|          const StringPrimitive *strPrim = lookupTableEntry.getStringPrim();
   59|  1.47M|          if (strPrim->isASCII()) {
  ------------------
  |  Branch (59:15): [True: 1.47M, False: 0]
  ------------------
   60|  1.47M|            if (stringRefEquals(str, strPrim->castToASCIIRef())) {
  ------------------
  |  Branch (60:17): [True: 1.47M, False: 0]
  ------------------
   61|  1.47M|              return idx;
   62|  1.47M|            }
   63|  1.47M|          } else {
   64|      0|            if (stringRefEquals(str, strPrim->castToUTF16Ref())) {
  ------------------
  |  Branch (64:17): [True: 0, False: 0]
  ------------------
   65|      0|              return idx;
   66|      0|            }
   67|      0|          }
   68|  1.47M|        } else if (lookupTableEntry.isLazyASCII()) {
  ------------------
  |  Branch (68:20): [True: 2.45k, False: 0]
  ------------------
   69|       |          // Lazy ASCII string.
   70|  2.45k|          if (stringRefEquals(str, lookupTableEntry.getLazyASCIIRef())) {
  ------------------
  |  Branch (70:15): [True: 2.45k, False: 0]
  ------------------
   71|  2.45k|            return idx;
   72|  2.45k|          }
   73|  2.45k|        } 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|  1.48M|      }
   80|  2.72M|    }
   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|  1.39M|    idx = (idx + base) & (cap - 1);
   85|  1.39M|    ++base;
   86|  1.39M|  }
   87|  2.44M|}
_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringIDsEEjN4llvh8ArrayRefIT_EEjb:
   23|    773|    bool mustBeNew) const {
   24|    773|  assert(identifierTable_ && "identifier table pointer is not initialized");
   25|       |
   26|    773|  auto cap = capacity();
   27|    773|  assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
   28|    773|  assert(size_ < cap && "The hash table can never be full");
   29|       |
   30|    773|#ifdef HERMES_SLOW_DEBUG
   31|    773|  assert(hash == hashString(str) && "invalid hash");
   32|    773|#endif
   33|    773|  uint32_t idx = hash & (cap - 1);
   34|    773|  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|    773|  OptValue<uint32_t> deletedIndex;
   39|       |  // The loop will always terminate as long as the hash table is not full.
   40|    893|  while (1) {
  ------------------
  |  Branch (40:10): [Folded - Ignored]
  ------------------
   41|    893|    if (table_.isEmpty(idx)) {
  ------------------
  |  Branch (41:9): [True: 773, False: 120]
  ------------------
   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|    773|      return deletedIndex ? *deletedIndex : idx;
  ------------------
  |  Branch (44:14): [True: 0, False: 773]
  ------------------
   45|    773|    } else if (table_.isDeleted(idx)) {
  ------------------
  |  Branch (45:16): [True: 0, False: 120]
  ------------------
   46|      0|      assert(
   47|      0|          !mustBeNew &&
   48|      0|          "mustBeNew should never be set if there are deleted entries");
   49|      0|      deletedIndex = idx;
   50|    120|    } else if (!mustBeNew) {
  ------------------
  |  Branch (50:16): [True: 120, 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|    120|      auto &lookupTableEntry =
   55|    120|          identifierTable_->getLookupTableEntry(table_.get(idx));
   56|    120|      if (lookupTableEntry.getHash() == hash) {
  ------------------
  |  Branch (56:11): [True: 0, False: 120]
  ------------------
   57|      0|        if (lookupTableEntry.isStringPrim()) {
  ------------------
  |  Branch (57:13): [True: 0, False: 0]
  ------------------
   58|      0|          const StringPrimitive *strPrim = lookupTableEntry.getStringPrim();
   59|      0|          if (strPrim->isASCII()) {
  ------------------
  |  Branch (59:15): [True: 0, False: 0]
  ------------------
   60|      0|            if (stringRefEquals(str, strPrim->castToASCIIRef())) {
  ------------------
  |  Branch (60:17): [True: 0, False: 0]
  ------------------
   61|      0|              return idx;
   62|      0|            }
   63|      0|          } else {
   64|      0|            if (stringRefEquals(str, strPrim->castToUTF16Ref())) {
  ------------------
  |  Branch (64:17): [True: 0, False: 0]
  ------------------
   65|      0|              return idx;
   66|      0|            }
   67|      0|          }
   68|      0|        } else if (lookupTableEntry.isLazyASCII()) {
  ------------------
  |  Branch (68:20): [True: 0, False: 0]
  ------------------
   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|      0|        } 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|      0|      }
   80|    120|    }
   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|    120|    idx = (idx + base) & (cap - 1);
   85|    120|    ++base;
   86|    120|  }
   87|    773|}
_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringEPKNS0_15StringPrimitiveEjb:
  114|   492k|    bool mustBeNew) const {
  115|   492k|  if (str->isASCII()) {
  ------------------
  |  Branch (115:7): [True: 492k, False: 281]
  ------------------
  116|   492k|    return lookupString(str->castToASCIIRef(), hash, mustBeNew);
  117|   492k|  } else {
  118|    281|    return lookupString(str->castToUTF16Ref(), hash, mustBeNew);
  119|    281|  }
  120|   492k|}
_ZN6hermes2vm6detail19IdentifierHashTable6insertEjNS0_8SymbolIDE:
  122|   457k|void IdentifierHashTable::insert(uint32_t idx, SymbolID id) {
  123|   457k|  table_.set(idx, id.unsafeGetIndex());
  124|   457k|  ++size_;
  125|   457k|  ++nonEmptyEntryCount_;
  126|       |
  127|   457k|  if (shouldGrow()) {
  ------------------
  |  Branch (127:7): [True: 79, False: 457k]
  ------------------
  128|     79|    growAndRehash(capacity() * 2);
  129|     79|  }
  130|   457k|}
_ZN6hermes2vm6detail19IdentifierHashTable13growAndRehashEj:
  140|    239|void IdentifierHashTable::growAndRehash(uint32_t newCapacity) {
  141|       |  // Guard against potential overflow in the calculation of new capacity.
  142|    239|  if (LLVM_UNLIKELY(newCapacity <= capacity())) {
  ------------------
  |  |  189|    239|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 239]
  |  |  ------------------
  ------------------
  143|      0|    hermes_fatal("too many identifiers created");
  144|      0|  }
  145|    239|  assert(llvh::isPowerOf2_32(newCapacity) && "capacity must be power of 2");
  146|    239|  CompactTable tmpTable(newCapacity, table_.getCurrentScale());
  147|    239|  tmpTable.swap(table_);
  148|   846k|  for (uint32_t oldIdx = 0; oldIdx < tmpTable.size(); ++oldIdx) {
  ------------------
  |  Branch (148:29): [True: 845k, False: 239]
  ------------------
  149|   845k|    if (!tmpTable.isValid(oldIdx)) {
  ------------------
  |  Branch (149:9): [True: 334k, False: 511k]
  ------------------
  150|   334k|      continue;
  151|   334k|    }
  152|       |    // Pass true as second argument as we know this string is not in the table.
  153|   511k|    uint32_t idx = 0;
  154|   511k|    uint32_t oldVal = tmpTable.get(oldIdx);
  155|   511k|    auto &lookupTableEntry = identifierTable_->getLookupTableEntry(oldVal);
  156|   511k|    uint32_t hash = lookupTableEntry.getHash();
  157|   511k|    if (lookupTableEntry.isStringPrim()) {
  ------------------
  |  Branch (157:9): [True: 492k, False: 19.1k]
  ------------------
  158|   492k|      idx = lookupString(lookupTableEntry.getStringPrim(), hash, true);
  159|   492k|    } else if (lookupTableEntry.isLazyASCII()) {
  ------------------
  |  Branch (159:16): [True: 19.1k, False: 4]
  ------------------
  160|  19.1k|      idx = lookupString(lookupTableEntry.getLazyASCIIRef(), hash, true);
  161|  19.1k|    } else if (lookupTableEntry.isLazyUTF16()) {
  ------------------
  |  Branch (161:16): [True: 4, False: 0]
  ------------------
  162|      4|      idx = lookupString(lookupTableEntry.getLazyUTF16Ref(), hash, true);
  163|      4|    }
  164|   511k|    table_.set(idx, oldVal);
  165|   511k|  }
  166|    239|  nonEmptyEntryCount_ = size_;
  167|    239|}

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

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

_ZNK6hermes2vm9CardTable22findNextCardWithStatusENS1_10CardStatusEmm:
   35|    431|    size_t endIndex) const {
   36|   907k|  for (size_t idx = fromIndex; idx < endIndex; idx++)
  ------------------
  |  Branch (36:32): [True: 907k, False: 113]
  ------------------
   37|   907k|    if (cards_[idx].load(std::memory_order_relaxed) == status)
  ------------------
  |  Branch (37:9): [True: 318, False: 906k]
  ------------------
   38|    318|      return idx;
   39|       |
   40|    113|  return llvh::None;
   41|    431|}
_ZN6hermes2vm9CardTable5clearEv:
   43|    113|void CardTable::clear() {
   44|    113|  cleanRange(kFirstUsedIndex, kValidIndices);
   45|    113|}
_ZN6hermes2vm9CardTable10cleanRangeEmm:
   59|    113|void CardTable::cleanRange(size_t from, size_t to) {
   60|    113|  cleanOrDirtyRange(from, to, CardStatus::Clean);
   61|    113|}
_ZN6hermes2vm9CardTable17cleanOrDirtyRangeEmmNS1_10CardStatusE:
   70|    113|    CardStatus cleanOrDirty) {
   71|   922k|  for (size_t index = from; index < to; index++) {
  ------------------
  |  Branch (71:29): [True: 922k, False: 113]
  ------------------
   72|   922k|    cards_[index].store(cleanOrDirty, std::memory_order_relaxed);
   73|   922k|  }
   74|    113|}
_ZN6hermes2vm9CardTable16updateBoundariesEPNS1_8BoundaryEPKcS5_:
   79|  40.0k|    const char *end) {
   80|  40.0k|  assert(boundary != nullptr && "Need a boundary cursor");
   81|  40.0k|  assert(
   82|  40.0k|      base() <= start && end <= AlignedStorage::end(base()) &&
   83|  40.0k|      "Precondition: [start, end) must be covered by this table.");
   84|  40.0k|  assert(
   85|  40.0k|      boundary->index() == addressToIndex(boundary->address()) &&
   86|  40.0k|      "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|  40.0k|  assert(
   89|  40.0k|      start <= boundary->address() && boundary->address() < end &&
   90|  40.0k|      "Precondition: must have crossed boundary.");
   91|       |  // The object may be large, and may cross multiple cards, but first
   92|       |  // handle the first card.
   93|  40.0k|  boundaries_[boundary->index()] =
   94|  40.0k|      (boundary->address() - start) >> LogHeapAlign;
   95|  40.0k|  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|  40.0k|  int8_t currentExp = 0;
  103|  40.0k|  unsigned currentIndexDelta = 1;
  104|  40.0k|  unsigned numWithCurrentExp = 0;
  105|  1.37M|  while (boundary->address() < end) {
  ------------------
  |  Branch (105:10): [True: 1.33M, False: 40.0k]
  ------------------
  106|  1.33M|    boundaries_[boundary->index()] = encodeExp(currentExp);
  107|  1.33M|    numWithCurrentExp++;
  108|  1.33M|    if (numWithCurrentExp == currentIndexDelta) {
  ------------------
  |  Branch (108:9): [True: 6.05k, False: 1.33M]
  ------------------
  109|  6.05k|      numWithCurrentExp = 0;
  110|  6.05k|      currentExp++;
  111|  6.05k|      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|  6.05k|    }
  115|  1.33M|    boundary->bump();
  116|  1.33M|  }
  117|  40.0k|}
_ZNK6hermes2vm9CardTable15firstObjForCardEj:
  119|  1.81M|GCCell *CardTable::firstObjForCard(unsigned index) const {
  120|  1.81M|  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|  11.1M|  while (val < 0) {
  ------------------
  |  Branch (125:10): [True: 9.37M, False: 1.81M]
  ------------------
  126|  9.37M|    index -= 1 << decodeExp(val);
  127|  9.37M|    val = boundaries_[index];
  128|  9.37M|  }
  129|       |
  130|  1.81M|  char *boundary = const_cast<char *>(indexToAddress(index));
  131|  1.81M|  char *resPtr = boundary - (val << LogHeapAlign);
  132|  1.81M|  return reinterpret_cast<GCCell *>(resPtr);
  133|  1.81M|}
_ZNK6hermes2vm9CardTable16verifyBoundariesEPcS2_:
  157|    226|void CardTable::verifyBoundaries(char *start, char *level) const {
  158|       |  // Start should be card-aligned.
  159|    226|  assert(isCardAligned(start));
  160|  1.81M|  for (unsigned index = addressToIndex(start); index < kValidIndices; index++) {
  ------------------
  |  Branch (160:48): [True: 1.81M, False: 226]
  ------------------
  161|  1.81M|    const char *boundary = indexToAddress(index);
  162|  1.81M|    if (level <= boundary) {
  ------------------
  |  Branch (162:9): [True: 0, False: 1.81M]
  ------------------
  163|      0|      break;
  164|      0|    }
  165|  1.81M|    GCCell *cell = firstObjForCard(index);
  166|       |    // Should be a valid cell.
  167|  1.81M|    assert(
  168|  1.81M|        cell->isValid() &&
  169|  1.81M|        "Card object boundary is broken: firstObjForCard yields invalid cell.");
  170|  1.81M|    char *cellPtr = reinterpret_cast<char *>(cell);
  171|       |    // And it should extend across the card boundary.
  172|  1.81M|    assert(
  173|  1.81M|        cellPtr <= boundary &&
  174|  1.81M|        boundary < (cellPtr + cell->getAllocatedSize()) &&
  175|  1.81M|        "Card object boundary is broken: first obj doesn't extend into card");
  176|  1.81M|  }
  177|    226|}

_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|}

_ZN6hermes2vm17FreelistBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   52|      1|void FreelistBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   53|      1|  mb.setVTable(&HadesGC::OldGen::FreelistCell::vt);
   54|      1|}
_ZN6hermes2vm7HadesGC6OldGen11finishAllocEPNS0_6GCCellEj:
   56|   585k|GCCell *HadesGC::OldGen::finishAlloc(GCCell *cell, uint32_t sz) {
   57|       |  // Track the number of allocated bytes in a segment.
   58|   585k|  incrementAllocatedBytes(sz);
   59|       |  // Write a mark bit so this entry doesn't get free'd by the sweeper.
   60|   585k|  HeapSegment::setCellMarkBit(cell);
   61|       |  // Could overwrite the VTable, but the allocator will write a new one in
   62|       |  // anyway.
   63|   585k|  return cell;
   64|   585k|}
_ZN6hermes2vm7HadesGC6OldGen13SegmentBucket13addToFreelistEPS3_:
   66|    175|void HadesGC::OldGen::SegmentBucket::addToFreelist(SegmentBucket *dummyHead) {
   67|    175|  auto *oldHead = dummyHead->next;
   68|    175|  if (oldHead)
  ------------------
  |  Branch (68:7): [True: 0, False: 175]
  ------------------
   69|      0|    oldHead->prev = this;
   70|    175|  prev = dummyHead;
   71|    175|  next = oldHead;
   72|    175|  dummyHead->next = this;
   73|    175|}
_ZNK6hermes2vm7HadesGC6OldGen13SegmentBucket18removeFromFreelistEv:
   75|     15|void HadesGC::OldGen::SegmentBucket::removeFromFreelist() const {
   76|     15|  if (next)
  ------------------
  |  Branch (76:7): [True: 0, False: 15]
  ------------------
   77|      0|    next->prev = prev;
   78|     15|  prev->next = next;
   79|     15|}
_ZN6hermes2vm7HadesGC6OldGen17addCellToFreelistEPvjPNS2_13SegmentBucketE:
   84|    160|    SegmentBucket *segBucket) {
   85|    160|  assert(
   86|    160|      sz >= sizeof(FreelistCell) &&
   87|    160|      "Cannot construct a FreelistCell into an allocation in the OG");
   88|    160|  FreelistCell *newFreeCell = constructCell<FreelistCell>(addr, sz);
   89|    160|  HeapSegment::setCellHead(static_cast<GCCell *>(addr), sz);
   90|    160|  addCellToFreelist(newFreeCell, segBucket);
   91|    160|}
_ZN6hermes2vm7HadesGC6OldGen17addCellToFreelistEPNS2_12FreelistCellEPNS2_13SegmentBucketE:
   95|    175|    SegmentBucket *segBucket) {
   96|    175|  const size_t sz = cell->getAllocatedSize();
   97|       |  // Push onto the size-specific free list for this bucket and segment.
   98|    175|  CompressedPointer oldHead = segBucket->head;
   99|    175|  cell->next_ = oldHead;
  100|    175|  segBucket->head =
  101|    175|      CompressedPointer::encodeNonNull(cell, gc_.getPointerBase());
  102|       |
  103|       |  // If this SegmentBucket was not already in the freelist, add it.
  104|    175|  if (!oldHead) {
  ------------------
  |  Branch (104:7): [True: 175, False: 0]
  ------------------
  105|    175|    uint32_t bucket = getFreelistBucket(sz);
  106|    175|    auto *dummyHead = &buckets_[bucket];
  107|    175|    segBucket->addToFreelist(dummyHead);
  108|       |
  109|       |    // Set a bit indicating that there are now available blocks for this bucket.
  110|    175|    freelistBucketBitArray_.set(bucket, true);
  111|    175|  }
  112|       |
  113|       |  // In ASAN builds, poison the memory outside of the FreelistCell so that
  114|       |  // accesses are flagged as illegal while it is in the freelist.
  115|       |  // Here, and in other places where FreelistCells are poisoned, use +1 on the
  116|       |  // pointer to skip towards the memory region directly after the FreelistCell
  117|       |  // header of a cell. This way the header is always intact and readable, and
  118|       |  // only the contents of the cell are poisoned.
  119|    175|  __asan_poison_memory_region(cell + 1, sz - sizeof(FreelistCell));
  120|    175|}
_ZN6hermes2vm7HadesGC6OldGen22removeCellFromFreelistEPNS0_27AssignableCompressedPointerEmPNS2_13SegmentBucketE:
  156|     15|    SegmentBucket *segBucket) {
  157|     15|  FreelistCell *cell =
  158|     15|      vmcast<FreelistCell>(prevLoc->getNonNull(gc_.getPointerBase()));
  159|     15|  assert(cell && "Cannot get a null cell from freelist");
  160|       |
  161|       |  // Update whatever was pointing to the cell we are removing.
  162|     15|  *prevLoc = cell->next_;
  163|       |  // Update the bit arrays if the given freelist is now empty.
  164|     15|  if (!segBucket->head) {
  ------------------
  |  Branch (164:7): [True: 15, False: 0]
  ------------------
  165|     15|    segBucket->removeFromFreelist();
  166|       |
  167|       |    // If setting the bit to 0 above made this bucket empty for all segments,
  168|       |    // set the bucket bit to 0 as well.
  169|     15|    freelistBucketBitArray_.set(bucket, buckets_[bucket].next);
  170|     15|  }
  171|       |
  172|       |  // Unpoison the memory so that the mutator can use it.
  173|     15|  __asan_unpoison_memory_region(
  174|     15|      cell + 1, cell->getAllocatedSize() - sizeof(FreelistCell));
  175|     15|  return cell;
  176|     15|}
_ZN6hermes2vm7HadesGC11HeapSegment11setCellHeadEPKNS0_6GCCellEm:
  181|   585k|    const size_t sz) {
  182|   585k|  const char *start = reinterpret_cast<const char *>(cellStart);
  183|   585k|  const char *end = start + sz;
  184|   585k|  CardTable *cards = cardTableCovering(start);
  185|   585k|  auto boundary = cards->nextBoundary(start);
  186|       |  // If this object crosses a card boundary, then update boundaries
  187|       |  // appropriately.
  188|   585k|  if (boundary.address() < end) {
  ------------------
  |  Branch (188:7): [True: 40.0k, False: 545k]
  ------------------
  189|  40.0k|    cards->updateBoundaries(&boundary, start, end);
  190|  40.0k|  }
  191|   585k|}
_ZN6hermes2vm7HadesGC11HeapSegment16getFirstCellHeadEm:
  193|    159|GCCell *HadesGC::HeapSegment::getFirstCellHead(size_t cardIdx) {
  194|    159|  CardTable &cards = cardTable();
  195|    159|  GCCell *cell = cards.firstObjForCard(cardIdx);
  196|    159|  assert(cell->isValid() && "Object head doesn't point to a valid object");
  197|    159|  return cell;
  198|    159|}
_ZN6hermes2vm7HadesGC6OldGen12FreelistCell5carveEj:
  235|   585k|GCCell *HadesGC::OldGen::FreelistCell::carve(uint32_t sz) {
  236|   585k|  const auto origSize = getAllocatedSize();
  237|   585k|  assert(
  238|   585k|      origSize >= sz + minAllocationSize() &&
  239|   585k|      "Can't split if it would leave too small of a second cell");
  240|   585k|  const auto finalSize = origSize - sz;
  241|   585k|  char *newCellAddress = reinterpret_cast<char *>(this) + finalSize;
  242|   585k|  GCCell *const newCell = reinterpret_cast<GCCell *>(newCellAddress);
  243|   585k|  setSizeFromGC(finalSize);
  244|   585k|  HeapSegment::setCellHead(newCell, sz);
  245|   585k|  return newCell;
  246|   585k|}
_ZN6hermes2vm7HadesGC6OldGenC2ERS1_:
 1261|    160|HadesGC::OldGen::OldGen(HadesGC &gc) : gc_(gc) {}
_ZN6hermes2vm7HadesGCC2ERNS0_6GCBase11GCCallbacksERNS0_11PointerBaseERKNS0_8GCConfigENSt3__110shared_ptrINS0_12CrashManagerEEENSB_INS0_15StorageProviderEEEj:
 1270|    160|    : GCBase(
 1271|    160|          gcCallbacks,
 1272|    160|          pointerBase,
 1273|    160|          gcConfig,
 1274|    160|          std::move(crashMgr),
 1275|    160|          HeapKind::HadesGC),
 1276|    160|      maxHeapSize_{std::max<uint64_t>(
 1277|    160|          gcConfig.getMaxHeapSize(),
 1278|       |          // At least one YG segment and one OG segment.
 1279|    160|          2 * AlignedStorage::size())},
 1280|    160|      provider_(std::move(provider)),
 1281|    160|      oldGen_{*this},
 1282|    160|      backgroundExecutor_{
 1283|    160|          kConcurrentGC ? std::make_unique<Executor>() : nullptr},
  ------------------
  |  Branch (1283:11): [Folded - Ignored]
  ------------------
 1284|    160|      promoteYGToOG_{!gcConfig.getAllocInYoung()},
 1285|    160|      revertToYGAtTTI_{gcConfig.getRevertToYGAtTTI()},
 1286|    160|      overwriteDeadYGObjects_{gcConfig.getOverwriteDeadYGObjects()},
 1287|    160|      occupancyTarget_(gcConfig.getOccupancyTarget()),
 1288|    160|      ygAverageSurvivalBytes_{
 1289|    160|          /*weight*/ 0.5,
 1290|    160|          /*init*/ kYGInitialSizeFactor * HeapSegment::maxSize() *
 1291|    160|              kYGInitialSurvivalRatio} {
 1292|    160|  (void)vmExperimentFlags;
 1293|    160|  std::lock_guard<Mutex> lk(gcMutex_);
 1294|    160|  crashMgr_->setCustomData("HermesGC", getKindAsStr().c_str());
 1295|       |  // createSegment relies on member variables and should not be called until
 1296|       |  // they are initialised.
 1297|    160|  llvh::ErrorOr<HeapSegment> newYoungGen = createSegment();
 1298|    160|  if (!newYoungGen)
  ------------------
  |  Branch (1298:7): [True: 0, False: 160]
  ------------------
 1299|      0|    hermes_fatal("Failed to initialize the young gen", newYoungGen.getError());
 1300|    160|  setYoungGen(std::move(newYoungGen.get()));
 1301|    160|  const size_t initHeapSize = std::max<uint64_t>(
 1302|    160|      {gcConfig.getMinHeapSize(),
 1303|    160|       gcConfig.getInitHeapSize(),
 1304|    160|       HeapSegment::maxSize()});
 1305|    160|  oldGen_.setTargetSizeBytes(initHeapSize - HeapSegment::maxSize());
 1306|    160|}
_ZN6hermes2vm7HadesGCD2Ev:
 1308|    160|HadesGC::~HadesGC() {
 1309|       |  // finalizeAll calls waitForCollectionToFinish, so there should be no ongoing
 1310|       |  // collection.
 1311|    160|  assert(
 1312|    160|      concurrentPhase_ == Phase::None &&
 1313|    160|      "Must call finalizeAll before destructor.");
 1314|    160|}
_ZNK6hermes2vm7HadesGC12getKindAsStrEv:
 1449|    273|std::string HadesGC::getKindAsStr() const {
 1450|    273|  return kGCName;
 1451|    273|}
_ZN6hermes2vm7HadesGC19pauseBackgroundTaskEv:
 1641|   551k|std::lock_guard<Mutex> HadesGC::pauseBackgroundTask() {
 1642|   551k|  assert(kConcurrentGC && "Should not be called in incremental mode");
 1643|   551k|  assert(!calledByBackgroundThread() && "Must be called from mutator");
 1644|       |  // Signal to the background thread that it should stop and wait on
 1645|       |  // ogPauseCondVar_.
 1646|   551k|  ogPaused_.store(true, std::memory_order_relaxed);
 1647|       |  // Acquire gcMutex_ as soon as it is released by the background thread.
 1648|   551k|  gcMutex_.lock();
 1649|       |  // Signal to the background thread that it may resume. Note that it will just
 1650|       |  // go to wait on gcMutex_, since it is currently held by this thread.
 1651|   551k|  ogPaused_.store(false, std::memory_order_relaxed);
 1652|   551k|  ogPauseCondVar_.notify_one();
 1653|   551k|  return std::lock_guard(gcMutex_, std::adopt_lock);
 1654|   551k|}
_ZN6hermes2vm7HadesGC11finalizeAllEv:
 1890|    160|void HadesGC::finalizeAll() {
 1891|    160|  std::lock_guard<Mutex> lk{gcMutex_};
 1892|       |  // Terminate any existing OG collection.
 1893|    160|  concurrentPhase_ = Phase::None;
 1894|    160|  if (ogCollectionStats_)
  ------------------
  |  Branch (1894:7): [True: 0, False: 160]
  ------------------
 1895|      0|    ogCollectionStats_->markUsed();
 1896|       |  // In case of an OOM, we may be in the middle of a YG collection.
 1897|    160|  if (ygCollectionStats_)
  ------------------
  |  Branch (1897:7): [True: 0, False: 160]
  ------------------
 1898|      0|    ygCollectionStats_->markUsed();
 1899|       |  // Now finalize the heap.
 1900|       |  // We might be in the middle of a YG collection, with some objects promoted to
 1901|       |  // the OG, and some not. Only finalize objects that have not been promoted to
 1902|       |  // OG, and let the OG finalize the promoted objects.
 1903|    160|  finalizeYoungGenObjects();
 1904|       |
 1905|       |  // If we are in the middle of a YG collection, some objects may have already
 1906|       |  // been promoted to the OG. Assume that any remaining external memory in the
 1907|       |  // YG belongs to those objects.
 1908|    160|  transferExternalMemoryToOldGen();
 1909|       |
 1910|    160|  const auto finalizeCallback = [this](GCCell *cell) {
 1911|    160|    assert(cell->isValid() && "Invalid cell in finalizeAll");
 1912|    160|    cell->getVT()->finalizeIfExists(cell, *this);
 1913|    160|  };
 1914|    160|  if (compactee_.segment)
  ------------------
  |  Branch (1914:7): [True: 0, False: 160]
  ------------------
 1915|      0|    compactee_.segment->forCompactedObjs(finalizeCallback, getPointerBase());
 1916|       |
 1917|    160|  for (HeapSegment &seg : oldGen_)
  ------------------
  |  Branch (1917:25): [True: 160, False: 160]
  ------------------
 1918|    160|    seg.forAllObjs(finalizeCallback);
 1919|    160|}
_ZN6hermes2vm7HadesGC20creditExternalMemoryEPNS0_6GCCellEj:
 1921|    320|void HadesGC::creditExternalMemory(GCCell *cell, uint32_t sz) {
 1922|    320|  assert(canAllocExternalMemory(sz) && "Precondition");
 1923|    320|  if (inYoungGen(cell)) {
  ------------------
  |  Branch (1923:7): [True: 281, False: 39]
  ------------------
 1924|    281|    size_t newYGExtBytes = getYoungGenExternalBytes() + sz;
 1925|    281|    setYoungGenExternalBytes(newYGExtBytes);
 1926|    281|    auto adj = std::min<size_t>(sz, youngGen_.available());
 1927|    281|    youngGen_.setEffectiveEnd(youngGen_.effectiveEnd() - adj);
 1928|    281|  } else {
 1929|     39|    std::lock_guard<Mutex> lk{gcMutex_};
 1930|     39|    oldGen_.creditExternalMemory(sz);
 1931|     39|    uint64_t totalBytes = oldGen_.allocatedBytes() + oldGen_.externalBytes();
 1932|     39|    if (totalBytes > oldGen_.targetSizeBytes())
  ------------------
  |  Branch (1932:9): [True: 0, False: 39]
  ------------------
 1933|      0|      youngGen_.setEffectiveEnd(youngGen_.level());
 1934|     39|  }
 1935|    320|}
_ZN6hermes2vm7HadesGC19debitExternalMemoryEPNS0_6GCCellEj:
 1937|    291|void HadesGC::debitExternalMemory(GCCell *cell, uint32_t sz) {
 1938|    291|  if (inYoungGen(cell)) {
  ------------------
  |  Branch (1938:7): [True: 217, False: 74]
  ------------------
 1939|    217|    size_t oldYGExtBytes = getYoungGenExternalBytes();
 1940|    217|    assert(
 1941|    217|        oldYGExtBytes >= sz && "Debiting more native memory than was credited");
 1942|    217|    setYoungGenExternalBytes(oldYGExtBytes - sz);
 1943|       |    // Don't modify the effective end here. creditExternalMemory is in charge
 1944|       |    // of tracking this. We don't expect many debits to not be from finalizers
 1945|       |    // anyway.
 1946|    217|  } else {
 1947|     74|    std::lock_guard<Mutex> lk{gcMutex_};
 1948|     74|    oldGen_.debitExternalMemory(sz);
 1949|     74|  }
 1950|    291|}
_ZN6hermes2vm7HadesGC16writeBarrierSlowEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEES3_:
 1964|   975k|    SmallHermesValue value) {
 1965|   975k|  if (ogMarkingBarriers_) {
  ------------------
  |  Branch (1965:7): [True: 0, False: 975k]
  ------------------
 1966|      0|    snapshotWriteBarrierInternal(*loc);
 1967|      0|  }
 1968|   975k|  if (!value.isPointer()) {
  ------------------
  |  Branch (1968:7): [True: 110k, False: 864k]
  ------------------
 1969|   110k|    return;
 1970|   110k|  }
 1971|   864k|  relocationWriteBarrier(loc, value.getPointer(getPointerBase()));
 1972|   864k|}
_ZN6hermes2vm7HadesGC16writeBarrierSlowEPKNS0_13GCPointerBaseEPKNS0_6GCCellE:
 1974|  1.19M|void HadesGC::writeBarrierSlow(const GCPointerBase *loc, const GCCell *value) {
 1975|  1.19M|  if (*loc && ogMarkingBarriers_)
  ------------------
  |  Branch (1975:7): [True: 907k, False: 288k]
  |  Branch (1975:15): [True: 0, False: 907k]
  ------------------
 1976|      0|    snapshotWriteBarrierInternal(*loc);
 1977|       |  // Always do the non-snapshot write barrier in order for YG to be able to
 1978|       |  // scan cards.
 1979|  1.19M|  relocationWriteBarrier(loc, value);
 1980|  1.19M|}
_ZN6hermes2vm7HadesGC22relocationWriteBarrierEPKvS3_:
 2096|  2.15M|void HadesGC::relocationWriteBarrier(const void *loc, const void *value) {
 2097|  2.15M|  assert(!inYoungGen(loc) && "Pre-condition from other callers");
 2098|       |  // Do not dirty cards for compactee->compactee, yg->yg, or yg->compactee
 2099|       |  // pointers. But do dirty cards for compactee->yg pointers, since compaction
 2100|       |  // may not happen in the next YG.
 2101|  2.15M|  if (AlignedStorage::containedInSame(loc, value)) {
  ------------------
  |  Branch (2101:7): [True: 370k, False: 1.78M]
  ------------------
 2102|   370k|    return;
 2103|   370k|  }
 2104|  1.78M|  if (inYoungGen(value) || compactee_.contains(value)) {
  ------------------
  |  Branch (2104:7): [True: 1.78M, False: 396]
  |  Branch (2104:28): [True: 0, False: 396]
  ------------------
 2105|       |    // Only dirty a card if it's an old-to-young or old-to-compactee pointer.
 2106|       |    // This is fine to do since the GC never modifies card tables outside of
 2107|       |    // allocation.
 2108|       |    // Note that this *only* applies since the boundaries are updated separately
 2109|       |    // from the card table being marked itself.
 2110|  1.78M|    HeapSegment::cardTableCovering(loc)->dirtyCardForAddress(loc);
 2111|  1.78M|  }
 2112|  1.78M|}
_ZN6hermes2vm7HadesGC18weakRefReadBarrierEPNS0_6GCCellE:
 2122|   365k|void HadesGC::weakRefReadBarrier(GCCell *value) {
 2123|   365k|  assert(
 2124|   365k|      !calledByBackgroundThread() &&
 2125|   365k|      "Read barrier invoked by background thread.");
 2126|       |  // If the GC is marking, conservatively mark the value as live.
 2127|   365k|  if (ogMarkingBarriers_)
  ------------------
  |  Branch (2127:7): [True: 0, False: 365k]
  ------------------
 2128|      0|    snapshotWriteBarrierInternal(value);
 2129|       |
 2130|       |  // Otherwise, if no GC is active at all, the weak ref must be alive.
 2131|       |  // During sweeping there's no special handling either.
 2132|   365k|}
_ZN6hermes2vm7HadesGC22canAllocExternalMemoryEj:
 2134|    592|bool HadesGC::canAllocExternalMemory(uint32_t size) {
 2135|    592|  return size <= maxHeapSize_;
 2136|    592|}
_ZN6hermes2vm7HadesGC10forAllObjsERKNSt3__18functionIFvPNS0_6GCCellEEEE:
 2138|    452|void HadesGC::forAllObjs(const std::function<void(GCCell *)> &callback) {
 2139|    452|  std::lock_guard<Mutex> lk{gcMutex_};
 2140|    452|  youngGen().forAllObjs(callback);
 2141|       |
 2142|    452|  const auto skipGarbageCallback = [callback](GCCell *cell) {
 2143|       |    // If we're doing this check during sweeping, or between sweeping and
 2144|       |    // compaction, there might be some objects that are dead, and could
 2145|       |    // potentially have garbage in them. There's no need to check the
 2146|       |    // pointers of those objects.
 2147|    452|    if (HeapSegment::getCellMarkBit(cell)) {
 2148|    452|      callback(cell);
 2149|    452|    }
 2150|    452|  };
 2151|    452|  for (HeapSegment &seg : oldGen_) {
  ------------------
  |  Branch (2151:25): [True: 452, False: 452]
  ------------------
 2152|    452|    if (concurrentPhase_ != Phase::Sweep)
  ------------------
  |  Branch (2152:9): [True: 452, False: 0]
  ------------------
 2153|    452|      seg.forAllObjs(callback);
 2154|      0|    else
 2155|      0|      seg.forAllObjs(skipGarbageCallback);
 2156|    452|  }
 2157|    452|  if (compactee_.segment) {
  ------------------
  |  Branch (2157:7): [True: 0, False: 452]
  ------------------
 2158|      0|    if (!compactee_.evacActive())
  ------------------
  |  Branch (2158:9): [True: 0, False: 0]
  ------------------
 2159|      0|      compactee_.segment->forAllObjs(callback);
 2160|      0|    else
 2161|      0|      compactee_.segment->forAllObjs(skipGarbageCallback);
 2162|      0|  }
 2163|    452|}
_ZNK6hermes2vm7HadesGC24calledByBackgroundThreadEv:
 2172|  12.9M|bool HadesGC::calledByBackgroundThread() const {
 2173|       |  // If the background thread is active, check if this thread matches the
 2174|       |  // background thread.
 2175|  12.9M|  return kConcurrentGC &&
  ------------------
  |  Branch (2175:10): [Folded - Ignored]
  ------------------
 2176|  12.9M|      backgroundExecutor_->getThreadId() == std::this_thread::get_id();
  ------------------
  |  Branch (2176:7): [True: 0, False: 12.9M]
  ------------------
 2177|  12.9M|}
_ZNK6hermes2vm7HadesGC12validPointerEPKv:
 2179|  20.8M|bool HadesGC::validPointer(const void *p) const {
 2180|  20.8M|  return dbgContains(p) && static_cast<const GCCell *>(p)->isValid();
  ------------------
  |  Branch (2180:10): [True: 20.8M, False: 0]
  |  Branch (2180:28): [True: 20.8M, False: 0]
  ------------------
 2181|  20.8M|}
_ZNK6hermes2vm7HadesGC11dbgContainsEPKv:
 2183|  20.8M|bool HadesGC::dbgContains(const void *p) const {
 2184|  20.8M|  return inYoungGen(p) || inOldGen(p);
  ------------------
  |  Branch (2184:10): [True: 4.93M, False: 15.9M]
  |  Branch (2184:27): [True: 15.9M, False: 0]
  ------------------
 2185|  20.8M|}
_ZN6hermes2vm7HadesGC17needsWriteBarrierEPvPNS0_6GCCellE:
 2189|  3.00M|bool HadesGC::needsWriteBarrier(void *loc, GCCell *value) {
 2190|  3.00M|  return !inYoungGen(loc);
 2191|  3.00M|}
_ZN6hermes2vm7HadesGC9allocSlowEj:
 2194|    113|void *HadesGC::allocSlow(uint32_t sz) {
 2195|    113|  AllocResult res;
 2196|       |  // Failed to alloc in young gen, do a young gen collection.
 2197|    113|  youngGenCollection(
 2198|    113|      kNaturalCauseForAnalytics, /*forceOldGenCollection*/ false);
 2199|    113|  res = youngGen().alloc(sz);
 2200|    113|  if (res.success)
  ------------------
  |  Branch (2200:7): [True: 113, False: 0]
  ------------------
 2201|    113|    return res.ptr;
 2202|       |
 2203|       |  // Still fails after YG collection, perhaps it is a large alloc, try growing
 2204|       |  // the YG to full size.
 2205|      0|  youngGen().clearExternalMemoryCharge();
 2206|      0|  res = youngGen().alloc(sz);
 2207|      0|  if (res.success)
  ------------------
  |  Branch (2207:7): [True: 0, False: 0]
  ------------------
 2208|      0|    return res.ptr;
 2209|       |
 2210|       |  // A YG collection is guaranteed to fully evacuate, leaving all the space
 2211|       |  // available, so the only way this could fail is if sz is greater than
 2212|       |  // a segment size.
 2213|       |  // This would be an error in VM code to ever allow such a size to be
 2214|       |  // allocated, and thus there's an assert at the top of this function to
 2215|       |  // disallow that. This case is for production, if we miss a test case.
 2216|      0|  oom(make_error_code(OOMError::SuperSegmentAlloc));
 2217|      0|}
_ZN6hermes2vm7HadesGC14allocLongLivedEj:
 2219|   551k|void *HadesGC::allocLongLived(uint32_t sz) {
 2220|   551k|  assert(
 2221|   551k|      isSizeHeapAligned(sz) &&
 2222|   551k|      "Call to allocLongLived must use a size aligned to HeapAlign");
 2223|   551k|  assert(gcMutex_ && "GC mutex must be held when calling allocLongLived");
 2224|   551k|  totalAllocatedBytes_ += sz;
 2225|       |  // Alloc directly into the old gen.
 2226|   551k|  return oldGen_.alloc(sz);
 2227|   551k|}
_ZN6hermes2vm7HadesGC6OldGen5allocEj:
 2229|   585k|GCCell *HadesGC::OldGen::alloc(uint32_t sz) {
 2230|   585k|  assert(
 2231|   585k|      isSizeHeapAligned(sz) &&
 2232|   585k|      "Should be aligned before entering this function");
 2233|   585k|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 2234|   585k|  assert(sz <= maxAllocationSize() && "Allocating too large of an object");
 2235|   585k|  assert(gc_.gcMutex_ && "gcMutex_ must be held before calling oldGenAlloc");
 2236|   585k|  if (GCCell *cell = search(sz)) {
  ------------------
  |  Branch (2236:15): [True: 585k, False: 160]
  ------------------
 2237|   585k|    return cell;
 2238|   585k|  }
 2239|       |  // Before waiting for a collection to finish, check if we're below the max
 2240|       |  // heap size and can simply allocate another segment. This will prevent
 2241|       |  // blocking the YG unnecessarily.
 2242|    160|  llvh::ErrorOr<HeapSegment> seg = gc_.createSegment();
 2243|    160|  if (seg) {
  ------------------
  |  Branch (2243:7): [True: 160, False: 0]
  ------------------
 2244|       |    // Complete this allocation using a bump alloc.
 2245|    160|    AllocResult res = seg->alloc(sz);
 2246|    160|    assert(
 2247|    160|        res.success &&
 2248|    160|        "A newly created segment should always be able to allocate");
 2249|       |    // Set the cell head for any successful alloc, so that write barriers can
 2250|       |    // move from dirty cards to the head of the object.
 2251|    160|    seg->setCellHead(static_cast<GCCell *>(res.ptr), sz);
 2252|       |    // Add the segment to segments_ and add the remainder of the segment to the
 2253|       |    // free list.
 2254|    160|    addSegment(std::move(seg.get()));
 2255|    160|    GCCell *newObj = static_cast<GCCell *>(res.ptr);
 2256|    160|    HeapSegment::setCellMarkBit(newObj);
 2257|    160|    return newObj;
 2258|    160|  }
 2259|       |
 2260|       |  // TODO(T109282643): Block on any pending OG collections here in case they
 2261|       |  // free up space.
 2262|       |
 2263|       |  // Repeat the search in case the collection did free memory.
 2264|      0|  if (GCCell *cell = search(sz)) {
  ------------------
  |  Branch (2264:15): [True: 0, False: 0]
  ------------------
 2265|      0|    return cell;
 2266|      0|  }
 2267|       |
 2268|       |  // The GC didn't recover enough memory, OOM.
 2269|       |  // Re-use the error code from the earlier heap segment allocation, because
 2270|       |  // it's either that the max heap size was reached, or that segment failed to
 2271|       |  // allocate.
 2272|      0|  gc_.oom(seg.getError());
 2273|      0|}
_ZN6hermes2vm7HadesGC6OldGen17getFreelistBucketEj:
 2275|  2.34M|uint32_t HadesGC::OldGen::getFreelistBucket(uint32_t size) {
 2276|       |  // If the size corresponds to the "small" portion of the freelist, then the
 2277|       |  // bucket is just (size) / (heap alignment)
 2278|  2.34M|  if (size < kMinSizeForLargeBlock) {
  ------------------
  |  Branch (2278:7): [True: 1.16M, False: 1.17M]
  ------------------
 2279|  1.16M|    auto bucket = size >> LogHeapAlign;
 2280|  1.16M|    assert(
 2281|  1.16M|        bucket < kNumSmallFreelistBuckets &&
 2282|  1.16M|        "Small blocks must be within the small free list range");
 2283|  1.16M|    return bucket;
 2284|  1.16M|  }
 2285|       |  // Otherwise, index into the large portion of the freelist, which is based on
 2286|       |  // powers of 2
 2287|       |
 2288|  1.17M|  auto bucket =
 2289|  1.17M|      kNumSmallFreelistBuckets + llvh::Log2_32(size) - kLogMinSizeForLargeBlock;
 2290|  1.17M|  assert(
 2291|  1.17M|      bucket < kNumFreelistBuckets &&
 2292|  1.17M|      "Block size must be within the freelist range!");
 2293|  1.17M|  return bucket;
 2294|  1.17M|}
_ZN6hermes2vm7HadesGC6OldGen6searchEj:
 2296|   585k|GCCell *HadesGC::OldGen::search(uint32_t sz) {
 2297|   585k|  size_t bucket = getFreelistBucket(sz);
 2298|   585k|  if (bucket < kNumSmallFreelistBuckets) {
  ------------------
  |  Branch (2298:7): [True: 584k, False: 919]
  ------------------
 2299|       |    // Fast path: There already exists a size bucket for this alloc. Check if
 2300|       |    // there's a free cell to take and exit.
 2301|   584k|    if (auto *segBucket = buckets_[bucket].next) {
  ------------------
  |  Branch (2301:15): [True: 0, False: 584k]
  ------------------
 2302|      0|      assert(freelistBucketBitArray_.at(bucket));
 2303|      0|      FreelistCell *cell = removeCellFromFreelist(bucket, segBucket);
 2304|      0|      assert(
 2305|      0|          cell->getAllocatedSize() == sz &&
 2306|      0|          "Size bucket should be an exact match");
 2307|      0|      return finishAlloc(cell, sz);
 2308|      0|    }
 2309|       |    // Make sure we start searching at the smallest possible size that could fit
 2310|   584k|    bucket = getFreelistBucket(sz + minAllocationSize());
 2311|   584k|  }
 2312|       |  // Once we're examining the rest of the free list, it's a first-fit algorithm.
 2313|       |  // This approach approximates finding the smallest possible fit.
 2314|   585k|  bucket = freelistBucketBitArray_.findNextSetBitFrom(bucket);
 2315|   585k|  for (; bucket < kNumFreelistBuckets;
  ------------------
  |  Branch (2315:10): [True: 585k, False: 160]
  ------------------
 2316|   585k|       bucket = freelistBucketBitArray_.findNextSetBitFrom(bucket + 1)) {
 2317|   585k|    auto *segBucket = buckets_[bucket].next;
 2318|   585k|    do {
 2319|       |      // Need to track the previous entry in order to change the next pointer.
 2320|   585k|      AssignableCompressedPointer *prevLoc = &segBucket->head;
 2321|   585k|      AssignableCompressedPointer cellCP = segBucket->head;
 2322|       |
 2323|   585k|      do {
 2324|   585k|        auto *cell =
 2325|   585k|            vmcast<FreelistCell>(cellCP.getNonNull(gc_.getPointerBase()));
 2326|   585k|        assert(
 2327|   585k|            cellCP == *prevLoc &&
 2328|   585k|            "prevLoc should be updated in each iteration");
 2329|   585k|        assert(
 2330|   585k|            (!cell->next_ ||
 2331|   585k|             cell->next_.getNonNull(gc_.getPointerBase())->isValid()) &&
 2332|   585k|            "Next pointer points to an invalid cell");
 2333|   585k|        const auto cellSize = cell->getAllocatedSize();
 2334|   585k|        assert(
 2335|   585k|            getFreelistBucket(cellSize) == bucket &&
 2336|   585k|            "Found an incorrectly sized block in this bucket");
 2337|       |        // Check if the size is large enough that the cell could be split.
 2338|   585k|        if (cellSize >= sz + minAllocationSize()) {
  ------------------
  |  Branch (2338:13): [True: 585k, False: 0]
  ------------------
 2339|       |          // Split the free cell. In order to avoid initializing
 2340|       |          // soon-to-be-unused values like the size and the next pointer, copy
 2341|       |          // the return path here.
 2342|   585k|          auto newCell = cell->carve(sz);
 2343|       |          // Since the size of cell has changed, we may need to add it to a
 2344|       |          // different free list bucket.
 2345|   585k|          auto newBucket = getFreelistBucket(cell->getAllocatedSize());
 2346|   585k|          assert(newBucket <= bucket && "Split cell must be smaller.");
 2347|   585k|          if (newBucket != bucket) {
  ------------------
  |  Branch (2347:15): [True: 15, False: 585k]
  ------------------
 2348|     15|            removeCellFromFreelist(prevLoc, bucket, segBucket);
 2349|       |            // Since the buckets for each segment are stored contiguously in
 2350|       |            // memory, we can compute the address of the SegmentBucket for
 2351|       |            // newBucket in this segment relative to the current SegmentBucket.
 2352|     15|            auto diff = bucket - newBucket;
 2353|     15|            addCellToFreelist(cell, segBucket - diff);
 2354|     15|          }
 2355|       |          // Because we carved newCell out before removing cell from the
 2356|       |          // freelist, newCell is still poisoned (regardless of whether the
 2357|       |          // conditional above executed). Unpoison it.
 2358|   585k|          __asan_unpoison_memory_region(newCell, sz);
 2359|   585k|          return finishAlloc(newCell, sz);
 2360|   585k|        } else if (cellSize == sz) {
  ------------------
  |  Branch (2360:20): [True: 0, False: 0]
  ------------------
 2361|       |          // Exact match, take it.
 2362|      0|          removeCellFromFreelist(prevLoc, bucket, segBucket);
 2363|      0|          return finishAlloc(cell, sz);
 2364|      0|        }
 2365|       |        // Non-exact matches, or anything just barely too small to fit, will
 2366|       |        // need to find another block.
 2367|       |        // NOTE: This is due to restrictions on the minimum cell size to keep
 2368|       |        // the heap parseable, especially in debug mode. If this minimum size
 2369|       |        // becomes smaller (smaller header, size becomes part of it
 2370|       |        // automatically, debug magic field is handled differently), this
 2371|       |        // decisions can be re-examined. An example alternative is to make a
 2372|       |        // special fixed-size cell that is only as big as an empty GCCell. That
 2373|       |        // alternative only works if the empty is small enough to fit in any gap
 2374|       |        // in the heap. That's not true in debug modes currently.
 2375|      0|        prevLoc = &cell->next_;
 2376|      0|        cellCP = cell->next_;
 2377|      0|      } while (cellCP);
  ------------------
  |  Branch (2377:16): [True: 0, False: 0]
  ------------------
 2378|      0|      segBucket = segBucket->next;
 2379|      0|    } while (segBucket);
  ------------------
  |  Branch (2379:14): [True: 0, False: 0]
  ------------------
 2380|   585k|  }
 2381|    160|  return nullptr;
 2382|   585k|}
_ZN6hermes2vm7HadesGC18youngGenCollectionENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEb:
 2424|    113|    bool forceOldGenCollection) {
 2425|    113|  ygCollectionStats_ = std::make_unique<CollectionStats>(*this, cause, "young");
 2426|    113|  ygCollectionStats_->beginCPUTimeSection();
 2427|    113|  ygCollectionStats_->setBeginTime();
 2428|       |  // Acquire the GC lock for the duration of the YG collection.
 2429|    113|  auto lk = ensureBackgroundTaskPaused();
 2430|       |  // The YG is not parseable while a collection is occurring.
 2431|    113|  assert(!inGC() && "Cannot be in GC at the start of YG!");
 2432|    113|  GCCycle cycle{*this, "GC Young Gen"};
 2433|    113|#ifdef HERMES_SLOW_DEBUG
 2434|    113|  checkWellFormed();
 2435|       |  // Check that the card tables are well-formed before the collection.
 2436|    113|  verifyCardTable();
 2437|    113|#endif
 2438|    113|  assert(
 2439|    113|      youngGen().markBitArray().findNextUnmarkedBitFrom(0) ==
 2440|    113|          youngGen().markBitArray().size() &&
 2441|    113|      "Young gen segment must have all mark bits set");
 2442|    113|  struct {
 2443|    113|    uint64_t before{0};
 2444|    113|    uint64_t after{0};
 2445|    113|  } heapBytes, externalBytes;
 2446|    113|  heapBytes.before = youngGen().used();
 2447|    113|  externalBytes.before = getYoungGenExternalBytes();
 2448|       |  // YG is about to be emptied, add all of the allocations.
 2449|    113|  totalAllocatedBytes_ += youngGen().used();
 2450|    113|  const bool doCompaction = compactee_.evacActive();
 2451|       |  // Attempt to promote the YG segment to OG if the flag is set. If this call
 2452|       |  // fails for any reason, proceed with a GC.
 2453|    113|  if (promoteYoungGenToOldGen()) {
  ------------------
  |  Branch (2453:7): [True: 0, False: 113]
  ------------------
 2454|       |    // Leave sweptBytes and sweptExternalBytes as defaults (which are 0).
 2455|       |    // Don't update the average YG survival ratio since no liveness was
 2456|       |    // calculated for the promotion case.
 2457|      0|    ygCollectionStats_->setBeforeSizes(
 2458|      0|        heapBytes.before, externalBytes.before, segmentFootprint());
 2459|      0|    ygCollectionStats_->addCollectionType("promotion");
 2460|      0|    assert(!doCompaction && "Cannot do compactions during YG promotions.");
 2461|    113|  } else {
 2462|    113|    auto &yg = youngGen();
 2463|       |
 2464|    113|    if (compactee_.segment) {
  ------------------
  |  Branch (2464:9): [True: 0, False: 113]
  ------------------
 2465|      0|      EvacAcceptor<true> acceptor{*this};
 2466|      0|      youngGenEvacuateImpl(acceptor, doCompaction);
 2467|       |      // The remaining bytes after the collection is just the number of bytes
 2468|       |      // that were evacuated.
 2469|      0|      heapBytes.after = acceptor.evacuatedBytes();
 2470|    113|    } else {
 2471|    113|      EvacAcceptor<false> acceptor{*this};
 2472|    113|      youngGenEvacuateImpl(acceptor, false);
 2473|    113|      heapBytes.after = acceptor.evacuatedBytes();
 2474|    113|    }
 2475|       |    // Inform trackers about objects that died during this YG collection.
 2476|    113|    if (isTrackingIDs()) {
  ------------------
  |  Branch (2476:9): [True: 0, False: 113]
  ------------------
 2477|      0|      auto trackerCallback = [this](GCCell *cell) {
 2478|       |        // The compactee might have free list cells, which are not tracked.
 2479|       |        // untrackObject requires the object to have been tracked previously.
 2480|       |        // So skip free list cells here.
 2481|      0|        if (!vmisa<OldGen::FreelistCell>(cell)) {
 2482|      0|          untrackObject(cell, cell->getAllocatedSize());
 2483|      0|        }
 2484|      0|      };
 2485|      0|      yg.forCompactedObjs(trackerCallback, getPointerBase());
 2486|      0|      if (doCompaction) {
  ------------------
  |  Branch (2486:11): [True: 0, False: 0]
  ------------------
 2487|      0|        compactee_.segment->forCompactedObjs(trackerCallback, getPointerBase());
 2488|      0|      }
 2489|      0|    }
 2490|       |    // Run finalizers for young gen objects.
 2491|    113|    finalizeYoungGenObjects();
 2492|       |    // This was modified by debitExternalMemoryFromFinalizer, called by
 2493|       |    // finalizers. The difference in the value before to now was the swept bytes
 2494|    113|    externalBytes.after = getYoungGenExternalBytes();
 2495|       |
 2496|    113|    if (overwriteDeadYGObjects_)
  ------------------
  |  Branch (2496:9): [True: 0, False: 113]
  ------------------
 2497|      0|      memset(yg.start(), kInvalidHeapValue, yg.used());
 2498|       |
 2499|       |    // Now the copy list is drained, and all references point to the old
 2500|       |    // gen. Clear the level of the young gen.
 2501|    113|    yg.resetLevel();
 2502|    113|    assert(
 2503|    113|        yg.markBitArray().findNextUnmarkedBitFrom(0) ==
 2504|    113|            yg.markBitArray().size() &&
 2505|    113|        "Young gen segment must have all mark bits set");
 2506|       |
 2507|    113|    if (doCompaction) {
  ------------------
  |  Branch (2507:9): [True: 0, False: 113]
  ------------------
 2508|      0|      numCompactions_++;
 2509|      0|      ygCollectionStats_->addCollectionType("compact");
 2510|       |      // We can use the total amount of external memory in the OG before and
 2511|       |      // after running finalizers to measure how much external memory has been
 2512|       |      // released.
 2513|      0|      uint64_t ogExternalBefore = oldGen_.externalBytes();
 2514|       |      // Similarly, finalizeCompactee will update the allocated bytes counter to
 2515|       |      // remove bytes allocated in the compactee.
 2516|      0|      uint64_t ogAllocatedBefore = oldGen_.allocatedBytes();
 2517|      0|      finalizeCompactee();
 2518|      0|      heapBytes.before += ogAllocatedBefore - oldGen_.allocatedBytes();
 2519|      0|      const uint64_t externalCompactedBytes =
 2520|      0|          ogExternalBefore - oldGen_.externalBytes();
 2521|       |      // Since we can't track the actual number of external bytes that were in
 2522|       |      // this segment, just use the swept external byte count.
 2523|      0|      externalBytes.before += externalCompactedBytes;
 2524|      0|    }
 2525|       |
 2526|       |    // Move external memory accounting from YG to OG as well.
 2527|    113|    transferExternalMemoryToOldGen();
 2528|       |
 2529|       |    // Potentially resize the YG if this collection did not meet our pause time
 2530|       |    // goals. Exclude compacting collections and the portion of YG time spent on
 2531|       |    // incremental OG collections, since they distort pause times and are
 2532|       |    // unaffected by YG size.
 2533|    113|    if (!doCompaction)
  ------------------
  |  Branch (2533:9): [True: 113, False: 0]
  ------------------
 2534|    113|      updateYoungGenSizeFactor();
 2535|       |
 2536|       |    // The effective end of our YG is no longer accurate for multiple reasons:
 2537|       |    // 1. transferExternalMemoryToOldGen resets the effectiveEnd to be the end.
 2538|       |    // 2. Creating a large alloc in the YG can increase the effectiveEnd.
 2539|       |    // 3. The duration of this collection may not have met our pause time goals.
 2540|    113|    youngGen().setEffectiveEnd(
 2541|    113|        youngGen().start() +
 2542|    113|        static_cast<size_t>(ygSizeFactor_ * HeapSegment::maxSize()));
 2543|       |
 2544|       |    // We have to set these after the collection, in case a compaction took
 2545|       |    // place and updated these metrics.
 2546|    113|    ygCollectionStats_->setBeforeSizes(
 2547|    113|        heapBytes.before, externalBytes.before, segmentFootprint());
 2548|       |
 2549|       |    // The swept bytes are just the bytes that were not evacuated.
 2550|    113|    ygCollectionStats_->setSweptBytes(heapBytes.before - heapBytes.after);
 2551|    113|    ygCollectionStats_->setSweptExternalBytes(
 2552|    113|        externalBytes.before - externalBytes.after);
 2553|    113|    ygCollectionStats_->setAfterSize(segmentFootprint());
 2554|       |    // If this is not a compacting YG, update the average survival bytes.
 2555|       |    // In a compacting YG, since the evacuatedBytes counter tracks both
 2556|       |    // segments, this value is not a useful predictor of future collections.
 2557|    113|    if (!doCompaction)
  ------------------
  |  Branch (2557:9): [True: 113, False: 0]
  ------------------
 2558|    113|      ygAverageSurvivalBytes_.update(
 2559|    113|          ygCollectionStats_->afterAllocatedBytes() +
 2560|    113|          ygCollectionStats_->afterExternalBytes());
 2561|    113|  }
 2562|    113|#ifdef HERMES_SLOW_DEBUG
 2563|       |  // Check that the card tables are well-formed after the collection.
 2564|    113|  verifyCardTable();
 2565|    113|#endif
 2566|       |  // Perform any pending work for an ongoing OG collection.
 2567|       |  // Do this before starting a new collection in case we need collections
 2568|       |  // back-to-back. Also, don't check this after starting a collection to avoid
 2569|       |  // waiting for something that is both unlikely, and will increase the pause
 2570|       |  // time if it does happen.
 2571|    113|  yieldToOldGen();
 2572|       |  // We can only consider starting a new OG collection if any previous OG
 2573|       |  // collection is fully completed and has not left a pending compaction. This
 2574|       |  // handles the rare case where an OG collection was completed during this YG
 2575|       |  // collection, and the compaction will therefore only be completed in the next
 2576|       |  // collection.
 2577|    113|  if (concurrentPhase_ == Phase::None && !compactee_.evacActive()) {
  ------------------
  |  Branch (2577:7): [True: 113, False: 0]
  |  Branch (2577:42): [True: 113, False: 0]
  ------------------
 2578|       |    // There is no OG collection running, check the tripwire in case this is the
 2579|       |    // first YG after an OG completed.
 2580|    113|    checkTripwireAndSubmitStats();
 2581|    113|    if (forceOldGenCollection) {
  ------------------
  |  Branch (2581:9): [True: 0, False: 113]
  ------------------
 2582|       |      // If an OG collection is being forced, it's because something called
 2583|       |      // collect directly, most likely from a memory warning. In order to
 2584|       |      // respond to memory pressure effectively, the OG should compact.
 2585|      0|      oldGenCollection(std::move(cause), /*forceCompaction*/ true);
 2586|    113|    } else {
 2587|       |      // If the OG is sufficiently full after the collection finishes, begin
 2588|       |      // an OG collection.
 2589|       |      // External bytes are part of the numerator and denominator, because they
 2590|       |      // should not be included as part of determining the heap's occupancy, but
 2591|       |      // instead just influence when collections begin.
 2592|    113|      const uint64_t totalAllocated =
 2593|    113|          oldGen_.allocatedBytes() + oldGen_.externalBytes();
 2594|    113|      const uint64_t totalBytes = oldGen_.targetSizeBytes();
 2595|    113|      double allocatedRatio = static_cast<double>(totalAllocated) / totalBytes;
 2596|    113|      if (allocatedRatio >= ogThreshold_) {
  ------------------
  |  Branch (2596:11): [True: 0, False: 113]
  ------------------
 2597|      0|        oldGenCollection(kNaturalCauseForAnalytics, /*forceCompaction*/ false);
 2598|      0|      }
 2599|    113|    }
 2600|    113|  }
 2601|    113|#ifdef HERMES_SLOW_DEBUG
 2602|       |  // Run a well-formed check before exiting.
 2603|    113|  checkWellFormed();
 2604|    113|#endif
 2605|    113|  ygCollectionStats_->setEndTime();
 2606|    113|  ygCollectionStats_->endCPUTimeSection();
 2607|    113|  auto statsEvent = std::move(*ygCollectionStats_).getEvent();
 2608|    113|  recordGCStats(statsEvent, true);
 2609|    113|  recordGCStats(statsEvent, &ygCumulativeStats_, true);
 2610|    113|  ygCollectionStats_.reset();
 2611|    113|}
_ZN6hermes2vm7HadesGC23promoteYoungGenToOldGenEv:
 2613|    113|bool HadesGC::promoteYoungGenToOldGen() {
 2614|    113|  if (!promoteYGToOG_) {
  ------------------
  |  Branch (2614:7): [True: 113, False: 0]
  ------------------
 2615|    113|    return false;
 2616|    113|  }
 2617|       |
 2618|       |  // Attempt to create a new segment, if that fails, turn off the flag to
 2619|       |  // disable GC and return false so we proceed with a GC.
 2620|       |  // TODO: Add more stringent criteria for turning off this flag, for instance,
 2621|       |  // once the heap reaches a certain size. That would avoid growing the heap to
 2622|       |  // the maximum possible size before stopping promotions.
 2623|      0|  llvh::ErrorOr<HeapSegment> newYoungGen = createSegment();
 2624|      0|  if (!newYoungGen) {
  ------------------
  |  Branch (2624:7): [True: 0, False: 0]
  ------------------
 2625|      0|    promoteYGToOG_ = false;
 2626|      0|    return false;
 2627|      0|  }
 2628|       |
 2629|       |  // Move the external memory costs to the OG. Needs to happen here so that the
 2630|       |  // YG segment moved to OG is not left with an effective end.
 2631|      0|  transferExternalMemoryToOldGen();
 2632|       |  // The flag is on to prevent GC until TTI. Promote the whole YG segment
 2633|       |  // directly into OG.
 2634|       |  // Before promoting it, set the cell heads correctly for the segment
 2635|       |  // going into OG. This could be done at allocation time, but at a cost
 2636|       |  // to YG alloc times for a case that might not come up.
 2637|      0|  youngGen_.forAllObjs([this](GCCell *cell) {
 2638|      0|    youngGen_.setCellHead(cell, cell->getAllocatedSize());
 2639|      0|  });
 2640|       |  // It is important that this operation is just a move of pointers to
 2641|       |  // segments. The addresses have to stay the same or else it would
 2642|       |  // require a marking pass through all objects.
 2643|       |  // This will also rename the segment in the crash data.
 2644|      0|  oldGen_.addSegment(setYoungGen(std::move(newYoungGen.get())));
 2645|       |
 2646|      0|  return true;
 2647|      0|}
_ZN6hermes2vm7HadesGC11setYoungGenENS1_11HeapSegmentE:
 2649|    160|HadesGC::HeapSegment HadesGC::setYoungGen(HeapSegment seg) {
 2650|    160|  addSegmentExtentToCrashManager(seg, "YG");
 2651|    160|  youngGenFinalizables_.clear();
 2652|    160|  std::swap(youngGen_, seg);
 2653|    160|  youngGenCP_ = CompressedPointer::encodeNonNull(
 2654|    160|      reinterpret_cast<GCCell *>(youngGen_.lowLim()), getPointerBase());
 2655|    160|  return seg;
 2656|    160|}
_ZN6hermes2vm7HadesGC27checkTripwireAndSubmitStatsEv:
 2658|    113|void HadesGC::checkTripwireAndSubmitStats() {
 2659|    113|  assert(
 2660|    113|      gcMutex_ &&
 2661|    113|      "gcMutex must be held before calling checkTripwireAndSubmitStats");
 2662|    113|  assert(
 2663|    113|      concurrentPhase_ == Phase::None &&
 2664|    113|      "Cannot check stats while OG collection is ongoing.");
 2665|    113|  if (!ogCollectionStats_) {
  ------------------
  |  Branch (2665:7): [True: 113, False: 0]
  ------------------
 2666|    113|    return;
 2667|    113|  }
 2668|      0|  const auto usedBytes = ogCollectionStats_->afterAllocatedBytes() +
 2669|      0|      ogCollectionStats_->afterExternalBytes();
 2670|       |  // We use the amount of live data from after a GC completed as the minimum
 2671|       |  // bound of what is live.
 2672|      0|  checkTripwire(usedBytes);
 2673|      0|  auto event = std::move(*ogCollectionStats_).getEvent();
 2674|      0|  recordGCStats(event, false);
 2675|      0|  recordGCStats(event, &ogCumulativeStats_, false);
 2676|      0|  ogCollectionStats_.reset();
 2677|      0|}
_ZN6hermes2vm7HadesGC30transferExternalMemoryToOldGenEv:
 2679|    273|void HadesGC::transferExternalMemoryToOldGen() {
 2680|    273|  oldGen_.creditExternalMemory(getYoungGenExternalBytes());
 2681|    273|  setYoungGenExternalBytes(0);
 2682|    273|  youngGen_.clearExternalMemoryCharge();
 2683|    273|}
_ZN6hermes2vm7HadesGC24updateYoungGenSizeFactorEv:
 2685|    113|void HadesGC::updateYoungGenSizeFactor() {
 2686|    113|  assert(
 2687|    113|      ygSizeFactor_ <= 1.0 && ygSizeFactor_ >= 0.25 && "YG size out of range.");
 2688|    113|  const auto ygDuration = ygCollectionStats_->getElapsedTime().count();
 2689|       |  // If the YG collection has taken less than 20% of our budgeted time, increase
 2690|       |  // the size of the YG by 10%.
 2691|    113|  if (ygDuration < kTargetMaxPauseMs * 0.2)
  ------------------
  |  Branch (2691:7): [True: 75, False: 38]
  ------------------
 2692|     75|    ygSizeFactor_ = std::min(ygSizeFactor_ * 1.1, 1.0);
 2693|       |  // If the YG collection has taken more than 40% of our budgeted time, decrease
 2694|       |  // the size of the YG by 10%. This is meant to leave some time for OG work.
 2695|       |  // However, don't let the YG size drop below 25% of the segment size.
 2696|     38|  else if (ygDuration > kTargetMaxPauseMs * 0.4)
  ------------------
  |  Branch (2696:12): [True: 1, False: 37]
  ------------------
 2697|      1|    ygSizeFactor_ = std::max(ygSizeFactor_ * 0.9, 0.25);
 2698|    113|}
_ZN6hermes2vm7HadesGC23finalizeYoungGenObjectsEv:
 2815|    273|void HadesGC::finalizeYoungGenObjects() {
 2816|    989|  for (GCCell *cell : youngGenFinalizables_) {
  ------------------
  |  Branch (2816:21): [True: 989, False: 273]
  ------------------
 2817|    989|    if (!cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (2817:9): [True: 843, False: 146]
  ------------------
 2818|    843|      cell->getVT()->finalize(cell, *this);
 2819|    843|    }
 2820|    989|  }
 2821|    273|  youngGenFinalizables_.clear();
 2822|    273|}
_ZNK6hermes2vm7HadesGC13externalBytesEv:
 2829|    320|uint64_t HadesGC::externalBytes() const {
 2830|    320|  return getYoungGenExternalBytes() + oldGen_.externalBytes();
 2831|    320|}
_ZNK6hermes2vm7HadesGC16segmentFootprintEv:
 2833|    546|uint64_t HadesGC::segmentFootprint() const {
 2834|    546|  size_t totalSegments = oldGen_.numSegments() + (youngGen_ ? 1 : 0) +
  ------------------
  |  Branch (2834:51): [True: 386, False: 160]
  ------------------
 2835|    546|      (compactee_.segment ? 1 : 0);
  ------------------
  |  Branch (2835:8): [True: 0, False: 546]
  ------------------
 2836|    546|  return totalSegments * AlignedStorage::size();
 2837|    546|}
_ZNK6hermes2vm7HadesGC13heapFootprintEv:
 2839|    320|uint64_t HadesGC::heapFootprint() const {
 2840|    320|  return segmentFootprint() + externalBytes();
 2841|    320|}
_ZNK6hermes2vm7HadesGC6OldGen14allocatedBytesEv:
 2843|    152|uint64_t HadesGC::OldGen::allocatedBytes() const {
 2844|    152|  return allocatedBytes_;
 2845|    152|}
_ZN6hermes2vm7HadesGC6OldGen23incrementAllocatedBytesEi:
 2847|   585k|void HadesGC::OldGen::incrementAllocatedBytes(int32_t incr) {
 2848|   585k|  allocatedBytes_ += incr;
 2849|   585k|  assert(allocatedBytes_ <= size() && "Invalid increment");
 2850|   585k|}
_ZNK6hermes2vm7HadesGC6OldGen13externalBytesEv:
 2852|    472|uint64_t HadesGC::OldGen::externalBytes() const {
 2853|    472|  assert(gc_.gcMutex_ && "OG external bytes must be accessed under gcMutex_.");
 2854|    472|  return externalBytes_;
 2855|    472|}
_ZNK6hermes2vm7HadesGC6OldGen4sizeEv:
 2857|   585k|uint64_t HadesGC::OldGen::size() const {
 2858|   585k|  size_t totalSegments = numSegments() + (gc_.compactee_.segment ? 1 : 0);
  ------------------
  |  Branch (2858:43): [True: 0, False: 585k]
  ------------------
 2859|   585k|  return totalSegments * HeapSegment::maxSize();
 2860|   585k|}
_ZNK6hermes2vm7HadesGC6OldGen15targetSizeBytesEv:
 2862|    152|uint64_t HadesGC::OldGen::targetSizeBytes() const {
 2863|    152|  assert(gc_.gcMutex_ && "Must hold gcMutex_ when accessing targetSizeBytes_.");
 2864|    152|  return targetSizeBytes_;
 2865|    152|}
_ZNK6hermes2vm7HadesGC24getYoungGenExternalBytesEv:
 2867|  1.31k|size_t HadesGC::getYoungGenExternalBytes() const {
 2868|  1.31k|  assert(
 2869|  1.31k|      !calledByBackgroundThread() &&
 2870|  1.31k|      "ygExternalBytes_ is only accessible from the mutator.");
 2871|  1.31k|  return ygExternalBytes_;
 2872|  1.31k|}
_ZN6hermes2vm7HadesGC24setYoungGenExternalBytesEm:
 2873|    771|void HadesGC::setYoungGenExternalBytes(size_t sz) {
 2874|    771|  assert(
 2875|    771|      !calledByBackgroundThread() &&
 2876|    771|      "ygExternalBytes_ is only accessible from the mutator.");
 2877|    771|  ygExternalBytes_ = sz;
 2878|    771|}
_ZN6hermes2vm7HadesGC6OldGen5beginEv:
 2900|    838|std::deque<HadesGC::HeapSegment>::iterator HadesGC::OldGen::begin() {
 2901|    838|  return segments_.begin();
 2902|    838|}
_ZN6hermes2vm7HadesGC6OldGen3endEv:
 2904|    838|std::deque<HadesGC::HeapSegment>::iterator HadesGC::OldGen::end() {
 2905|    838|  return segments_.end();
 2906|    838|}
_ZNK6hermes2vm7HadesGC6OldGen5beginEv:
 2909|  15.9M|    const {
 2910|  15.9M|  return segments_.begin();
 2911|  15.9M|}
_ZNK6hermes2vm7HadesGC6OldGen3endEv:
 2913|  15.9M|std::deque<HadesGC::HeapSegment>::const_iterator HadesGC::OldGen::end() const {
 2914|  15.9M|  return segments_.end();
 2915|  15.9M|}
_ZNK6hermes2vm7HadesGC6OldGen11numSegmentsEv:
 2917|   586k|size_t HadesGC::OldGen::numSegments() const {
 2918|   586k|  return segments_.size();
 2919|   586k|}
_ZN6hermes2vm7HadesGC6OldGenixEm:
 2921|    113|HadesGC::HeapSegment &HadesGC::OldGen::operator[](size_t i) {
 2922|    113|  return segments_[i];
 2923|    113|}
_ZN6hermes2vm7HadesGC13createSegmentEv:
 2925|    320|llvh::ErrorOr<HadesGC::HeapSegment> HadesGC::createSegment() {
 2926|       |  // No heap size limit when Handle-SAN is on, to allow the heap enough room to
 2927|       |  // keep moving things around.
 2928|    320|  if (!sanitizeRate_ && heapFootprint() >= maxHeapSize_)
  ------------------
  |  Branch (2928:7): [Folded - Ignored]
  |  Branch (2928:25): [True: 0, False: 320]
  ------------------
 2929|      0|    return make_error_code(OOMError::MaxHeapReached);
 2930|       |
 2931|    320|  auto res = AlignedStorage::create(provider_.get(), "hades-segment");
 2932|    320|  if (!res) {
  ------------------
  |  Branch (2932:7): [True: 0, False: 320]
  ------------------
 2933|      0|    return res.getError();
 2934|      0|  }
 2935|    320|  HeapSegment seg(std::move(res.get()));
 2936|       |  // Even if compressed pointers are off, we still use the segment index for
 2937|       |  // crash manager indices.
 2938|    320|  size_t segIdx;
 2939|    320|  if (segmentIndices_.size()) {
  ------------------
  |  Branch (2939:7): [True: 0, False: 320]
  ------------------
 2940|      0|    segIdx = segmentIndices_.back();
 2941|      0|    segmentIndices_.pop_back();
 2942|    320|  } else {
 2943|    320|    segIdx = ++numSegments_;
 2944|    320|  }
 2945|    320|  pointerBase_.setSegment(segIdx, seg.lowLim());
 2946|    320|  addSegmentExtentToCrashManager(seg, std::to_string(segIdx));
 2947|    320|  seg.markBitArray().markAll();
 2948|    320|  return llvh::ErrorOr<HadesGC::HeapSegment>(std::move(seg));
 2949|    320|}
_ZN6hermes2vm7HadesGC6OldGen10addSegmentENS1_11HeapSegmentE:
 2951|    160|void HadesGC::OldGen::addSegment(HeapSegment seg) {
 2952|    160|  segments_.emplace_back(std::move(seg));
 2953|    160|  HeapSegment &newSeg = segments_.back();
 2954|    160|  incrementAllocatedBytes(newSeg.used());
 2955|       |  // Add a set of freelist buckets for this segment.
 2956|    160|  segmentBuckets_.emplace_back();
 2957|       |
 2958|    160|  assert(
 2959|    160|      segmentBuckets_.size() == segments_.size() &&
 2960|    160|      "Must have as many freelists as segments.");
 2961|       |
 2962|       |  // Add the remainder of the segment to the freelist.
 2963|    160|  uint32_t sz = newSeg.available();
 2964|    160|  if (sz >= minAllocationSize()) {
  ------------------
  |  Branch (2964:7): [True: 160, False: 0]
  ------------------
 2965|    160|    auto res = newSeg.alloc(sz);
 2966|    160|    assert(res.success);
 2967|    160|    auto bucket = getFreelistBucket(sz);
 2968|    160|    addCellToFreelist(res.ptr, sz, &segmentBuckets_.back()[bucket]);
 2969|    160|  }
 2970|       |
 2971|    160|  gc_.addSegmentExtentToCrashManager(newSeg, std::to_string(numSegments()));
 2972|    160|}
_ZN6hermes2vm7HadesGC6OldGen18setTargetSizeBytesEm:
 2989|    160|void HadesGC::OldGen::setTargetSizeBytes(size_t targetSizeBytes) {
 2990|    160|  assert(gc_.gcMutex_ && "Must hold gcMutex_ when accessing targetSizeBytes_.");
 2991|    160|  assert(!targetSizeBytes_ && "Should only initialise targetSizeBytes_ once.");
 2992|    160|  targetSizeBytes_ = ExponentialMovingAverage(0.5, targetSizeBytes);
 2993|    160|}
_ZNK6hermes2vm7HadesGC8inOldGenEPKv:
 2995|  15.9M|bool HadesGC::inOldGen(const void *p) const {
 2996|       |  // If it isn't in any OG segment or the compactee, then this pointer is not in
 2997|       |  // the OG.
 2998|  15.9M|  return compactee_.contains(p) ||
  ------------------
  |  Branch (2998:10): [True: 0, False: 15.9M]
  ------------------
 2999|  15.9M|      std::any_of(oldGen_.begin(), oldGen_.end(), [p](const HeapSegment &seg) {
  ------------------
  |  Branch (2999:7): [True: 15.9M, False: 0]
  ------------------
 3000|  15.9M|           return seg.contains(p);
 3001|  15.9M|         });
 3002|  15.9M|}
_ZN6hermes2vm7HadesGC13yieldToOldGenEv:
 3004|    113|void HadesGC::yieldToOldGen() {
 3005|    113|  assert(inGC() && "Must be in GC when yielding to old gen");
 3006|    113|  if (!kConcurrentGC && concurrentPhase_ != Phase::None) {
  ------------------
  |  Branch (3006:7): [Folded - Ignored]
  |  Branch (3006:25): [True: 0, False: 0]
  ------------------
 3007|       |    // If there is an ongoing collection, update the drain rate before
 3008|       |    // collecting.
 3009|      0|    if (concurrentPhase_ == Phase::Mark)
  ------------------
  |  Branch (3009:9): [True: 0, False: 0]
  ------------------
 3010|      0|      oldGenMarker_->setDrainRate(getDrainRate());
 3011|       |
 3012|      0|    constexpr uint32_t kYGIncrementalCollectBudget = kTargetMaxPauseMs / 2;
 3013|      0|    const auto initialPhase = concurrentPhase_;
 3014|       |    // If the phase hasn't changed and we are still under 25ms after the first
 3015|       |    // iteration, then we can be reasonably sure that the next iteration will
 3016|       |    // also be <25ms, keeping us within 50ms even in the worst case.
 3017|      0|    do {
 3018|      0|      incrementalCollect(false);
 3019|      0|    } while (concurrentPhase_ == initialPhase &&
  ------------------
  |  Branch (3019:14): [True: 0, False: 0]
  |  Branch (3019:14): [True: 0, False: 0]
  ------------------
 3020|      0|             ygCollectionStats_->getElapsedTime().count() <
  ------------------
  |  Branch (3020:14): [True: 0, False: 0]
  ------------------
 3021|      0|                 kYGIncrementalCollectBudget);
 3022|       |
 3023|    113|  } else if (concurrentPhase_ == Phase::CompleteMarking) {
  ------------------
  |  Branch (3023:14): [True: 0, False: 113]
  ------------------
 3024|      0|    incrementalCollect(false);
 3025|      0|    collectOGInBackground();
 3026|      0|  }
 3027|    113|}
_ZN6hermes2vm7HadesGC30addSegmentExtentToCrashManagerERKNS1_11HeapSegmentERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
 3055|    640|    const std::string &extraName) {
 3056|    640|  assert(!extraName.empty() && "extraName can't be empty");
 3057|    640|  if (!crashMgr_) {
  ------------------
  |  Branch (3057:7): [True: 0, False: 640]
  ------------------
 3058|      0|    return;
 3059|      0|  }
 3060|    640|  const std::string segmentName = name_ + ":HeapSegment:" + extraName;
 3061|       |  // Pointers need at most 18 characters for 0x + 16 digits for a 64-bit
 3062|       |  // pointer.
 3063|    640|  constexpr unsigned kAddressMaxSize = 18;
 3064|    640|  char segmentAddressBuffer[kAddressMaxSize];
 3065|    640|  snprintf(segmentAddressBuffer, kAddressMaxSize, "%p", seg.lowLim());
 3066|    640|  crashMgr_->setContextualCustomData(segmentName.c_str(), segmentAddressBuffer);
 3067|       |
 3068|       |#ifdef HERMESVM_PLATFORM_LOGGING
 3069|       |  hermesLog(
 3070|       |      "HermesGC",
 3071|       |      "Added segment extent: %s = %s",
 3072|       |      segmentName.c_str(),
 3073|       |      segmentAddressBuffer);
 3074|       |#endif
 3075|    640|}
_ZN6hermes2vm7HadesGC15checkWellFormedEv:
 3089|    226|void HadesGC::checkWellFormed() {
 3090|    226|  CheckHeapWellFormedAcceptor acceptor(*this);
 3091|    226|  {
 3092|    226|    DroppingAcceptor<CheckHeapWellFormedAcceptor> nameAcceptor{acceptor};
 3093|    226|    markRoots(nameAcceptor, true);
 3094|    226|  }
 3095|    226|  markWeakRoots(acceptor, /*markLongLived*/ true);
 3096|    226|  forAllObjs([this, &acceptor](GCCell *cell) {
 3097|    226|    assert(cell->isValid() && "Invalid cell encountered in heap");
 3098|    226|    markCell(cell, acceptor);
 3099|    226|  });
 3100|       |
 3101|    226|  weakMapEntrySlots_.forEach([](WeakMapEntrySlot &slot) {
 3102|    226|    if (slot.mappedValue.isEmpty()) {
 3103|    226|      assert(
 3104|    226|          !slot.key ||
 3105|    226|          !slot.owner && "Reachable entry should have not have Empty value.");
 3106|    226|    }
 3107|    226|  });
 3108|    226|}
_ZN6hermes2vm7HadesGC15verifyCardTableEv:
 3110|    226|void HadesGC::verifyCardTable() {
 3111|    226|  assert(inGC() && "Must be in GC to call verifyCardTable");
 3112|    226|  struct VerifyCardDirtyAcceptor final : public SlotAcceptor {
 3113|    226|    HadesGC &gc;
 3114|       |
 3115|    226|    explicit VerifyCardDirtyAcceptor(HadesGC &gc) : gc(gc) {}
 3116|       |
 3117|    226|    void acceptHelper(void *valuePtr, void *locPtr) {
 3118|    226|      const bool crossRegionCompacteePtr =
 3119|    226|          !gc.compactee_.evacContains(locPtr) &&
 3120|    226|          gc.compactee_.evacContains(valuePtr);
 3121|    226|      if (!gc.inYoungGen(locPtr) &&
 3122|    226|          (gc.inYoungGen(valuePtr) || crossRegionCompacteePtr)) {
 3123|    226|        assert(HeapSegment::cardTableCovering(locPtr)->isCardForAddressDirty(
 3124|    226|            locPtr));
 3125|    226|      }
 3126|    226|    }
 3127|       |
 3128|    226|    void accept(GCPointerBase &ptr) override {
 3129|    226|      acceptHelper(ptr.get(gc.getPointerBase()), &ptr);
 3130|    226|    }
 3131|       |
 3132|    226|    void accept(GCHermesValue &hv) override {
 3133|    226|      if (hv.isPointer())
 3134|    226|        acceptHelper(hv.getPointer(), &hv);
 3135|    226|    }
 3136|    226|    void accept(GCSmallHermesValue &hv) override {
 3137|    226|      if (hv.isPointer())
 3138|    226|        acceptHelper(hv.getPointer(gc.getPointerBase()), &hv);
 3139|    226|    }
 3140|       |
 3141|    226|    void accept(const GCSymbolID &hv) override {}
 3142|    226|  };
 3143|       |
 3144|    226|  VerifyCardDirtyAcceptor acceptor{*this};
 3145|    226|  forAllObjs([this, &acceptor](GCCell *cell) { markCell(cell, acceptor); });
 3146|       |
 3147|    226|  for (const HeapSegment &seg : oldGen_) {
  ------------------
  |  Branch (3147:31): [True: 226, False: 226]
  ------------------
 3148|    226|    seg.cardTable().verifyBoundaries(seg.start(), seg.level());
 3149|    226|  }
 3150|    226|}
_ZN6hermes2vm7HadesGC15CollectionStats13setSweptBytesEm:
  276|    113|  void setSweptBytes(uint64_t sweptBytes) {
  277|    113|    sweptBytes_ = sweptBytes;
  278|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStats21setSweptExternalBytesEm:
  280|    113|  void setSweptExternalBytes(uint64_t externalBytes) {
  281|    113|    sweptExternalBytes_ = externalBytes;
  282|    113|  }
_ZNK6hermes2vm7HadesGC15CollectionStats19afterAllocatedBytesEv:
  326|    339|  uint64_t afterAllocatedBytes() const {
  327|    339|    assert(sweptBytes_ <= allocatedBefore_);
  328|    339|    return allocatedBefore_ - sweptBytes_;
  329|    339|  }
_ZNK6hermes2vm7HadesGC15CollectionStats18afterExternalBytesEv:
  331|    226|  uint64_t afterExternalBytes() const {
  332|    226|    assert(sweptExternalBytes_ <= externalBefore_);
  333|    226|    return externalBefore_ - sweptExternalBytes_;
  334|    226|  }
_ZN6hermes2vm7HadesGC15CollectionStatsC2ERS1_NSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEESA_:
  255|    113|      : gc_{gc},
  256|    113|        cause_{std::move(cause)},
  257|    113|        collectionType_{std::move(collectionType)} {}
_ZN6hermes2vm7HadesGC15CollectionStats19beginCPUTimeSectionEv:
  308|    113|  void beginCPUTimeSection() {
  309|    113|    assert(
  310|    113|        cpuTimeSectionStart_ == Duration{} &&
  311|    113|        "Must end cpu time section before starting another");
  312|    113|    cpuTimeSectionStart_ = oscompat::thread_cpu_time();
  313|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStats12setBeginTimeEv:
  289|    113|  void setBeginTime() {
  290|    113|    assert(beginTime_ == Clock::time_point{} && "Begin time already set");
  291|    113|    beginTime_ = Clock::now();
  292|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStats17endCPUTimeSectionEv:
  314|    113|  void endCPUTimeSection() {
  315|    113|    cpuDuration_ += oscompat::thread_cpu_time() - cpuTimeSectionStart_;
  316|    113|    cpuTimeSectionStart_ = {};
  317|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStats10setEndTimeEv:
  295|    113|  void setEndTime() {
  296|    113|    assert(endTime_ == Clock::time_point{} && "End time already set");
  297|    113|    endTime_ = Clock::now();
  298|    113|  }
_ZNO6hermes2vm7HadesGC15CollectionStats8getEventEv:
  346|    113|  GCAnalyticsEvent getEvent() && {
  347|    113|    markUsed();
  348|    113|    return GCAnalyticsEvent{
  349|    113|        gc_.getName(),
  350|    113|        gc_.getKindAsStr(),
  351|    113|        collectionType_,
  352|    113|        std::move(cause_),
  353|    113|        std::chrono::duration_cast<std::chrono::milliseconds>(
  354|    113|            endTime_ - beginTime_),
  355|    113|        std::chrono::duration_cast<std::chrono::milliseconds>(cpuDuration_),
  356|    113|        /*allocated*/ BeforeAndAfter{allocatedBefore_, afterAllocatedBytes()},
  357|    113|        /*size*/ BeforeAndAfter{sizeBefore_, sizeAfter_},
  358|    113|        /*external*/ BeforeAndAfter{externalBefore_, afterExternalBytes()},
  359|    113|        /*survivalRatio*/ survivalRatio(),
  360|    113|        /*tags*/ std::move(tags_)};
  361|    113|  }
_ZNK6hermes2vm7HadesGC15CollectionStats13survivalRatioEv:
  336|    113|  double survivalRatio() const {
  337|    113|    return allocatedBefore_
  ------------------
  |  Branch (337:12): [True: 113, False: 0]
  ------------------
  338|    113|        ? static_cast<double>(afterAllocatedBytes()) / allocatedBefore_
  339|    113|        : 0;
  340|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStatsD2Ev:
  258|    113|  ~CollectionStats() {
  259|    113|    assert(usedDbg_ && "Stats not submitted.");
  260|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStats14setBeforeSizesEmmm:
  269|    113|  void setBeforeSizes(uint64_t allocated, uint64_t external, uint64_t sz) {
  270|    113|    allocatedBefore_ = allocated;
  271|    113|    externalBefore_ = external;
  272|    113|    sizeBefore_ = sz;
  273|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStats12setAfterSizeEm:
  284|    113|  void setAfterSize(uint64_t sz) {
  285|    113|    sizeAfter_ = sz;
  286|    113|  }
_ZN6hermes2vm7HadesGC15CollectionStats8markUsedEv:
  342|    113|  void markUsed() {
  343|    113|    assert(!std::exchange(usedDbg_, true) && "markUsed called twice");
  344|    113|  }
_ZNK6hermes2vm7HadesGC8Executor11getThreadIdEv:
 1052|  12.9M|  std::thread::id getThreadId() const {
 1053|  12.9M|    return thread_.get_id();
 1054|  12.9M|  }
_ZN6hermes2vm7HadesGC15CollectionStats14getElapsedTimeEv:
  300|    113|  std::chrono::milliseconds getElapsedTime() {
  301|    113|    return std::chrono::duration_cast<std::chrono::milliseconds>(
  302|    113|        Clock::now() - beginTime_);
  303|    113|  }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptorC2ERS1_:
 3115|    226|    explicit VerifyCardDirtyAcceptor(HadesGC &gc) : gc(gc) {}
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERNS0_13GCPointerBaseE:
 3128|  5.97M|    void accept(GCPointerBase &ptr) override {
 3129|  5.97M|      acceptHelper(ptr.get(gc.getPointerBase()), &ptr);
 3130|  5.97M|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor12acceptHelperEPvS3_:
 3117|  9.12M|    void acceptHelper(void *valuePtr, void *locPtr) {
 3118|  9.12M|      const bool crossRegionCompacteePtr =
 3119|  9.12M|          !gc.compactee_.evacContains(locPtr) &&
  ------------------
  |  Branch (3119:11): [True: 9.12M, False: 0]
  ------------------
 3120|  9.12M|          gc.compactee_.evacContains(valuePtr);
  ------------------
  |  Branch (3120:11): [True: 0, False: 9.12M]
  ------------------
 3121|  9.12M|      if (!gc.inYoungGen(locPtr) &&
  ------------------
  |  Branch (3121:11): [True: 1.72M, False: 7.39M]
  ------------------
 3122|  9.12M|          (gc.inYoungGen(valuePtr) || crossRegionCompacteePtr)) {
  ------------------
  |  Branch (3122:12): [True: 1.63k, False: 1.72M]
  |  Branch (3122:39): [True: 0, False: 1.72M]
  ------------------
 3123|  1.63k|        assert(HeapSegment::cardTableCovering(locPtr)->isCardForAddressDirty(
 3124|  1.63k|            locPtr));
 3125|  1.63k|      }
 3126|  9.12M|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
 3132|  20.5M|    void accept(GCHermesValue &hv) override {
 3133|  20.5M|      if (hv.isPointer())
  ------------------
  |  Branch (3133:11): [True: 28.4k, False: 20.4M]
  ------------------
 3134|  28.4k|        acceptHelper(hv.getPointer(), &hv);
 3135|  20.5M|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERNS0_17GCHermesValueBaseINS0_13HermesValue32EEE:
 3136|  7.39M|    void accept(GCSmallHermesValue &hv) override {
 3137|  7.39M|      if (hv.isPointer())
  ------------------
  |  Branch (3137:11): [True: 3.11M, False: 4.28M]
  ------------------
 3138|  3.11M|        acceptHelper(hv.getPointer(gc.getPointerBase()), &hv);
 3139|  7.39M|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERKNS0_10GCSymbolIDE:
 3141|  2.32M|    void accept(const GCSymbolID &hv) override {}
_ZN6hermes2vm7HadesGC8ExecutorC2Ev:
 1033|    160|  Executor() : thread_([this] { worker(); }) {}
_ZZN6hermes2vm7HadesGC8ExecutorC1EvENKUlvE_clEv:
 1033|    160|  Executor() : thread_([this] { worker(); }) {}
_ZN6hermes2vm7HadesGC8Executor6workerEv:
 1058|    160|  void worker() {
 1059|    160|    oscompat::set_thread_name("hades");
 1060|    160|    std::unique_lock<std::mutex> lk(mtx_);
 1061|    320|    while (!shutdown_) {
  ------------------
  |  Branch (1061:12): [True: 160, False: 160]
  ------------------
 1062|    160|      cv_.wait(lk, [this]() { return !queue_.empty() || shutdown_; });
 1063|    160|      while (!queue_.empty()) {
  ------------------
  |  Branch (1063:14): [True: 0, False: 160]
  ------------------
 1064|      0|        auto fn = std::move(queue_.front());
 1065|      0|        queue_.pop_front();
 1066|      0|        lk.unlock();
 1067|      0|        fn();
 1068|      0|        lk.lock();
 1069|      0|      }
 1070|    160|    }
 1071|    160|  }
_ZZN6hermes2vm7HadesGC8Executor6workerEvENKUlvE_clEv:
 1062|    320|      cv_.wait(lk, [this]() { return !queue_.empty() || shutdown_; });
  ------------------
  |  Branch (1062:38): [True: 0, False: 320]
  |  Branch (1062:57): [True: 160, False: 160]
  ------------------
_ZN6hermes2vm7HadesGC8ExecutorD2Ev:
 1034|    160|  ~Executor() {
 1035|    160|    {
 1036|    160|      std::lock_guard<std::mutex> lk(mtx_);
 1037|    160|      shutdown_ = true;
 1038|    160|      cv_.notify_one();
 1039|    160|    }
 1040|    160|    thread_.join();
 1041|    160|  }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC11finalizeAllEvENK3$_0clEPNS0_6GCCellE:
 1910|   585k|  const auto finalizeCallback = [this](GCCell *cell) {
 1911|   585k|    assert(cell->isValid() && "Invalid cell in finalizeAll");
 1912|   585k|    cell->getVT()->finalizeIfExists(cell, *this);
 1913|   585k|  };
HadesGC.cpp:_ZN6hermes2vm7HadesGC11HeapSegment10forAllObjsIZNS1_11finalizeAllEvE3$_0EEvT_:
  201|    160|void HadesGC::HeapSegment::forAllObjs(CallbackFunction callback) {
  202|   585k|  for (GCCell *cell : cells()) {
  ------------------
  |  Branch (202:21): [True: 585k, False: 160]
  ------------------
  203|       |    // Skip free-list entries.
  204|   585k|    if (!vmisa<OldGen::FreelistCell>(cell)) {
  ------------------
  |  Branch (204:9): [True: 585k, False: 160]
  ------------------
  205|   585k|      callback(cell);
  206|   585k|    }
  207|   585k|  }
  208|    160|}
_ZN6hermes2vm7HadesGC11HeapSegment10forAllObjsINSt3__18functionIFvPNS0_6GCCellEEEEEEvT_:
  201|    904|void HadesGC::HeapSegment::forAllObjs(CallbackFunction callback) {
  202|  15.9M|  for (GCCell *cell : cells()) {
  ------------------
  |  Branch (202:21): [True: 15.9M, False: 904]
  ------------------
  203|       |    // Skip free-list entries.
  204|  15.9M|    if (!vmisa<OldGen::FreelistCell>(cell)) {
  ------------------
  |  Branch (204:9): [True: 15.9M, False: 452]
  ------------------
  205|  15.9M|      callback(cell);
  206|  15.9M|    }
  207|  15.9M|  }
  208|    904|}
HadesGC.cpp:_ZN6hermes2vmL10convertPtrIPNS0_6GCCellEEET_RNS0_11PointerBaseENS0_17CompressedPointerE:
  389|    359|/* static */ GCCell *convertPtr(PointerBase &base, CompressedPointer cp) {
  390|    359|  return cp.get(base);
  391|    359|}
HadesGC.cpp:_ZN6hermes2vmL10convertPtrIPNS0_6GCCellEEET_RNS0_11PointerBaseES3_:
  393|  5.88k|static T convertPtr(PointerBase &, GCCell *p) {
  394|  5.88k|  return p;
  395|  5.88k|}
HadesGC.cpp:_ZN6hermes2vmL10convertPtrINS0_17CompressedPointerEEET_RNS0_11PointerBaseES2_:
  385|  22.4k|static T convertPtr(PointerBase &, CompressedPointer cp) {
  386|  22.4k|  return cp;
  387|  22.4k|}
HadesGC.cpp:_ZN6hermes2vmL10convertPtrINS0_17CompressedPointerEEET_RNS0_11PointerBaseEPNS0_6GCCellE:
  397|  28.3k|/* static */ CompressedPointer convertPtr(PointerBase &base, GCCell *a) {
  398|  28.3k|  return CompressedPointer::encodeNonNull(a, base);
  399|  28.3k|}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EEC2ERS1_:
  406|    113|      : gc{gc},
  407|    113|        pointerBase_{gc.getPointerBase()},
  408|    113|        copyListHead_{nullptr},
  409|    113|        isTrackingIDs_{gc.isTrackingIDs()} {}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERPNS0_6GCCellE:
  500|  6.31k|  void accept(GCCell *&ptr) override {
  501|  6.31k|    ptr = acceptRoot(ptr);
  502|  6.31k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptRootEPNS0_6GCCellE:
  425|   627k|  LLVM_NODISCARD GCCell *acceptRoot(GCCell *ptr) {
  426|   627k|    if (shouldForward(ptr))
  ------------------
  |  Branch (426:9): [True: 4.49k, False: 622k]
  ------------------
  427|  4.49k|      return forwardCell<GCCell *>(ptr);
  428|   622k|    return ptr;
  429|   627k|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb0EE13shouldForwardEPKv:
  416|   695k|  inline bool shouldForward(const void *ptr) const {
  417|   695k|    return gc.inYoungGen(ptr) ||
  ------------------
  |  Branch (417:12): [True: 6.47k, False: 689k]
  ------------------
  418|   695k|        (CompactionEnabled && gc.compactee_.evacContains(ptr));
  ------------------
  |  Branch (418:10): [Folded - Ignored]
  |  Branch (418:31): [True: 0, False: 0]
  ------------------
  419|   695k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE11forwardCellIPNS0_6GCCellEEET_S6_:
  464|  6.24k|  LLVM_NODISCARD T forwardCell(GCCell *const cell) {
  465|  6.24k|    assert(
  466|  6.24k|        HeapSegment::getCellMarkBit(cell) && "Cannot forward unmarked object");
  467|  6.24k|    if (cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (467:9): [True: 359, False: 5.88k]
  ------------------
  468|       |      // Get the forwarding pointer from the header of the object.
  469|    359|      CompressedPointer forwardedCell = cell->getMarkedForwardingPointer();
  470|    359|      assert(
  471|    359|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  472|    359|          "Cell was forwarded incorrectly");
  473|    359|      return convertPtr<T>(pointerBase_, forwardedCell);
  474|    359|    }
  475|  5.88k|    assert(cell->isValid() && "Encountered an invalid cell");
  476|  5.88k|    const auto cellSize = cell->getAllocatedSize();
  477|       |    // Newly discovered cell, first forward into the old gen.
  478|  5.88k|    GCCell *const newCell = gc.oldGen_.alloc(cellSize);
  479|  5.88k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  5.88k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  480|  5.88k|        gc.inOldGen(newCell) && "Evacuated cell not in the old gen");
  481|  5.88k|    assert(
  482|  5.88k|        HeapSegment::getCellMarkBit(newCell) &&
  483|  5.88k|        "Cell must be marked when it is allocated into the old gen");
  484|       |    // Copy the contents of the existing cell over before modifying it.
  485|  5.88k|    std::memcpy(newCell, cell, cellSize);
  486|  5.88k|    assert(newCell->isValid() && "Cell was copied incorrectly");
  487|  5.88k|    evacuatedBytes_ += cellSize;
  488|  5.88k|    CopyListCell *const copyCell = static_cast<CopyListCell *>(cell);
  489|       |    // Set the forwarding pointer in the old spot
  490|  5.88k|    copyCell->setMarkedForwardingPointer(
  491|  5.88k|        CompressedPointer::encodeNonNull(newCell, pointerBase_));
  492|  5.88k|    if (isTrackingIDs_) {
  ------------------
  |  Branch (492:9): [True: 0, False: 5.88k]
  ------------------
  493|      0|      gc.moveObject(cell, cellSize, newCell, cellSize);
  494|      0|    }
  495|       |    // Push onto the copied list.
  496|  5.88k|    push(copyCell);
  497|  5.88k|    return convertPtr<T>(pointerBase_, newCell);
  498|  5.88k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE4pushEPNS1_12CopyListCellE:
  583|  34.2k|  void push(CopyListCell *cell) {
  584|  34.2k|    cell->next_ = copyListHead_;
  585|  34.2k|    copyListHead_ = CompressedPointer::encodeNonNull(cell, pointerBase_);
  586|  34.2k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_17PinnedHermesValueE:
  508|   687k|  void accept(PinnedHermesValue &hv) override {
  509|   687k|    assert((!hv.isPointer() || hv.getPointer()) && "Value is not nullable.");
  510|   687k|    acceptNullable(hv);
  511|   687k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE14acceptNullableERNS0_17PinnedHermesValueE:
  513|   689k|  void acceptNullable(PinnedHermesValue &hv) override {
  514|   689k|    if (hv.isPointer()) {
  ------------------
  |  Branch (514:9): [True: 620k, False: 68.3k]
  ------------------
  515|   620k|      GCCell *forwardedPtr = acceptRoot(static_cast<GCCell *>(hv.getPointer()));
  516|   620k|      hv.setInGC(hv.updatePointer(forwardedPtr), gc);
  517|   620k|    }
  518|   689k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_13GCPointerBaseE:
  504|   116k|  void accept(GCPointerBase &ptr) override {
  505|   116k|    ptr.setInGC(acceptHeap(ptr, &ptr));
  506|   116k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptHeapENS0_17CompressedPointerEPv:
  447|   644k|  acceptHeap(CompressedPointer cptr, void *heapLoc) {
  448|   644k|    if (shouldForward(cptr)) {
  ------------------
  |  Branch (448:9): [True: 50.8k, False: 593k]
  ------------------
  449|  50.8k|      GCCell *ptr = cptr.getNonNull(pointerBase_);
  450|  50.8k|      assert(
  451|  50.8k|          HeapSegment::getCellMarkBit(ptr) &&
  452|  50.8k|          "Should only evacuate marked objects.");
  453|  50.8k|      return forwardCell<CompressedPointer>(ptr);
  454|  50.8k|    }
  455|   593k|    if (CompactionEnabled && gc.compactee_.contains(cptr)) {
  ------------------
  |  Branch (455:9): [Folded - Ignored]
  |  Branch (455:30): [True: 0, False: 0]
  ------------------
  456|       |      // If a compaction is about to take place, dirty the card for any newly
  457|       |      // evacuated cells, since the marker may miss them.
  458|      0|      HeapSegment::cardTableCovering(heapLoc)->dirtyCardForAddress(heapLoc);
  459|      0|    }
  460|   593k|    return cptr;
  461|   644k|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb0EE13shouldForwardENS0_17CompressedPointerE:
  420|   644k|  inline bool shouldForward(CompressedPointer ptr) const {
  421|   644k|    return gc.inYoungGen(ptr) ||
  ------------------
  |  Branch (421:12): [True: 50.8k, False: 593k]
  ------------------
  422|   644k|        (CompactionEnabled && gc.compactee_.evacContains(ptr));
  ------------------
  |  Branch (422:10): [Folded - Ignored]
  |  Branch (422:31): [True: 0, False: 0]
  ------------------
  423|   644k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE11forwardCellINS0_17CompressedPointerEEET_PNS0_6GCCellE:
  464|  50.8k|  LLVM_NODISCARD T forwardCell(GCCell *const cell) {
  465|  50.8k|    assert(
  466|  50.8k|        HeapSegment::getCellMarkBit(cell) && "Cannot forward unmarked object");
  467|  50.8k|    if (cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (467:9): [True: 22.4k, False: 28.3k]
  ------------------
  468|       |      // Get the forwarding pointer from the header of the object.
  469|  22.4k|      CompressedPointer forwardedCell = cell->getMarkedForwardingPointer();
  470|  22.4k|      assert(
  471|  22.4k|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  472|  22.4k|          "Cell was forwarded incorrectly");
  473|  22.4k|      return convertPtr<T>(pointerBase_, forwardedCell);
  474|  22.4k|    }
  475|  28.3k|    assert(cell->isValid() && "Encountered an invalid cell");
  476|  28.3k|    const auto cellSize = cell->getAllocatedSize();
  477|       |    // Newly discovered cell, first forward into the old gen.
  478|  28.3k|    GCCell *const newCell = gc.oldGen_.alloc(cellSize);
  479|  28.3k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  28.3k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  480|  28.3k|        gc.inOldGen(newCell) && "Evacuated cell not in the old gen");
  481|  28.3k|    assert(
  482|  28.3k|        HeapSegment::getCellMarkBit(newCell) &&
  483|  28.3k|        "Cell must be marked when it is allocated into the old gen");
  484|       |    // Copy the contents of the existing cell over before modifying it.
  485|  28.3k|    std::memcpy(newCell, cell, cellSize);
  486|  28.3k|    assert(newCell->isValid() && "Cell was copied incorrectly");
  487|  28.3k|    evacuatedBytes_ += cellSize;
  488|  28.3k|    CopyListCell *const copyCell = static_cast<CopyListCell *>(cell);
  489|       |    // Set the forwarding pointer in the old spot
  490|  28.3k|    copyCell->setMarkedForwardingPointer(
  491|  28.3k|        CompressedPointer::encodeNonNull(newCell, pointerBase_));
  492|  28.3k|    if (isTrackingIDs_) {
  ------------------
  |  Branch (492:9): [True: 0, False: 28.3k]
  ------------------
  493|      0|      gc.moveObject(cell, cellSize, newCell, cellSize);
  494|      0|    }
  495|       |    // Push onto the copied list.
  496|  28.3k|    push(copyCell);
  497|  28.3k|    return convertPtr<T>(pointerBase_, newCell);
  498|  28.3k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
  520|   842k|  void accept(GCHermesValue &hv) override {
  521|   842k|    if (hv.isPointer()) {
  ------------------
  |  Branch (521:9): [True: 1.74k, False: 840k]
  ------------------
  522|  1.74k|      GCCell *forwardedPtr =
  523|  1.74k|          acceptHeap(static_cast<GCCell *>(hv.getPointer()), &hv);
  524|  1.74k|      hv.setInGC(hv.updatePointer(forwardedPtr), gc);
  525|  1.74k|    }
  526|   842k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptHeapEPNS0_6GCCellEPv:
  431|  1.74k|  LLVM_NODISCARD GCCell *acceptHeap(GCCell *ptr, void *heapLoc) {
  432|  1.74k|    if (shouldForward(ptr)) {
  ------------------
  |  Branch (432:9): [True: 1.74k, False: 0]
  ------------------
  433|  1.74k|      assert(
  434|  1.74k|          HeapSegment::getCellMarkBit(ptr) &&
  435|  1.74k|          "Should only evacuate marked objects.");
  436|  1.74k|      return forwardCell<GCCell *>(ptr);
  437|  1.74k|    }
  438|      0|    if (CompactionEnabled && gc.compactee_.contains(ptr)) {
  ------------------
  |  Branch (438:9): [Folded - Ignored]
  |  Branch (438:30): [True: 0, False: 0]
  ------------------
  439|       |      // If a compaction is about to take place, dirty the card for any newly
  440|       |      // evacuated cells, since the marker may miss them.
  441|      0|      HeapSegment::cardTableCovering(heapLoc)->dirtyCardForAddress(heapLoc);
  442|      0|    }
  443|      0|    return ptr;
  444|  1.74k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_17GCHermesValueBaseINS0_13HermesValue32EEE:
  528|   545k|  void accept(GCSmallHermesValue &hv) override {
  529|   545k|    if (hv.isPointer()) {
  ------------------
  |  Branch (529:9): [True: 527k, False: 18.2k]
  ------------------
  530|   527k|      CompressedPointer forwardedPtr = acceptHeap(hv.getPointer(), &hv);
  531|   527k|      hv.setInGC(hv.updatePointer(forwardedPtr), gc);
  532|   527k|    }
  533|   545k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptWeakERNS0_12WeakRootBaseE:
  535|  67.0k|  void acceptWeak(WeakRootBase &wr) override {
  536|       |    // It's safe to not do a read barrier here since this is happening in the GC
  537|       |    // and does not extend the lifetime of the referent.
  538|  67.0k|    GCCell *const ptr = wr.getNoBarrierUnsafe(pointerBase_);
  539|       |
  540|  67.0k|    if (!shouldForward(ptr))
  ------------------
  |  Branch (540:9): [True: 66.8k, False: 233]
  ------------------
  541|  66.8k|      return;
  542|       |
  543|    233|    if (ptr->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (543:9): [True: 81, False: 152]
  ------------------
  544|       |      // Get the forwarding pointer from the header of the object.
  545|     81|      CompressedPointer forwardedCell = ptr->getMarkedForwardingPointer();
  546|     81|      assert(
  547|     81|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  548|     81|          "Cell was forwarded incorrectly");
  549|       |      // Assign back to the input pointer location.
  550|     81|      wr = forwardedCell;
  551|    152|    } else {
  552|    152|      wr = nullptr;
  553|    152|    }
  554|    233|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERKNS0_10GCSymbolIDE:
  557|   495k|  void accept(const GCSymbolID &sym) override {}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EED2Ev:
  411|    113|  ~EvacAcceptor() override {}
_ZN6hermes2vm7HadesGC20youngGenEvacuateImplINS1_12EvacAcceptorILb0EEEEEvRT_b:
 2385|    113|void HadesGC::youngGenEvacuateImpl(Acceptor &acceptor, bool doCompaction) {
 2386|       |  // Marking each object puts it onto an embedded free list.
 2387|    113|  {
 2388|    113|    DroppingAcceptor<Acceptor> nameAcceptor{acceptor};
 2389|    113|    markRoots(nameAcceptor, /*markLongLived*/ doCompaction);
 2390|       |
 2391|       |    // Mark the values in WeakMap entries as roots for the purposes of young gen
 2392|       |    // collection. This is slightly suboptimal since some of the keys or maps
 2393|       |    // may be dead, but we still end up evacuating their corresponding value.
 2394|       |    // This is done for simplicity, since it lets us avoid needing to iterate to
 2395|       |    // a fixed point as is done during a full collection.
 2396|    113|    weakMapEntrySlots_.forEach([&nameAcceptor](WeakMapEntrySlot &slot) {
 2397|    113|      nameAcceptor.accept(slot.mappedValue);
 2398|    113|    });
 2399|    113|  }
 2400|       |  // Find old-to-young pointers, as they are considered roots for YG
 2401|       |  // collection.
 2402|    113|  scanDirtyCards(acceptor);
 2403|       |  // Iterate through the copy list to find new pointers.
 2404|  34.3k|  while (CopyListCell *const copyCell = acceptor.pop()) {
  ------------------
  |  Branch (2404:30): [True: 34.2k, False: 113]
  ------------------
 2405|  34.2k|    assert(
 2406|  34.2k|        copyCell->hasMarkedForwardingPointer() && "Discovered unmarked object");
 2407|  34.2k|    assert(
 2408|  34.2k|        (inYoungGen(copyCell) || compactee_.evacContains(copyCell)) &&
 2409|  34.2k|        "Unexpected object in YG collection");
 2410|       |    // Update the pointers inside the forwarded object, since the old
 2411|       |    // object is only there for the forwarding pointer.
 2412|  34.2k|    GCCell *const cell =
 2413|  34.2k|        copyCell->getMarkedForwardingPointer().getNonNull(getPointerBase());
 2414|  34.2k|    markCell(cell, acceptor);
 2415|  34.2k|  }
 2416|       |
 2417|       |  // Mark weak roots. We only need to update the long lived weak roots if we are
 2418|       |  // evacuating part of the OG.
 2419|    113|  markWeakRoots(acceptor, /*markLongLived*/ doCompaction);
 2420|    113|}
_ZN6hermes2vm7HadesGC14scanDirtyCardsILb0EEEvRNS1_12EvacAcceptorIXT_EEE:
 2786|    113|void HadesGC::scanDirtyCards(EvacAcceptor<CompactionEnabled> &acceptor) {
 2787|    113|  SlotVisitor<EvacAcceptor<CompactionEnabled>> visitor{acceptor};
 2788|    113|  const bool preparingCompaction =
 2789|    113|      CompactionEnabled && !compactee_.evacActive();
  ------------------
  |  Branch (2789:7): [Folded - Ignored]
  |  Branch (2789:28): [True: 0, False: 0]
  ------------------
 2790|       |  // The acceptors in this loop can grow the old gen by adding another
 2791|       |  // segment, if there's not enough room to evac the YG objects discovered.
 2792|       |  // Since segments are always placed at the end, we can use indices instead
 2793|       |  // of iterators, which aren't invalidated. It's ok to not scan newly added
 2794|       |  // segments, since they are going to be handled from the rest of YG
 2795|       |  // collection.
 2796|    113|  const auto segEnd = oldGen_.numSegments();
 2797|    226|  for (size_t i = 0; i < segEnd; ++i) {
  ------------------
  |  Branch (2797:22): [True: 113, False: 113]
  ------------------
 2798|       |    // It is safe to hold this reference across a push_back into
 2799|       |    // oldGen_.segments_ since references into a deque are not invalidated.
 2800|    113|    HeapSegment &seg = oldGen_[i];
 2801|    113|    scanDirtyCardsForSegment(visitor, seg);
 2802|       |    // Do not clear the card table if the OG thread is currently marking to
 2803|       |    // prepare for a compaction. Note that we should clear the card tables if
 2804|       |    // the compaction is currently ongoing.
 2805|    113|    if (!preparingCompaction)
  ------------------
  |  Branch (2805:9): [Folded - Ignored]
  ------------------
 2806|    113|      seg.cardTable().clear();
 2807|    113|  }
 2808|       |
 2809|       |  // No need to search dirty cards in the compactee segment if it is
 2810|       |  // currently being evacuated, since it will be scanned fully.
 2811|    113|  if (preparingCompaction)
  ------------------
  |  Branch (2811:7): [Folded - Ignored]
  ------------------
 2812|      0|    scanDirtyCardsForSegment(visitor, *compactee_.segment);
 2813|    113|}
_ZN6hermes2vm7HadesGC24scanDirtyCardsForSegmentILb0EEEvRNS0_11SlotVisitorINS1_12EvacAcceptorIXT_EEEEERNS1_11HeapSegmentE:
 2703|    113|    HeapSegment &seg) {
 2704|    113|  const auto &cardTable = seg.cardTable();
 2705|       |  // Use level instead of end in case the OG segment is still in bump alloc
 2706|       |  // mode.
 2707|    113|  const char *const origSegLevel = seg.level();
 2708|    113|  size_t from = cardTable.addressToIndex(seg.start());
 2709|    113|  const size_t to = cardTable.addressToIndex(origSegLevel - 1) + 1;
 2710|       |
 2711|       |  // Do not scan unmarked objects in the OG if we are currently sweeping. We do
 2712|       |  // this for three reasons:
 2713|       |  // 1. If an object is unmarked during sweeping, that means it is dead, so it
 2714|       |  //    is wasteful to scan it and promote objects it refers to.
 2715|       |  // 2. During compaction, these unmarked objects may point to dead objects in
 2716|       |  //    the compactee. Promoting these objects is dangerous, since they may
 2717|       |  //    contain references to other dead objects that are or will be freed.
 2718|       |  // 3. If a compaction was completed during this cycle, unmarked objects may
 2719|       |  //    contain references into the now freed compactee. These pointers are not
 2720|       |  //    safe to visit.
 2721|    113|  const bool visitUnmarked = concurrentPhase_ != Phase::Sweep;
 2722|       |
 2723|    272|  while (const auto oiBegin = cardTable.findNextDirtyCard(from, to)) {
  ------------------
  |  Branch (2723:21): [True: 159, False: 113]
  ------------------
 2724|    159|    const auto iBegin = *oiBegin;
 2725|       |
 2726|    159|    const auto oiEnd = cardTable.findNextCleanCard(iBegin, to);
 2727|    159|    const auto iEnd = oiEnd ? *oiEnd : to;
  ------------------
  |  Branch (2727:23): [True: 159, False: 0]
  ------------------
 2728|       |
 2729|    159|    assert(
 2730|    159|        (iEnd == to || !cardTable.isCardForIndexDirty(iEnd)) &&
 2731|    159|        cardTable.isCardForIndexDirty(iEnd - 1) &&
 2732|    159|        "end should either be the end of the card table, or the first "
 2733|    159|        "non-dirty card after a sequence of dirty cards");
 2734|    159|    assert(iBegin < iEnd && "Indices must be apart by at least one");
 2735|       |
 2736|    159|    const char *const begin = cardTable.indexToAddress(iBegin);
 2737|    159|    const char *const end = cardTable.indexToAddress(iEnd);
 2738|       |    // Don't try to mark any cell past the original boundary of the segment.
 2739|    159|    const void *const boundary = std::min(end, origSegLevel);
 2740|       |
 2741|       |    // Use the object heads rather than the card table to discover the head
 2742|       |    // of the object.
 2743|    159|    GCCell *const firstObj = seg.getFirstCellHead(iBegin);
 2744|    159|    GCCell *obj = firstObj;
 2745|       |    // Throughout this loop, objects are being marked which could promote
 2746|       |    // other objects into the OG. Such objects might be promoted onto a dirty
 2747|       |    // card, and be visited a second time. This is only a problem if the
 2748|       |    // acceptor isn't idempotent. Luckily, EvacAcceptor happens to be
 2749|       |    // idempotent, and so there's no correctness issue with visiting an object
 2750|       |    // multiple times. If EvacAcceptor wasn't idempotent, we'd have to be able
 2751|       |    // to identify objects promoted from YG in this loop, which would be
 2752|       |    // expensive.
 2753|       |
 2754|       |    // Mark the first object with respect to the dirty card boundaries.
 2755|    159|    if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2755:9): [True: 159, False: 0]
  |  Branch (2755:26): [True: 0, False: 0]
  ------------------
 2756|    159|      markCellWithinRange(visitor, obj, obj->getKind(), begin, end);
 2757|       |
 2758|    159|    obj = obj->nextCell();
 2759|       |    // If there are additional objects in this card, scan them.
 2760|    159|    if (LLVM_LIKELY(obj < boundary)) {
  ------------------
  |  |  188|    159|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 159, False: 0]
  |  |  ------------------
  ------------------
 2761|       |      // Mark the objects that are entirely contained within the dirty card
 2762|       |      // boundaries. In a given iteration, obj is the start of a given object,
 2763|       |      // and next is the start of the next object. Iterate until the last
 2764|       |      // object where next is within the card.
 2765|  29.4k|      for (GCCell *next = obj->nextCell(); next < boundary;
  ------------------
  |  Branch (2765:44): [True: 29.2k, False: 159]
  ------------------
 2766|  29.2k|           next = next->nextCell()) {
 2767|  29.2k|        if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2767:13): [True: 29.2k, False: 0]
  |  Branch (2767:30): [True: 0, False: 0]
  ------------------
 2768|  29.2k|          markCell(visitor, obj, obj->getKind());
 2769|  29.2k|        obj = next;
 2770|  29.2k|      }
 2771|       |
 2772|       |      // Mark the final object in the range with respect to the dirty card
 2773|       |      // boundaries.
 2774|    159|      assert(
 2775|    159|          obj < boundary && obj->nextCell() >= boundary &&
 2776|    159|          "Last object in card must touch or cross cross the card boundary");
 2777|    159|      if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2777:11): [True: 159, False: 0]
  |  Branch (2777:28): [True: 0, False: 0]
  ------------------
 2778|    159|        markCellWithinRange(visitor, obj, obj->getKind(), begin, end);
 2779|    159|    }
 2780|       |
 2781|    159|    from = iEnd;
 2782|    159|  }
 2783|    113|}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE3popEv:
  563|  34.3k|  CopyListCell *pop() {
  564|  34.3k|    if (!copyListHead_) {
  ------------------
  |  Branch (564:9): [True: 113, False: 34.2k]
  ------------------
  565|    113|      return nullptr;
  566|  34.2k|    } else {
  567|  34.2k|      CopyListCell *const cell =
  568|  34.2k|          static_cast<CopyListCell *>(copyListHead_.getNonNull(pointerBase_));
  569|  34.2k|      assert(HeapSegment::getCellMarkBit(cell) && "Discovered unmarked object");
  570|  34.2k|      copyListHead_ = cell->next_;
  571|  34.2k|      return cell;
  572|  34.2k|    }
  573|  34.3k|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb0EE14evacuatedBytesEv:
  559|    113|  uint64_t evacuatedBytes() const {
  560|    113|    return evacuatedBytes_;
  561|    113|  }
HadesGC.cpp:_ZZNK6hermes2vm7HadesGC8inOldGenEPKvENK3$_0clERKNS1_11HeapSegmentE:
 2999|  15.9M|      std::any_of(oldGen_.begin(), oldGen_.end(), [p](const HeapSegment &seg) {
 3000|  15.9M|           return seg.contains(p);
 3001|  15.9M|         });
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15checkWellFormedEvENK3$_0clEPNS0_6GCCellE:
 3096|  7.95M|  forAllObjs([this, &acceptor](GCCell *cell) {
 3097|  7.95M|    assert(cell->isValid() && "Invalid cell encountered in heap");
 3098|  7.95M|    markCell(cell, acceptor);
 3099|  7.95M|  });
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvENK3$_0clEPNS0_6GCCellE:
 3145|  7.95M|  forAllObjs([this, &acceptor](GCCell *cell) { markCell(cell, acceptor); });

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

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

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

_ZN8facebook6hermes8debugger10StackTraceC2Ev:
   87|    320|  StackTrace() {}

_ZN6hermes6BufferD2Ev:
   19|    567|Buffer::~Buffer() {}
_ZN6hermes2vm12CrashManagerD2Ev:
   22|    160|CrashManager::~CrashManager() {}

LLVMFuzzerTestOneInput:
   22|    160|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   23|    160|  if (!size) {
  ------------------
  |  Branch (23:7): [True: 0, False: 160]
  ------------------
   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|    160|  if (HermesRuntime::isHermesBytecode(data, size)) {
  ------------------
  |  Branch (32:7): [True: 0, False: 160]
  ------------------
   33|      0|    return 0;
   34|      0|  }
   35|       |
   36|    160|  std::string s(reinterpret_cast<const char *>(data), size);
   37|    160|  s.append("\0");
   38|    160|  auto runtime = makeHermesRuntime();
   39|       |
   40|       |  // create a simple HostObject
   41|    160|  class ProtoHostObject : public HostObject {
   42|    160|    Value get(Runtime &rt, const PropNameID &) override {
   43|    160|      return String::createFromAscii(rt, "phoprop");
   44|    160|    }
   45|       |
   46|    160|    void set(Runtime &, const PropNameID &name, const Value &value) override {
   47|    160|      (void)name;
   48|    160|      (void)value;
   49|    160|      return;
   50|    160|    }
   51|       |
   52|    160|    std::vector<PropNameID> getPropertyNames(Runtime &rt) override {
   53|    160|      return PropNameID::names(rt, "prop1", "1", "2", "prop2", "3");
   54|    160|    }
   55|    160|  };
   56|       |
   57|       |  // expose the HostObject to the js runtime
   58|       |  // many important apps expose this kind of objects
   59|    160|  runtime->global().setProperty(
   60|    160|      *runtime,
   61|    160|      "p",
   62|    160|      Object::createFromHostObject(
   63|    160|          *runtime, std::make_shared<ProtoHostObject>()));
   64|       |
   65|       |  // Cap the run-time of the code so that fuzzing can stay efficient.
   66|    160|  constexpr uint32_t kTimeoutForRunningInMs = 10000;
   67|    160|  runtime->watchTimeLimit(kTimeoutForRunningInMs);
   68|       |
   69|    160|  try {
   70|    160|    runtime->evaluateJavaScript(std::make_unique<StringBuffer>(s), "");
   71|    160|  } 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|     98|  }
   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|    160|  return 0;
   83|    160|}
fuzzer-jsi-entry.cpp:_ZZ22LLVMFuzzerTestOneInputEN15ProtoHostObject3getERN8facebook3jsi7RuntimeERKNS1_10PropNameIDE:
   42|   390k|    Value get(Runtime &rt, const PropNameID &) override {
   43|   390k|      return String::createFromAscii(rt, "phoprop");
   44|   390k|    }

